added quick-fix to delete all unused libraries (IDEA-99885)

This commit is contained in:
nik
2013-11-25 13:49:58 +04:00
parent 7c80f38656
commit 495fddcaa4
3 changed files with 55 additions and 17 deletions
@@ -46,6 +46,7 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.util.*;
public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurable {
@@ -257,14 +258,23 @@ public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurabl
}
public void removeLibrary(@NotNull LibraryProjectStructureElement element) {
getModelProvider().getModifiableModel().removeLibrary(element.getLibrary());
myContext.getDaemonAnalyzer().removeElement(element);
final MyNode node = findNodeByObject(myRoot, element.getLibrary());
if (node != null) {
removePaths(TreeUtil.getPathFromRoot(node));
}
removeLibraries(Collections.singletonList(element));
}
public void removeLibraries(@NotNull List<LibraryProjectStructureElement> libraries) {
List<TreePath> pathsToRemove = new ArrayList<TreePath>();
for (LibraryProjectStructureElement element : libraries) {
getModelProvider().getModifiableModel().removeLibrary(element.getLibrary());
MyNode node = findNodeByObject(myRoot, element.getLibrary());
if (node != null) {
pathsToRemove.add(TreeUtil.getPathFromRoot(node));
}
}
myContext.getDaemonAnalyzer().removeElements(libraries);
removePaths(pathsToRemove.toArray(new TreePath[pathsToRemove.size()]));
}
@Override
protected boolean removeLibrary(final Library library) {
final LibraryTable table = library.getTable();
@@ -41,6 +41,7 @@ import org.jetbrains.annotations.NotNull;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -148,7 +149,7 @@ public class LibraryProjectStructureElement extends ProjectStructureElement {
@Override
public ProjectStructureProblemDescription createUnusedElementWarning() {
final List<ConfigurationErrorQuickFix> fixes = Arrays.asList(new AddLibraryToDependenciesFix(), new RemoveLibraryFix());
final List<ConfigurationErrorQuickFix> fixes = Arrays.asList(new AddLibraryToDependenciesFix(), new RemoveLibraryFix(), new RemoveAllUnusedLibrariesFix());
return new ProjectStructureProblemDescription("Library '" + StringUtil.escapeXml(myLibrary.getName()) + "'" + " is not used", null, createPlace(),
ProjectStructureProblemType.unused("unused-library"), ProjectStructureProblemDescription.ProblemLevel.PROJECT,
fixes, false);
@@ -225,4 +226,24 @@ public class LibraryProjectStructureElement extends ProjectStructureElement {
BaseLibrariesConfigurable.getInstance(myContext.getProject(), myLibrary.getTable().getTableLevel()).removeLibrary(LibraryProjectStructureElement.this);
}
}
private class RemoveAllUnusedLibrariesFix extends ConfigurationErrorQuickFix {
private RemoveAllUnusedLibrariesFix() {
super("Remove All Unused Libraries");
}
@Override
public void performFix() {
BaseLibrariesConfigurable configurable = BaseLibrariesConfigurable.getInstance(myContext.getProject(), LibraryTablesRegistrar.PROJECT_LEVEL);
Library[] libraries = configurable.getModelProvider().getModifiableModel().getLibraries();
List<LibraryProjectStructureElement> toRemove = new ArrayList<LibraryProjectStructureElement>();
for (Library library : libraries) {
LibraryProjectStructureElement libraryElement = new LibraryProjectStructureElement(myContext, library);
if (myContext.getDaemonAnalyzer().getUsages(libraryElement).isEmpty()) {
toRemove.add(libraryElement);
}
}
configurable.removeLibraries(toRemove);
}
}
}
@@ -141,21 +141,28 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
}
public void removeElement(ProjectStructureElement element) {
myElementWithNotCalculatedUsages.remove(element);
myElementsToShowWarningIfUnused.remove(element);
myWarningsAboutUnused.remove(element);
myProblemHolders.remove(element);
final Collection<ProjectStructureElementUsage> usages = mySourceElement2Usages.removeAll(element);
if (usages != null) {
for (ProjectStructureElementUsage usage : usages) {
myProblemHolders.remove(usage.getContainingElement());
removeElements(Collections.singletonList(element));
}
public void removeElements(@NotNull List<? extends ProjectStructureElement> elements) {
myElementWithNotCalculatedUsages.removeAll(elements);
myElementsToShowWarningIfUnused.removeAll(elements);
for (ProjectStructureElement element : elements) {
myWarningsAboutUnused.remove(element);
myProblemHolders.remove(element);
final Collection<ProjectStructureElementUsage> usages = mySourceElement2Usages.removeAll(element);
if (usages != null) {
for (ProjectStructureElementUsage usage : usages) {
myProblemHolders.remove(usage.getContainingElement());
}
}
removeUsagesInElement(element);
myDispatcher.getMulticaster().problemsChanged(element);
}
removeUsagesInElement(element);
myDispatcher.getMulticaster().problemsChanged(element);
reportUnusedElements();
}
private void reportUnusedElements() {
if (!myElementWithNotCalculatedUsages.isEmpty()) return;