void (@NotNull Set<? super Import> namesToImport, @NotNull PsiJavaFile file) { PsiImportList importList = file.getImportList(); PsiImportStatementBase[] imports = importList == null ? PsiImportStatementBase.EMPTY_ARRAY : importList.getAllImportStatements(); Map<String, Import> unresolvedNames = new HashMap<>(); @NotNull Set<Import> unresolvedOnDemand = new HashSet<>(); for (PsiImportStatementBase anImport : imports) { PsiJavaCodeReferenceElement ref = anImport.getImportReference(); if (ref == null) continue; JavaResolveResult[] results = ref.multiResolve(false); if (results.length == 0) { String text = ref.getCanonicalText(); if (anImport.isOnDemand()) { text += ".*"; } Import importedName = new Import(text, anImport instanceof PsiImportStaticStatement); if (anImport.isOnDemand()) { unresolvedOnDemand.add(importedName); } else { unresolvedNames.put(ref.getReferenceName(), importedName); } } } if (unresolvedNames.isEmpty() && unresolvedOnDemand.isEmpty()) { return; } // do not optimize unresolved imports for things like JSP (IDEA-41814) if (file.getViewProvider().getLanguages().size() > 1 && file.getViewProvider().getBaseLanguage() != JavaLanguage.INSTANCE) { namesToImport.addAll(unresolvedOnDemand); namesToImport.addAll(unresolvedNames.values()); return; } boolean[] hasResolveProblem = {false}; // do not visit imports for (PsiClass aClass : file.getClasses()) { if (!(aClass instanceof PsiCompiledElement)) { aClass.accept(new JavaRecursiveElementWalkingVisitor() { @Override public void visitReferenceElement(@NotNull PsiJavaCodeReferenceElement reference) { if (reference.getQualifier() == null) { String name = reference.getReferenceName(); Import unresolvedImport = unresolvedNames.get(name); if (reference.multiResolve(false).length == 0) { hasResolveProblem[0] = true; if (unresolvedImport != null) { namesToImport.add(unresolvedImport); unresolvedNames.remove(name); if (unresolvedNames.isEmpty()) return; } } } super.visitReferenceElement(reference); } }); } } if (hasResolveProblem[0]) { namesToImport.addAll(unresolvedOnDemand); } // otherwise, optimize out all red on demand imports for green file }