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 2021/09/24 13:33:24 UTC

[groovy] 01/01: GROOVY-10240: Support record grammar (allow disabling for consistency with sealed classes)

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

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

commit 3ec5a075420d69a1d2da8c150d4467e1cead760b
Author: Paul King <pa...@asert.com.au>
AuthorDate: Fri Sep 24 23:33:15 2021 +1000

    GROOVY-10240: Support record grammar (allow disabling for consistency with sealed classes)
---
 .../groovy/classgen/asm/WriterController.java      |  2 +-
 .../groovy/control/CompilerConfiguration.java      | 25 ++++++++++++++++++++++
 .../org/codehaus/groovy/classgen/RecordTest.groovy | 10 +++++++++
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index 5cddcff..7a08d52 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -101,7 +101,7 @@ public class WriterController {
 
         this.bytecodeVersion = chooseBytecodeVersion(invokedynamic, config.isPreviewFeatures(), config.getTargetBytecode());
 
-        if (bytecodeVersion >= Opcodes.V16 && cn.isRecord()) {
+        if (bytecodeVersion >= Opcodes.V16 && cn.isRecord() && config.isRecordsNative()) {
             // `java.lang.Record` has been added since JDK16
             cn.setSuperClass(ClassHelper.makeWithoutCaching(RECORD_CLASS_NAME));
         }
diff --git a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index e5fe194..fa366a5 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -385,6 +385,12 @@ public class CompilerConfiguration {
     private boolean previewFeatures;
 
     /**
+     * Whether Record class information is natively generated for target bytecode >= 16 (JEP 359/384/395).
+     * Otherwise record-like classes are produced.
+     */
+    private boolean recordsNative;
+
+    /**
      * Whether Sealed class information is natively generated for target bytecode >= 17 (JEP 360/397/409)
      */
     private boolean sealedNative;
@@ -453,6 +459,7 @@ public class CompilerConfiguration {
         warningLevel = WarningMessage.LIKELY_ERRORS;
         parameters = getBooleanSafe("groovy.parameters");
         previewFeatures = getBooleanSafe("groovy.preview.features");
+        recordsNative = !getBooleanSafe("groovy.records.native.disable");
         sealedNative = !getBooleanSafe("groovy.sealed.native.disable");
         sealedAnnotations = !getBooleanSafe("groovy.sealed.annotations.disable");
         sourceEncoding = getSystemPropertySafe("groovy.source.encoding",
@@ -998,6 +1005,24 @@ public class CompilerConfiguration {
     }
 
     /**
+     * Whether Record class information is natively generated (JEP 359/384/395).
+     *
+     * @return recordsNative
+     */
+    public boolean isRecordsNative() {
+        return recordsNative;
+    }
+
+    /**
+     * Sets whether Record class information is natively generated (JEP 359/384/395).
+     *
+     * @param recordsNative whether record classes extend java.lang.Record for target bytecode >= 16
+     */
+    public void setRecordsNative(final boolean recordsNative) {
+        this.recordsNative = recordsNative;
+    }
+
+    /**
      * Whether Sealed class information is natively generated (JEP 360/397/409).
      *
      * @return sealedNative
diff --git a/src/test/groovy/org/codehaus/groovy/classgen/RecordTest.groovy b/src/test/groovy/org/codehaus/groovy/classgen/RecordTest.groovy
index b550c02..f943c0a 100644
--- a/src/test/groovy/org/codehaus/groovy/classgen/RecordTest.groovy
+++ b/src/test/groovy/org/codehaus/groovy/classgen/RecordTest.groovy
@@ -36,4 +36,14 @@ class RecordTest {
             assert java.lang.Record == RecordJDK16plus.class.getSuperclass()
         ''')
     }
+
+    @Test
+    void testRecordOnJDK16plusWhenDisabled() {
+        assumeTrue(isAtLeastJdk('16.0'))
+        def configuration = new CompilerConfiguration(targetBytecode: CompilerConfiguration.JDK16, recordsNative: false)
+        assertScript(new GroovyShell(configuration), '''
+            record RecordJDK16plus2(String name) {}
+            assert java.lang.Record != RecordJDK16plus2.class.getSuperclass()
+        ''')
+    }
 }