You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/01/25 10:56:55 UTC

[groovy] 02/02: GROOVY-10434: ClassNode isRecord() refactoring: additional clarification when information will be available

This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit fb2754a404aaaa0d9f1a88744441df19c6db5ff8
Author: Paul King <pa...@asert.com.au>
AuthorDate: Tue Jan 25 20:15:45 2022 +1000

    GROOVY-10434: ClassNode isRecord() refactoring: additional clarification when information will be available
---
 src/main/java/org/codehaus/groovy/ast/ClassNode.java       | 14 +++++++++-----
 .../groovy/transform/RecordTypeASTTransformation.java      | 12 ++++++++++++
 .../codehaus/groovy/transform/SealedASTTransformation.java |  6 +++---
 3 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/ClassNode.java b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
index 0874d61..991a6a5 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
@@ -55,6 +55,7 @@ import static org.codehaus.groovy.ast.ClassHelper.SEALED_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.isObjectType;
 import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveBoolean;
 import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveVoid;
+import static org.codehaus.groovy.transform.RecordTypeASTTransformation.recordNative;
 import static org.objectweb.asm.Opcodes.ACC_ABSTRACT;
 import static org.objectweb.asm.Opcodes.ACC_ANNOTATION;
 import static org.objectweb.asm.Opcodes.ACC_ENUM;
@@ -1369,23 +1370,24 @@ public class ClassNode extends AnnotatedNode {
 
     /**
      * Checks if the {@link ClassNode} instance represents a native {@code record}.
-     * Check instead for the {@code RecordType} annotation if looking for records and record-like classes.
+     * Check instead for the {@code RecordBase} annotation if looking for records and
+     * record-like classes currently being compiled.
      *
      * @return {@code true} if the instance represents a native {@code record}
-     *
      * @since 4.0.0
      */
+    @Incubating
     public boolean isRecord() {
-        return getUnresolvedSuperClass() != null && "java.lang.Record".equals(getUnresolvedSuperClass().getName());
+        return recordNative(this);
     }
 
     /**
      * Gets the record components of record type.
      *
      * @return {@code RecordComponentNode} instances
-     *
      * @since 4.0.0
      */
+    @Incubating
     public List<RecordComponentNode> getRecordComponents() {
         if (redirect != null)
             return redirect.getRecordComponents();
@@ -1403,6 +1405,7 @@ public class ClassNode extends AnnotatedNode {
      *
      * @since 4.0.0
      */
+    @Incubating
     public void setRecordComponents(List<RecordComponentNode> recordComponents) {
         if (redirect != null) {
             redirect.setRecordComponents(recordComponents);
@@ -1421,7 +1424,8 @@ public class ClassNode extends AnnotatedNode {
     }
 
     /**
-     * @return true for native and emulated (annotation based) sealed classes
+     * @return {@code true} for native and emulated (annotation based) sealed classes
+     * @since 4.0.0
      */
     @Incubating
     public boolean isSealed() {
diff --git a/src/main/java/org/codehaus/groovy/transform/RecordTypeASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/RecordTypeASTTransformation.java
index d47ed5b..e1bf231 100644
--- a/src/main/java/org/codehaus/groovy/transform/RecordTypeASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/RecordTypeASTTransformation.java
@@ -26,6 +26,7 @@ import groovy.transform.RecordOptions;
 import groovy.transform.RecordTypeMode;
 import groovy.transform.options.PropertyHandler;
 import org.apache.groovy.ast.tools.MethodNodeUtils;
+import org.apache.groovy.lang.annotation.Incubating;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.AnnotatedNode;
 import org.codehaus.groovy.ast.AnnotationNode;
@@ -254,6 +255,17 @@ public class RecordTypeASTTransformation extends AbstractASTTransformation imple
         }
     }
 
+    /**
+     * Indicates that the given classnode is a native JVM record class.
+     * For classes being compiled, this will only be valid after the
+     * {@code RecordTypeASTTransformation} transform has been invoked.
+     */
+    @Incubating
+    public static boolean recordNative(ClassNode node) {
+        return node.getUnresolvedSuperClass() != null &&
+                "java.lang.Record".equals(node.getUnresolvedSuperClass().getName());
+    }
+
     private void createComponents(ClassNode cNode, List<PropertyNode> pList) {
         if (pList.size() > 16) { // Groovy currently only goes to Tuple16
             addError("Record has too many components for a components() method", cNode);
diff --git a/src/main/java/org/codehaus/groovy/transform/SealedASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/SealedASTTransformation.java
index 5f38c68..9037670 100644
--- a/src/main/java/org/codehaus/groovy/transform/SealedASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/SealedASTTransformation.java
@@ -115,9 +115,9 @@ public class SealedASTTransformation extends AbstractASTTransformation {
     }
 
     /**
-     * Reports true if the {@code Sealed} annotation should be included in the bytecode for
-     * a sealed or emulated-sealed class.
-     * Will only ever return true after the SealedASTTransformation visit method has completed.
+     * Reports true if the {@code Sealed} annotation should not be
+     * included in the bytecode for a sealed or emulated-sealed class.
+     * Will only ever return true after the {@code SealedASTTransformation} transform has been invoked.
      *
      * @return true if a {@code Sealed} annotation is not required for this node
      */