groovy break, continue highlighting fix
authorMaxim Medvedev <maxim.medvedev@jetbrains.com>
Mon, 23 Nov 2009 12:59:21 +0000 (15:59 +0300)
committerMaxim Medvedev <maxim.medvedev@jetbrains.com>
Mon, 23 Nov 2009 12:59:21 +0000 (15:59 +0300)
plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java

index 42f6fe361e85e0ee59632f23664fd70d8616f2e5..e743e60524669634f295f186f83c07f5d3ec0ff4 100644 (file)
@@ -218,7 +218,7 @@ public class GroovyAnnotator implements Annotator {
   private static void checkLabeledStatement(GrLabeledStatement statement, AnnotationHolder holder) {
     final String name = statement.getLabelName();
     if (ResolveUtil.resolveLabeledStatement(name, statement, true) != null) {
-      holder.createErrorAnnotation(statement.getLabel(), GroovyBundle.message("label.already.used", name));
+      holder.createWarningAnnotation(statement.getLabel(), GroovyBundle.message("label.already.used", name));
     }
   }
 
@@ -232,20 +232,18 @@ public class GroovyAnnotator implements Annotator {
       }
     }
 
-    final PsiElement targetStatement = statement.findTargetStatement();
+    final GrStatement targetStatement = statement.findTargetStatement();
     if (targetStatement == null) {
       if (statement instanceof GrContinueStatement && label == null) {
         holder.createErrorAnnotation(statement, GroovyBundle.message("continue.outside.loop"));
       }
-      else if (statement instanceof GrBreakStatement) {
-        if (label == null) {
-          holder.createErrorAnnotation(statement, GroovyBundle.message("break.outside.loop.or.switch"));
-        }
-        else if (findFirstLoop(statement) == null) {
-          holder.createErrorAnnotation(statement, GroovyBundle.message("break.outside.loop"));
-        }
+      else if (statement instanceof GrBreakStatement && label == null) {
+        holder.createErrorAnnotation(statement, GroovyBundle.message("break.outside.loop.or.switch"));
       }
     }
+    if (statement instanceof GrBreakStatement && label != null && findFirstLoop(statement) == null) {
+      holder.createErrorAnnotation(statement, GroovyBundle.message("break.outside.loop"));
+    }
   }
 
   @Nullable
index c0e3be47076a8cfbca150d32540a5a8f3e34c913..a0af3e28198a794e8d62b7474e622494f35d788f 100644 (file)
@@ -241,8 +241,8 @@ public class ResolveUtil {
     do {
       PsiElement last = element;
       element = element.getParent();
-      if (element == null || element instanceof GrMember || element instanceof GrClosableBlock || element instanceof GroovyFile) break;
-      if (element instanceof GrStatement) {
+      if (element == null || element instanceof GrMember || element instanceof GroovyFile) break;
+      if (element instanceof GrStatement && !(element instanceof GrClosableBlock)) {
         statement = (GrStatement)element;
       }
       PsiElement sibling = element;
@@ -253,6 +253,7 @@ public class ResolveUtil {
         }
         sibling = sibling.getPrevSibling();
       }
+      if (element instanceof GrClosableBlock) break;
     }
     while (true);
     return new Pair<GrStatement, GrLabeledStatement>(null, null);