IDEA-136053 (annotation parsing loop protection)
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Fri, 6 Feb 2015 15:54:05 +0000 (16:54 +0100)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Fri, 6 Feb 2015 16:02:12 +0000 (17:02 +0100)
java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java
java/java-tests/testData/psi/parser-partial/declarations/AnnoLoop.txt [new file with mode: 0644]
java/java-tests/testSrc/com/intellij/lang/java/parser/partial/DeclarationParserTest.java

index 36d024726bbfc888c08044ff16dea2e86ab04519..9ff9da60f09c655c6871435394f1505ae4c8b472 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -767,7 +767,10 @@ public class DeclarationParser {
     final PsiBuilder.Marker anno = builder.mark();
     builder.advanceLexer();
 
-    final PsiBuilder.Marker classRef = myParser.getReferenceParser().parseJavaCodeReference(builder, true, false, false, false);
+    PsiBuilder.Marker classRef = null;
+    if (builder.getTokenType() == JavaTokenType.IDENTIFIER) {
+      classRef = myParser.getReferenceParser().parseJavaCodeReference(builder, true, false, false, false);
+    }
     if (classRef == null) {
       error(builder, JavaErrorMessages.message("expected.class.reference"));
     }
diff --git a/java/java-tests/testData/psi/parser-partial/declarations/AnnoLoop.txt b/java/java-tests/testData/psi/parser-partial/declarations/AnnoLoop.txt
new file mode 100644 (file)
index 0000000..36ed65b
--- /dev/null
@@ -0,0 +1,18 @@
+PsiJavaFile:AnnoLoop.java
+  PsiJavaToken:LBRACE('{')
+  PsiWhiteSpace(' ')
+  PsiErrorElement:Unexpected token
+    PsiJavaToken:AT('@')
+    PsiJavaToken:AT('@')
+    PsiJavaToken:AT('@')
+  PsiWhiteSpace(' ')
+  PsiField:i
+    PsiModifierList:
+      <empty list>
+    PsiTypeElement:int
+      PsiKeyword:int('int')
+    PsiWhiteSpace(' ')
+    PsiIdentifier:i('i')
+    PsiJavaToken:SEMICOLON(';')
+  PsiWhiteSpace(' ')
+  PsiJavaToken:RBRACE('}')
\ No newline at end of file
index e088797031a4ddb3937a0027660be0a3b12389b4..d29a9d8eee12a0c0b30d220e368f4ac6560a181b 100644 (file)
@@ -64,6 +64,7 @@ public class DeclarationParserTest extends JavaParsingTestCase {
   public void testAnnoNested() { doParserTest("{ @interface Inner { String bar () default \"<unspecified>\"; } }", true, false); }
   public void testAnnoInner() { doParserTest("{ @interface Inner { double bar () default 0.0; } }"); }
   public void testAnnoOtherMembers() { doParserTest("{ int field;\n void m() {}\n class C {}\n interface I {} }", true, false); }
+  public void testAnnoLoop() { doParserTest("{ @@@ int i; }"); }
 
   public void testFieldSimple() { doParserTest("{ int field = 0; }"); }
   public void testFieldMulti() { doParserTest("{ int field1 = 0, field2; }"); }