diff options
26 files changed, 102 insertions, 21 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java index 2203c52ee2..41f35fc078 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java @@ -1247,6 +1247,7 @@ public void test011_problem_categories() { expectedProblemAttributes.put("RecordAccessorMethodShouldNotBeStatic", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED)); expectedProblemAttributes.put("RecordCannotExtendRecord", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED)); expectedProblemAttributes.put("RecordComponentCannotBeVoid", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED)); + expectedProblemAttributes.put("RecordIllegalVararg", new ProblemAttributes(CategorizedProblem.CAT_PREVIEW_RELATED)); StringBuffer failures = new StringBuffer(); StringBuffer correctResult = new StringBuffer(70000); Field[] fields = (iProblemClass = IProblem.class).getFields(); @@ -2261,6 +2262,7 @@ public void test012_compiler_problems_tuning() { expectedProblemAttributes.put("RecordAccessorMethodShouldNotBeStatic", SKIP); expectedProblemAttributes.put("RecordCannotExtendRecord", SKIP); expectedProblemAttributes.put("RecordComponentCannotBeVoid", SKIP); + expectedProblemAttributes.put("RecordIllegalVararg", SKIP); Map constantNamesIndex = new HashMap(); Field[] fields = JavaCore.class.getFields(); for (int i = 0, length = fields.length; i < length; i++) { 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 b5e87dcd1f..ea5b478672 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 @@ -33,7 +33,7 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest { static { // TESTS_NUMBERS = new int [] { 40 }; // TESTS_RANGE = new int[] { 1, -1 }; -// TESTS_NAMES = new String[] { "testBug559281" }; +// TESTS_NAMES = new String[] { "testBug559448" }; } public static Class<?> testClass() { @@ -1805,4 +1805,66 @@ public void testBug559281_002() { "Illegal component name wait in record X;\n" + "----------\n"); } +public void testBug559448_001() { + runConformTest( + new String[] { + "X.java", + "class X {\n"+ + " public static void main(String[] args){\n"+ + " System.out.println(0);\n" + + " }\n"+ + "}\n"+ + "record Point(int x, int... y){\n"+ + "}\n" + }, + "0"); +} +public void testBug559448_002() { + this.runNegativeTest( + new String[] { + "X.java", + "class X {\n"+ + " public static void main(String[] args){\n"+ + " System.out.println(0);\n" + + " }\n"+ + "}\n"+ + "record Point(int... x, int y){\n"+ + "}\n" + }, + "----------\n" + + "1. ERROR in X.java (at line 6)\n" + + " record Point(int... x, int y){\n" + + " ^\n" + + "The variable argument type int of the record Point must be the last parameter\n" + + "----------\n" + + "2. ERROR in X.java (at line 6)\n" + + " record Point(int... x, int y){\n" + + " ^\n" + + "The variable argument type int of the method Point must be the last parameter\n" + + "----------\n"); +} +public void testBug559448_003() { + this.runNegativeTest( + new String[] { + "X.java", + "class X {\n"+ + " public static void main(String[] args){\n"+ + " System.out.println(0);\n" + + " }\n"+ + "}\n"+ + "record Point(int... x, int... y){\n"+ + "}\n" + }, + "----------\n" + + "1. ERROR in X.java (at line 6)\n" + + " record Point(int... x, int... y){\n" + + " ^\n" + + "The variable argument type int of the record Point must be the last parameter\n" + + "----------\n" + + "2. ERROR in X.java (at line 6)\n" + + " record Point(int... x, int... y){\n" + + " ^\n" + + "The variable argument type int of the method Point must be the last parameter\n" + + "----------\n"); +} }
\ No newline at end of file diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java index c82b97c247..0e88267098 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java @@ -2303,6 +2303,9 @@ void setSourceStart(int sourceStart); /** @since 3.21 BETA_JAVA14 * @noreference preview feature error */ int RecordComponentCannotBeVoid= PreviewRelated + 1753; + /** @since 3.21 BETA_JAVA14 + * @noreference preview feature error */ + int RecordIllegalVararg= PreviewRelated + 1754; /* records - end */ /* Java14 errors - end */ } diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java index cdccc15858..3aef1851f2 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java @@ -7224,7 +7224,7 @@ protected void consumeRule(int act) { consumeRecordComponentsopt(); break; - case 328 : if (DEBUG) { System.out.println("RecordComponents ::= RecordComponents COMMA..."); } //$NON-NLS-1$ + case 327 : if (DEBUG) { System.out.println("RecordComponents ::= RecordComponents COMMA..."); } //$NON-NLS-1$ consumeRecordComponents(); break; @@ -10837,6 +10837,9 @@ private void convertToFields(RecordDeclaration rd, Argument[] args) { problemReporter().recordComponentCannotBeVoid(rd, arg); continue; } + if (arg.isVarArgs() && i < max - 1) + problemReporter().recordIllegalVararg(arg, rd); + argsSet.add(argName); FieldDeclaration f = fields[nFields++] = createFieldDeclaration(arg.name, arg.sourceStart, arg.sourceEnd); f.bits = arg.bits; @@ -10944,7 +10947,7 @@ protected void consumeRecordComponent(boolean isVarArgs) { if (extendedDimensions == 0) { type.sourceEnd = endOfEllipsis; } -// type.bits |= ASTNode.IsVarArgs; // set isVarArgs + type.bits |= ASTNode.IsVarArgs; // set isVarArgs } int modifierPositions = this.intStack[this.intPtr--]; Argument arg; diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java index f40fbcfccb..68f93b97b3 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/ParserBasicInformation.java @@ -20,24 +20,25 @@ package org.eclipse.jdt.internal.compiler.parser; /*An interface that contains static declarations for some basic information about the parser such as the number of rules in the grammar, the starting state, etc...*/ public interface ParserBasicInformation { + public final static int - ERROR_SYMBOL = 132, - MAX_NAME_LENGTH = 41, - NUM_STATES = 1201, + ERROR_SYMBOL = 132, + MAX_NAME_LENGTH = 41, + NUM_STATES = 1199, - NT_OFFSET = 132, - SCOPE_UBOUND = 312, - SCOPE_SIZE = 313, - LA_STATE_OFFSET = 17816, - MAX_LA = 1, - NUM_RULES = 903, - NUM_TERMINALS = 132, - NUM_NON_TERMINALS = 418, - NUM_SYMBOLS = 550, - START_STATE = 1040, - EOFT_SYMBOL = 62, - EOLT_SYMBOL = 62, - ACCEPT_ACTION = 17815, - ERROR_ACTION = 17816; + NT_OFFSET = 132, + SCOPE_UBOUND = 312, + SCOPE_SIZE = 313, + LA_STATE_OFFSET = 17905, + MAX_LA = 1, + NUM_RULES = 903, + NUM_TERMINALS = 132, + NUM_NON_TERMINALS = 418, + NUM_SYMBOLS = 550, + START_STATE = 1037, + EOFT_SYMBOL = 62, + EOLT_SYMBOL = 62, + ACCEPT_ACTION = 17904, + ERROR_ACTION = 17905; } diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser1.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser1.rsc Binary files differindex d57985d1b1..6f304a8ba5 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser1.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser1.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser12.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser12.rsc Binary files differindex 9e81fd205a..9ab22f5846 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser12.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser12.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser13.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser13.rsc Binary files differindex c574d1763a..1e1ac78f44 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser13.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser13.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser14.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser14.rsc Binary files differindex aef8765967..3237e8bae8 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser14.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser14.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser15.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser15.rsc Binary files differindex d3e7f6606f..61fbbedd99 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser15.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser15.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser16.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser16.rsc Binary files differindex 2315753b1b..f8c234790d 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser16.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser16.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser17.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser17.rsc Binary files differindex 63c2914c5d..b62c97f284 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser17.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser17.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser2.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser2.rsc Binary files differindex 09e8bc845d..51bf942399 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser2.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser2.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser20.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser20.rsc Binary files differindex e7df088cd6..8207477499 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser20.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser20.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser21.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser21.rsc Binary files differindex 396f101f66..a95beca7f9 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser21.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser21.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser22.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser22.rsc Binary files differindex 58bead9f92..0e7a761d54 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser22.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser22.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser24.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser24.rsc Binary files differindex a060701fc7..c9b79f9097 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser24.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser24.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser3.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser3.rsc Binary files differindex 93c40e8997..87a06fdd9b 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser3.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser3.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser4.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser4.rsc Binary files differindex ac3f01e9e1..2810f217dc 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser4.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser4.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser5.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser5.rsc Binary files differindex 1df94acf3c..047304336e 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser5.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser5.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser6.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser6.rsc Binary files differindex c7230fc8f7..2fb937879d 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser6.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser6.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser8.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser8.rsc Binary files differindex 67b763ee18..ffdcbaf81d 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser8.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser8.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser9.rsc b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser9.rsc Binary files differindex 083646cb8f..89aa21b410 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser9.rsc +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/parser9.rsc diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java index b39698c6fc..cc3ab17b64 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java @@ -11638,4 +11638,13 @@ public void recordComponentCannotBeVoid(ASTNode recordDecl, Argument arg) { recordDecl.sourceStart, recordDecl.sourceEnd); } +public void recordIllegalVararg(Argument argType, RecordDeclaration recordDecl) { + String[] arguments = new String[] {CharOperation.toString(argType.type.getTypeName()), new String(recordDecl.name)}; + this.handle( + IProblem.RecordIllegalVararg, + arguments, + arguments, + argType.sourceStart, + argType.sourceEnd); +} }
\ No newline at end of file diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties index 0ddf7f09ee..4e4b3172c1 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties @@ -1047,6 +1047,7 @@ 1751 = The accessor method must not be static 1752 = The type {1} may not subclass {0} explicitly 1753 = void is an invalid type for the component {0} of a record +1754 = The variable argument type {0} of the record {1} must be the last parameter # Java 14 Preview - end diff --git a/org.eclipse.jdt.core/grammar/java.g b/org.eclipse.jdt.core/grammar/java.g index 65d6105666..2d308edb7e 100644 --- a/org.eclipse.jdt.core/grammar/java.g +++ b/org.eclipse.jdt.core/grammar/java.g @@ -1137,7 +1137,6 @@ RecordHeader ::= '(' RecordComponentsopt RecordComponentHeaderRightParen RecordComponentsopt ::= $empty /.$putCase consumeRecordComponentsopt(); $break ./ RecordComponentsopt -> RecordComponents -RecordComponentsopt -> VariableArityRecordComponent /:$readableName RecordComponentsopt:/ /:$compliance 14:/ @@ -1147,6 +1146,7 @@ RecordComponents ::= RecordComponents ',' RecordComponent /:$readableName RecordComponents:/ /:$compliance 14:/ +RecordComponent -> VariableArityRecordComponent RecordComponent ::= Modifiersopt Type VariableDeclaratorId /.$putCase consumeRecordComponent(false); $break ./ /:$readableName RecordComponent:/ |