From aae19da658c542e057ddf845f18127976c194e7d Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 10 Mar 2011 11:38:24 +0100 Subject: [PATCH] groovy switch parsing should preseve brace nesting --- .../parsing/statements/SwitchStatement.java | 7 ++ .../lang/parser/GroovyReparseTest.groovy | 15 ++++ .../testdata/reparse/SwitchCaseDot_after.txt | 72 +++++++++++++++++++ .../testdata/reparse/SwitchCaseDot_before.txt | 70 ++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 plugins/groovy/testdata/reparse/SwitchCaseDot_after.txt create mode 100644 plugins/groovy/testdata/reparse/SwitchCaseDot_before.txt diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/SwitchStatement.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/SwitchStatement.java index 5d30e5953ca6..81ce3348b5d7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/SwitchStatement.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/SwitchStatement.java @@ -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")); } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/GroovyReparseTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/GroovyReparseTest.groovy index 4c03321128ea..cf2faeeeee18 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/GroovyReparseTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/GroovyReparseTest.groovy @@ -98,5 +98,20 @@ class GroovyReparseTest extends LightCodeInsightFixtureTestCase { """, "switch " } + public void testSwitchCaseDot() throws Exception { + checkReparse """ + def foo() { + switch(x) { + case 2: + return + case 3: + return false + case 4: + return false + } + } +""", "foo." + } + } diff --git a/plugins/groovy/testdata/reparse/SwitchCaseDot_after.txt b/plugins/groovy/testdata/reparse/SwitchCaseDot_after.txt new file mode 100644 index 000000000000..bdddd8b0d6e5 --- /dev/null +++ b/plugins/groovy/testdata/reparse/SwitchCaseDot_after.txt @@ -0,0 +1,72 @@ +Groovy script + PsiElement(new line)('\n ') + Method + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + PsiElement(identifier)('foo') + PsiElement(()('(') + Parameter list + + PsiElement())(')') + PsiWhiteSpace(' ') + Throw clause + + 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 + + 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') diff --git a/plugins/groovy/testdata/reparse/SwitchCaseDot_before.txt b/plugins/groovy/testdata/reparse/SwitchCaseDot_before.txt new file mode 100644 index 000000000000..b626bc15f2f2 --- /dev/null +++ b/plugins/groovy/testdata/reparse/SwitchCaseDot_before.txt @@ -0,0 +1,70 @@ +Groovy script + PsiElement(new line)('\n ') + Method + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + PsiElement(identifier)('foo') + PsiElement(()('(') + Parameter list + + PsiElement())(')') + PsiWhiteSpace(' ') + Throw clause + + 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')