'Project Structure' dialog: process possible usages from unloaded modules

This is also needed to avoid reporting project libraries used from unloaded modules only as unused.
This commit is contained in:
nik
2017-06-12 16:44:12 +02:00
committed by nik
parent d05cbf7f49
commit 70ca487f88
2 changed files with 122 additions and 4 deletions
@@ -18,22 +18,23 @@ package com.intellij.openapi.roots.ui.configuration;
import com.intellij.compiler.ModuleCompilerUtil;
import com.intellij.compiler.ModuleSourceSet;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.UnloadedModuleDescription;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootModel;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Chunk;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.*;
/**
* @author nik
@@ -123,6 +124,30 @@ public class GeneralProjectSettingsElement extends ProjectStructureElement {
@Override
public List<ProjectStructureElementUsage> getUsagesInElement() {
Collection<UnloadedModuleDescription> unloadedModules = ModuleManager.getInstance(myContext.getProject()).getUnloadedModuleDescriptions();
if (!unloadedModules.isEmpty()) {
MultiMap<Module, UnloadedModuleDescription> dependenciesInUnloadedModules = new MultiMap<>();
for (UnloadedModuleDescription unloaded : unloadedModules) {
for (String moduleName : unloaded.getDependencyModuleNames()) {
Module depModule = myContext.getModulesConfigurator().getModuleModel().findModuleByName(moduleName);
if (depModule != null) {
dependenciesInUnloadedModules.putValue(depModule, unloaded);
}
}
}
List<ProjectStructureElementUsage> usages = new ArrayList<>();
for (Map.Entry<Module, Collection<UnloadedModuleDescription>> entry : dependenciesInUnloadedModules.entrySet()) {
usages.add(new UsagesInUnloadedModules(myContext, this, new ModuleProjectStructureElement(myContext, entry.getKey()),
entry.getValue()));
}
//currently we don't store dependencies on project libraries from unloaded modules in the model, so suppose that all the project libraries are used
for (Library library : myContext.getProjectLibrariesProvider().getModifiableModel().getLibraries()) {
usages.add(new UsagesInUnloadedModules(myContext, this, new LibraryProjectStructureElement(myContext, library), unloadedModules));
}
return usages;
}
return Collections.emptyList();
}
@@ -0,0 +1,93 @@
/*
* Copyright 2000-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.module.UnloadedModuleDescription;
import com.intellij.openapi.roots.ui.configuration.GeneralProjectSettingsElement;
import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable;
import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
import com.intellij.ui.navigation.Place;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import javax.swing.*;
import java.util.Collection;
/**
* @author nik
*/
public class UsagesInUnloadedModules extends ProjectStructureElementUsage {
private final StructureConfigurableContext myContext;
private final GeneralProjectSettingsElement myContainingElement;
private final ProjectStructureElement mySourceElement;
private final String myPresentableName;
public UsagesInUnloadedModules(StructureConfigurableContext context, GeneralProjectSettingsElement element,
ProjectStructureElement sourceElement, Collection<UnloadedModuleDescription> unloadedModules) {
myContext = context;
myContainingElement = element;
mySourceElement = sourceElement;
myPresentableName =
unloadedModules.size() > 1 ? unloadedModules.size() + " Unloaded Modules"
: "Unloaded Module '" + ObjectUtils.notNull(ContainerUtil.getFirstItem(unloadedModules)).getName() + "'";
}
@Override
public ProjectStructureElement getSourceElement() {
return mySourceElement;
}
@Override
public ProjectStructureElement getContainingElement() {
return myContainingElement;
}
@Override
public String getPresentableName() {
return myPresentableName;
}
@Override
public PlaceInProjectStructure getPlace() {
Place configurablePlace = ProjectStructureConfigurable.getInstance(myContext.getProject()).createProjectConfigurablePlace();
return new PlaceInProjectStructureBase(myContext.getProject(), configurablePlace, myContainingElement);
}
@Override
public void removeSourceElement() {
}
@Override
public void replaceElement(ProjectStructureElement newElement) {
}
@Override
public Icon getIcon() {
return AllIcons.Modules.UnloadedModule;
}
@Override
public int hashCode() {
return 0;
}
@Override
public boolean equals(Object obj) {
return obj instanceof UsagesInUnloadedModules;
}
}