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 <[email protected]> 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() + ''') + } }
