mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-77897 (Maven dependency marked wrongly as duplicate although dependencies have different scopes)
This commit is contained in:
+26
-11
@@ -35,9 +35,7 @@ import org.jetbrains.idea.maven.dom.model.MavenDomDependency;
|
||||
import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel;
|
||||
import org.jetbrains.idea.maven.project.MavenProject;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspection<MavenDomProjectModel> {
|
||||
public MavenDuplicateDependenciesInspection() {
|
||||
@@ -47,15 +45,12 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
|
||||
@Override
|
||||
public void checkFileElement(DomFileElement<MavenDomProjectModel> domFileElement,
|
||||
DomElementAnnotationHolder holder) {
|
||||
|
||||
final XmlFile xmlFile = domFileElement.getFile();
|
||||
MavenDomProjectModel projectModel = domFileElement.getRootElement();
|
||||
|
||||
checkMavenProjectModel(projectModel, xmlFile, holder);
|
||||
checkMavenProjectModel(projectModel, holder);
|
||||
}
|
||||
|
||||
private static void checkMavenProjectModel(@NotNull MavenDomProjectModel projectModel,
|
||||
@NotNull XmlFile xmlFile,
|
||||
@NotNull DomElementAnnotationHolder holder) {
|
||||
final Map<String, Set<MavenDomDependency>> allDuplicates = getDuplicateDependenciesMap(projectModel);
|
||||
|
||||
@@ -64,16 +59,36 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
|
||||
if (id != null) {
|
||||
Set<MavenDomDependency> dependencies = allDuplicates.get(id);
|
||||
if (dependencies != null && dependencies.size() > 1) {
|
||||
addProblem(dependency, dependencies, holder);
|
||||
|
||||
List<MavenDomDependency> duplicatedDependencies = new ArrayList<MavenDomDependency>();
|
||||
|
||||
for (MavenDomDependency d : dependencies) {
|
||||
if (d == dependency) continue;
|
||||
|
||||
if (d.getParent() == dependency.getParent() || scope(d).equals(scope(dependency))) {
|
||||
duplicatedDependencies.add(d);
|
||||
}
|
||||
}
|
||||
|
||||
if (duplicatedDependencies.size() > 0) {
|
||||
addProblem(dependency, duplicatedDependencies, holder);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String scope(MavenDomDependency dependency) {
|
||||
String res = dependency.getScope().getRawText();
|
||||
if (StringUtil.isEmpty(res)) return "compile";
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
private static void addProblem(@NotNull MavenDomDependency dependency,
|
||||
@NotNull Set<MavenDomDependency> dependencies,
|
||||
@NotNull Collection<MavenDomDependency> dependencies,
|
||||
@NotNull DomElementAnnotationHolder holder) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
Set<MavenDomProjectModel> processed = new HashSet<MavenDomProjectModel>();
|
||||
for (MavenDomDependency domDependency : dependencies) {
|
||||
if (dependency.equals(domDependency)) continue;
|
||||
@@ -90,7 +105,7 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
|
||||
}
|
||||
|
||||
private static String createLinkText(@NotNull MavenDomProjectModel model, @NotNull MavenDomDependency dependency) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
XmlTag tag = dependency.getXmlTag();
|
||||
if (tag == null) return getProjectName(model);
|
||||
|
||||
+112
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.jetbrains.idea.maven.inspections
|
||||
|
||||
import org.jetbrains.idea.maven.dom.MavenDomTestCase
|
||||
import org.jetbrains.idea.maven.dom.inspections.MavenDuplicateDependenciesInspection
|
||||
|
||||
/**
|
||||
* @author Sergey Evdokimov
|
||||
*/
|
||||
class MavenDuplicatedInspectionTest extends MavenDomTestCase {
|
||||
|
||||
public void testDuplicatedInOneFile() {
|
||||
myFixture.enableInspections(MavenDuplicateDependenciesInspection)
|
||||
|
||||
createProjectPom("""
|
||||
<groupId>mavenParent</groupId>
|
||||
<artifactId>childA</artifactId>
|
||||
<version>1.0</version>
|
||||
|
||||
<dependencies>
|
||||
<<warning>dependency</warning>>
|
||||
<groupId>commons-collections</groupId>
|
||||
<artifactId>commons-collections</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<<warning>dependency</warning>>
|
||||
<groupId>commons-collections</groupId>
|
||||
<artifactId>commons-collections</artifactId>
|
||||
<version>LATEST</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
""")
|
||||
|
||||
checkHighlighting()
|
||||
}
|
||||
|
||||
public void testDuplicatedInParent() {
|
||||
myFixture.enableInspections(MavenDuplicateDependenciesInspection)
|
||||
|
||||
def m = createModulePom("child", """
|
||||
<groupId>mavenParent</groupId>
|
||||
<artifactId>child</artifactId>
|
||||
<version>1.0</version>
|
||||
|
||||
<parent>
|
||||
<groupId>mavenParent</groupId>
|
||||
<artifactId>parent</artifactId>
|
||||
<version>1.0</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>commons-collections</groupId>
|
||||
<artifactId>commons-collections</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
""")
|
||||
|
||||
createProjectPom("""
|
||||
<groupId>mavenParent</groupId>
|
||||
<artifactId>parent</artifactId>
|
||||
<version>1.0</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<modules>
|
||||
<module>child</module>
|
||||
</modules>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>commons-collections</groupId>
|
||||
<artifactId>commons-collections</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<<warning>dependency</warning>>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>LATEST</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
""")
|
||||
|
||||
importProject()
|
||||
|
||||
checkHighlighting(myProjectPom, true, false, true)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user