diff --git a/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/parser/GroovyGeneratedParser.java b/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/parser/GroovyGeneratedParser.java index 0e22ade07956..807da60cb741 100644 --- a/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/parser/GroovyGeneratedParser.java +++ b/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/parser/GroovyGeneratedParser.java @@ -7291,11 +7291,22 @@ public class GroovyGeneratedParser implements PsiParser, LightPsiParser { return r; } - // '?:' mb_nl + // mb_nl ('?:' mb_nl) private static boolean elvis_expression_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "elvis_expression_0")) return false; boolean r; Marker m = enter_section_(b); + r = mb_nl(b, l + 1); + r = r && elvis_expression_0_1(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // '?:' mb_nl + private static boolean elvis_expression_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "elvis_expression_0_1")) return false; + boolean r; + Marker m = enter_section_(b); r = consumeTokenSmart(b, T_ELVIS); r = r && mb_nl(b, l + 1); exit_section_(b, m, null, r); 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 bc3320d424a8..db7d6f2cc8e4 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 @@ -1076,7 +1076,7 @@ private conditionals ::= ternary_expression | elvis_expression ternary_expression ::= expression (ternary_tail_pin | ternary_tail) private ternary_tail_pin ::= '?' mb_nl !'[' expression mb_nl ':' mb_nl conditionals { pin = 3 consumeTokenMethod = 'consumeTokenFast' } private ternary_tail ::= '?' mb_nl expression mb_nl ':' mb_nl conditionals { pin = 5 consumeTokenMethod = 'consumeTokenFast' } -elvis_expression ::= expression '?:' mb_nl expression +elvis_expression ::= expression mb_nl ('?:' mb_nl) expression { rightAssociative = 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 84d88abe6491..8b6323ba18e1 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 @@ -81,6 +81,8 @@ class ExpressionsParsingTest extends GroovyParsingTestCase { void testconditional$elvis2() throws Throwable { doTest() } + void testconditional$elvisNlBeforeOperator() { doTest() } + void testconditional$ternaryQuestionOnly() { doTest() } void testconditional$ternaryWithoutElse() { doTest() } diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/conditional/elvisNlBeforeOperator.test b/plugins/groovy/testdata/parsing/groovy/expressions/conditional/elvisNlBeforeOperator.test new file mode 100644 index 000000000000..2d1239872cc2 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/conditional/elvisNlBeforeOperator.test @@ -0,0 +1,12 @@ +a +?: b +----- +Groovy script + Elvis expression + Reference expression + PsiElement(identifier)('a') + PsiElement(new line)('\n') + PsiElement(?:)('?:') + PsiWhiteSpace(' ') + Reference expression + PsiElement(identifier)('b') \ No newline at end of file