AspectJ 1.1 Features
------------------------------------------------------------


------------------------------
About this document

This document contains information about the proposed features of
AspectJ 1.1.  It assumes as a baseline that AspectJ 1.1 includes all
the features of AspectJ 1.0.6.  Any feature difference, especially
incompatible changes, should be noted.  It is organized by DOWNLOAD.
Inside the tools download there are sections per feature. 

Feel free to just stick shorthand notes at the end of this file, and
move them up to the New Features (or other) section as we want.


------------------------------
OPEN ISSUES

* -sourceroots/-injars matrix completeness

* do we release ant tasks in beta?

* do we call beta alpha or alpha beta?

------------------------------
DOWNLOAD: Tools

General deliverables:  Two licence files.  A readme.  Possibly a changes.

---- runtime

Deliverable:  aspectjrt.jar

Changes:

* RUNTIME_LICENCE:  AspectjRT.jar now has a BSD-style licence [NOT BETA]

* JOINPOINT_NAMES: Added constant fields holding constant names for
  the join points.
  
* NO_COLUMN_NUMBER: thisJoinPoint.getSourceLocation().getColumn()
  is incompatible with bytecode weaving and can not be supported.
  Do we want to remove the method or make it return -1?
  
* NOT_10_BINARY_COMPATIBLE: Some modifications to classes in internal
  packages means that code built with 1.1 won't run on the 1.0 version
  of aspectjrt.jar.
  [XXX this has always been true and sounds more scary than it is.
   The readme/docs do/should always say that you need to compile and
   run with at least the same version of the runtime classes as 
   the compiler]

---- tools

Deliverable: aspectjtools.jar

* Single jar containing .class files for all components listed below.
  This will contain code under both the CPL and the MPL.

---- ajc

Deliverable:  ajc, ajc.bat

Changes: 

-- new features 
* NO_SOURCE: -source/-usejavac options are not supported [INCOMPATIBLE]  

* SOURCEROOT: -sourceroots option indicates that all source files in
  a particular directory tree should be compiled [NEW]
  This option is the only way that sourcefiles can currently be
  specified for incremental compilation on the command-line.

* BYTECODE_WEAVING: supporting bytecode-containing jar files as input
  for the compiler.  [NEW]
  * Command-line: -injars option
  Not supported in incremental mode.
  * Eclipse: not supported [BETA]
  This has a ripple effect on "code the compiler controls" issues.
  There are obfustication issues that should be discussed in the readme

* OUTJAR: supports generating a single .jar file with the results of a
  compilation, rather than separate .class files. This should be
  most useful when weaving into existing .jar files.  The resulting jar 
  file has no meta-information, just classes.  [question: compression level?]
  [NEW]

* BINARY_ASPECTS: Aspects may be compiled to a standalone bytecode
  form, and later be used in a linking/compiling phase to affect join
  points.  [NEW]
  This will only be partially working in beta1:  The front-end is not
  reading the binary aspects. [BETA]

* INCREMENTAL: incremental compilation [NEW] 
  * Command-line: interface is using -sourceroots and typing <enter>
    for an incremental recompile.  Better interfaces are possible
    in the future.
  * Eclipse: invisible
  * JBuilder/Netbeans:  ??
  * Emacs:  possibly using new command-line interface?
  * Ant: unsupported in BETA

* NORMAL_OPTIONS: now supporting many javac options ajc failed to in 1.0:  
  essentially those supported in the ECLIPSE_OPTIONS [NEW]

* ECLIPSE_OPTIONS: The eclipse compiler provides a large number of
  options for controlling its behavior, i.e. -warn:unusedLocals.  All
  of these options may be passed to the command-line ajc compiler.  Mik should 
  be bugged to get full list and description of the options [NEW]


-- features not supported yet

* NO_WEAVE: An option with unknown name that generates code but does 
  no back-end weaving [NO BETA]

* SOURCE_INFORMATION: Source file information in error messages may be
  either better or worse (depending on how well we do our eclipse
  integration, this may not happen). [INCOMPATIBLE, MINIMAL]
  JSR 45 information is not created/maintained. [BETA]  

* NO_AROUND_OPTIMIZATION: -XinlineAroundClosure not implemented.
  [INCOMPATIBLE]  No inlining at all [BETA].

* NO_CALLEE_SIDE_CALL:  Not implemented [BETA]

* OTHER_X_OPTIONS: XaddSafePrefix (not used anymore, but we make some
                   weak guarantees about this), XserializableAspects [see below]
                   XTargetNearSource [see below]
                   

-- features no longer supported
* NO_SOURCE: -preprocess/-usejavac/-nocomment/-workingdir options are 
  not supported [INCOMPATIBLE]  

* NO_STRICT_LENIENT:  The -strict/-lenient flags are no longer
  supported, since we no longer own the compiler [INCOMPATIBLE, MINIMAL]
  

* NO_PORTING: The -porting flag is no longer supported.

---- Ajdb

* NO_AJDB: Ajdb is no longer supported, shipped, talked about,
  seen, or believed to exist.  We write a nice couple of paragraphs
  about JSR 45. [INCOMPATIBLE] 


---- Ajdoc

* NO_AJDOC: Ajdoc is not provided [BETA, possibly but not certainly
  FINAL as well]

