diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleCompositeImportingTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleCompositeImportingTest.java index 293952cb009d..9c50d596295f 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleCompositeImportingTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleCompositeImportingTest.java @@ -549,4 +549,53 @@ public class GradleCompositeImportingTest extends GradleImportingTestCase { assertModuleModuleDeps("root-project.sub-project.main", "myId.main"); } + + @Test + @TargetVersions("3.1+") + public void testScopeUpdateForSubstituteDependency() throws Exception { + createSettingsFile("rootProject.name = 'pA'\n" + + "include 'pA-1', 'pA-2'\n" + + "includeBuild('pB')\n" + + "includeBuild('pC')"); + + createProjectSubFile("pB/settings.gradle"); + createProjectSubFile("pC/settings.gradle"); + + createProjectSubFile("pA-1/build.gradle", + new GradleBuildScriptBuilderEx() + .applyPlugin("'java-library'") + .addDependency("implementation 'group:pC'") + .generate()); + + createProjectSubFile("pA-2/build.gradle", + new GradleBuildScriptBuilderEx() + .applyPlugin("'java-library'") + .addDependency("implementation project(':pA-1')") + .addDependency("implementation 'group:pB'") + .generate()); + + createProjectSubFile("pB/build.gradle", + new GradleBuildScriptBuilderEx() + .addPostfix("group = 'group'") + .applyPlugin("'java-library'") + .addDependency("api 'group:pC'") + .generate()); + + createProjectSubFile("pC/build.gradle", + new GradleBuildScriptBuilderEx() + .addPostfix("group = 'group'") + .applyPlugin("'java-library'") + .generate()); + + //enableGradleDebugWithSuspend(); + importProject(""); + + assertModules("pA", + "pA.pA-1", "pA.pA-1.main", "pA.pA-1.test", + "pA.pA-2", "pA.pA-2.main", "pA.pA-2.test", + "pB", "pB.main", "pB.test", + "pC", "pC.main", "pC.test"); + + assertModuleModuleDepScope("pA.pA-2.main", "pC.main", COMPILE); + } } diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/resolve/DependencyResolverImpl.java b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/resolve/DependencyResolverImpl.java index a7555792bd1c..e82cf2632484 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/resolve/DependencyResolverImpl.java +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/resolve/DependencyResolverImpl.java @@ -527,9 +527,24 @@ public class DependencyResolverImpl implements DependencyResolver { @NotNull ExternalDependency nextDependency) { Collection seenFiles = getFiles(seenDependency); Collection nextFiles = getFiles(nextDependency); - return seenFiles.containsAll(nextFiles); + boolean filesSeen = seenFiles.containsAll(nextFiles); + boolean projectDependencySeen = compareAsProjectDependencies(seenDependency, nextDependency); + + return filesSeen || projectDependencySeen; } + private static boolean compareAsProjectDependencies(@NotNull ExternalDependency seenDependency, + @NotNull ExternalDependency newDependency) { + if (seenDependency instanceof ExternalProjectDependency + && newDependency instanceof ExternalProjectDependency) { + String seenConfiguration = ((ExternalProjectDependency)seenDependency).getConfigurationName(); + String newConfiguration = ((ExternalProjectDependency)newDependency).getConfigurationName(); + return + seenDependency.getId().equals(newDependency.getId()) + && ((seenConfiguration == newConfiguration) || (seenConfiguration != null && seenConfiguration.equals(newConfiguration))); + } + return false; + } private static void upgradeScopeIfNeeded(@NotNull ExternalDependency targetDependency, @NotNull String newScope) { if (targetDependency.getScope().equals(COMPILE_SCOPE) || !(targetDependency instanceof AbstractExternalDependency)) {