From ac231a6af671a9cf601cc0b1d9b2b02fc00b54e5 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Mon, 9 Jul 2018 22:23:40 +0300 Subject: [PATCH] [groovy] allow new line before elvis operand (IDEA-195296) --- .../groovy/lang/parser/GroovyGeneratedParser.java | 13 ++++++++++++- .../jetbrains/plugins/groovy/lang/parser/groovy.bnf | 2 +- .../lang/parser/ExpressionsParsingTest.groovy | 2 ++ .../conditional/elvisNlBeforeOperator.test | 12 ++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 plugins/groovy/testdata/parsing/groovy/expressions/conditional/elvisNlBeforeOperator.test 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