diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java index 4a870086053..0d95eae5a3f 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java +++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java @@ -1816,7 +1816,15 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { if (at(COLON) && lookahead(1) == IDENTIFIER) { errorAndAdvance("Unexpected type specification", 2); } - if (!at(COMMA)) break; + if (!at(COMMA)) { + if (atSet(EXPRESSION_FIRST)) { + error("Expecting ','"); + continue; + } + else { + break; + } + } advance(); // COMMA if (at(RPAR)) { error("Expecting an argument"); diff --git a/compiler/testData/diagnostics/tests/CharacterLiterals.kt b/compiler/testData/diagnostics/tests/CharacterLiterals.kt index b99ca7098fa..b2e07c99188 100644 --- a/compiler/testData/diagnostics/tests/CharacterLiterals.kt +++ b/compiler/testData/diagnostics/tests/CharacterLiterals.kt @@ -4,10 +4,10 @@ fun test(c : Char) { test('aa') test('a) test(' - test(0' - test('\n') - test('\\') - test('''') + test(0' + test('\n') + test('\\') + test('''') test('\'') test('\"') } diff --git a/compiler/testData/psi/FunctionExpressions_ERR.txt b/compiler/testData/psi/FunctionExpressions_ERR.txt index a2f1b01c6b1..29f2093393e 100644 --- a/compiler/testData/psi/FunctionExpressions_ERR.txt +++ b/compiler/testData/psi/FunctionExpressions_ERR.txt @@ -575,61 +575,64 @@ KtFile: FunctionExpressions_ERR.kt PsiElement(RPAR)(')') PsiWhiteSpace('\n\n\n ') CALL_EXPRESSION - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('bar') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('public') - PsiWhiteSpace(' ') - PsiErrorElement:Expecting ')' - PsiElement(fun)('fun') - PsiWhiteSpace(' ') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar') VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('public') + PsiErrorElement:Expecting ',' + + PsiWhiteSpace(' ') + VALUE_ARGUMENT + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') PsiElement(RPAR)(')') - PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line) - PsiElement(RPAR)(')') PsiWhiteSpace('\n ') CALL_EXPRESSION - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('bar') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('open') - PsiWhiteSpace(' ') - PsiErrorElement:Expecting ')' - PsiElement(fun)('fun') - PsiWhiteSpace(' ') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar') VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('open') + PsiErrorElement:Expecting ',' + + PsiWhiteSpace(' ') + VALUE_ARGUMENT + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') PsiElement(RPAR)(')') - PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line) - PsiElement(RPAR)(')') PsiWhiteSpace('\n ') CALL_EXPRESSION - CALL_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('bar') - VALUE_ARGUMENT_LIST - PsiElement(LPAR)('(') - VALUE_ARGUMENT - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('final') - PsiWhiteSpace(' ') - PsiErrorElement:Expecting ')' - PsiElement(fun)('fun') - PsiWhiteSpace(' ') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar') VALUE_ARGUMENT_LIST PsiElement(LPAR)('(') + VALUE_ARGUMENT + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('final') + PsiErrorElement:Expecting ',' + + PsiWhiteSpace(' ') + VALUE_ARGUMENT + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') PsiElement(RPAR)(')') - PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line) - PsiElement(RPAR)(')') PsiWhiteSpace('\n\n ') CALL_EXPRESSION REFERENCE_EXPRESSION @@ -659,4 +662,4 @@ KtFile: FunctionExpressions_ERR.kt PsiElement(IDENTIFIER)('V') PsiElement(RPAR)(')') PsiWhiteSpace('\n') - PsiElement(RBRACE)('}') \ No newline at end of file + PsiElement(RBRACE)('}') diff --git a/compiler/testData/psi/noCommaBetweenArguments.kt b/compiler/testData/psi/noCommaBetweenArguments.kt new file mode 100644 index 00000000000..e54ef261891 --- /dev/null +++ b/compiler/testData/psi/noCommaBetweenArguments.kt @@ -0,0 +1,22 @@ +fun foo() { + bar1( + A() + A() + ) + bar2(A() A()) + + bar3(x y) + bar4(x + y + ) + + bar5("" "") + bar6("" + "" + ) + + bar7({} {}) + bar8({} + {} + ) +} diff --git a/compiler/testData/psi/noCommaBetweenArguments.txt b/compiler/testData/psi/noCommaBetweenArguments.txt new file mode 100644 index 00000000000..bbe4eeb9a49 --- /dev/null +++ b/compiler/testData/psi/noCommaBetweenArguments.txt @@ -0,0 +1,182 @@ +KtFile: noCommaBetweenArguments.kt + PACKAGE_DIRECTIVE + + IMPORT_LIST + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar1') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiWhiteSpace('\n ') + VALUE_ARGUMENT + BINARY_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('A') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + OPERATION_REFERENCE + PsiElement(IDENTIFIER)('A') + PARENTHESIZED + PsiElement(LPAR)('(') + PsiErrorElement:Expecting an expression + + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar2') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + BINARY_EXPRESSION + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('A') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(IDENTIFIER)('A') + PARENTHESIZED + PsiElement(LPAR)('(') + PsiErrorElement:Expecting an expression + + PsiElement(RPAR)(')') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar3') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + BINARY_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('x') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(IDENTIFIER)('y') + PsiErrorElement:Expecting an element + + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar4') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + BINARY_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('x') + PsiWhiteSpace('\n ') + OPERATION_REFERENCE + PsiElement(IDENTIFIER)('y') + PsiErrorElement:Expecting an element + + PsiWhiteSpace('\n ') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar5') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + PsiElement(CLOSING_QUOTE)('"') + PsiErrorElement:Expecting ',' + + PsiWhiteSpace(' ') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + PsiElement(CLOSING_QUOTE)('"') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar6') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + PsiElement(CLOSING_QUOTE)('"') + PsiErrorElement:Expecting ',' + + PsiWhiteSpace('\n ') + VALUE_ARGUMENT + STRING_TEMPLATE + PsiElement(OPEN_QUOTE)('"') + PsiElement(CLOSING_QUOTE)('"') + PsiWhiteSpace('\n ') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar7') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + CALL_EXPRESSION + LAMBDA_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') + PsiWhiteSpace(' ') + LAMBDA_ARGUMENT + LAMBDA_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n ') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('bar8') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + VALUE_ARGUMENT + CALL_EXPRESSION + LAMBDA_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + LAMBDA_ARGUMENT + LAMBDA_EXPRESSION + FUNCTION_LITERAL + PsiElement(LBRACE)('{') + BLOCK + + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n ') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') diff --git a/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java index 0d1314fdeec..29b3a2fa71f 100644 --- a/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java @@ -521,6 +521,11 @@ public class ParsingTestGenerated extends AbstractParsingTest { runTest("compiler/testData/psi/NewlinesInParentheses.kt"); } + @TestMetadata("noCommaBetweenArguments.kt") + public void testNoCommaBetweenArguments() throws Exception { + runTest("compiler/testData/psi/noCommaBetweenArguments.kt"); + } + @TestMetadata("NonTypeBeforeDotInBaseClass.kt") public void testNonTypeBeforeDotInBaseClass() throws Exception { runTest("compiler/testData/psi/NonTypeBeforeDotInBaseClass.kt"); diff --git a/idea/testData/checker/regression/javaStyleClassLiteralInAnnotationArguments.kt b/idea/testData/checker/regression/javaStyleClassLiteralInAnnotationArguments.kt index 43615b3085d..430078b8aeb 100644 --- a/idea/testData/checker/regression/javaStyleClassLiteralInAnnotationArguments.kt +++ b/idea/testData/checker/regression/javaStyleClassLiteralInAnnotationArguments.kt @@ -2,5 +2,5 @@ annotation class A class B -@A(B.class) -fun f() {} \ No newline at end of file +@A(B.class) +fun f() {}