Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8291594

Add methods to Elements for record constructors

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P3 P3
    • 20
    • core-libs
    • None
    • behavioral
    • minimal
    • Adding default methods to an existing interface.
    • Java API
    • SE

      Summary

      Add methods to Elements to determine if record constructors are canonical or compact.

      Problem

      The language concepts of a record's canonical constructor and compact constructor are not surfaced in the javax.lang.model API.

      Solution

      Add predicates to Elements to support this functionality.

      Specification

      diff --git a/src/java.compiler/share/classes/javax/lang/model/util/Elements.java b/src/java.compiler/share/classes/javax/lang/model/util/Elements.java
      index 98584cd9a27..f567c7f3b1b 100644
      --- a/src/java.compiler/share/classes/javax/lang/model/util/Elements.java
      +++ b/src/java.compiler/share/classes/javax/lang/model/util/Elements.java
      @@ -760,6 +760,51 @@ public interface Elements {
               return null;
           }
      
      +    /**
      +     * {@return {@code true} if the executable element can be
      +     * determined to be a canonical constructor of a record, {@code
      +     * false} otherwise}
      +     * Note that in some cases there may be insufficient information
      +     * to determine if a constructor is a canonical constructor, such
      +     * as if the executable element is built backed by a class
      +     * file. In such cases, {@code false} is returned.
      +     *
      +     * @implSpec
      +     * The default implementation of this method unconditionally
      +     * returns {@code false}.
      +     *
      +     * @param e  the executable being examined
      +     * @jls 8.10.4.1 Normal Canonical Constructors
      +     * @since 20
      +     */
      +    default boolean isCanonicalConstructor(ExecutableElement e) {
      +        return false;
      +    }
      +
      +    /**
      +     * {@return {@code true} if the executable element can be
      +     * determined to be a compact constructor of a record, {@code
      +     * false} otherwise}
      +     * By definition, a compact constructor is also a {@linkplain
      +     * #isCanonicalConstructor(ExecutableElement) canonical
      +     * constructor}.
      +     * Note that in some cases there may be insufficient information
      +     * to determine if a constructor is a compact constructor, such as
      +     * if the executable element is built backed by a class file. In
      +     * such cases, {@code false} is returned.
      +     *
      +     * @implSpec
      +     * The default implementation of this method unconditionally
      +     * returns {@code false}.
      +     *
      +     * @param e  the executable being examined
      +     * @jls 8.10.4.2 Compact Canonical Constructors
      +     * @since 20
      +     */
      +    default boolean isCompactConstructor(ExecutableElement e) {
      +        return false;
      +    }
      +
           /**
            * {@return the file object for this element or {@code null} if
            * there is no such file object}

            darcy Joe Darcy
            jjg Jonathan Gibbons
            Vicente Arturo Romero Zaldivar
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: