diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java index 115981ad51bb..134ac624f93e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java @@ -26,11 +26,14 @@ import com.intellij.util.containers.hash.HashSet; import com.intellij.util.xml.DomFileElement; import com.intellij.util.xml.highlighting.BasicDomElementsInspection; import com.intellij.util.xml.highlighting.DomElementAnnotationHolder; +import gnu.trove.THashMap; +import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.dom.DependencyConflictId; import org.jetbrains.idea.maven.dom.MavenDomBundle; import org.jetbrains.idea.maven.dom.MavenDomProjectProcessorUtils; import org.jetbrains.idea.maven.dom.MavenDomUtil; +import org.jetbrains.idea.maven.dom.model.MavenDomDependencies; import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; import org.jetbrains.idea.maven.project.MavenProject; @@ -47,11 +50,12 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec DomElementAnnotationHolder holder) { MavenDomProjectModel projectModel = domFileElement.getRootElement(); - checkMavenProjectModel(projectModel, holder); + checkManagedDependencies(projectModel, holder); + checkDependencies(projectModel, holder); } - private static void checkMavenProjectModel(@NotNull MavenDomProjectModel projectModel, - @NotNull DomElementAnnotationHolder holder) { + private static void checkDependencies(@NotNull MavenDomProjectModel projectModel, + @NotNull DomElementAnnotationHolder holder) { final Map> allDuplicates = getDuplicateDependenciesMap(projectModel); for (MavenDomDependency dependency : projectModel.getDependencies().getDependencies()) { @@ -152,19 +156,7 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec Processor collectProcessor = new Processor() { public boolean process(MavenDomProjectModel model) { - for (MavenDomDependency dependency : model.getDependencies().getDependencies()) { - DependencyConflictId mavenId = DependencyConflictId.create(dependency); - if (mavenId != null) { - if (allDependencies.containsKey(mavenId)) { - allDependencies.get(mavenId).add(dependency); - } - else { - Set dependencies = new HashSet(); - dependencies.add(dependency); - allDependencies.put(mavenId, dependencies); - } - } - } + collect(allDependencies, model.getDependencies()); return false; } }; @@ -175,6 +167,36 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec return allDependencies; } + private static void collect(Map> duplicates, @NotNull MavenDomDependencies dependencies) { + for (MavenDomDependency dependency : dependencies.getDependencies()) { + DependencyConflictId mavenId = DependencyConflictId.create(dependency); + if (mavenId == null) continue; + + Set set = duplicates.get(mavenId); + if (set == null) { + set = new THashSet(); + duplicates.put(mavenId, set); + } + + set.add(dependency); + } + } + + private static void checkManagedDependencies(@NotNull MavenDomProjectModel projectModel, + @NotNull DomElementAnnotationHolder holder) { + final Map> duplicates = new THashMap>(); + collect(duplicates, projectModel.getDependencyManagement().getDependencies()); + + for (Map.Entry> entry : duplicates.entrySet()) { + Set set = entry.getValue(); + if (set.size() <= 1) continue; + + for (MavenDomDependency dependency : set) { + holder.createProblem(dependency, HighlightSeverity.WARNING, "Duplicated dependency"); + } + } + } + @NotNull public String getGroupDisplayName() { return MavenDomBundle.message("inspection.group"); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy b/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy index 9bee055ff90b..c5891687bb9c 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy @@ -216,4 +216,40 @@ class MavenDuplicatedInspectionTest extends MavenDomTestCase { checkHighlighting(myProjectPom, true, false, true) } + public void testDuplicatedInManagedDependencies() { + myFixture.enableInspections(MavenDuplicateDependenciesInspection) + + createProjectPom(""" + mavenParent + childA + 1.0 + + + + <dependency> + junit + junit + 3.8.2 + jar + + + <dependency> + junit + junit + 4.0 + + + + junit + junit + 4.0 + sources + + + +""") + + checkHighlighting() + } + }