Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Arthanareeswaran2020-08-13 10:10:25 +0000
committerJay Arthanareeswaran2020-08-13 12:35:15 +0000
commit2718f4861eb3702ce5f77ac30c337e89b1d86efa (patch)
treea07eb7baade1882b11c11122f9584137f48ef52c
parentb8a1a3b13e6305805d702258b6ae0129d0f7f338 (diff)
downloadeclipse.jdt.core-2718f4861eb3702ce5f77ac30c337e89b1d86efa.tar.gz
eclipse.jdt.core-2718f4861eb3702ce5f77ac30c337e89b1d86efa.tar.xz
eclipse.jdt.core-2718f4861eb3702ce5f77ac30c337e89b1d86efa.zip
Bug 565732 - [15] record declaration without parenthesis not flagged
error Change-Id: I02c33f35b0b56c1bda377e40a654657e49539858 Signed-off-by: Jay Arthanareeswaran <jarthana@in.ibm.com>
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java132
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/JavaFeature.java5
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java8
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) {

Back to the top