while condition doesn't eat }

This commit is contained in:
peter
2011-03-21 15:49:18 +01:00
parent 591dc13b3f
commit c39552a5b3
3 changed files with 127 additions and 18 deletions
@@ -92,17 +92,13 @@ public class GroovyParser implements PsiParser {
ParserUtils.getToken(builder, GroovyTokenTypes.mNLS);
if (!ParserUtils.getToken(builder, GroovyTokenTypes.mRPAREN, GroovyBundle.message("rparen.expected"))) {
while (!builder.eof() && GroovyTokenTypes.mNLS == builder.getTokenType()){
builder.advanceLexer();
}
while (ParserUtils.getToken(builder, mNLS)) {}
marker.done(FOR_STATEMENT);
return true;
}
PsiBuilder.Marker warn = builder.mark();
if (builder.getTokenType() == GroovyTokenTypes.mNLS) {
ParserUtils.getToken(builder, GroovyTokenTypes.mNLS);
}
ParserUtils.getToken(builder, GroovyTokenTypes.mNLS);
if (parseExtendedStatement(builder)) {
warn.rollbackTo();
@@ -239,14 +235,8 @@ public class GroovyParser implements PsiParser {
ParserUtils.getToken(builder, GroovyTokenTypes.mNLS);
if (!ParserUtils.getToken(builder, GroovyTokenTypes.mRPAREN, GroovyBundle.message("rparen.expected"))) {
while (!builder.eof() && !GroovyTokenTypes.mNLS.equals(builder.getTokenType()) && !GroovyTokenTypes.mRPAREN.equals(builder.getTokenType())) {
builder.advanceLexer();
builder.error(GroovyBundle.message("rparen.expected"));
}
if (!ParserUtils.getToken(builder, GroovyTokenTypes.mRPAREN)) {
marker.done(WHILE_STATEMENT);
return true;
}
marker.done(WHILE_STATEMENT);
return true;
}
PsiBuilder.Marker warn = builder.mark();
@@ -255,13 +245,12 @@ public class GroovyParser implements PsiParser {
if (!parseStatement(builder, true) && !parseExtendedStatement(builder)) {
warn.rollbackTo();
builder.error(GroovyBundle.message("expression.expected"));
marker.done(WHILE_STATEMENT);
return true;
} else {
warn.drop();
marker.done(WHILE_STATEMENT);
return true;
}
marker.done(WHILE_STATEMENT);
return true;
}
public void parseBlockBody(PsiBuilder builder) {
@@ -149,5 +149,16 @@ def foo() {
""", "\b"
}
public void testWhileRParen() {
checkReparse """
def foo() {
def cl = {
while (true<caret> {
//
}
}
}""", ";"
}
}
+109
View File
@@ -0,0 +1,109 @@
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 ')
Variable definitions
Modifiers
PsiElement(def)('def')
PsiWhiteSpace(' ')
Variable
PsiElement(identifier)('cl')
PsiWhiteSpace(' ')
PsiElement(=)('=')
PsiWhiteSpace(' ')
Closable block
PsiElement({)('{')
PsiWhiteSpace('\n ')
Parameter list
<empty list>
WHILE statement
PsiElement(while)('while')
PsiWhiteSpace(' ')
PsiElement(()('(')
Method call
Literal
PsiElement(true)('true')
PsiWhiteSpace(' ')
Arguments
<empty list>
Closable block
PsiElement({)('{')
PsiWhiteSpace('\n ')
PsiComment(line comment)('//')
PsiElement(new line)('\n ')
Parameter list
<empty list>
PsiElement(})('}')
PsiErrorElement:')' expected
<empty list>
PsiWhiteSpace('\n ')
PsiElement(})('}')
PsiWhiteSpace('\n')
PsiElement(})('}')
---
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 ')
Variable definitions
Modifiers
PsiElement(def)('def')
PsiWhiteSpace(' ')
Variable
PsiElement(identifier)('cl')
PsiWhiteSpace(' ')
PsiElement(=)('=')
PsiWhiteSpace(' ')
Closable block
PsiElement({)('{')
PsiWhiteSpace('\n ')
Parameter list
<empty list>
WHILE statement
PsiElement(while)('while')
PsiWhiteSpace(' ')
PsiElement(()('(')
Literal
PsiElement(true)('true')
PsiErrorElement:')' expected
<empty list>
PsiElement(;)(';')
PsiWhiteSpace(' ')
Closable block
PsiElement({)('{')
PsiWhiteSpace('\n ')
PsiComment(line comment)('//')
PsiElement(new line)('\n ')
Parameter list
<empty list>
PsiElement(})('}')
PsiWhiteSpace('\n ')
PsiElement(})('}')
PsiWhiteSpace('\n')
PsiElement(})('}')