
Checker Framework redesign/refactoring (in priority order):

(Throughout the refactorings, incrementally update the manual.)

* Document the difference between getAnnotation and getEffectiveAnnotation

* rename commonAssignmentCheck to subtypeCheck

* rename asMemberOf or postAsMemberOf to fieldFromUse

* isSubtype should not return boolean.
  (Sometimes it is used for control flow rather than error reporting?  Why?  And would that even be possible to incorporate into inference mode?)
  It should be "requireSubtype", return void, and issue the proper error.
  This is essentially commonAssignmentCheck, though.  What's the distinction?  Determine that and document it.
  An alternative (but not as good?):  isSubtype could return information about the specific error (like 3rd type parameter is the one that doesn't match, for example).
  Problem: type hierarchy doesn't have access to the Checker.
   * could return an error object, or pass in something that will handle errors.
  (Werner calls this a "declarative interface".)
  [Jonathan should propose an interface.]
  [Werner will write some code in the meanwhile to direct the discussion.]

* CF cleanups based on langtools cleanups -- typeFromElement and typeFromTree hacks can be removed [Werner]

* Some things need to happen only once ever, whereas others happen once per compilation method.
  Need a setup and teardown method (rather than typeProcessingOver, which is not called if there is a Java error or typechkecing error (but is called if there are warnings)).
  [Werner.]

* AnnotatedTypeFactory changes (Stuart); see below

* Eliminate use of reflection in composing a type-checker from
  similarly-named classes; force this to be explicit.  This will make the
  type-checkers a bit more verbose, but easier to understand and debug.
  Examples throughout the manual may need to be updated.

* change from AST visiting to CFG visiting, so that each type system doesn't
  have to implement special logic to infer where boxing, unboxing, and
  other desugarings occur -- that can be done once, correctly, by CFG
  construction.
  TypeVisitor or SourceVisitor should be over the CFG.
  This can be independent of Stuart's changes.
  Should the new interface be over the CFG too?
  A nice side effect is that if the CFG duplicates code (such as that for
  finally blocks), then we get path/context-sensitive treatment of that
  code for free since we analyze it twice.  One challenge would be avoiding
  producing two error messages for the same expression, but that feature
  could be deferred because the system can be useful even before that
  feature is implemented.
Stefan says:
I have three comments that might be useful to consider when performing this
transformation:
- We currently have a generic MarkerNode which we use (mostly for debugging)
  to keep some of the structure of high-level constructs that we don't need
  in the CFG, such as locking or try-catch blocks.  I'd except this structure
  to be more important for type-checkers, so it might be worth having
  explicit types for the different kinds.
- If the CFG is used for type-checking, then somebody should go carefully
  over the CFGBuilder to make sure it does not unsoundly approximate the
  source program.  Some approximations might be sound for flow-sensitive
  type-refinement (and only lead to missed opportunities for type
  refinement), but are not sound when type-checking.  I don't have a concrete
  example in mind, but the TODOs might be a good starting point.
- A challenge will be how to deal with type-checking errors that occur for
  CFG nodes without direct source-level counter-part (which were introduced
  as part of desugaring), but I'm sure you are aware of this.

* there are currently multiple ways to obtain an error reporter and other
  global values.  Put these in a Checker Framework environment, and make all
  the code use a single consistent way to obtain them.  This will make the
  code easier to understand and will make mocking easier to do.

* staging for compound checkers:  ability to run multiple checkers within a
  single type system [Rene]

* staging of steps within a checker:  separate conceptually distinct tasks,
  such as implicits/defaults/flow/typevalidity/subtyping/customchecks.
  This can be done in twwo spages:two tasks:
   1.  Using the current AnnotatedTypeFactory's lazy approach to annotation,
       separate the current logic into individual steps, where each step is run
       successively on the current tree.
   2.  Abandon the lazy approach.  Separate the current logic into steps that
       are run over an entire compilation unit.  This is to avoid the visitor
       feedback loop that makes debugging so difficult.
  [Rene]

* separate definition of a type-checker from performing type-checking using
  that definition, to make "initialization" of a type system easier
* eliminate postInit method

* load javac via a classloader rather than by starting a new process -- this
  may avoid some problems with the Maven plugin?

===========================================================================

Inference-related tasks:

* Create unique ids for each annotated type location in source code, these IDs
will replace inference's ids.  This can be a discrete task, though I would
imagine there are some interactions with Stuart's code.

* Add a callback for either generating constraints or enforcing checks in
either commonAssignmentCheck or QualifierHierarchy.  If this is done through
QualifierHierarchy, create methods isSubtype and mustBeSubtype to distinguish
between the times when isSubtype is used in conditionals rather than to
enforce a subtype relationship

* Add a Solve step to the top-level control flow.  Perhaps, as part of the high
level staging this step can optionally be replaced by a PrintConstraints step,
or a GenerateGame step.

===========================================================================

Overview of Stuart's refactorings, in his own words:

> The stuff I'm working on has three main components:
>
>  - User-defined qualifier support: Allow checkers to use custom objects to
>    represent qualifiers internally, instead of using AnnotationMirrors
>    directly.
>  - Qualifier parameter support: Allow checkers to easily add support for
>    generics-style qualifier parameters.  This uses user-defined qualifiers in
>    its implementation.
>  - SPARTA: A new implementation of the SPARTA FlowChecker, based on qualifier
>    parameters.
>
> Here are my branches:
>
> ssh://tricycle/homes/gws/spernste/hg/checker-framework
>   (branched from checker-framework-dff)
>   This has changes to existing checker framework components that are necessary
>   to make the other components work.
>
> ssh://tricycle/homes/gws/spernste/hg/checker-framework-qual
>   (branched from ~spernste/hg/checker-framework)
>   This has user-defined qualifier support, implemented as an abstract base
>   checker in the checkers.userqual package.  I also adapted the TaintingChecker
>   to use the new userqual base classes.
>
> ssh://tricycle/homes/gws/spernste/hg/checker-framework-qualparam
>   (branched from ~spernste/hg/checker-framework-qual)
>   This has qualifier parameter support, implemented as an abstract base checker
>   in the checkers.qualparam package.  I also adapted the TaintingChecker to
>   use the new qualparam base classes.
>
> ssh://tricycle/homes/gws/spernste/hg/checker-framework-sparta
>   (branched from ~spernste/hg/checker-framework-qualparam)
>   This has the qualparam-based implementation of the SPARTA FlowChecker.
>
> I think I have the permissions set so anyone can check out from these
> repositories, but let me know if I need to fix them.

===========================================================================
