diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java index 78209645d1cc..460e07bce1a1 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java @@ -438,13 +438,12 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver testSet = ContainerUtil.newHashSet(); - Map gradleTestOutputs = pair.first.getUserData(GRADLE_OUTPUTS); - if(gradleTestOutputs != null) { - ContainerUtil.addAllNotNull(compileSet, - gradleTestOutputs.get(ExternalSystemSourceType.TEST), - gradleTestOutputs.get(ExternalSystemSourceType.TEST_RESOURCE)); + if(gradleOutputs != null) { + ContainerUtil.addAllNotNull(testSet, + gradleOutputs.get(ExternalSystemSourceType.TEST), + gradleOutputs.get(ExternalSystemSourceType.TEST_RESOURCE)); } - if (compileSet.isEmpty() && ContainerUtil.intersects(libraryPaths, testSet)) { + if (!testSet.isEmpty() && ContainerUtil.intersects(libraryPaths, testSet)) { targetModuleOutputPaths = testSet; } } 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 161986352c98..e1a2e15dbe7a 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java @@ -849,4 +849,50 @@ public class GradleDependenciesImportingTest extends GradleImportingTestCase { } assertModuleModuleDepScope("projectC", "projectB", DependencyScope.PROVIDED); } + + @Test + public void testProjectConfigurationDependencyWithDependencyOnTestOutput() throws Exception { + createSettingsFile("include 'project1'\n" + + "include 'project2'\n"); + + importProject( + "project(':project1') {\n" + + " apply plugin: 'java'\n" + + " configurations {\n" + + " testOutput\n" + + " testOutput.extendsFrom (testCompile)\n" + + " }\n" + + "\n" + + " dependencies {\n" + + " testOutput sourceSets.test.output\n" + + " testCompile group: 'junit', name: 'junit', version: '4.11'\n" + + " }\n" + + "}\n" + + "\n" + + "project(':project2') {\n" + + " apply plugin: 'java'\n" + + " dependencies {\n" + + " compile project(path: ':project1')\n" + + "\n" + + " testCompile group: 'junit', name: 'junit', version: '4.11'\n" + + " testCompile project(path: ':project1', configuration: 'testOutput')\n" + + " }\n" + + "\n" + + "}\n" + ); + + assertModules("project", "project1", "project1_main", "project1_test", "project2", "project2_main", "project2_test"); + + assertModuleModuleDepScope("project1_test", "project1_main", DependencyScope.COMPILE); + assertModuleLibDepScope("project1_test", "Gradle: junit:junit:4.11", DependencyScope.COMPILE); + assertModuleLibDepScope("project1_test", "Gradle: org.hamcrest:hamcrest-core:1.3", DependencyScope.COMPILE); + + assertModuleModuleDepScope("project2_main", "project1_main", DependencyScope.COMPILE); + + assertModuleModuleDepScope("project2_test", "project2_main", DependencyScope.COMPILE); + assertModuleModuleDepScope("project2_test", "project1_test", DependencyScope.COMPILE); + assertModuleModuleDepScope("project2_test", "project1_main", DependencyScope.COMPILE); + assertModuleLibDepScope("project2_test", "Gradle: junit:junit:4.11", DependencyScope.COMPILE); + assertModuleLibDepScope("project2_test", "Gradle: org.hamcrest:hamcrest-core:1.3", DependencyScope.COMPILE); + } } diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultExternalProjectDependency.java b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultExternalProjectDependency.java index b504fbc8d99e..807b4c0f1bff 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultExternalProjectDependency.java +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/model/DefaultExternalProjectDependency.java @@ -63,6 +63,10 @@ public class DefaultExternalProjectDependency extends AbstractExternalDependency public void setConfigurationName(String configurationName) { myConfigurationName = configurationName; + // have to differentiate(using different DefaultExternalDependencyId) project dependencies on different configurations + if(!Dependency.DEFAULT_CONFIGURATION.equals(configurationName)){ + setClassifier(configurationName); + } } @Override 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 fc51a2d5192a..dd6ac919a370 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 @@ -155,10 +155,19 @@ class DependencyResolverImpl implements DependencyResolver { ResolutionResult resolutionResult = configuration.incoming.resolutionResult if(!configuration.resolvedConfiguration.hasError()) { - def fileDeps = new LinkedHashSet(configuration.incoming.files.files); + Collection fileDeps = new LinkedHashSet(configuration.incoming.files.files); artifactMap.values().each { fileDeps.remove(it.file) } + configurationProjectDependencies.values().each { + def intersect = fileDeps.intersect(it.resolve()) + if(!intersect.isEmpty()) { + def fileCollectionDependency = new DefaultFileCollectionDependency(intersect) + fileCollectionDependency.scope = scope + result.add(fileCollectionDependency) + fileDeps.removeAll(intersect) + } + } fileDeps.each { def fileCollectionDependency = new DefaultFileCollectionDependency([it]) fileCollectionDependency.scope = scope