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 1225be4b127b..eb20864270a0 100644
--- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java
+++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleDependenciesImportingTest.java
@@ -1243,6 +1243,69 @@ public class GradleDependenciesImportingTest extends GradleImportingTestCase {
assertModuleLibDepScope("project2_test", "Gradle: org.hamcrest:hamcrest-core:1.3", DependencyScope.COMPILE);
}
+ @TargetVersions("2.0+")
+ @Test
+ public void testJavadocAndSourcesForDependencyWithMultipleArtifacts() throws Exception {
+ createProjectSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/ivy-1.0-SNAPSHOT.xml",
+ "\n" +
+ "\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ "\n");
+ VirtualFile classesJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT.jar");
+ VirtualFile javadocJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT-javadoc.jar");
+ VirtualFile sourcesJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT-sources.jar");
+ createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT.jar");
+ createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT-javadoc.jar");
+ createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT-sources.jar");
+
+ importProject(
+ "apply plugin: 'java'\n" +
+ "\n" +
+ "repositories {\n" +
+ " ivy { url file('repo') }\n" +
+ "}\n" +
+ "\n" +
+ "dependencies {\n" +
+ " compile 'depGroup:depArtifact:1.0-SNAPSHOT'\n" +
+ "}\n" +
+ "apply plugin: 'idea'\n" +
+ "idea.module.downloadJavadoc true"
+ );
+
+ assertModules("project", "project_main", "project_test");
+
+ assertModuleModuleDepScope("project_test", "project_main", DependencyScope.COMPILE);
+
+ final String depName = "Gradle: depGroup:depArtifact:1.0-SNAPSHOT";
+ assertModuleLibDep("project_main", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl());
+ assertModuleLibDepScope("project_main", depName, DependencyScope.COMPILE);
+ assertModuleLibDep("project_test", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl());
+ assertModuleLibDepScope("project_test", depName, DependencyScope.COMPILE);
+
+ importProjectUsingSingeModulePerGradleProject();
+ assertModules("project");
+
+ // Gradle built-in models has been fixed since 2.3 version, https://issues.gradle.org/browse/GRADLE-3170
+ if(GradleVersion.version(gradleVersion).compareTo(GradleVersion.version("2.3")) >= 0) {
+ assertModuleLibDep("project", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl());
+ }
+ assertMergedModuleCompileLibDepScope("project", depName);
+ }
+
private void assertMergedModuleCompileLibDepScope(String moduleName, String depName) {
if (isGradleOlderThen_3_4()) {
assertModuleLibDepScope(moduleName, depName, DependencyScope.COMPILE);
diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.java b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.java
index 4397a8e72415..aa54d8a336ba 100644
--- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.java
+++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/util/DependencyResolverImpl.java
@@ -19,11 +19,11 @@ package org.jetbrains.plugins.gradle.tooling.util;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
+import com.google.common.io.Files;
import groovy.lang.MetaMethod;
import groovy.lang.MetaProperty;
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
@@ -65,7 +65,6 @@ import java.util.regex.Pattern;
import static com.google.common.base.Predicates.isNull;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.find;
import static org.codehaus.groovy.runtime.StringGroovyMethods.capitalize;
/**
@@ -1181,21 +1180,14 @@ public class DependencyResolverImpl implements DependencyResolver {
ComponentArtifactsResult artifactsResult = componentResultsMap.get(componentIdentifier);
if (artifactsResult != null) {
- final Set sourceArtifacts = artifactsResult.getArtifacts(SourcesArtifact.class);
- ResolvedArtifactResult sourcesResult = sourceArtifacts != null && !sourceArtifacts.isEmpty()
- ? (ResolvedArtifactResult)find(sourceArtifacts, Predicates.instanceOf(ResolvedArtifactResult.class))
- : null;
- if (sourcesResult != null) {
- ((DefaultExternalLibraryDependency)dependency).setSource(sourcesResult.getFile());
+ ArtifactResult sourcesResult = findMatchingArtifact(artifact, artifactsResult, SourcesArtifact.class);
+ if (sourcesResult instanceof ResolvedArtifactResult) {
+ ((DefaultExternalLibraryDependency)dependency).setSource(((ResolvedArtifactResult)sourcesResult).getFile());
}
-
- final Set javadocArtifacts = artifactsResult.getArtifacts(JavadocArtifact.class);
- ResolvedArtifactResult javadocResult = javadocArtifacts != null && !javadocArtifacts.isEmpty()
- ? (ResolvedArtifactResult)find(javadocArtifacts, Predicates.instanceOf(ResolvedArtifactResult.class))
- : null;
- if (javadocResult != null) {
- ((DefaultExternalLibraryDependency)dependency).setJavadoc(javadocResult.getFile());
+ ArtifactResult javadocResult = findMatchingArtifact(artifact, artifactsResult, JavadocArtifact.class);
+ if (javadocResult instanceof ResolvedArtifactResult) {
+ ((DefaultExternalLibraryDependency)dependency).setJavadoc(((ResolvedArtifactResult)javadocResult).getFile());
}
}
}
@@ -1235,6 +1227,24 @@ public class DependencyResolverImpl implements DependencyResolver {
}
}
+ private static ArtifactResult findMatchingArtifact(ResolvedArtifact artifact,
+ ComponentArtifactsResult componentArtifacts,
+ Class extends Artifact> artifactType) {
+ String baseName = Files.getNameWithoutExtension(artifact.getFile().getName());
+ Set artifactResults = componentArtifacts.getArtifacts(artifactType);
+
+ if (artifactResults.size() == 1) {
+ return artifactResults.iterator().next();
+ }
+
+ for (ArtifactResult result : artifactResults) {
+ if (result instanceof ResolvedArtifactResult && ((ResolvedArtifactResult)result).getFile().getName().startsWith(baseName)) {
+ return result;
+ }
+ }
+ return null;
+ }
+
private static boolean isProjectDependencyArtifact(ResolvedArtifact artifact) {
return isDependencySubstitutionsSupported && artifact.getId().getComponentIdentifier() instanceof ProjectComponentIdentifier;
}