---- ajbrowser

* NO_CROSSCUTTING_STRUCTURE:  Crosscutting structure is not shown
  [BETA_ONLY]


------------------------------
DOWNLOADS: AJDE for Jbuilder, AJDE for Netbeans, AJDE for Emacs

Deliverables:  3 downloads, same as 1.0.6 (Mik, expand?)

Changes:

* NO_AJDE_INCREMENTAL_COMPILATION: the 1.1 compiler will only 
  work in batch mode [BETA_ONLY]

* NO_TARGET_NEAR_SOURCE:  -XTargetNearSource option is not supported in
  the 1.1 command-line compiler. [INCOMPATIBLE]


------------------------------
DOWNLOAD: ajc ant tasks

Deliverables:  1 download, same as 1.0.6

Changes: 
  - adding experimental taskdef based on DefaultCompilerAdapter
  - updated taskdef to use new compiler interface
  - neither support incremental mode [XXX leave ant running, touch tag file?]

------------------------------
DOWNLOAD: Source distributions

Tools Source: completely revamped, includes license for org.eclipse package
AJDE-JBuilder Source: basically the same, if aspectjtools.jar is one jar
AJDE-Netbeans Source: basically the same, if aspectjtools.jar is one jar

------------------------------
DOWNLOAD: Documentation

Deliverable: 1 or 0 downloads.  Main deliverable is fleshed-out
version of this document with outgoing links to bare or updated 1.0.6
documentation.

Changes (language changes):

* THROWS_PATTERN: Typename patterns are allowed in place of typenames 
  in throws clauses.  This is 
  http://aspectj.org/home/hugunin/features11.html#throws-patterns [NEW]

* CALLEE_SIDE_CALLS: 1.1 may pick out different callee-side call join
  points than 1.0.6 on the same code.  [INCOMPATIBLE] 

* SINGLE_INTERCLASS_TARGET: 1.1 does not allow inter-class
  declarations to be made with a TypePattern as target.  (workaround
  available, defense can be presented if asked).  [INCOMPATIBLE]

* SINGLE_TYPENAME_PATTERN_TARGET: A simple type-name pattern with no
  wildcard can match no more than one type.  The type that it matches
  is determined at compile-time.  [INCOMPATIBLE]  
  [THIS IS NO LONGER THE CASE, SO IT IS NOT DOCUMENTED AS SUCH]

* ASPECT_PRECEDENCE: Dominates is replaced/mirrored with alternate
  declare-space specification, or it's not.  (??) [INCOMPATIBLE, or
  NEW, or NOTHING]

* UNAVAILABLE_JOIN_POINTS: [INCOMPATIBLE, MINIMAL]
  * Initializer Execution join points no longer exist.  The
    information needed to pick them out doesn't exist in bytecode.
    there was not kinded pcd for it, and we're not sure anyone will
    actually notice the difference.
  * Others? (??)
  
* CONSTRUCTOR_EXECUTION_IS_BIGGER: constructor execution join points
  (of constructors which call super) include the code for instance
  initialization (the code inside the old initializer execution join
  point).  Again, the information needed to NOT include this code
  isn't available in bytecode.  This could be a big deal... before
  advice on many constructor execution join points will run before the
  dynamic initializers run. [INCOMPATIBLE]

* NEW_PCDS: Kinded PCDs are available for every kind of join
  point. This is 
  http://aspectj.org/home/hugunin/features11.html#kinded-pcds [NEW]
  * adviceExecution (spelling?)
  * preInitialization (spelling?)

* WITHIN_MEMBER_TYPES: Within of a member type (NOT a package-level
  type) such as within(pkg.Type.MemberType) is not guaranteed to pick
  out code inside anonymous and local types.  (JLS 13.1).  If anyone
  cares, we can do tests on jikes/javac/eclipse to see if we actually
  do, but this is hopefully a completely minimal issue [INCOMPATIBLE,
  MINIMAL].  It is unclear if this is a fundamental limitation of 
  bytecode weaving or if it can be fixed with further work.


Documentation caveats:

- example code not updated [XXX?]
- quick ref
- 

------------------------------
Future work

There are a number of changes that clearly would be either useful or
easy (hopefully things that are both useful and easy are already
done), but we don't plan to actually ship them in 1.1.  

* HANDLER_EXCLUDES_NON_EXCEPTIONS: (PR826)

* SUPERTYPES_TYPE_PATTERN:

* DYNAMIC_CLASSLOADER_WEAVER:

* SOURCE_WEAVING:

------------------------------
Shorthand notes

- no optimizations for per* aspects

- declare soft unimplemented [this is on the table for not doing for beta]

- privileged unimplemented [this is on the table for not doing for beta]

- declare dominates (?) [decided before beta]

- declare error/warning source locations are weaker than just missing column [BETA]


- a note for the dangerous bends section of the programming guide

  Base.m() throws IOException
  Derived.m() [no throws]
  
  call(void Base.m() throws IOException)
  --> this doesn't match new Derived().m(), but will without the throws
  
  
- The status of the -XserializableAspects flag is iceberg-like.

- Don't implement intra-type static members onto interfaces

- Don't handle introduced fields with constant values

- no crosscuting structure means no inline annotations w/ -emacssym, but speedbar still
  shows declaration tree
  

