groovy for-in parser fix
authorMaxim Medvedev <maxim.medvedev@jetbrains.com>
Wed, 11 Nov 2009 15:10:08 +0000 (18:10 +0300)
committerMaxim Medvedev <maxim.medvedev@jetbrains.com>
Wed, 11 Nov 2009 15:10:08 +0000 (18:10 +0300)
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/ForStatement.java
plugins/groovy/testdata/groovy/refactoring/rename/to_prop.test
plugins/groovy/testdata/groovy/refactoring/rename/to_setter.test
plugins/groovy/testdata/parsing/groovy/statements/for/for1.test
plugins/groovy/testdata/parsing/groovy/statements/for/for2.test
plugins/groovy/testdata/parsing/groovy/statements/syn/syn1.test

index 2d4bcae1a47b369586a7046127fdf85cad783003..f91b4f8755261cb4afdd7d74210381186f71e6ac 100644 (file)
@@ -134,4 +134,6 @@ public abstract class TokenSets implements GroovyTokenTypes {
       mREGEX_LITERAL,
       mGSTRING_LITERAL
   );
+
+  public static TokenSet FOR_IN_DELIMITERS = TokenSet.create(kIN, mCOLON);
 }
index 01dc392c3229bafe83216b5a9d490961d8d433e6..6dd9f25bd03b70c719b4d6165c94af3b9ecb4b7f 100644 (file)
@@ -18,6 +18,7 @@ package org.jetbrains.plugins.groovy.lang.parser.parsing.statements;
 
 import com.intellij.lang.PsiBuilder;
 import org.jetbrains.plugins.groovy.GroovyBundle;
+import org.jetbrains.plugins.groovy.lang.lexer.TokenSets;
 import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes;
 import org.jetbrains.plugins.groovy.lang.parser.GroovyParser;
 import org.jetbrains.plugins.groovy.lang.parser.parsing.auxiliary.modifiers.Modifiers;
@@ -38,7 +39,6 @@ public class ForStatement implements GroovyElementTypes {
   }
 
   private static boolean tradForClauseParse(PsiBuilder builder, GroovyParser parser) {
-
     PsiBuilder.Marker marker = builder.mark();
 
     if (ParserUtils.getToken(builder, mSEMI) || (Declaration.parse(builder, false, parser) && ParserUtils.getToken(builder, mSEMI))) {
@@ -102,23 +102,40 @@ public class ForStatement implements GroovyElementTypes {
    * Parses Groovy-style 'in' clause
    */
   private static boolean forInClauseParse(PsiBuilder builder, GroovyParser parser) {
-
     PsiBuilder.Marker marker = builder.mark();
 
-    PsiBuilder.Marker parameterMarker = builder.mark();
+    PsiBuilder.Marker paramMarker = builder.mark();
+
     Modifiers.parse(builder, parser);
-    if (ParserUtils.lookAhead(builder, mIDENT, kIN) || ParserUtils.lookAhead(builder, mIDENT, mCOLON)) {
+
+    boolean isBuiltInType = TokenSets.BUILT_IN_TYPE.contains(builder.getTokenType());
+
+    PsiBuilder.Marker typeSpec = builder.mark();
+    TypeSpec.parseStrict(builder);
+
+    if (builder.getTokenType() == mIDENT || isBuiltInType) {
+      typeSpec.drop();
+    }
+    else {
+      typeSpec.rollbackTo();
+    }
+
+    if (TokenSets.FOR_IN_DELIMITERS.contains(builder.getTokenType())) {
+      builder.error(GroovyBundle.message("identifier.expected"));
+      paramMarker.drop();
+    }
+    else if (builder.getTokenType() == mIDENT) {
       ParserUtils.getToken(builder, mIDENT);
+      paramMarker.done(PARAMETER);
     }
     else {
-      TypeSpec.parseStrict(builder);
-      ParserUtils.getToken(builder, mIDENT, GroovyBundle.message("identifier.expected"));
+      paramMarker.drop();
+      marker.rollbackTo();
+      return false;
     }
-    parameterMarker.done(PARAMETER);
 
     if (!ParserUtils.getToken(builder, kIN) && !ParserUtils.getToken(builder, mCOLON)) {
-      builder.error(GroovyBundle.message("in.expected"));
-      marker.drop();
+      marker.rollbackTo();
       return false;
     }
 
index d43afd32832ff45e0c4d1e1d9dfc37195ab01422..664c879391771a3a64d51dbf230f573556193675 100644 (file)
@@ -16,9 +16,9 @@ a.foo = ""
 a.<caret>setFoo("asd")
 -----
 class A {
-  def String newName = "asd"
+  def String foo = "asd"
 
-  def setFoo(asd){}
+  def setNewName(asd){}
 
   def getFoo(){"dsfsdf"}
 }
@@ -29,5 +29,5 @@ A a = new A()
 a.foo
 a.getFoo()
 
-a.foo = ""
+a.newName = ""
 a.setNewName("asd")
\ No newline at end of file
index 17534156209710538683be51b345b08c42bb4308..84b9f250f195350429760a4a65872845452b5785 100644 (file)
@@ -30,4 +30,4 @@ a.foo
 a.getFoo()
 
 a.newName = ""
-a.setFoo("asd")
\ No newline at end of file
+a.setNewName("asd")
\ No newline at end of file
index f341714a658782886875e2c433b8f6ebf10e4b07..dee41309211ba26c65ad304277b54cd0c6825639 100644 (file)
@@ -7,6 +7,8 @@ Groovy script
     PsiElement(()('(')
     In clause
       Parameter
+        Modifiers
+          <empty list>
         PsiElement(identifier)('i')
       PsiWhiteSpace(' ')
       PsiElement(in)('in')
index 6f89d3d8d4cfe1e76dee1cf1f938f9ea8c982dd2..bb37d2762fe188e51a25f5b5313d9dc15a75c852 100644 (file)
@@ -8,6 +8,8 @@ Groovy script
     PsiElement(()('(')
     In clause
       Parameter
+        Modifiers
+          <empty list>
         PsiElement(identifier)('i')
       PsiWhiteSpace(' ')
       PsiElement(in)('in')
index e5feeac618306f537827120ae304595985096132..e2e4f5cf83e0dc387e4aca4221fa68df59d8e4fa 100644 (file)
@@ -19,6 +19,8 @@ Groovy script
         PsiElement(()('(')
         In clause
           Parameter
+            Modifiers
+              <empty list>
             PsiElement(identifier)('i')
           PsiWhiteSpace(' ')
           PsiElement(in)('in')