IDEA-52997: Groovy: good code is red. A field and a property of the same name are...
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / annotator / GroovyAnnotator.java
index 45e2952d75c2025a2db9c1db349f836bea85728c..d114ec046a7d5918bfa3fc48afd293cb4a118b03 100644 (file)
@@ -1386,25 +1386,39 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator {
   }
 
   private static class DuplicateVariablesProcessor extends PropertyResolverProcessor {
-    boolean borderPassed;
+    private boolean myBorderPassed;
+    private final boolean myHasVisibilityModifier;
 
     public DuplicateVariablesProcessor(GrVariable variable) {
       super(variable.getName(), variable);
-      borderPassed = false;
+      myBorderPassed = false;
+      myHasVisibilityModifier = hasExplicitVisibilityModifiers(variable);
+    }
+
+    private static boolean hasExplicitVisibilityModifiers(GrVariable variable) {
+      final PsiModifierList modifierList = variable.getModifierList();
+      if (modifierList instanceof GrModifierList) return ((GrModifierList)modifierList).hasExplicitVisibilityModifiers();
+      if (modifierList == null) return false;
+      return modifierList.hasExplicitModifier(GrModifier.PUBLIC) ||
+             modifierList.hasExplicitModifier(GrModifier.PROTECTED) ||
+             modifierList.hasExplicitModifier(GrModifier.PRIVATE);
     }
 
     @Override
     public boolean execute(PsiElement element, ResolveState state) {
-      if (borderPassed) {
+      if (myBorderPassed) {
         return false;
       }
+      if (element instanceof GrVariable && hasExplicitVisibilityModifiers((GrVariable)element) != myHasVisibilityModifier) {
+        return true;
+      }
       return super.execute(element, state);
     }
 
     @Override
     public void handleEvent(Event event, Object associated) {
       if (event == ResolveUtil.DECLARATION_SCOPE_PASSED) {
-        borderPassed = true;
+        myBorderPassed = true;
       }
       super.handleEvent(event, associated);
     }