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()
+ ''')
+ }
}