groovy switch parsing should preseve brace nesting

This commit is contained in:
peter
2011-03-10 11:39:42 +01:00
parent 79941fc64e
commit aae19da658
4 changed files with 164 additions and 0 deletions
@@ -104,6 +104,13 @@ public class SwitchStatement implements GroovyElementTypes {
parser.parseSwitchCaseList(builder);
}
sectionMarker.done(CASE_SECTION);
if (builder.getTokenType() != kCASE && builder.getTokenType() != kDEFAULT && builder.getTokenType() != mRCURLY) {
builder.error("case, default or } expected");
while (!builder.eof() && builder.getTokenType() != kCASE && builder.getTokenType() != kDEFAULT && builder.getTokenType() != mRCURLY) {
builder.advanceLexer();
}
}
}
ParserUtils.getToken(builder, mRCURLY, GroovyBundle.message("rcurly.expected"));
}
@@ -98,5 +98,20 @@ class GroovyReparseTest extends LightCodeInsightFixtureTestCase {
""", "switch "
}
public void testSwitchCaseDot() throws Exception {
checkReparse """
def foo() {
switch(x) {
case 2:
return <caret>
case 3:
return false
case 4:
return false
}
}
""", "foo."
}
}
+72
View File
@@ -0,0 +1,72 @@
Groovy script
PsiElement(new line)('\n ')
Method
Modifiers
PsiElement(def)('def')
PsiWhiteSpace(' ')
PsiElement(identifier)('foo')
PsiElement(()('(')
Parameter list
<empty list>
PsiElement())(')')
PsiWhiteSpace(' ')
Throw clause
<empty list>
Open block
PsiElement({)('{')
PsiWhiteSpace('\n ')
Switch statement
PsiElement(switch)('switch')
PsiElement(()('(')
Reference expression
PsiElement(identifier)('x')
PsiElement())(')')
PsiWhiteSpace(' ')
PsiElement({)('{')
PsiWhiteSpace('\n ')
Case section
Case label
PsiElement(case)('case')
PsiWhiteSpace(' ')
Literal
PsiElement(Integer)('2')
PsiElement(:)(':')
PsiElement(new line)('\n ')
RETURN statement
PsiElement(return)('return')
PsiWhiteSpace(' ')
Reference expression
Reference expression
PsiElement(identifier)('foo')
PsiElement(.)('.')
PsiElement(new line)('\n ')
PsiElement(case)('case')
PsiWhiteSpace(' ')
Literal
PsiElement(Integer)('3')
PsiErrorElement:case, default or } expected
<empty list>
PsiElement(:)(':')
PsiElement(new line)('\n ')
PsiElement(return)('return')
PsiWhiteSpace(' ')
PsiElement(false)('false')
PsiElement(new line)('\n ')
Case section
Case label
PsiElement(case)('case')
PsiWhiteSpace(' ')
Literal
PsiElement(Integer)('4')
PsiElement(:)(':')
PsiElement(new line)('\n ')
RETURN statement
PsiElement(return)('return')
PsiWhiteSpace(' ')
Literal
PsiElement(false)('false')
PsiElement(new line)('\n ')
PsiElement(})('}')
PsiElement(new line)('\n ')
PsiElement(})('}')
PsiElement(new line)('\n')
@@ -0,0 +1,70 @@
Groovy script
PsiElement(new line)('\n ')
Method
Modifiers
PsiElement(def)('def')
PsiWhiteSpace(' ')
PsiElement(identifier)('foo')
PsiElement(()('(')
Parameter list
<empty list>
PsiElement())(')')
PsiWhiteSpace(' ')
Throw clause
<empty list>
Open block
PsiElement({)('{')
PsiWhiteSpace('\n ')
Switch statement
PsiElement(switch)('switch')
PsiElement(()('(')
Reference expression
PsiElement(identifier)('x')
PsiElement())(')')
PsiWhiteSpace(' ')
PsiElement({)('{')
PsiWhiteSpace('\n ')
Case section
Case label
PsiElement(case)('case')
PsiWhiteSpace(' ')
Literal
PsiElement(Integer)('2')
PsiElement(:)(':')
PsiElement(new line)('\n ')
RETURN statement
PsiElement(return)('return')
PsiWhiteSpace(' ')
PsiElement(new line)('\n ')
Case section
Case label
PsiElement(case)('case')
PsiWhiteSpace(' ')
Literal
PsiElement(Integer)('3')
PsiElement(:)(':')
PsiElement(new line)('\n ')
RETURN statement
PsiElement(return)('return')
PsiWhiteSpace(' ')
Literal
PsiElement(false)('false')
PsiElement(new line)('\n ')
Case section
Case label
PsiElement(case)('case')
PsiWhiteSpace(' ')
Literal
PsiElement(Integer)('4')
PsiElement(:)(':')
PsiElement(new line)('\n ')
RETURN statement
PsiElement(return)('return')
PsiWhiteSpace(' ')
Literal
PsiElement(false)('false')
PsiElement(new line)('\n ')
PsiElement(})('}')
PsiElement(new line)('\n ')
PsiElement(})('}')
PsiElement(new line)('\n')