JDK-8235590 : Extend javax.lang.model to cover binding variables
  • Type: CSR
  • Component: core-libs
  • Sub-Component: javax.lang.model
  • Priority: P4
  • Status: Closed
  • Resolution: Approved
  • Fix Versions: 14
  • Submitted: 2019-12-09
  • Updated: 2019-12-11
  • Resolved: 2019-12-11
Related Reports
CSR :  
Description
Summary
-------

The javax.lang.model.element.ElementKind models various local variables, but, with the recent addition of binding variables (for pattern matching), a new ElementKind was not added. The proposal here is to add a new ElementKind for binding variables.

Problem
-------

Various types of variables local to methods have their own enum constant in ElementKind, but binding variables don't.

Solution
--------

A new enum constant, BINDING_VARIABLE, is added into the ElementKind.

Specification
-------------

    diff --git a/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java b/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java
    --- a/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java
    +++ b/src/java.compiler/share/classes/javax/lang/model/element/ElementKind.java
    @@ -137,7 +137,24 @@
          */
         @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS,
                                      essentialAPI=false)
    -    RECORD_COMPONENT;
    +    RECORD_COMPONENT,
    +
    +    /**
    +     * {@preview Associated with pattern matching for {@code
    +     * instanceof}, a preview feature of the Java language.
    +     *
    +     *           This enum constant is associated with <i>pattern
    +     *           matching for {@code instanceof}</i>, a preview
    +     *           feature of the Java language. Preview features
    +     *           may be removed in a future release, or upgraded to permanent
    +     *           features of the Java language.}
    +     *
    +     * A binding variable in a pattern .
    +     * @since 14
    +     */
    +    @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.PATTERN_MATCHING_IN_INSTANCEOF,
    +                                 essentialAPI=false)
    +    BINDING_VARIABLE;
     
         /**
          * Returns {@code true} if this is a kind of class:
    diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java
    --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java
    +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor14.java
    @@ -136,4 +136,20 @@
         public R visitTypeAsRecord(TypeElement e, P p) {
             return defaultAction(e, p);
         }
    +
    +    /**
    +     * Visits a {@code BINDING_VARIABLE} variable element.
    +     *
    +     * @implSpec This implementation calls {@code defaultAction}.
    +     *
    +     * @param e {@inheritDoc}
    +     * @param p {@inheritDoc}
    +     * @return  the result of {@code defaultAction}
    +     *
    +     * @since 14
    +     */
    +    @Override
    +    public R visitVariableAsBindingVariable(VariableElement e, P p) {
    +        return defaultAction(e, p);
    +    }
     }
    diff --git a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java
    --- a/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java
    +++ b/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java
    @@ -360,6 +363,21 @@
         }
     
         /**
    +     * Visits a {@code BINDING_VARIABLE} variable element.
    +     *
    +     * @implSpec This implementation calls {@code visitUnknown}.
    +     *
    +     * @param e the element to visit
    +     * @param p a visitor-specified parameter
    +     * @return  the result of {@code visitUnknown}
    +     *
    +     * @since 14
    +     */
    +    public R visitVariableAsBindingVariable(VariableElement e, P p) {
    +        return visitUnknown(e, p);
    +    }
    +
    +    /**
          * {@inheritDoc}
          *
          * @implSpec This implementation dispatches to the visit method

A specdiff is also attached, and also available at the following location for convenience: http://cr.openjdk.java.net/~jlahoda/8235541/specdiff.00/overview-summary.html

Comments
Moving amended specification to Approved; the diff in the Specification section is the normative one.
11-12-2019

Updates to the ElementKind visitors are needed as well; adding to the specification section above.
11-12-2019