diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java index 63ed83894fdb..ef3bf971394f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java @@ -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 dataNode, @NotNull ExternalSourceSet sourceSet) { - for (Map.Entry directorySetEntry : sourceSet.getSources().entrySet()) { + for (Map.Entry 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 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 ideModule, @NotNull SourceSetsProcessor processor) { Map> sourceSetsMap = ContainerUtil.newHashMap(); - for (DataNode dataNode : ExternalSystemApiUtil.findAll(ideModule, GradleSourceSetData.KEY)) { + for (DataNode 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 directorySetEntry : sourceSet.getSources().entrySet()) { + for (Map.Entry 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 sourceTypeFileEntry : compileOutputPaths.entrySet()) { + for (Map.Entry 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 orphanModules = ContainerUtil.newArrayList(); Map modulesIndex = ContainerUtil.newHashMap(); - for (DataNode dataNode : ExternalSystemApiUtil.getChildren(ideProject, ProjectKeys.MODULE)) { + for (DataNode 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 ownerModule, @NotNull IdeaModuleDependency dependency, - @NotNull Map registeredModulesIndex) + @NotNull Map 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); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverUtil.java index f942ebf3a1f4..ce91a771989c 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverUtil.java @@ -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 ideProject) throws IllegalStateException { Map 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, 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 ideProject, @NotNull final LibraryData library) { - if (ideProject == null) return; + public static boolean linkProjectLibrary(@Nullable DataNode ideProject, @NotNull final LibraryData library) { + if (ideProject == null) return false; - DataNode libraryData = - ExternalSystemApiUtil.find(ideProject, ProjectKeys.LIBRARY, node -> library.equals(node.getData())); + String libraryName = library.getExternalName(); + DataNode 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) { diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java index 4010d4371e66..a881f77ae57d 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java @@ -450,7 +450,7 @@ public class GradleDependenciesImportingTest extends GradleImportingTestCase { List 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);