From ce0c1dbd01cba02b8a4089e88a661a506532bdae Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Mon, 21 May 2018 20:36:04 +0300 Subject: [PATCH] [groovy] parser: argument list parsing & recovery (IDEA-191728) --- .../groovy/lang/parser/GroovyBnfParser.java | 219 ++++++++++++++++-- .../plugins/groovy/lang/parser/groovy.bnf | 22 +- .../plugins/groovy/lang/parser/parserUtils.kt | 10 +- .../expressions/arguments/ArgumentList.java | 34 ++- .../lang/parser/ExpressionsParsingTest.groovy | 2 + ...finishArgumentListOnKeywordOccurrence.test | 9 +- .../groovy/expressions/parenthed/paren6.test | 2 +- .../groovy/expressions/path/method/ind2.test | 2 +- .../expressions/path/method/method10.test | 8 +- .../expressions/path/method/method14.test | 13 ++ .../expressions/path/method/method4.test | 4 +- .../expressions/path/method/method5.test | 4 +- .../expressions/path/method/method6.test | 2 +- .../expressions/path/method/method8.test | 2 +- .../expressions/path/method/method9.test | 16 +- .../expressions/propertyAccessError.test | 2 +- .../groovy/expressions/special/list3.test | 2 +- .../groovy/expressions/special/map3.test | 9 +- .../groovy/expressions/special/mapHang.test | 2 +- .../groovy/expressions/typecast/una3.test | 7 +- .../statements/declaration/meth_err13.test | 2 +- .../statements/declaration/meth_err14.test | 2 +- .../reparse/MultilineToNormalString.txt | 6 +- 23 files changed, 292 insertions(+), 89 deletions(-) create mode 100644 plugins/groovy/testdata/parsing/groovy/expressions/path/method/method14.test diff --git a/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/parser/GroovyBnfParser.java b/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/parser/GroovyBnfParser.java index 5bc3cc489292..4496d99d1f9c 100644 --- a/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/parser/GroovyBnfParser.java +++ b/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/parser/GroovyBnfParser.java @@ -948,6 +948,111 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { return r; } + /* ********************************************************** */ + // <>>> <>>> + static boolean argument_list_item(PsiBuilder b, int l, Parser _brace) { + if (!recursion_guard_(b, l, "argument_list_item")) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_); + r = argument_list_item_head(b, l + 1, _brace); + p = r; // pin = 1 + r = r && argument_list_item_end(b, l + 1, _brace); + exit_section_(b, l, m, r, p, null); + return r || p; + } + + /* ********************************************************** */ + // ',' | &<> + static boolean argument_list_item_end(PsiBuilder b, int l, Parser _brace) { + if (!recursion_guard_(b, l, "argument_list_item_end")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, T_COMMA); + if (!r) r = argument_list_item_end_1(b, l + 1, _brace); + exit_section_(b, m, null, r); + return r; + } + + // &<> + private static boolean argument_list_item_end_1(PsiBuilder b, int l, Parser _brace) { + if (!recursion_guard_(b, l, "argument_list_item_end_1")) return false; + boolean r; + Marker m = enter_section_(b, l, _AND_); + r = _brace.parse(b, l); + exit_section_(b, l, m, r, false, null); + return r; + } + + /* ********************************************************** */ + // <> <>>>>> + static boolean argument_list_item_head(PsiBuilder b, int l, Parser _brace) { + return argument_list_item_head0(b, l + 1, _brace, new Parser() { + public boolean parse(PsiBuilder b, int l) { + return argument_list_item_recovery(b, l + 1, _brace); + } + }); + } + + /* ********************************************************** */ + // !(end_of_file | <>) parse_argument + static boolean argument_list_item_head0(PsiBuilder b, int l, Parser _brace, Parser _recovery) { + if (!recursion_guard_(b, l, "argument_list_item_head0")) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_); + r = argument_list_item_head0_0(b, l + 1, _brace, _recovery); + p = r; // pin = 1 + r = r && parse_argument(b, l + 1); + exit_section_(b, l, m, r, p, _recovery); + return r || p; + } + + // !(end_of_file | <>) + private static boolean argument_list_item_head0_0(PsiBuilder b, int l, Parser _brace, Parser _recovery) { + if (!recursion_guard_(b, l, "argument_list_item_head0_0")) return false; + boolean r; + Marker m = enter_section_(b, l, _NOT_); + r = !argument_list_item_head0_0_0(b, l + 1, _brace, _recovery); + exit_section_(b, l, m, r, false, null); + return r; + } + + // end_of_file | <> + private static boolean argument_list_item_head0_0_0(PsiBuilder b, int l, Parser _brace, Parser _recovery) { + if (!recursion_guard_(b, l, "argument_list_item_head0_0_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = eof(b, l + 1); + if (!r) r = _brace.parse(b, l); + exit_section_(b, m, null, r); + return r; + } + + /* ********************************************************** */ + // !(<> | ',' | '}' | qualified_reference_expression_identifiers | expression_start | argument_label) + static boolean argument_list_item_recovery(PsiBuilder b, int l, Parser _brace) { + if (!recursion_guard_(b, l, "argument_list_item_recovery")) return false; + boolean r; + Marker m = enter_section_(b, l, _NOT_); + r = !argument_list_item_recovery_0(b, l + 1, _brace); + exit_section_(b, l, m, r, false, null); + return r; + } + + // <> | ',' | '}' | qualified_reference_expression_identifiers | expression_start | argument_label + private static boolean argument_list_item_recovery_0(PsiBuilder b, int l, Parser _brace) { + if (!recursion_guard_(b, l, "argument_list_item_recovery_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = _brace.parse(b, l); + if (!r) r = consumeToken(b, T_COMMA); + if (!r) r = consumeToken(b, T_RBRACE); + if (!r) r = qualified_reference_expression_identifiers(b, l + 1); + if (!r) r = expression_start(b, l + 1); + if (!r) r = argument_label(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + /* ********************************************************** */ // mandatory_expression optional_expression* public static boolean array_declarator(PsiBuilder b, int l) { @@ -1172,6 +1277,25 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { return r; } + /* ********************************************************** */ + // bracket_argument_list_item* + static boolean bracket_argument_list_inner(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "bracket_argument_list_inner")) return false; + int c = current_position_(b); + while (true) { + if (!bracket_argument_list_item(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "bracket_argument_list_inner", c)) break; + c = current_position_(b); + } + return true; + } + + /* ********************************************************** */ + // <> + static boolean bracket_argument_list_item(PsiBuilder b, int l) { + return argument_list_item(b, l + 1, T_RBRACK_parser_); + } + /* ********************************************************** */ // 'break' IDENTIFIER? public static boolean break_statement(PsiBuilder b, int l) { @@ -1193,26 +1317,47 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { } /* ********************************************************** */ - // empty_pars | '(' parse_paren_argument_list ')' + // '(' (')') | '(' paren_argument_list_inner ')' public static boolean call_argument_list(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "call_argument_list")) return false; if (!nextTokenIsFast(b, T_LPAREN)) return false; boolean r; Marker m = enter_section_(b); - r = empty_pars(b, l + 1); + r = call_argument_list_0(b, l + 1); if (!r) r = call_argument_list_1(b, l + 1); exit_section_(b, m, ARGUMENT_LIST, r); return r; } - // '(' parse_paren_argument_list ')' + // '(' (')') + private static boolean call_argument_list_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "call_argument_list_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeTokenFast(b, T_LPAREN); + r = r && call_argument_list_0_1(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // (')') + private static boolean call_argument_list_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "call_argument_list_0_1")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeTokenFast(b, T_RPAREN); + exit_section_(b, m, null, r); + return r; + } + + // '(' paren_argument_list_inner ')' private static boolean call_argument_list_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "call_argument_list_1")) return false; boolean r, p; Marker m = enter_section_(b, l, _NONE_); r = consumeTokenFast(b, T_LPAREN); p = r; // pin = 1 - r = r && report_error_(b, parseArgumentList(b, l + 1, T_RPAREN, argument_parser_)); + r = r && report_error_(b, paren_argument_list_inner(b, l + 1)); r = p && consumeToken(b, T_RPAREN) && r; exit_section_(b, l, m, r, p, null); return r || p; @@ -2813,18 +2958,6 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { return true; } - /* ********************************************************** */ - // '(' ')' - static boolean empty_pars(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "empty_pars")) return false; - if (!nextTokenIsFast(b, T_LPAREN)) return false; - boolean r; - Marker m = enter_section_(b); - r = consumeTokens(b, 0, T_LPAREN, T_RPAREN); - exit_section_(b, m, null, r); - return r; - } - /* ********************************************************** */ // empty public static boolean empty_throws_clause(PsiBuilder b, int l) { @@ -3587,7 +3720,7 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { } /* ********************************************************** */ - // !empty_map '[' parse_bracket_argument_list ']' + // !empty_map '[' bracket_argument_list_inner ']' public static boolean index_expression_argument_list(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "index_expression_argument_list")) return false; boolean r, p; @@ -3595,7 +3728,7 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { r = index_expression_argument_list_0(b, l + 1); r = r && consumeTokenFast(b, T_LBRACK); p = r; // pin = 2 - r = r && report_error_(b, parseArgumentList(b, l + 1, T_RBRACK, argument_parser_)); + r = r && report_error_(b, bracket_argument_list_inner(b, l + 1)); r = p && consumeToken(b, T_RBRACK) && r; exit_section_(b, l, m, r, p, null); return r || p; @@ -4232,14 +4365,14 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { } /* ********************************************************** */ - // '[' parse_bracket_argument_list ']' + // '[' bracket_argument_list_inner ']' static boolean non_empty_list_or_map(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "non_empty_list_or_map")) return false; if (!nextTokenIs(b, T_LBRACK)) return false; boolean r, p; Marker m = enter_section_(b, l, _NONE_); r = consumeToken(b, T_LBRACK); - r = r && parseArgumentList(b, l + 1, T_RBRACK, argument_parser_); + r = r && bracket_argument_list_inner(b, l + 1); p = r; // pin = 2 r = r && consumeToken(b, T_RBRACK); exit_section_(b, l, m, r, p, null); @@ -4498,6 +4631,36 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { return r; } + /* ********************************************************** */ + // paren_argument_list_item* <> + static boolean paren_argument_list_inner(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "paren_argument_list_inner")) return false; + boolean r; + Marker m = enter_section_(b); + r = paren_argument_list_inner_0(b, l + 1); + r = r && clearError(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // paren_argument_list_item* + private static boolean paren_argument_list_inner_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "paren_argument_list_inner_0")) return false; + int c = current_position_(b); + while (true) { + if (!paren_argument_list_item(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "paren_argument_list_inner_0", c)) break; + c = current_position_(b); + } + return true; + } + + /* ********************************************************** */ + // <> + static boolean paren_argument_list_item(PsiBuilder b, int l) { + return argument_list_item(b, l + 1, T_RPAREN_parser_); + } + /* ********************************************************** */ // '('')' | '(' <>>> ')' static boolean paren_list(PsiBuilder b, int l, Parser _item) { @@ -4588,6 +4751,12 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { return r; } + /* ********************************************************** */ + // <> + static boolean parse_argument(PsiBuilder b, int l) { + return parseArgument(b, l + 1, argument_parser_); + } + /* ********************************************************** */ // <> static boolean parse_block_declaration(PsiBuilder b, int l) { @@ -7052,6 +7221,16 @@ public class GroovyBnfParser implements PsiParser, LightPsiParser { return consumeTokenFast(b, T_LBRACE); } }; + final static Parser T_RBRACK_parser_ = new Parser() { + public boolean parse(PsiBuilder b, int l) { + return consumeToken(b, T_RBRACK); + } + }; + final static Parser T_RPAREN_parser_ = new Parser() { + public boolean parse(PsiBuilder b, int l) { + return consumeToken(b, T_RPAREN); + } + }; final static Parser angle_list_item_recovery_parser_ = new Parser() { public boolean parse(PsiBuilder b, int l) { return commaAngleRecovery(b, l + 1); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/groovy.bnf b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/groovy.bnf index 824d5e2c6027..dad298d2d0ab 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/groovy.bnf +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/groovy.bnf @@ -935,7 +935,7 @@ list_or_map ::= empty_list | empty_map | non_empty_list_or_map private empty_map ::= '[' mb_nl ':' mb_nl ']' private empty_list ::= '[' mb_nl ']' -private non_empty_list_or_map ::= '[' parse_bracket_argument_list ']' +private non_empty_list_or_map ::= '[' bracket_argument_list_inner ']' { pin = 2 } @@ -981,7 +981,7 @@ private cast_expression_no_pin ::= '(' type_element ')' priority1_4 private priority1_5 ::= index_expression | postfix_unary_expression index_expression ::= expression index_expression_argument_list -index_expression_argument_list ::= !empty_map '[' parse_bracket_argument_list ']' +index_expression_argument_list ::= !empty_map '[' bracket_argument_list_inner ']' { pin = 2 elementType = argument_list @@ -1089,19 +1089,29 @@ fake argument_list ::= empty_argument_list ::= { elementType = argument_list } private call_argument_list_start ::= &'(' // adds a variant, to achieve "'(' expected" generated message -call_argument_list ::= empty_pars | '(' parse_paren_argument_list ')' +call_argument_list ::= '(' (')') | '(' paren_argument_list_inner ')' { elementType = argument_list pin('call_argument_list_1') = 1 consumeTokenMethod = 'consumeTokenFast' } -private external parse_paren_argument_list ::= parseArgumentList 'T_RPAREN' argument -private external parse_bracket_argument_list ::= parseArgumentList 'T_RBRACK' argument +private paren_argument_list_inner ::= paren_argument_list_item* <> +private bracket_argument_list_inner ::= bracket_argument_list_item* + +private paren_argument_list_item ::= <> +private bracket_argument_list_item ::= <> + +private meta argument_list_item ::= <>>> <>>> { pin = 1 } +private meta argument_list_item_head ::= <> <>>>>> +private meta argument_list_item_head0 ::= !(end_of_file | <>) parse_argument { pin = 1 recoverWhile = '<>' } +private meta argument_list_item_end ::= ',' | &<> +private meta argument_list_item_recovery ::= !(<> | ',' | '}' | qualified_reference_expression_identifiers | expression_start | argument_label) application_argument_list ::= <> private application_arguments ::= argument (',' mb_nl argument)* +private parse_argument ::= <> private argument ::= spread_list_argument | named_argument | <> spread_list_argument ::= !<> '*' expression { consumeTokenMethod = 'consumeTokenFast' } named_argument ::= argument_label named_argument_tail @@ -1202,7 +1212,7 @@ private nl ::= NL { consumeTokenMethod = 'consumeTokenFast' } private meta mb_nl_group ::= <> | nl <> // allows error reporting in position before the new line private empty ::= () private external fail ::= noMatch -private empty_pars ::= '(' ')' { consumeTokenMethod = 'consumeTokenFast' } +private external end_of_file ::= eof // endregion diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parserUtils.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parserUtils.kt index 36ad4f8b9ccf..87160d1a55ea 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parserUtils.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parserUtils.kt @@ -13,7 +13,6 @@ import com.intellij.openapi.util.Key import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.TokenSet import org.jetbrains.plugins.groovy.GroovyBundle -import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.expressions.arguments.ArgumentList import org.jetbrains.plugins.groovy.lang.psi.GroovyElementTypes.* import org.jetbrains.plugins.groovy.util.get import org.jetbrains.plugins.groovy.util.getAndReset @@ -122,9 +121,9 @@ fun codeReferenceTypeArguments(builder: PsiBuilder, level: Int, typeArgumentsPar return true } -fun parseArgumentList(builder: PsiBuilder, level: Int, closingBrace: IElementType, argumentParser: Parser): Boolean { +fun parseArgument(builder: PsiBuilder, level: Int, argumentParser: Parser): Boolean { return builder.withKey(parseArguments, true) { - ArgumentList.parseArgumentList(builder, level, closingBrace, argumentParser) + argumentParser.parse(builder, level) } } @@ -314,3 +313,8 @@ fun clearVariants(builder: PsiBuilder, level: Int): Boolean { fun replaceVariants(builder: PsiBuilder, level: Int, variant: String): Boolean { return clearVariants(builder, level) && addVariant(builder, level, variant) } + +fun clearError(builder: PsiBuilder, level: Int): Boolean { + ErrorState.get(builder).currentFrame.errorReportedAt = -1 + return true +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/arguments/ArgumentList.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/arguments/ArgumentList.java index 58c28760c00f..2b5d326e6a6d 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/arguments/ArgumentList.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/arguments/ArgumentList.java @@ -1,8 +1,22 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.jetbrains.plugins.groovy.lang.parser.parsing.statements.expressions.arguments; import com.intellij.lang.PsiBuilder; -import com.intellij.lang.parser.GeneratedParserUtilBase.Parser; import com.intellij.openapi.util.Pair; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; @@ -36,17 +50,14 @@ public class ArgumentList { GroovyTokenTypes.kTRY, GroovyTokenTypes.kVOLATILE, GroovyTokenTypes.kWHILE); - public static void parseArgumentList(PsiBuilder builder, IElementType closingBrace, GroovyParser parser) { - parseArgumentList(builder, 0, closingBrace, (b, l) -> argumentParse(b, parser)); - } - public static boolean parseArgumentList(PsiBuilder builder, int level, IElementType closingBrace, Parser argumentParser) { - boolean hasFirstArg = argumentParser.parse(builder, level + 1); + public static void parseArgumentList(PsiBuilder builder, IElementType closingBrace, GroovyParser parser) { + boolean hasFirstArg = argumentParse(builder, parser); if (!hasFirstArg) { if (!closingBrace.equals(builder.getTokenType())) { builder.error(GroovyBundle.message("expression.expected")); } - if (GroovyTokenTypes.mRCURLY.equals(builder.getTokenType())) return true; + if (GroovyTokenTypes.mRCURLY.equals(builder.getTokenType())) return; if (!GroovyTokenTypes.mCOMMA.equals(builder.getTokenType()) && !closingBrace.equals(builder.getTokenType())) { @@ -63,14 +74,14 @@ public class ArgumentList { } ParserUtils.getToken(builder, GroovyTokenTypes.mNLS); if (hasErrors && CONTROL_KEYWORDS.contains(builder.getTokenType())) { - return true; + return; } - if (!argumentParser.parse(builder, level + 1)) { + if (!argumentParse(builder, parser)) { if (!closingBrace.equals(builder.getTokenType())) { builder.error(GroovyBundle.message("expression.expected")); hasErrors = true; } - if (GroovyTokenTypes.mRCURLY.equals(builder.getTokenType())) return true; + if (GroovyTokenTypes.mRCURLY.equals(builder.getTokenType())) return; if (!GroovyTokenTypes.mCOMMA.equals(builder.getTokenType()) && !closingBrace.equals(builder.getTokenType())) { @@ -81,7 +92,6 @@ public class ArgumentList { } ParserUtils.getToken(builder, GroovyTokenTypes.mNLS); - return true; } /** diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy index 899159bd8b73..adc893c51d0c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy @@ -279,6 +279,8 @@ class ExpressionsParsingTest extends GroovyParsingTestCase { void testpath$method$method9() throws Throwable { doTest() } + void testpath$method$method14() { doTest() } + void testpath$path1() throws Throwable { doTest() } void testpath$path13() throws Throwable { doTest() } diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/finishArgumentListOnKeywordOccurrence.test b/plugins/groovy/testdata/parsing/groovy/expressions/finishArgumentListOnKeywordOccurrence.test index a0f01a9ad5dc..310a5e7f3f50 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/finishArgumentListOnKeywordOccurrence.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/finishArgumentListOnKeywordOccurrence.test @@ -37,10 +37,9 @@ Groovy script PsiElement([)('[') Reference expression PsiElement(identifier)('param') - PsiErrorElement:',' or ']' expected - - PsiElement())(')') - PsiErrorElement:',' or ']' expected + PsiErrorElement:')' unexpected + PsiElement())(')') + PsiErrorElement:',', or ']' expected, got 'case' PsiWhiteSpace('\n ') Case section @@ -64,7 +63,7 @@ Groovy script Reference expression PsiElement(identifier)('param') PsiElement(])(']') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')' or ',' expected, got 'case' PsiWhiteSpace('\n ') Case section diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/parenthed/paren6.test b/plugins/groovy/testdata/parsing/groovy/expressions/parenthed/paren6.test index e4433d1b128f..a3aaa7bf046e 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/parenthed/paren6.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/parenthed/paren6.test @@ -12,5 +12,5 @@ Groovy script PsiElement(identifier)('a') PsiElement(.)('.') PsiElement(identifier)('toString') - PsiErrorElement:')' expected + PsiErrorElement:')' or ',' expected \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/ind2.test b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/ind2.test index 6d4c8f3ee477..99ce297baccc 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/ind2.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/ind2.test @@ -8,5 +8,5 @@ Groovy script PsiElement([)('[') Literal PsiElement(string)(''name'') - PsiErrorElement:']' expected + PsiErrorElement:',' or ']' expected \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method10.test b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method10.test index 548d92e2efd7..24675fd4bb94 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method10.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method10.test @@ -12,16 +12,16 @@ Groovy script Literal PsiElement(Integer)('1') PsiElement(,)(',') - PsiErrorElement:Expression expected + PsiErrorElement: expected, got ',' PsiElement(,)(',') - PsiErrorElement:Expression expected + PsiErrorElement: expected, got ',' PsiElement(,)(',') - PsiErrorElement:Expression expected + PsiErrorElement: expected, got ',' PsiElement(,)(',') - PsiErrorElement:Expression expected + PsiErrorElement: expected, got ',' PsiElement(,)(',') Literal diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method14.test b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method14.test new file mode 100644 index 000000000000..49b945150bdf --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method14.test @@ -0,0 +1,13 @@ +a(, +----- +Groovy script + Method call + Reference expression + PsiElement(identifier)('a') + Arguments + PsiElement(()('(') + PsiErrorElement: expected, got ',' + + PsiElement(,)(',') + PsiErrorElement:')' expected + \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method4.test b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method4.test index 2621fb37bb69..b92030215c3b 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method4.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method4.test @@ -13,12 +13,12 @@ Groovy script PsiWhiteSpace(' ') Literal PsiElement(Integer)('3') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')' or ',' expected, got '3' PsiWhiteSpace(' ') Literal PsiElement(Integer)('3') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')' or ',' expected, got '3' PsiWhiteSpace(' ') Literal diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method5.test b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method5.test index 41c75e6fc5d6..ea4e394f5f86 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method5.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method5.test @@ -17,7 +17,7 @@ Groovy script PsiWhiteSpace(' ') Reference expression PsiElement(identifier)('c') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')' or ',' expected, got '3' PsiWhiteSpace('\n') Method call @@ -29,5 +29,5 @@ Groovy script Arguments PsiElement(()('(') PsiElement())(')') - PsiErrorElement:')' expected + PsiErrorElement:')' or ',' expected \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method6.test b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method6.test index 0414d986e6d6..fe1c46ba6f36 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method6.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method6.test @@ -8,7 +8,7 @@ Groovy script PsiElement(identifier)('foo') Arguments PsiElement(()('(') - PsiErrorElement:Expression expected + PsiErrorElement: expected, got ',' PsiWhiteSpace('\n') PsiElement(,)(',') diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method8.test b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method8.test index 90f5fd94be04..25c4a3e80080 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method8.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method8.test @@ -13,7 +13,7 @@ Groovy script Literal PsiElement(Integer)('3') PsiElement(,)(',') - PsiErrorElement:Expression expected + PsiErrorElement: expected, got ',' PsiElement(,)(',') Literal diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method9.test b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method9.test index 64940c51eb4d..850cedeef08c 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method9.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/path/method/method9.test @@ -9,14 +9,9 @@ Groovy script PsiElement(identifier)('foo') Arguments PsiElement(()('(') - PsiErrorElement:Expression expected - + PsiErrorElement: expected, got '#' + PsiElement(wrong token)('#') PsiElement(wrong token)('#') - PsiErrorElement:Expression expected - - PsiElement(wrong token)('#') - PsiErrorElement:Expression expected - PsiElement(wrong token)('#') PsiElement(,)(',') PsiWhiteSpace(' ') @@ -27,12 +22,9 @@ Groovy script Literal PsiElement(Integer)('2') PsiElement(,)(',') - PsiErrorElement:Expression expected - PsiWhiteSpace(' ') - PsiElement(wrong token)('#') - PsiErrorElement:Expression expected - + PsiErrorElement: expected, got '#' + PsiElement(wrong token)('#') PsiElement(wrong token)('#') PsiElement(,)(',') PsiWhiteSpace(' ') diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/propertyAccessError.test b/plugins/groovy/testdata/parsing/groovy/expressions/propertyAccessError.test index 43288b142f46..6c2a9acba75d 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/propertyAccessError.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/propertyAccessError.test @@ -16,6 +16,6 @@ Groovy script Parameter list PsiElement(})('}') - PsiErrorElement:',' or ']' expected + PsiErrorElement:',' or ']' expected, got '}' PsiElement(})('}') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/special/list3.test b/plugins/groovy/testdata/parsing/groovy/expressions/special/list3.test index 6e80e7823668..1314fc341921 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/special/list3.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/special/list3.test @@ -6,7 +6,7 @@ Groovy script Literal PsiElement(Gstring)('"abc"') PsiElement(,)(',') - PsiErrorElement:Expression expected + PsiErrorElement: expected, got ',' PsiWhiteSpace(' ') PsiElement(,)(',') diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/special/map3.test b/plugins/groovy/testdata/parsing/groovy/expressions/special/map3.test index 9ada660c3cf5..48303f2d0bc1 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/special/map3.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/special/map3.test @@ -10,15 +10,10 @@ Groovy script Literal PsiElement(Integer)('3') PsiElement(,)(',') - PsiErrorElement:Expression expected - PsiWhiteSpace(' ') - PsiElement(wrong token)('#') - PsiErrorElement:',' or ']' expected - + PsiErrorElement: expected, got '#' + PsiElement(wrong token)('#') PsiElement(:)(':') - PsiErrorElement:',' or ']' expected - PsiWhiteSpace(' ') Literal PsiElement(Integer)('2') diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/special/mapHang.test b/plugins/groovy/testdata/parsing/groovy/expressions/special/mapHang.test index ee25b4738aeb..72d2029955f7 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/special/mapHang.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/special/mapHang.test @@ -250,5 +250,5 @@ Groovy script PsiElement(,)(',') PsiWhiteSpace('\n') PsiElement(])(']') - PsiErrorElement:']' expected + PsiErrorElement:',' or ']' expected \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/typecast/una3.test b/plugins/groovy/testdata/parsing/groovy/expressions/typecast/una3.test index ad3855781b31..7da414336656 100644 --- a/plugins/groovy/testdata/parsing/groovy/expressions/typecast/una3.test +++ b/plugins/groovy/testdata/parsing/groovy/expressions/typecast/una3.test @@ -13,12 +13,11 @@ Groovy script PsiElement(])(']') Arguments PsiElement([)('[') - PsiErrorElement:Expression expected - PsiWhiteSpace(' ') - PsiElement())(')') + PsiErrorElement: or ']' expected, got ')' + PsiElement())(')') PsiWhiteSpace(' ') Literal PsiElement(Integer)('3') - PsiErrorElement:']' expected + PsiErrorElement:',' or ']' expected \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/declaration/meth_err13.test b/plugins/groovy/testdata/parsing/groovy/statements/declaration/meth_err13.test index 526379971f7e..70dd0ab33ec5 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/declaration/meth_err13.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/declaration/meth_err13.test @@ -12,7 +12,7 @@ Groovy script PsiElement(()('(') builtin type class expression PsiElement(int)('int') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')' or ',' expected, got 'a' PsiWhiteSpace(' ') Reference expression diff --git a/plugins/groovy/testdata/parsing/groovy/statements/declaration/meth_err14.test b/plugins/groovy/testdata/parsing/groovy/statements/declaration/meth_err14.test index 3bfab74bd6b6..fd30ee37fbe9 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/declaration/meth_err14.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/declaration/meth_err14.test @@ -12,7 +12,7 @@ Groovy script PsiElement(()('(') Reference expression PsiElement(identifier)('Map') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')' or ',' expected, got 'm' PsiWhiteSpace(' ') Reference expression diff --git a/plugins/groovy/testdata/reparse/MultilineToNormalString.txt b/plugins/groovy/testdata/reparse/MultilineToNormalString.txt index 4be605bbeaf8..8fe9493e3468 100644 --- a/plugins/groovy/testdata/reparse/MultilineToNormalString.txt +++ b/plugins/groovy/testdata/reparse/MultilineToNormalString.txt @@ -36,11 +36,11 @@ Groovy script PsiElement(()('(') Literal PsiElement(Gstring)('""') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')' or ',' expected, got 'aaa' Reference expression PsiElement(identifier)('aaa') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')' or ',' expected, got '"' Compound Gstring PsiElement(Gstring begin)('"') @@ -49,7 +49,7 @@ Groovy script PsiErrorElement:Gstring end expected PsiElement(new line)('\n ') - PsiErrorElement:',' or ')' expected + PsiErrorElement:')', ',' or expected, got '}' PsiElement(})('}') PsiElement(new line)('\n\n ')