A new example project has been published, demonstrating how to build a small extension
which adds string repetition functionality for the multiplication expression. For example,
allowing you to write this in a Java program:
We are working on improving Java 8 type inference. A beta version of the new
type inference is available in the typeinf2 branch from the Bitbucket repository.
2018-01-25 Release 8.1.1
ExtendJ 8.1.1 fixes many bytecode generation issues, and a few static analysis bugs.
Only minor API changes were made since version 8.1.0.
Full change log:
Unified diamond type inference with method type inference.
A synthetic method access is now used by DiamondAccess to infer type
arguments. This means that much more of the method type inference
implementation can be reused directly by the diamond implementation.
Changed the argument type of MethodAccess.maxSpecific() from Collection to Iterable.
Changed the Argument type of MethodAccess.potentiallyApplicable() from
Collection to Iterable.
Changed TypeDecl.bridgeMethods() from collection attribute to synthesized
Removed the attribute TypeDecl.localBridgeMethods() (renamed to
The attribute SwichStmt.enumIndices() has been moved to TypeDecl.
This attribute is used to generate implicit enum switch maps.
Elements in the SimpleSet datastructure is are now ordered by insertion
order. This makes the element order deterministic.
Added NTA TryWithResources.closeAccess() to represent the implicit
resource closing method access in a TWR statement.
Use TryWithResources.closeAccess().decl() instead.
Added attribute TypeDecl.methods(), which computes all visible method
declarations for a type (includes inherited methods).
Use TypeDecl.methods().iterator() instead.
Added attribute TypeDecl.interfacesMethods(), which computes all methods
inherited from superinterfaces (transitive).
Use TypeDecl.interfacesMethods().iterator() instead.
Added attribute TypeDecl.localMethods(), which computes all local method
declarations for a type.
Use TypeDecl.localMethods().iterator() instead.
Use TypeDecl.superInterfaces().iterator() instead.
2017-12-30 Release 8.1.0
ExtendJ is now stable enough that it makes sense to tag a release. Version
8.1.0 includes several large rewrites to remove side effects in attributes, and
adding support for Stack Map Frames.
Version 8.1.0 includes the following changes:
Many compatibility bug fixes.
Type inference improvements.
Many attributes were renamed, removed, added, or redesigned.
Stack Map Frames bytecode attributes are now generated by all Java 6+ backends.
The Java 6 backend now outputs bytecode version 50 (was 49).
The Java 7 backend now outputs bytecode version 51 (was 49).
The Java 8 backend now outputs bytecode version 52 (was 49).
The AbstractDot node type has been removed.
Removed several side effects in attributes. Static semantic error checking
should now be mostly well-defined with respect to attribute purity and
Accessor methods are now generated by NTAs, replacing an imperative AST
Removed the FieldDecl list rewrite. Multiple field declarations are now
handled by using NTAs.
Updated to build with JastAdd 2.2.2.
Circular NTAs are now used as the rewrite implementation, for safer
Fixed order dependencies in name classification rewrites.
Replaced imperative enclosing variables transformation with on-demand
generation using NTAs during code generation.
Replaced enum index transformations by using NTAs instead.
Bridge methods are now generated on demand using NTAs, instead of using
imperative AST transformations.
Replaced implicit enum member rewrites by NTAs.
Replaced enum constructor transformation by NTAs.
2017-12-09 Stack Map Frames
Stack map frames
generation was implemented in commit
This allows ExtendJ to finally generate Java 8 bytecode, which in turn allows
us to compile default interface methods and calls to static interface methods.
2017-10-23 Concurrent Circular RAGs Talk
Jesper presented recent work on
Concurrent Circular Reference Attribute Grammars (doi)(free version)
at SLE 2017. ExtendJ was parallelized as part of this research.
The talk was recorded and can be viewed here:
Jesper had a talk about ExtendJ at Voxxed Days Zürich. The talk is available to
watch on YouTube:
2016-10-02 AST Visualizer Tool
A new tool for graphically navigating ExtendJ ASTs is available! Check out the
new tool page to learn more.
2016-02-28 Removing side effects
We are current working on removing side effects in the JastAdd attributes used
in ExtendJ. The goal is to completely remove attribute evaluation order
dependencies and allow interesting parallelization opportunities. To be able
to remove the side effects we have changed the way implicit method declarations,
constructors, and fields are added in the AST.