Gradle: use module level libraries for different dependencies with the same name (IDEA-191341)

This commit is contained in:
Vladislav.Soroka
2018-06-13 22:05:58 +03:00
parent 86a3c8dbc3
commit b9cfdc23ee
3 changed files with 64 additions and 58 deletions
@@ -153,7 +153,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
mainModuleData.setIdeModuleGroup(isRootModule ? null : moduleGroup);
}
for (ExternalSourceSet sourceSet : externalProject.getSourceSets().values()) {
for (ExternalSourceSet sourceSet: externalProject.getSourceSets().values()) {
final String moduleId = getModuleId(resolverCtx, gradleModule, sourceSet);
final String moduleExternalName = gradleModule.getName() + ":" + sourceSet.getName();
final String moduleInternalName = getInternalModuleName(gradleModule, externalProject, sourceSet.getName(), resolverCtx);
@@ -207,14 +207,15 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
assert sourceSetMap != null;
sourceSetMap.put(moduleId, Pair.create(sourceSetDataNode, sourceSet));
}
} else {
}
else {
try {
IdeaJavaLanguageSettings languageSettings = gradleModule.getJavaLanguageSettings();
if(languageSettings != null) {
if(languageSettings.getLanguageLevel() != null) {
if (languageSettings != null) {
if (languageSettings.getLanguageLevel() != null) {
mainModuleData.setSourceCompatibility(languageSettings.getLanguageLevel().toString());
}
if(languageSettings.getTargetBytecodeVersion() != null) {
if (languageSettings.getTargetBytecodeVersion() != null) {
mainModuleData.setTargetCompatibility(languageSettings.getTargetBytecodeVersion().toString());
}
}
@@ -271,11 +272,11 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
processSourceSets(resolverCtx, gradleModule, externalProject, ideModule, new SourceSetsProcessor() {
@Override
public void process(@NotNull DataNode<? extends ModuleData> dataNode, @NotNull ExternalSourceSet sourceSet) {
for (Map.Entry<IExternalSystemSourceType, ExternalSourceDirectorySet> directorySetEntry : sourceSet.getSources().entrySet()) {
for (Map.Entry<IExternalSystemSourceType, ExternalSourceDirectorySet> directorySetEntry: sourceSet.getSources().entrySet()) {
ExternalSystemSourceType sourceType = ExternalSystemSourceType.from(directorySetEntry.getKey());
ExternalSourceDirectorySet sourceDirectorySet = directorySetEntry.getValue();
for (File file : sourceDirectorySet.getSrcDirs()) {
for (File file: sourceDirectorySet.getSrcDirs()) {
ContentRootData ideContentRoot = new ContentRootData(GradleConstants.SYSTEM_ID, file.getAbsolutePath());
ideContentRoot.storePath(sourceType, file.getAbsolutePath());
dataNode.createChild(ProjectKeys.CONTENT_ROOT, ideContentRoot);
@@ -289,7 +290,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
if (contentRoots == null) {
return;
}
for (IdeaContentRoot gradleContentRoot : contentRoots) {
for (IdeaContentRoot gradleContentRoot: contentRoots) {
if (gradleContentRoot == null) continue;
File rootDirectory = gradleContentRoot.getRootDirectory();
@@ -309,7 +310,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
Set<File> excluded = gradleContentRoot.getExcludeDirectories();
if (excluded != null) {
for (File file : excluded) {
for (File file: excluded) {
ideContentRoot.storePath(ExternalSystemSourceType.EXCLUDED, file.getAbsolutePath());
}
}
@@ -323,11 +324,11 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
@NotNull DataNode<ModuleData> ideModule,
@NotNull SourceSetsProcessor processor) {
Map<String, DataNode<GradleSourceSetData>> sourceSetsMap = ContainerUtil.newHashMap();
for (DataNode<GradleSourceSetData> dataNode : ExternalSystemApiUtil.findAll(ideModule, GradleSourceSetData.KEY)) {
for (DataNode<GradleSourceSetData> dataNode: ExternalSystemApiUtil.findAll(ideModule, GradleSourceSetData.KEY)) {
sourceSetsMap.put(dataNode.getData().getId(), dataNode);
}
for (ExternalSourceSet sourceSet : externalProject.getSourceSets().values()) {
for (ExternalSourceSet sourceSet: externalProject.getSourceSets().values()) {
if (sourceSet == null || sourceSet.getSources().isEmpty()) continue;
final String moduleId = getModuleId(resolverCtx, gradleModule, sourceSet);
@@ -361,7 +362,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
gradleOutputMap = MultiMap.create();
dataNode.putUserData(GradleProjectResolver.GRADLE_OUTPUTS, gradleOutputMap);
}
for (Map.Entry<IExternalSystemSourceType, ExternalSourceDirectorySet> directorySetEntry : sourceSet.getSources().entrySet()) {
for (Map.Entry<IExternalSystemSourceType, ExternalSourceDirectorySet> directorySetEntry: sourceSet.getSources().entrySet()) {
ExternalSystemSourceType sourceType = ExternalSystemSourceType.from(directorySetEntry.getKey());
ExternalSourceDirectorySet sourceDirectorySet = directorySetEntry.getValue();
final ModuleData moduleData = dataNode.getData();
@@ -370,10 +371,10 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
moduleData.setCompileOutputPath(sourceType, outputDir.getAbsolutePath());
moduleData.setInheritProjectCompileOutputPath(sourceDirectorySet.isCompilerOutputPathInherited());
for (File gradleOutputDir : sourceDirectorySet.getGradleOutputDirs()) {
for (File gradleOutputDir: sourceDirectorySet.getGradleOutputDirs()) {
String gradleOutputPath = ExternalSystemApiUtil.toCanonicalPath(gradleOutputDir.getAbsolutePath());
gradleOutputMap.putValue(sourceType, gradleOutputPath);
if(!gradleOutputDir.getPath().equals(outputDir.getPath())) {
if (!gradleOutputDir.getPath().equals(outputDir.getPath())) {
moduleOutputsMap.put(gradleOutputPath, Pair.create(moduleData.getId(), sourceType));
}
}
@@ -408,7 +409,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
}
}
for (Map.Entry<ExternalSystemSourceType, File> sourceTypeFileEntry : compileOutputPaths.entrySet()) {
for (Map.Entry<ExternalSystemSourceType, File> sourceTypeFileEntry: compileOutputPaths.entrySet()) {
final File outputPath = sourceTypeFileEntry.getValue();
if (outputPath != null) {
moduleData.setCompileOutputPath(sourceTypeFileEntry.getKey(), outputPath.getAbsolutePath());
@@ -471,7 +472,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
List<String> orphanModules = ContainerUtil.newArrayList();
Map<String, ModuleData> modulesIndex = ContainerUtil.newHashMap();
for (DataNode<ModuleData> dataNode : ExternalSystemApiUtil.getChildren(ideProject, ProjectKeys.MODULE)) {
for (DataNode<ModuleData> dataNode: ExternalSystemApiUtil.getChildren(ideProject, ProjectKeys.MODULE)) {
modulesIndex.put(dataNode.getData().getExternalName(), dataNode.getData());
}
@@ -545,7 +546,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
final boolean isFlatProject = !FileUtil.isAncestor(rootProjectPath, moduleConfigPath, false);
if (externalProject != null) {
for (ExternalTask task : externalProject.getTasks().values()) {
for (ExternalTask task: externalProject.getTasks().values()) {
String taskName = isFlatProject ? task.getQName() : task.getName();
String taskGroup = task.getGroup();
if (taskName.trim().isEmpty() || isIdeaTask(taskName, taskGroup)) {
@@ -563,7 +564,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
return tasks;
}
for (GradleTask task : gradleModule.getGradleProject().getTasks()) {
for (GradleTask task: gradleModule.getGradleProject().getTasks()) {
String taskName = task.getName();
String taskGroup = getTaskGroup(task);
if (taskName == null || taskName.trim().isEmpty() || isIdeaTask(taskName, taskGroup)) {
@@ -743,7 +744,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
if (dirs == null) {
return;
}
for (IdeaSourceDirectory dir : dirs) {
for (IdeaSourceDirectory dir: dirs) {
ExternalSystemSourceType dirSourceType = type;
try {
if (dir.isGenerated() && !dirSourceType.isGenerated()) {
@@ -773,7 +774,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
final Class<?> aClass = obj.getClass();
LOG.debug(String.format("obj class: %s", aClass));
LOG.debug(String.format("classloader: %s", aClass.getClassLoader()));
for (Method m : aClass.getDeclaredMethods()) {
for (Method m: aClass.getDeclaredMethods()) {
LOG.debug(String.format("obj m: %s", m));
}
@@ -788,7 +789,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
LOG.debug(String.format("delegate: %s", delegate));
LOG.debug(String.format("delegate class: %s", delegate.getClass()));
LOG.debug(String.format("delegate classloader: %s", delegate.getClass().getClassLoader()));
for (Method m : delegate.getClass().getDeclaredMethods()) {
for (Method m: delegate.getClass().getDeclaredMethods()) {
LOG.debug(String.format("delegate m: %s", m));
}
}
@@ -807,7 +808,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
if (scopeAsString == null) {
return null;
}
for (DependencyScope dependencyScope : DependencyScope.values()) {
for (DependencyScope dependencyScope: DependencyScope.values()) {
if (scopeAsString.equalsIgnoreCase(dependencyScope.toString())) {
return dependencyScope;
}
@@ -819,7 +820,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
private static ModuleDependencyData buildDependency(@NotNull ProjectResolverContext resolverContext,
@NotNull DataNode<ModuleData> ownerModule,
@NotNull IdeaModuleDependency dependency,
@NotNull Map<String, ModuleData> registeredModulesIndex)
@NotNull Map<String, ModuleData> registeredModulesIndex)
throws IllegalStateException {
final GradleExecutionSettings gradleExecutionSettings = resolverContext.getSettings();
@@ -873,8 +874,8 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
}
String libraryName;
LibraryLevel level;
final GradleModuleVersion moduleVersion = dependency.getGradleModuleVersion();
final LibraryLevel level;
// Gradle API doesn't explicitly provide information about unresolved libraries (http://issues.gradle.org/browse/GRADLE-1995).
// That's why we use this dirty hack here.
@@ -885,12 +886,14 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
boolean isModuleLocalLibrary = false;
try {
isModuleLocalLibrary = FileUtil.isAncestor(gradleModule.getGradleProject().getProjectDirectory(), binaryPath, false);
} catch (UnsupportedMethodException e) {
}
catch (UnsupportedMethodException e) {
// ignore, generate project-level library for the dependency
}
if (isModuleLocalLibrary) {
level = LibraryLevel.MODULE;
} else {
}
else {
level = LibraryLevel.PROJECT;
}
@@ -948,7 +951,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
}
final LibraryData library = new LibraryData(GradleConstants.SYSTEM_ID, libraryName, unresolved);
if(moduleVersion != null) {
if (moduleVersion != null) {
library.setGroup(moduleVersion.getGroup());
library.setArtifactId(moduleVersion.getName());
library.setVersion(moduleVersion.getVersion());
@@ -975,8 +978,8 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver
library.addPath(LibraryPathType.DOC, javadocPath.getAbsolutePath());
}
if (level == LibraryLevel.PROJECT) {
linkProjectLibrary(ideProject, library);
if (level == LibraryLevel.PROJECT && !linkProjectLibrary(ideProject, library)) {
level = LibraryLevel.MODULE;
}
return new LibraryDependencyData(ownerModule.getData(), library, level);
@@ -205,7 +205,7 @@ public class GradleProjectResolverUtil {
*/
@Nullable
public static File getModuleDirPath(@NotNull GradleBuild build, @NotNull String path) {
for (BasicGradleProject project : build.getProjects()) {
for (BasicGradleProject project: build.getProjects()) {
if (project.getPath().equals(path)) {
return project.getProjectDirectory();
}
@@ -323,7 +323,7 @@ public class GradleProjectResolverUtil {
File gradleSrc = new File(gradleHomeDir, "src");
File[] gradleSrcRoots = gradleSrc.listFiles();
if (gradleSrcRoots == null) return;
for (File srcRoot : gradleSrcRoots) {
for (File srcRoot: gradleSrcRoots) {
library.addPath(LibraryPathType.SOURCE, srcRoot.getAbsolutePath());
}
}
@@ -357,7 +357,7 @@ public class GradleProjectResolverUtil {
return;
}
for (String path : libraryData.getPaths(LibraryPathType.BINARY)) {
for (String path: libraryData.getPaths(LibraryPathType.BINARY)) {
try {
final Path file = Paths.get(path);
if (!FileUtil.isAncestor(gradleUserHomeDir.getPath(), path, true)) continue;
@@ -497,7 +497,7 @@ public class GradleProjectResolverUtil {
@Nullable DataNode<ProjectData> ideProject) throws IllegalStateException {
Map<ExternalDependencyId, ExternalDependency> dependencyMap = ContainerUtil.newLinkedHashMap();
for (ExternalDependency dependency : dependencies) {
for (ExternalDependency dependency: dependencies) {
final ExternalDependency dep = dependencyMap.get(dependency.getId());
if (dep instanceof AbstractExternalDependency) {
dep.getDependencies().addAll(ContainerUtil.subtract(dependency.getDependencies(), dep.getDependencies()));
@@ -507,7 +507,7 @@ public class GradleProjectResolverUtil {
}
}
for (ExternalDependency dependency : dependencyMap.values()) {
for (ExternalDependency dependency: dependencyMap.values()) {
final ExternalDependency mergedDependency = ContainerUtil.getOrElse(mergedDependencyMap, dependency.getId(), dependency);
DependencyScope dependencyScope = getDependencyScope(mergedDependency.getScope());
@@ -552,7 +552,7 @@ public class GradleProjectResolverUtil {
String moduleId = getModuleId(projectDependency);
Pair<DataNode<GradleSourceSetData>, ExternalSourceSet> projectPair = sourceSetMap.get(moduleId);
if (projectPair == null) {
for (File file : projectDependency.getProjectDependencyArtifacts()) {
for (File file: projectDependency.getProjectDependencyArtifacts()) {
moduleId = artifactsMap.get(ExternalSystemApiUtil.toCanonicalPath(file.getAbsolutePath()));
if (moduleId == null) continue;
projectPair = sourceSetMap.get(moduleId);
@@ -577,7 +577,7 @@ public class GradleProjectResolverUtil {
libraryDependencyData.setExported(mergedDependency.getExported());
if (!projectDependency.getProjectDependencyArtifacts().isEmpty()) {
for (File artifact : projectDependency.getProjectDependencyArtifacts()) {
for (File artifact: projectDependency.getProjectDependencyArtifacts()) {
library.addPath(LibraryPathType.BINARY, artifact.getPath());
}
depOwnerDataNode = ownerDataNode.createChild(ProjectKeys.LIBRARY_DEPENDENCY, libraryDependencyData);
@@ -587,7 +587,7 @@ public class GradleProjectResolverUtil {
}
}
else {
for (ProjectDependencyInfo projectDependencyInfo : projectDependencyInfos) {
for (ProjectDependencyInfo projectDependencyInfo: projectDependencyInfos) {
ModuleDependencyData moduleDependencyData = new ModuleDependencyData(ownerModule, projectDependencyInfo.myModuleData);
moduleDependencyData.setScope(dependencyScope);
if (projectDependencyInfo.mySourceSet != null && "test".equals(projectDependencyInfo.mySourceSet.getName())) {
@@ -608,15 +608,10 @@ public class GradleProjectResolverUtil {
}
else if (mergedDependency instanceof ExternalLibraryDependency) {
String libraryName = mergedDependency.getId().getPresentableName();
final LibraryLevel level = StringUtil.isNotEmpty(libraryName) ? LibraryLevel.PROJECT : LibraryLevel.MODULE;
final LibraryData library = new LibraryData(GradleConstants.SYSTEM_ID, libraryName);
library.setArtifactId(mergedDependency.getId().getName());
library.setGroup(mergedDependency.getId().getGroup());
library.setVersion(mergedDependency.getId().getVersion());
LibraryDependencyData libraryDependencyData = new LibraryDependencyData(ownerModule, library, level);
libraryDependencyData.setScope(dependencyScope);
libraryDependencyData.setOrder(mergedDependency.getClasspathOrder());
libraryDependencyData.setExported(mergedDependency.getExported());
library.addPath(LibraryPathType.BINARY, ((ExternalLibraryDependency)mergedDependency).getFile().getAbsolutePath());
File sourcePath = ((ExternalLibraryDependency)mergedDependency).getSource();
@@ -627,11 +622,17 @@ public class GradleProjectResolverUtil {
if (javaDocPath != null) {
library.addPath(LibraryPathType.DOC, javaDocPath.getAbsolutePath());
}
depOwnerDataNode = ownerDataNode.createChild(ProjectKeys.LIBRARY_DEPENDENCY, libraryDependencyData);
if (StringUtil.isNotEmpty(libraryName)) {
linkProjectLibrary(ideProject, library);
LibraryLevel level = StringUtil.isNotEmpty(libraryName) ? LibraryLevel.PROJECT : LibraryLevel.MODULE;
if (StringUtil.isEmpty(libraryName) || !linkProjectLibrary(ideProject, library)) {
level = LibraryLevel.MODULE;
}
LibraryDependencyData libraryDependencyData = new LibraryDependencyData(ownerModule, library, level);
libraryDependencyData.setScope(dependencyScope);
libraryDependencyData.setOrder(mergedDependency.getClasspathOrder());
libraryDependencyData.setExported(mergedDependency.getExported());
depOwnerDataNode = ownerDataNode.createChild(ProjectKeys.LIBRARY_DEPENDENCY, libraryDependencyData);
}
else if (mergedDependency instanceof ExternalMultiLibraryDependency) {
final LibraryLevel level = LibraryLevel.MODULE;
@@ -645,13 +646,13 @@ public class GradleProjectResolverUtil {
libraryDependencyData.setOrder(mergedDependency.getClasspathOrder());
libraryDependencyData.setExported(mergedDependency.getExported());
for (File file : ((ExternalMultiLibraryDependency)mergedDependency).getFiles()) {
for (File file: ((ExternalMultiLibraryDependency)mergedDependency).getFiles()) {
library.addPath(LibraryPathType.BINARY, file.getAbsolutePath());
}
for (File file : ((ExternalMultiLibraryDependency)mergedDependency).getSources()) {
for (File file: ((ExternalMultiLibraryDependency)mergedDependency).getSources()) {
library.addPath(LibraryPathType.SOURCE, file.getAbsolutePath());
}
for (File file : ((ExternalMultiLibraryDependency)mergedDependency).getJavadoc()) {
for (File file: ((ExternalMultiLibraryDependency)mergedDependency).getJavadoc()) {
library.addPath(LibraryPathType.DOC, file.getAbsolutePath());
}
@@ -666,24 +667,23 @@ public class GradleProjectResolverUtil {
libraryDependencyData.setOrder(mergedDependency.getClasspathOrder());
libraryDependencyData.setExported(mergedDependency.getExported());
for (File file : ((FileCollectionDependency)mergedDependency).getFiles()) {
for (File file: ((FileCollectionDependency)mergedDependency).getFiles()) {
library.addPath(LibraryPathType.BINARY, file.getAbsolutePath());
}
ownerDataNode.createChild(ProjectKeys.LIBRARY_DEPENDENCY, libraryDependencyData);
}
else if (mergedDependency instanceof UnresolvedExternalDependency) {
final LibraryLevel level = LibraryLevel.PROJECT;
String libraryName = mergedDependency.getId().getPresentableName();
final LibraryData library = new LibraryData(GradleConstants.SYSTEM_ID, libraryName, true);
LibraryDependencyData libraryDependencyData = new LibraryDependencyData(ownerModule, library, level);
libraryDependencyData.setScope(dependencyScope);
final String failureMessage = ((UnresolvedExternalDependency)mergedDependency).getFailureMessage();
if (failureMessage != null) {
library.addPath(LibraryPathType.BINARY, failureMessage);
}
LibraryLevel level = linkProjectLibrary(ideProject, library) ? LibraryLevel.PROJECT : LibraryLevel.MODULE;
LibraryDependencyData libraryDependencyData = new LibraryDependencyData(ownerModule, library, level);
libraryDependencyData.setScope(dependencyScope);
ownerDataNode.createChild(ProjectKeys.LIBRARY_DEPENDENCY, libraryDependencyData);
linkProjectLibrary(ideProject, library);
}
if (depOwnerDataNode != null) {
@@ -693,14 +693,17 @@ public class GradleProjectResolverUtil {
}
}
public static void linkProjectLibrary(@Nullable DataNode<ProjectData> ideProject, @NotNull final LibraryData library) {
if (ideProject == null) return;
public static boolean linkProjectLibrary(@Nullable DataNode<ProjectData> ideProject, @NotNull final LibraryData library) {
if (ideProject == null) return false;
DataNode<LibraryData> libraryData =
ExternalSystemApiUtil.find(ideProject, ProjectKeys.LIBRARY, node -> library.equals(node.getData()));
String libraryName = library.getExternalName();
DataNode<LibraryData> libraryData = ExternalSystemApiUtil.find(ideProject, ProjectKeys.LIBRARY,
node -> libraryName.equals(node.getData().getExternalName()));
if (libraryData == null) {
ideProject.createChild(ProjectKeys.LIBRARY, library);
return true;
}
return libraryData.getData().equals(library);
}
public static boolean isIdeaTask(final String taskName, @Nullable String group) {
@@ -450,7 +450,7 @@ public class GradleDependenciesImportingTest extends GradleImportingTestCase {
List<LibraryOrderEntry> unresolvableDep = getModuleLibDeps("project_main", "Gradle: some:unresolvable-lib:0.1");
assertEquals(1, unresolvableDep.size());
LibraryOrderEntry unresolvableEntry = unresolvableDep.iterator().next();
assertFalse(unresolvableEntry.isModuleLevel());
assertTrue(unresolvableEntry.isModuleLevel());
assertEquals(DependencyScope.COMPILE, unresolvableEntry.getScope());
String[] unresolvableEntryUrls = unresolvableEntry.getUrls(OrderRootType.CLASSES);
assertEquals(1, unresolvableEntryUrls.length);