News

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.
  • Removed attributes:
    • DiamondAccess.mostSpecific(_, _)
    • DiamondAccess.potentiallyApplicable(_)
    • DiamondAccess.applicableBySubtyping(_, _)
    • DiamondAccess.applicableByMethodInvocationConversion(_, _)
    • DiamondAccess.applicableByVariableArity(_, _)
  • 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 attribute.
  • Removed the attribute TypeDecl.localBridgeMethods() (renamed to "bridgeMethods").
  • 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.
  • Removed TryWithResources.lookupClose(). Use TryWithResources.closeAccess().decl() instead.
  • Added attribute TypeDecl.methods(), which computes all visible method declarations for a type (includes inherited methods).
  • Removed TypeDecl.methodsIterator(). Use TypeDecl.methods().iterator() instead.
  • Added attribute TypeDecl.interfacesMethods(), which computes all methods inherited from superinterfaces (transitive).
  • Removed TypeDecl.interfacesMethodsIterator(). Use TypeDecl.interfacesMethods().iterator() instead.
  • Added attribute TypeDecl.localMethods(), which computes all local method declarations for a type.
  • Removed TypeDecl.localMethodsIterator(). Use TypeDecl.localMethods().iterator() instead.
  • Removed TypeDecl.interfacesIterator(). 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.
  • Pretty-printing 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 circularity.
  • Accessor methods are now generated by NTAs, replacing an imperative AST transformation.
  • 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 rewrite evaluation.
  • 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 21b8c09. 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:

2017-02-23

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.