diff options
| author | Markus Keller | 2015-03-05 20:52:37 +0000 |
|---|---|---|
| committer | Markus Keller | 2015-03-05 20:52:37 +0000 |
| commit | 26de20ae619c91a55a35147a34aba32ab3111d61 (patch) | |
| tree | c3f489eed99f5db6fa2a73ec3cd21310c72432eb | |
| parent | 1490ec2d61fb8e59c378e50775f4749531490d5f (diff) | |
| download | eclipse.jdt.core-26de20ae619c91a55a35147a34aba32ab3111d61.tar.gz eclipse.jdt.core-26de20ae619c91a55a35147a34aba32ab3111d61.tar.xz eclipse.jdt.core-26de20ae619c91a55a35147a34aba32ab3111d61.zip | |
Bug 459320: [ImportRewrite] adds import for declared package when pasting to CU outside of classpath
2 files changed, 49 insertions, 3 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewriteTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewriteTest.java index e1d22922d3..f5c7ca01d7 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewriteTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewriteTest.java @@ -18,8 +18,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import junit.framework.Test; - +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; @@ -49,6 +48,8 @@ import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.TextEdit; import org.osgi.service.prefs.BackingStoreException; +import junit.framework.Test; + @SuppressWarnings({"rawtypes", "unchecked"}) public class ImportRewriteTest extends AbstractJavaModelTests { @@ -1441,6 +1442,30 @@ public class ImportRewriteTest extends AbstractJavaModelTests { expected.append("public class Clazz {}\n"); assertEqualString(cu.getSource(), expected.toString()); } + + // https://bugs.eclipse.org/459320 + public void testAddImportToCuNotOnClasspath() throws Exception { + StringBuffer contents = new StringBuffer(); + contents.append("package pack1;\n"); + contents.append("\n"); + contents.append("public class Clazz {}\n"); + + createFolder("/P/alt-src/pack1/"); + IFile clazz = createFile("/P/alt-src/pack1/Clazz.java", contents.toString()); + ICompilationUnit cu = (ICompilationUnit) JavaCore.create(clazz); + cu.becomeWorkingCopy(null); + + try { + ImportRewrite rewrite = newImportsRewrite(cu, new String[] {}, 999, 999, true); + rewrite.setUseContextToFilterImplicitImports(true); + rewrite.addImport("pack1.AnotherClass"); + apply(rewrite); + + assertEqualString(cu.getSource(), contents.toString()); + } finally { + cu.discardWorkingCopy(); + } + } public void testAddImports1() throws Exception { diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/imports/ImportRewriteConfiguration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/imports/ImportRewriteConfiguration.java index c77fee8582..2055df1c3a 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/imports/ImportRewriteConfiguration.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/imports/ImportRewriteConfiguration.java @@ -18,6 +18,9 @@ import java.util.List; import java.util.Set; import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IPackageDeclaration; +import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.JavaProject; /** @@ -159,7 +162,25 @@ public final class ImportRewriteConfiguration { implicitImportContainerNames.add("java.lang"); //$NON-NLS-1$ - String compilationUnitPackageName = compilationUnit.getParent().getElementName(); + IJavaElement packageFragment = compilationUnit.getParent(); + String compilationUnitPackageName = packageFragment.getElementName(); + if (compilationUnitPackageName.isEmpty() && !packageFragment.exists() && compilationUnit.exists()) { + /* + * For a file outside of the build path, JavaCore#create(IFile) creates an + * ICompilationUnit with the file's parent folder as package fragment root, and a default package. + * That "wrong" package is problematic for the ImportRewrite, since it doesn't get filtered + * and eventually leads to unused import statements. + */ + try { + IPackageDeclaration[] packageDeclarations = compilationUnit.getPackageDeclarations(); + if (packageDeclarations.length > 0) { + implicitImportContainerNames.add(packageDeclarations[0].getElementName()); + return implicitImportContainerNames; + } + } catch (JavaModelException e) { + // continue + } + } implicitImportContainerNames.add(compilationUnitPackageName); return implicitImportContainerNames; |
