IDEA-53041: Auto-import no longer works for refExpr
authorMaxim Medvedev <maxim.medvedev@jetbrains.com>
Thu, 1 Apr 2010 10:33:13 +0000 (14:33 +0400)
committerMaxim Medvedev <maxim.medvedev@jetbrains.com>
Thu, 1 Apr 2010 11:45:54 +0000 (15:45 +0400)
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/PsiUtil.java

index 3010d46677e41e2201f5d850f3553ac3904d447f..3c6f229a60e7720d7e0b892ba4c4b68159178dd9 100644 (file)
@@ -95,6 +95,7 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements
     return null;
   }
 
+  @NotNull
   public PsiReference getReference() {
     PsiReference[] otherReferences = ReferenceProvidersRegistry.getReferencesFromProviders(this, GrReferenceExpression.class);
     PsiReference[] thisReference = {this};
@@ -156,6 +157,7 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements
     final String text = qName + typeArgs;
     GrReferenceExpression qualifiedRef = GroovyPsiElementFactory.getInstance(getProject()).createReferenceExpressionFromText(text);
     getNode().getTreeParent().replaceChild(getNode(), qualifiedRef.getNode());
+    PsiUtil.shortenReference(qualifiedRef);
     return qualifiedRef;
   }
 
@@ -195,6 +197,7 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements
 
   public PsiType getNominalType() {
     return GroovyPsiManager.getInstance(getProject()).getTypeInferenceHelper().doWithInferenceDisabled(new Computable<PsiType>() {
+      @Nullable
       public PsiType compute() {
         return getNominalTypeImpl();
       }
@@ -341,6 +344,7 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl implements
   }
 
   private static final class OurTypesCalculator implements Function<GrReferenceExpressionImpl, PsiType> {
+    @Nullable
     public PsiType fun(GrReferenceExpressionImpl refExpr) {
       final PsiType inferred = GroovyPsiManager.getInstance(refExpr.getProject()).getTypeInferenceHelper().getInferredType(refExpr);
       final PsiType nominal = refExpr.getNominalTypeImpl();
index 063f04b6a00f4dc93f2c48f14cfaf40a01cafe89..0bfbe68364b5417415ad86127051842a274db287 100644 (file)
@@ -304,8 +304,9 @@ public class PsiUtil {
     }
   }
 
-  public static void shortenReference(GrCodeReferenceElement ref) {
-    final GrCodeReferenceElement qualifier = ref.getQualifier();
+
+  public static void shortenReference(GrReferenceElement ref) {
+    final PsiElement qualifier = ref.getQualifier();
     if (qualifier != null &&
         (PsiTreeUtil.getParentOfType(ref, GrDocMemberReference.class) != null ||
          PsiTreeUtil.getParentOfType(ref, GrDocComment.class) == null) &&
@@ -313,7 +314,7 @@ public class PsiUtil {
         PsiTreeUtil.getParentOfType(ref, GroovyCodeFragment.class) == null) {
       final PsiElement resolved = ref.resolve();
       if (resolved instanceof PsiClass) {
-        ref.setQualifier(null);
+        setQualifier(ref, null);
         if (ref.isReferenceTo(resolved)) return;
 
         final GroovyFileBase file = (GroovyFileBase)ref.getContainingFile();
@@ -324,7 +325,7 @@ public class PsiUtil {
             final GrImportStatement added = file.addImportForClass(clazz);
             if (!ref.isReferenceTo(resolved)) {
               file.removeImport(added);
-              ref.setQualifier(qualifier);
+              setQualifier(ref, qualifier);
             }
           }
         }
@@ -332,21 +333,17 @@ public class PsiUtil {
     }
   }
 
-  private static boolean mayInsertImport(GrReferenceElement ref) {
-    return PsiTreeUtil.getParentOfType(ref, GrDocComment.class) == null && !(ref.getContainingFile() instanceof GroovyCodeFragment) && PsiTreeUtil.getParentOfType(ref, GrImportStatement.class) == null;
-  }
-
-  private static boolean mayShorten(@NotNull GrCodeReferenceElement ref) {
-    GrCodeReferenceElement cur = (GrCodeReferenceElement)ref.copy();
-    final GrCodeReferenceElement qualifier = cur.getQualifier();
-    if (qualifier == null) {
-      return true;
+  private static void setQualifier(@NotNull GrReferenceElement ref, @Nullable PsiElement qualifier) {
+    if (ref instanceof GrReferenceExpression) {
+      ((GrReferenceExpression)ref).setQualifierExpression((GrReferenceExpression)qualifier);
+    }
+    else if (ref instanceof GrCodeReferenceElement) {
+      ((GrCodeReferenceElement)ref).setQualifier((GrCodeReferenceElement)qualifier);
     }
-    final PsiClass correctResolved = (PsiClass)cur.resolve();
-    cur.setQualifier(null);
-    final GroovyResolveResult[] results = cur.multiResolve(false);
-    return results.length == 0 || (results.length == 1 && cur.getManager().areElementsEquivalent(results[0].getElement(), correctResolved));
+  }
 
+  private static boolean mayInsertImport(GrReferenceElement ref) {
+    return PsiTreeUtil.getParentOfType(ref, GrDocComment.class) == null && !(ref.getContainingFile() instanceof GroovyCodeFragment) && PsiTreeUtil.getParentOfType(ref, GrImportStatement.class) == null;
   }
 
   @Nullable