From c39552a5b347d6fbce9c9cefd243a85a2d0a94e6 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 21 Mar 2011 15:18:02 +0100 Subject: [PATCH] while condition doesn't eat } --- .../groovy/lang/parser/GroovyParser.java | 25 ++-- .../lang/parser/GroovyReparseTest.groovy | 11 ++ .../groovy/testdata/reparse/WhileRParen.txt | 109 ++++++++++++++++++ 3 files changed, 127 insertions(+), 18 deletions(-) create mode 100644 plugins/groovy/testdata/reparse/WhileRParen.txt diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyParser.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyParser.java index b05e3248fe3c..69d78c4dbae2 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyParser.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyParser.java @@ -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) { 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 56d22cdc60de..d1e8afd6ab27 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 @@ -149,5 +149,16 @@ def foo() { """, "\b" } + public void testWhileRParen() { + checkReparse """ +def foo() { + def cl = { + while (true { + // + } + } +}""", ";" + } + } diff --git a/plugins/groovy/testdata/reparse/WhileRParen.txt b/plugins/groovy/testdata/reparse/WhileRParen.txt new file mode 100644 index 000000000000..8231e4f642ac --- /dev/null +++ b/plugins/groovy/testdata/reparse/WhileRParen.txt @@ -0,0 +1,109 @@ +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 ') + Variable definitions + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + Variable + PsiElement(identifier)('cl') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + Closable block + PsiElement({)('{') + PsiWhiteSpace('\n ') + Parameter list + + WHILE statement + PsiElement(while)('while') + PsiWhiteSpace(' ') + PsiElement(()('(') + Method call + Literal + PsiElement(true)('true') + PsiWhiteSpace(' ') + Arguments + + Closable block + PsiElement({)('{') + PsiWhiteSpace('\n ') + PsiComment(line comment)('//') + PsiElement(new line)('\n ') + Parameter list + + PsiElement(})('}') + PsiErrorElement:')' expected + + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') +--- +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 ') + Variable definitions + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + Variable + PsiElement(identifier)('cl') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + Closable block + PsiElement({)('{') + PsiWhiteSpace('\n ') + Parameter list + + WHILE statement + PsiElement(while)('while') + PsiWhiteSpace(' ') + PsiElement(()('(') + Literal + PsiElement(true)('true') + PsiErrorElement:')' expected + + PsiElement(;)(';') + PsiWhiteSpace(' ') + Closable block + PsiElement({)('{') + PsiWhiteSpace('\n ') + PsiComment(line comment)('//') + PsiElement(new line)('\n ') + Parameter list + + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') \ No newline at end of file