diff options
author | Jay Arthanareeswaran | 2020-08-13 10:10:25 +0000 |
---|---|---|
committer | Jay Arthanareeswaran | 2020-08-13 12:35:15 +0000 |
commit | 2718f4861eb3702ce5f77ac30c337e89b1d86efa (patch) | |
tree | a07eb7baade1882b11c11122f9584137f48ef52c | |
parent | b8a1a3b13e6305805d702258b6ae0129d0f7f338 (diff) | |
download | eclipse.jdt.core-2718f4861eb3702ce5f77ac30c337e89b1d86efa.tar.gz eclipse.jdt.core-2718f4861eb3702ce5f77ac30c337e89b1d86efa.tar.xz eclipse.jdt.core-2718f4861eb3702ce5f77ac30c337e89b1d86efa.zip |
error
Change-Id: I02c33f35b0b56c1bda377e40a654657e49539858
Signed-off-by: Jay Arthanareeswaran <jarthana@in.ibm.com>
3 files changed, 144 insertions, 1 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java index d7d8f047bb..077785c9a0 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java @@ -7465,4 +7465,136 @@ public void testBug563182_07() { }, "0"); } + public void testBug565732_01() { + runNegativeTest( + new String[] { + "X.java", + "public record X {\n" + + "} " + }, + "----------\n" + + "1. ERROR in X.java (at line 1)\n" + + " public record X {\n" + + " ^\n" + + "Syntax error, insert \"RecordHeader\" to complete RecordHeaderPart\n" + + "----------\n", + null, + true, + new String[] {"--enable-preview"}, + getCompilerOptions()); + } + public void testBug565732_02() { + runNegativeTest( + new String[] { + "X.java", + "public record X<T> {\n" + + "} " + }, + "----------\n" + + "1. ERROR in X.java (at line 1)\n" + + " public record X<T> {\n" + + " ^\n" + + "Syntax error, insert \"RecordHeader\" to complete RecordHeaderPart\n" + + "----------\n", + null, + true, + new String[] {"--enable-preview"}, + getCompilerOptions()); + } + // Test that a record without any record components was indeed compiled + // to be a record at runtime + public void testBug565732_03() { + runConformTest( + new String[] { + "X.java", + "public record X() {\n" + + " public static void main(String[] args) {\n" + + " System.out.println(X.class.getSuperclass().getName());\n" + + " }\n" + + "}" + }, + "java.lang.Record"); + } + // Test that a record without any record components was indeed compiled + // to be a record at runtime + public void testBug565732_04() { + runConformTest( + new String[] { + "X.java", + "public record X<T>() {\n" + + " public static void main(String[] args) {\n" + + " System.out.println(X.class.getSuperclass().getName());\n" + + " }\n" + + "}" + }, + "java.lang.Record"); + } + // Test that a "record" can be used as a method name and invoked inside a record + public void testBug565732_05() { + runConformTest( + new String[] { + "X.java", + "public record X<T>() {\n" + + " public static void main(String[] args) {\n" + + " record();\n" + + " }\n" + + " public static void record() {\n" + + " System.out.println(\"record()\");\n" + + " }\n" + + "}" + }, + "record()"); + } + // Test that a "record" can be used as a label and invoked inside a record + public void testBug565732_06() { + runConformTest( + new String[] { + "X.java", + "public record X<T>() {\n" + + " public static void main(String[] args) {\n" + + " boolean flag = true;\n" + + " record: {\n" + + " if (flag) {\n" + + " System.out.println(\"record:\");\n" + + " flag = false;\n" + + " break record;\n" + + " }\n" + + " }\n" + + " }\n" + + "}" + }, + "record:"); + } + public void testBug565732_07() { + runNegativeTest( + new String[] { + "X.java", + "public class X {\n" + + " record R {};\n" + + "}" + }, + "----------\n" + + "1. ERROR in X.java (at line 2)\n" + + " record R {};\n" + + " ^\n" + + "Syntax error, insert \"RecordHeader\" to complete RecordHeaderPart\n" + + "----------\n", + null, + true, + new String[] {"--enable-preview"}, + getCompilerOptions()); + } + public void testBug565732_08() { + runConformTest( + new String[] { + "X.java", + "public class X {\n" + + " public static void main(String[] args) {\n" + + " System.out.println(R.class.getSuperclass().getName());\n" + + " }\n" + + " record R() {};\n" + + "}" + }, + "java.lang.Record"); + } } diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java index f9a9e109f2..2716a4eb5f 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java @@ -80,6 +80,11 @@ public enum JavaFeature { return options.enablePreviewFeatures; return this.getCompliance() <= options.sourceLevel; } + public boolean isSupported(long comp, boolean preview) { + if (this.isPreview) + return preview; + return this.getCompliance() <= comp; + } JavaFeature(long compliance, String name, char[][] restrictedKeywords, boolean isPreview) { this.compliance = compliance; diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java index 675f838dec..c575d0364e 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java @@ -32,6 +32,7 @@ import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; import org.eclipse.jdt.internal.compiler.ast.Statement; import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.impl.JavaFeature; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; import org.eclipse.jdt.internal.compiler.util.Util; @@ -5417,7 +5418,7 @@ int disambiguatedRestrictedIdentifierrecord(int restrictedIdentifierToken) { // and here's the kludge if (restrictedIdentifierToken != TokenNameRestrictedIdentifierrecord) return restrictedIdentifierToken; - if (this.sourceLevel < ClassFileConstants.JDK15 || !this.previewEnabled) + if (!JavaFeature.RECORDS.isSupported(this.complianceLevel, this.previewEnabled)) return TokenNameIdentifier; return disambiguaterecordWithLookAhead() ? @@ -5459,6 +5460,11 @@ private boolean disambiguaterecordWithLookAhead() { if (lookAhead1 == TokenNameIdentifier) { int lookAhead2 = this.vanguardScanner.getNextToken(); lookAhead2 = lookAhead2 == TokenNameLESS ? getNextTokenAfterTypeParameterHeader() : lookAhead2; + if (lookAhead2 == TokenNameLBRACE) { + // record X {} is considered a record (albeit illegal), + // This is so that we can issue an appropriate syntax error + return true; + } return lookAhead2 == TokenNameLPAREN; } } catch (InvalidInputException e) { |