IDEA-54478
authorAlexey Kudravtsev <cdr@intellij.com>
Thu, 13 May 2010 14:30:51 +0000 (18:30 +0400)
committerAlexey Kudravtsev <cdr@intellij.com>
Fri, 14 May 2010 10:15:25 +0000 (14:15 +0400)
java/java-impl/src/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java
java/java-impl/src/com/intellij/lang/java/JavaImportOptimizer.java
java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java
java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java

index e68fe070dcae2e6e841fe665af1d3c080cf7a6f5..90a25a5703b95c8ede01379866c158a02fcc2b45 100644 (file)
@@ -50,6 +50,7 @@ import com.intellij.openapi.progress.ProgressManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ProjectFileIndex;
 import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.util.TextRange;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
 import com.intellij.psi.*;
@@ -678,9 +679,26 @@ public class PostHighlightingPass extends TextEditorHighlightingPass {
     if (file == null || !codeAnalyzer.isHighlightingAvailable(file) || !(file instanceof PsiJavaFile) || file instanceof JspFile) return false;
 
     if (!codeAnalyzer.isErrorAnalyzingFinished(file)) return false;
+    boolean errors = containsErrorsPreventingOptimize(file);
+
+    return !errors && codeAnalyzer.canChangeFileSilently(myFile);
+  }
+
+  private boolean containsErrorsPreventingOptimize(PsiFile file) {
     List<HighlightInfo> errors = DaemonCodeAnalyzerImpl.getHighlights(myDocument, HighlightSeverity.ERROR, myProject);
 
-    return errors.isEmpty() && codeAnalyzer.canChangeFileSilently(myFile);
+    // ignore unresolved imports errors
+    PsiImportList importList = ((PsiJavaFile)file).getImportList();
+    if (importList != null) {
+      TextRange importsRange = importList.getTextRange();
+      for (HighlightInfo error : errors) {
+        if (!error.type.equals(HighlightInfoType.WRONG_REF)) return true;
+        if (!importsRange.contains(error.getActualStartOffset()) || !importsRange.contains(error.getActualEndOffset())) {
+          return true;
+        }
+      }
+    }
+    return false;
   }
 
   private static boolean isIntentionalPrivateConstructor(PsiMethod method, PsiClass containingClass) {
index 40dc91e2a70c9f988b9e6554d04c7966160ce171..258967df6d8442e9cf4c944e3d6b3b3b65ed7bee 100644 (file)
@@ -42,19 +42,18 @@ public class JavaImportOptimizer implements ImportOptimizer {
     }
     Project project = file.getProject();
     final PsiImportList newImportList = JavaCodeStyleManager.getInstance(project).prepareOptimizeImportsResult((PsiJavaFile)file);
+    if (newImportList == null) return EmptyRunnable.getInstance();
     return new Runnable() {
       public void run() {
         try {
-          if (newImportList != null) {
-            final PsiDocumentManager manager = PsiDocumentManager.getInstance(file.getProject());
-            final Document document = manager.getDocument(file);
-            if (document != null) {
-              manager.commitDocument(document);
-            }
-            final PsiImportList oldImportList = ((PsiJavaFile)file).getImportList();
-            assert oldImportList != null;
-            oldImportList.replace(newImportList);
+          final PsiDocumentManager manager = PsiDocumentManager.getInstance(file.getProject());
+          final Document document = manager.getDocument(file);
+          if (document != null) {
+            manager.commitDocument(document);
           }
+          final PsiImportList oldImportList = ((PsiJavaFile)file).getImportList();
+          assert oldImportList != null;
+          oldImportList.replace(newImportList);
         }
         catch (IncorrectOperationException e) {
           LOG.error(e);
index aeca7ad6406551dedba5d23a09a2982a5bb74b6f..dcd70b4fd3be28daf8c217976be8a1542986fe1a 100644 (file)
@@ -700,8 +700,9 @@ public class ImportHelper{
     }
   }
 
-  private static void addUnresolvedImportNames(@NotNull Set<Pair<String, Boolean>> names, @NotNull PsiJavaFile file) {
+  private static void addUnresolvedImportNames(@NotNull final Set<Pair<String, Boolean>> namesToImport, @NotNull PsiJavaFile file) {
     PsiImportStatementBase[] imports = file.getImportList().getAllImportStatements();
+    final Map<String, Pair<String, Boolean>> unresolvedNames = new THashMap<String, Pair<String, Boolean>>();
     for (PsiImportStatementBase anImport : imports) {
       PsiJavaCodeReferenceElement ref = anImport.getImportReference();
       if (ref == null) continue;
@@ -711,9 +712,32 @@ public class ImportHelper{
         if (anImport.isOnDemand()) {
           text += ".*";
         }
-        names.add(Pair.create(text, anImport instanceof PsiImportStaticStatement));
+
+        Pair<String, Boolean> pair = Pair.create(text, anImport instanceof PsiImportStaticStatement);
+        if (!anImport.isOnDemand()) {
+          unresolvedNames.put(ref.getReferenceName(), pair);
+        }
+        else {
+          namesToImport.add(pair);
+        }
       }
     }
+
+    // do not visit imports
+    for (PsiClass aClass : file.getClasses()) {
+      aClass.accept(new JavaRecursiveElementWalkingVisitor() {
+        @Override
+        public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
+          String name = reference.getReferenceName();
+          Pair<String, Boolean> pair = unresolvedNames.get(name);
+          if (pair != null && reference.multiResolve(false).length == 0) {
+            namesToImport.add(pair);
+            unresolvedNames.remove(name);
+          }
+          super.visitReferenceElement(reference);
+        }
+      });
+    }
   }
 
   public static boolean isImplicitlyImported(@NotNull String className, @NotNull PsiJavaFile file) {
index cc81cd46e6558c209965b0b1bec57ee045e831e4..75af79e8110de81c9b1ddc052b952227870ed73a 100644 (file)
@@ -105,7 +105,7 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
     return new ImportHelper(getSettings()).addImport(file, refClass);
   }
 
-  public void removeRedundantImports(final @NotNull PsiJavaFile file) throws IncorrectOperationException {
+  public void removeRedundantImports(@NotNull final PsiJavaFile file) throws IncorrectOperationException {
     final PsiImportList importList = file.getImportList();
     if (importList == null) return;
     final PsiImportStatementBase[] imports = importList.getAllImportStatements();
@@ -370,12 +370,11 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
 
     if (InheritanceUtil.isInheritorOrSelf(element, collectionClass, true)) {
       final PsiSubstitutor substitutor;
-      if (!manager.areElementsEquivalent(element, collectionClass)) {
-        substitutor = TypeConversionUtil.getClassSubstitutor(collectionClass, element,
-                                                             PsiSubstitutor.EMPTY);
+      if (manager.areElementsEquivalent(element, collectionClass)) {
+        substitutor = PsiSubstitutor.EMPTY;
       }
       else {
-        substitutor = PsiSubstitutor.EMPTY;
+        substitutor = TypeConversionUtil.getClassSubstitutor(collectionClass, element, PsiSubstitutor.EMPTY);
       }
 
       PsiTypeParameterList typeParameterList = collectionClass.getTypeParameterList();
@@ -882,7 +881,8 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
   public String suggestUniqueVariableName(String baseName, PsiElement place, boolean lookForward) {
     int index = 0;
     final PsiElement scope = PsiTreeUtil.getNonStrictParentOfType(place, PsiStatement.class, PsiCodeBlock.class);
-    NextName: while (true) {
+    NextName:
+    while (true) {
       String name = baseName;
       if (index > 0) {
         name += index;
@@ -935,7 +935,7 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
     };
   }
 
-  private void sortVariableNameSuggestions(String[] names,
+  private static void sortVariableNameSuggestions(String[] names,
                                            final VariableKind variableKind,
                                            final String propertyName,
                                            final PsiType type) {
@@ -1063,4 +1063,4 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
   private CodeStyleSettings getSettings() {
     return CodeStyleSettingsManager.getSettings(myProject);
   }
-}
\ No newline at end of file
+}