From fee33f3d28761056f4eb94d30aa84a47366e7bb8 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Wed, 25 May 2016 12:47:49 +0300 Subject: [PATCH] IDEA-155963 Gradle war 'providedCompile' dependencies not observed since version 2016.1.2 --- .../GradleDependenciesImportingTest.java | 37 +++++++++++++++++++ .../util/DependencyResolverImpl.groovy | 11 ++++-- 2 files changed, 45 insertions(+), 3 deletions(-) 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 425cf98da138..da9d2780358f 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java @@ -644,4 +644,41 @@ public class GradleDependenciesImportingTest extends GradleImportingTestCase { assertModuleLibDepScope("project", "Gradle: junit:junit:4.11", DependencyScope.COMPILE); assertModuleLibDepScope("project", "Gradle: org.hamcrest:hamcrest-core:1.3", DependencyScope.PROVIDED, DependencyScope.RUNTIME); } + + @Test + @TargetVersions("2.0+") + public void testProvidedTransitiveDependencies() throws Exception { + createSettingsFile("include 'projectA', 'projectB', 'projectC' "); + importProject( + "project(':projectA') {\n" + + " apply plugin: 'java'\n" + + "}\n" + + "project(':projectB') {\n" + + " apply plugin: 'java'\n" + + " dependencies {\n" + + " compile project(':projectA')\n" + + " }\n" + + "}\n" + + "project(':projectC') {\n" + + " apply plugin: 'war'\n" + + " dependencies {\n" + + " providedCompile project(':projectB')\n" + + " }\n" + + "}" + ); + + assertModules("project", "projectA", "projectA_main", "projectA_test", "projectB", "projectB_main", "projectB_test", "projectC", "projectC_main", "projectC_test"); + + assertModuleModuleDepScope("projectB_main", "projectA_main", DependencyScope.COMPILE); + assertModuleModuleDepScope("projectC_main", "projectA_main", DependencyScope.PROVIDED); + assertModuleModuleDepScope("projectC_main", "projectB_main", DependencyScope.PROVIDED); + + importProjectUsingSingeModulePerGradleProject(); + assertModules("project", "projectA", "projectB", "projectC"); + assertModuleModuleDepScope("projectB", "projectA", DependencyScope.COMPILE); + if(GradleVersion.version(gradleVersion).compareTo(GradleVersion.version("2.5")) >= 0) { + assertModuleModuleDepScope("projectC", "projectA", DependencyScope.PROVIDED); + } + assertModuleModuleDepScope("projectC", "projectB", DependencyScope.PROVIDED); + } } diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.groovy b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.groovy index 69472611725d..cedf6d10684e 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.groovy +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.groovy @@ -143,10 +143,15 @@ class DependencyResolverImpl implements DependencyResolver { Map componentResultsMap = [:]; componentResults.each { componentResultsMap.put(it.id, it) } - Multimap configurationProjectDependencies = ArrayListMultimap.create() - configuration.incoming.dependencies.findAll { it instanceof ProjectDependency }.each { - configurationProjectDependencies.put(toComponentIdentifier(it.group, it.name, it.version), it as ProjectDependency) + def projectDeps + projectDeps = { Configuration conf, map = ArrayListMultimap.create() -> + conf.incoming.dependencies.findAll { it instanceof ProjectDependency }.each { it -> + map.put(toComponentIdentifier(it.group, it.name, it.version), it as ProjectDependency) + projectDeps((it as ProjectDependency).projectConfiguration, map) + } + map } + Multimap configurationProjectDependencies = projectDeps(configuration) ResolutionResult resolutionResult = configuration.incoming.resolutionResult if(!configuration.resolvedConfiguration.hasError()) {