[groovy] parse slashy literals as reference expressions (IDEA-194880)

This commit is contained in:
Daniil Ovchinnikov
2018-07-02 17:55:18 +03:00
parent f6f2b1126b
commit eb85d5294a
5 changed files with 33 additions and 5 deletions
@@ -7566,7 +7566,7 @@ public class GroovyGeneratedParser implements PsiParser, LightPsiParser {
// | 'this'
// | 'super'
// | code_reference_identifiers_soft &(reference_dot | '.&')
// | (STR_SQ | STR_DQ) &string_literal_as_reference
// | (STR_SQ | STR_DQ | regex_literal) &string_literal_as_reference
public static boolean unqualified_reference_expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "unqualified_reference_expression")) return false;
boolean r;
@@ -7630,7 +7630,7 @@ public class GroovyGeneratedParser implements PsiParser, LightPsiParser {
return r;
}
// (STR_SQ | STR_DQ) &string_literal_as_reference
// (STR_SQ | STR_DQ | regex_literal) &string_literal_as_reference
private static boolean unqualified_reference_expression_4(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "unqualified_reference_expression_4")) return false;
boolean r;
@@ -7641,12 +7641,13 @@ public class GroovyGeneratedParser implements PsiParser, LightPsiParser {
return r;
}
// STR_SQ | STR_DQ
// STR_SQ | STR_DQ | regex_literal
private static boolean unqualified_reference_expression_4_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "unqualified_reference_expression_4_0")) return false;
boolean r;
r = consumeTokenSmart(b, STR_SQ);
if (!r) r = consumeTokenSmart(b, STR_DQ);
if (!r) r = regex_literal(b, l + 1);
return r;
}
@@ -839,7 +839,7 @@ unqualified_reference_expression ::= IDENTIFIER soft_type_argument_list?
| 'this'
| 'super'
| code_reference_identifiers_soft &(reference_dot | '.&')
| (STR_SQ | STR_DQ) &string_literal_as_reference
| (STR_SQ | STR_DQ | regex_literal) &string_literal_as_reference
{
elementType = reference_expression
}
@@ -636,6 +636,8 @@ class ExpressionsParsingTest extends GroovyParsingTestCase {
void testcommandExpr$literalInvoked() { doTest() }
void testcommandExpr$slashyInvoked() { doTest() }
void testcommandExpr$safeIndex() { doTest() }
void testcommandExpr$safeIndexEmpty() { doTest() }
@@ -0,0 +1,25 @@
/a/ b
$/a/$ b
-----
Groovy script
Call expression
Reference expression
GroovyASTPsiElementImpl(SLASHY_LITERAL)
PsiElement(regex begin)('/')
PsiElement(regex content)('a')
PsiElement(regex end)('/')
PsiWhiteSpace(' ')
Command arguments
Reference expression
PsiElement(identifier)('b')
PsiElement(new line)('\n')
Call expression
Reference expression
GroovyASTPsiElementImpl(DOLLAR_SLASHY_LITERAL)
PsiElement($/ regex begin)('$/')
PsiElement($/ regex content)('a')
PsiElement($/ regex end)('/$')
PsiWhiteSpace(' ')
Command arguments
Reference expression
PsiElement(identifier)('b')
@@ -3,7 +3,7 @@
-----
Groovy script
Call expression
Literal
Reference expression
GroovyASTPsiElementImpl(SLASHY_LITERAL)
PsiElement(regex begin)('/')
PsiElement(regex content)('asd\n')