FACT: The compiler is a complex beast.

Sometimes its hard to test that widget you've stuck five levels deep down in the 
compiler infrastructure, sometimes you want to ship some experimental function
that is only enabled in certain environments.

The solution is that we design the code for testability and configurability.

Q. What does this mean?

It means that throughout the complex are public fields or methods that are
exposed to enable some components to have their behaviour changed, from a
testcase or hosting environment (AJDT).  Andy has put a few of these in
over the last few months, and Adrian has just put one in - I don't think
we can get around the need for these things.

Q. How do I identify them?

I keep forgetting where I've put them, so from now on they are all marked
with a task tag of SECRETAPI.  When we have a little time to rest and
reflect on what we've been doing we should look at whether they can be
consolidated into an uber-control API module that centralises control of
all these secret buttons and widgets.

Q. Give me an example?

1. The structure model produced post build is a complex series of data
structures.  Incremental compilation is complex too.  Incremental
repairs to the structure model to ensure it stays up to date when
incrementally compiling are particularly complex so there is a flag
to turn on incremental repairs.

2. Testing what happens when processing incremental state is difficult
as there is no nice API to the state object that you can call at the
appropriate point in your test.  The StateListener instance that
can be set on the State object enables you to get callbacks when
certain things happen - for example if a change is detected on a 
classpath entry the compiler is looking at.  Doing it via an optional
listener means we don't have to record endless amounts of
information whilst state processing that would only be consumed
by the test infrastructure.

Q. Can I add them wherever I like?

NO! They are a last resort if you can't test something cleanly
*or* its so experimental you don't want to destabilise existing consumers
of the compiler.  For example the state management for incremental
compilation is currently configurable (defaults to off) as it has an
impact on memory usage and probably on other IDEs - when we've resolved
these issues we can look to making ON the default.  For any non-test
related secret APIs you should think about when they ought to be made
default !
