The initial inputs can include module-info files. Such files are
represented by ModuleElement
objects. However, new module-element
source and class files cannot be created through the Filer API. In the
Filer API, the syntax of the "name
" parameters of the create methods
is expanded to allow a leading "mod-name/
".
Work is ongoing on a possible refinement to the Filer API, JDK-8175119: Need to specify module of types created by Filer.createSourceFile/Filer.createClassFile?
The syntax of Processor.getSupportedAnnotationTypes
is also expanded
to allow an optional leading module name and slash.
For processors written to run both pre- and post-modules, the
recommendation is that the supported annotation type name include the
module prefix and rely on the code in
AbstractProcessor.getSupportedAnnotationTypes
to strip
out the module name when a source level earlier than 9 is being used.
New overloaded methods
RoundEnvironment.getElementsAnnotatedWithAny
allow
multiple annotations to be searched for in a single call.
The direct support for modeling modules proceeded mostly as
expected for modeling a new language construct in the API: a new
ModuleElement
type was added, a corresponding new
visitModule method was added to the ElementVisitor
interface, and a new MODULE ElementKind
was added
too. The ModuleElement
interface extends
Element
, QualifiedNameable
, and also
AnnotatedConstruct
.
The API support for modules throughout the API is similar to the support for packages.
However, note that the modeling of directive structure of a module may be changing in the near future, JDK-8175118: Revisit modeling of module directives.
The methods added to interfaces in this release generally use the new-in-Java-8 feature of default methods to provide some nominal implementation and provide better source compatibility for implementers of the interfaces. This included the new ElementVisitor.visitModule method method. The existing one-argument "visit" methods in the AnnotationValueVisitor, ElementVisitor, and TypeVisitor interfaces were also upgraded to be default methods.
Besides a new constant for RELEASE_9
,
SourceVersion
gained additional isKeyword
and isName
methods parameterized by a
SourceVersion
argument.
The behavior of getEnclosingElement
for a
PackageElement
is dependent on the source version being
used for the annotation processing run. When modules are present, a
module encloses a package. When modules are not present,
null
is returned for the enclosing element of a package
as done previously.
The Elements
utility interface has additions for
name-based look-ups of types, packages, and modules. A method is also
added to return the origin of a construct, that is, if the construct
is explicitly declared in the source, implicitly declared in the
source, synthesized by the compiler, etc.
The constructors of 6-era visitor classes have been deprecated since that source level is also deprecated.
The overall specification had a cleanup pass, obsolete statements removed, more @jls tags, etc.