@Override @Nullable public Collection<PsiImportStatementBase> findRedundantImports(final PsiJavaFile file) { final PsiImportList importList = file.getImportList(); if (importList == null) return null; final PsiImportStatementBase[] imports = importList.getAllImportStatements(); if (imports.length == 0) return null; Set<PsiImportStatementBase> allImports = new THashSet<PsiImportStatementBase>(Arrays.asList(imports)); final Collection<PsiImportStatementBase> redundant; if (FileTypeUtils.isInServerPageFile(file)) { // remove only duplicate imports redundant = ContainerUtil.newIdentityTroveSet(); ContainerUtil.addAll(redundant, imports); redundant.removeAll(allImports); for (PsiImportStatementBase importStatement : imports) { if (importStatement instanceof JspxImportStatement && importStatement.isForeignFileImport()) { redundant.remove(importStatement); } } } else { redundant = allImports; final List<PsiFile> roots = file.getViewProvider().getAllFiles(); for (PsiElement root : roots) { root.accept( new JavaRecursiveElementWalkingVisitor() { @Override public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { if (!reference.isQualified()) { final JavaResolveResult resolveResult = reference.advancedResolve(false); if (!inTheSamePackage(file, resolveResult.getElement())) { final PsiElement resolveScope = resolveResult.getCurrentFileResolveScope(); if (resolveScope instanceof PsiImportStatementBase) { final PsiImportStatementBase importStatementBase = (PsiImportStatementBase) resolveScope; redundant.remove(importStatementBase); } } } super.visitReferenceElement(reference); } private boolean inTheSamePackage(PsiJavaFile file, PsiElement element) { if (element instanceof PsiClass && ((PsiClass) element).getContainingClass() == null) { final PsiFile containingFile = element.getContainingFile(); if (containingFile instanceof PsiJavaFile) { return Comparing.strEqual( file.getPackageName(), ((PsiJavaFile) containingFile).getPackageName()); } } return false; } }); } } return redundant; }
public ASTNode getDefaultAnchor( @NotNull PsiImportList list, @NotNull PsiImportStatementBase statement) { PsiJavaCodeReferenceElement ref = statement.getImportReference(); if (ref == null) return null; int entryIndex = findEntryIndex(statement); PsiImportStatementBase[] allStatements = list.getAllImportStatements(); int[] entries = ArrayUtil.newIntArray(allStatements.length); List<PsiImportStatementBase> statements = new ArrayList<PsiImportStatementBase>(); for (int i = 0; i < allStatements.length; i++) { PsiImportStatementBase statement1 = allStatements[i]; int entryIndex1 = findEntryIndex(statement1); entries[i] = entryIndex1; if (entryIndex1 == entryIndex) { statements.add(statement1); } } if (statements.isEmpty()) { int index; for (index = entries.length - 1; index >= 0; index--) { if (entries[index] < entryIndex) break; } index++; return index < entries.length ? SourceTreeToPsiMap.psiElementToTree(allStatements[index]) : null; } else { String refText = ref.getCanonicalText(); if (statement.isOnDemand()) { refText += "."; } PsiImportStatementBase insertBefore = null; PsiImportStatementBase insertAfter = null; for (PsiImportStatementBase statement1 : statements) { PsiJavaCodeReferenceElement ref1 = statement1.getImportReference(); if (ref1 == null) { continue; } String refTextThis = ref1.getCanonicalText(); if (statement1.isOnDemand()) { refTextThis += "."; } int comp = Comparing.compare(refText, refTextThis); if (comp < 0 && insertBefore == null) { insertBefore = statement1; } if (comp > 0) { insertAfter = statement1; } } if (insertBefore != null) return insertBefore.getNode(); if (insertAfter != null) return insertAfter.getNode().getTreeNext(); return null; } }
@NotNull private File fileToFile(PsiJavaFile javaFile, List<String> additionalImports) { PsiImportList importList = javaFile.getImportList(); List<Import> imports = importList == null ? Collections.<Import>emptyList() : importsToImportList(importList.getAllImportStatements()); for (String i : additionalImports) imports.add(new Import(i)); return new File( quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses()), createMainFunction(javaFile)); }
private void doTestStaticImports(final PsiJavaFile javaFile, boolean okToLoadTree) { final PsiImportList importList = javaFile.getImportList(); final PsiImportStatementBase[] allImportStatements = importList.getAllImportStatements(); assertEquals(6, allImportStatements.length); final PsiImportStatement[] importStatements = importList.getImportStatements(); assertEquals(2, importStatements.length); final PsiImportStaticStatement[] importStaticStatements = importList.getImportStaticStatements(); assertEquals(4, importStaticStatements.length); assertFalse(importStatements[0].isOnDemand()); assertTrue(importStaticStatements[0].isOnDemand()); assertFalse(importStatements[0].isOnDemand()); assertTrue(importStaticStatements[1].isOnDemand()); assertFalse(importStaticStatements[2].isOnDemand()); assertFalse(importStaticStatements[3].isOnDemand()); assertEquals("sort", importStaticStatements[2].getReferenceName()); assertEquals("sort", importStaticStatements[3].getReferenceName()); final PsiImportStaticStatement classReference1 = importStaticStatements[1]; final PsiElement element1 = classReference1.resolveTargetClass(); assertNotNull(element1); assertTrue(element1 instanceof PsiClass); assertEquals("java.util.Arrays", ((PsiClass) element1).getQualifiedName()); final PsiImportStaticStatement classReference3 = importStaticStatements[3]; final PsiElement element3 = classReference3.resolveTargetClass(); assertNotNull(element3); assertTrue(element3 instanceof PsiClass); assertEquals("java.util.Arrays", ((PsiClass) element3).getQualifiedName()); if (okToLoadTree) { assertEquals( "java.util.Collections", importStaticStatements[0].getImportReference().getText()); assertEquals("java.util.Arrays", importStaticStatements[1].getImportReference().getText()); assertEquals( "java.util.Collections.sort", importStaticStatements[2].getImportReference().getText()); assertEquals( "java.util.Arrays.sort", importStaticStatements[3].getImportReference().getText()); } }