Skip to content

Commit 256e705

Browse files
snjezargrunber
authored andcommitted
Organize imports generates duplicate static import statement
Signed-off-by: Snjezana Peco <[email protected]>
1 parent 8d745b2 commit 256e705

File tree

7 files changed

+111
-15
lines changed

7 files changed

+111
-15
lines changed

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/OrganizeImportsHandler.java

+21-15
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.eclipse.jdt.core.Signature;
3333
import org.eclipse.jdt.core.dom.AST;
3434
import org.eclipse.jdt.core.dom.CompilationUnit;
35+
import org.eclipse.jdt.core.dom.IBinding;
3536
import org.eclipse.jdt.core.dom.Name;
3637
import org.eclipse.jdt.core.dom.SimpleName;
3738
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
@@ -181,21 +182,26 @@ private static boolean areEqual(InsertEdit edit1, InsertEdit edit2) {
181182
}
182183

183184
private static void addImports(CompilationUnit root, ICompilationUnit unit, String[] favourites, ImportRewrite importRewrite, AST ast, ASTRewrite astRewrite, SimpleName node, boolean isMethod) throws JavaModelException {
184-
String name = node.getIdentifier();
185-
String[] imports = SimilarElementsRequestor.getStaticImportFavorites(unit, name, isMethod, favourites);
186-
if (imports.length > 1) {
187-
// See https://github.com/redhat-developer/vscode-java/issues/1472
188-
return;
189-
}
190-
for (int i = 0; i < imports.length; i++) {
191-
String curr = imports[i];
192-
String qualifiedTypeName = Signature.getQualifier(curr);
193-
String res = importRewrite.addStaticImport(qualifiedTypeName, name, isMethod, new ContextSensitiveImportRewriteContext(root, node.getStartPosition(), importRewrite));
194-
int dot = res.lastIndexOf('.');
195-
if (dot != -1) {
196-
String usedTypeName = importRewrite.addImport(qualifiedTypeName);
197-
Name newName = ast.newQualifiedName(ast.newName(usedTypeName), ast.newSimpleName(name));
198-
astRewrite.replace(node, newName, null);
185+
IBinding binding = node.resolveBinding();
186+
if (binding != null) {
187+
importRewrite.addStaticImport(binding);
188+
} else {
189+
String name = node.getIdentifier();
190+
String[] imports = SimilarElementsRequestor.getStaticImportFavorites(unit, name, isMethod, favourites);
191+
if (imports.length > 1) {
192+
// See https://github.com/redhat-developer/vscode-java/issues/1472
193+
return;
194+
}
195+
for (int i = 0; i < imports.length; i++) {
196+
String curr = imports[i];
197+
String qualifiedTypeName = Signature.getQualifier(curr);
198+
String res = importRewrite.addStaticImport(qualifiedTypeName, name, isMethod, new ContextSensitiveImportRewriteContext(root, node.getStartPosition(), importRewrite));
199+
int dot = res.lastIndexOf('.');
200+
if (dot != -1) {
201+
String usedTypeName = importRewrite.addImport(qualifiedTypeName);
202+
Name newName = ast.newQualifiedName(ast.newName(usedTypeName), ast.newSimpleName(name));
203+
astRewrite.replace(node, newName, null);
204+
}
199205
}
200206
}
201207
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0"
2+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<groupId>foo.bar</groupId>
6+
<artifactId>salut6</artifactId>
7+
<version>0.0.1-SNAPSHOT</version>
8+
<properties>
9+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
10+
<maven.compiler.source>11</maven.compiler.source>
11+
<maven.compiler.target>11</maven.compiler.target>
12+
</properties>
13+
<dependencies>
14+
<dependency>
15+
<groupId>junit</groupId>
16+
<artifactId>junit</artifactId>
17+
<version>4.11</version>
18+
<scope>test</scope>
19+
</dependency>
20+
<dependency>
21+
<groupId>org.assertj</groupId>
22+
<artifactId>assertj-core</artifactId>
23+
<!-- use 2.9.1 for Java 7 projects -->
24+
<version>3.20.2</version>
25+
<scope>test</scope>
26+
</dependency>
27+
</dependencies>
28+
</project>

org.eclipse.jdt.ls.tests/projects/maven/salut6/src/main/java/.gitignore

Whitespace-only changes.

org.eclipse.jdt.ls.tests/projects/maven/salut6/src/main/resources/test.properties

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.sample;
2+
3+
import static org.hamcrest.MatcherAssert.assertThat;
4+
5+
import org.junit.Test;
6+
7+
public class MyTest {
8+
@Test
9+
public void test() {
10+
assertThat("test", true);
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.sample;
2+
3+
import static org.hamcrest.MatcherAssert.*;
4+
5+
import org.junit.Test;
6+
7+
public class MyTest2 {
8+
@Test
9+
public void test() {
10+
assertThat("test", true);
11+
}
12+
}

org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AdvancedOrganizeImportsHandlerTest.java

+38
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,21 @@
1515

1616
import static org.junit.Assert.assertEquals;
1717
import static org.junit.Assert.assertNotNull;
18+
import static org.junit.Assert.assertNull;
1819
import static org.junit.Assert.assertTrue;
1920

2021
import java.io.IOException;
2122
import java.util.ArrayList;
2223
import java.util.Arrays;
2324
import java.util.List;
25+
import java.util.Optional;
26+
import java.util.stream.Stream;
2427

2528
import org.eclipse.core.resources.IProject;
2629
import org.eclipse.core.resources.ResourcesPlugin;
2730
import org.eclipse.core.runtime.CoreException;
2831
import org.eclipse.jdt.core.ICompilationUnit;
32+
import org.eclipse.jdt.core.IImportDeclaration;
2933
import org.eclipse.jdt.core.IJavaProject;
3034
import org.eclipse.jdt.core.IPackageFragment;
3135
import org.eclipse.jdt.core.IType;
@@ -188,4 +192,38 @@ public void testAmbiguousStaticImports() throws Exception {
188192
JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setJavaCompletionFavoriteMembers(Arrays.asList(favourites));
189193
}
190194
}
195+
196+
// https://github.com/redhat-developer/vscode-java/issues/2012
197+
@Test
198+
public void testDuplicateStaticImports() throws Exception {
199+
importProjects("maven/salut6");
200+
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("salut6");
201+
assertTrue(BuildSupportManager.find("Maven").get().applies(project));
202+
String[] favourites = JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getJavaCompletionFavoriteMembers();
203+
try {
204+
List<String> list = new ArrayList<>();
205+
list.add("org.assertj.core.api.Assertions.*");
206+
JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setJavaCompletionFavoriteMembers(list);
207+
IJavaProject javaProject = JavaCore.create(project);
208+
IType type = javaProject.findType("org.sample.MyTest");
209+
ICompilationUnit unit = type.getCompilationUnit();
210+
TextEdit edit = OrganizeImportsHandler.organizeImports(unit, (selections) -> {
211+
return new ImportCandidate[0];
212+
});
213+
assertNull(edit);
214+
type = javaProject.findType("org.sample.MyTest2");
215+
unit = type.getCompilationUnit();
216+
edit = OrganizeImportsHandler.organizeImports(unit, (selections) -> {
217+
return new ImportCandidate[0];
218+
});
219+
assertNotNull(edit);
220+
JavaModelUtil.applyEdit(unit, edit, true, null);
221+
IImportDeclaration[] imports = unit.getImports();
222+
assertEquals(2, imports.length);
223+
Optional<IImportDeclaration> el = Stream.of(imports).filter(p -> p.getElementName().equals("org.hamcrest.MatcherAssert.assertThat")).findFirst();
224+
assertNotNull(el.get());
225+
} finally {
226+
JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setJavaCompletionFavoriteMembers(Arrays.asList(favourites));
227+
}
228+
}
191229
}

0 commit comments

Comments
 (0)