blob: 4724aa0d50a6d7f4d38b70e738e01e98c351db74 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.ui.tests.core;
import java.util.Hashtable;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.text.edits.TextEdit;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jdt.core.BindingKey;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.jdt.internal.corext.codemanipulation.AddImportsOperation;
import org.eclipse.jdt.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext;
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
import org.eclipse.jdt.internal.corext.dom.NodeFinder;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.ui.text.correction.AssistContext;
import org.eclipse.jdt.testplugin.JavaProjectHelper;
import org.eclipse.jdt.testplugin.TestOptions;
import org.osgi.service.prefs.BackingStoreException;
public class AddImportTest extends CoreTests {
private static final Class THIS= AddImportTest.class;
private IJavaProject fJProject1;
public AddImportTest(String name) {
super(name);
}
public static Test allTests() {
return new ProjectTestSetup(new TestSuite(THIS));
}
public static Test suite() {
if (true) {
return allTests();
} else {
return setUpTest(new AddImportTest("testAddImportContextSensitive06"));
}
}
public static Test setUpTest(Test test) {
return new ProjectTestSetup(test);
}
protected void setUp() throws Exception {
fJProject1= ProjectTestSetup.getProject();
Hashtable options= TestOptions.getDefaultOptions();
options.put(DefaultCodeFormatterConstants.FORMATTER_NUMBER_OF_EMPTY_LINES_TO_PRESERVE, String.valueOf(99));
JavaCore.setOptions(options);
}
protected void tearDown() throws Exception {
JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
}
public void testAddImports1() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Set;\n");
buf.append("import java.util.Vector;\n");
buf.append("import java.util.Map;\n");
buf.append("\n");
buf.append("import pack.List;\n");
buf.append("import pack.List2;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "java", "com", "pack" };
ImportRewrite imports= newImportsRewrite(cu, order, 2, true);
imports.addImport("java.net.Socket");
imports.addImport("p.A");
imports.addImport("com.something.Foo");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.net.Socket;\n");
buf.append("import java.util.Set;\n");
buf.append("import java.util.Vector;\n");
buf.append("import java.util.Map;\n");
buf.append("\n");
buf.append("import com.something.Foo;\n");
buf.append("\n");
buf.append("import p.A;\n");
buf.append("\n");
buf.append("import pack.List;\n");
buf.append("import pack.List2;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testAddImports2() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Set;\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "java", "java.util", "com", "pack" };
ImportRewrite imports= newImportsRewrite(cu, order, 2, true);
imports.addImport("java.x.Socket");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.x.Socket;\n");
buf.append("\n");
buf.append("import java.util.Set;\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testAddImports3() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Set; // comment\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "java", "java.util", "com", "pack" };
ImportRewrite imports= newImportsRewrite(cu, order, 99, true);
imports.addImport("java.util.Vector");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Set; // comment\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testRemoveImports1() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Set;\n");
buf.append("import java.util.Vector;\n");
buf.append("import java.util.Map;\n");
buf.append("\n");
buf.append("import pack.List;\n");
buf.append("import pack.List2;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "java", "com", "pack" };
ImportRewrite imports= newImportsRewrite(cu, order, 2, true);
imports.removeImport("java.util.Set");
imports.removeImport("pack.List");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Vector;\n");
buf.append("import java.util.Map;\n");
buf.append("\n");
buf.append("import pack.List2;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testRemoveImports2() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Set;\n");
buf.append("import java.util.Vector; // comment\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "java", "com", "pack" };
ImportRewrite imports= newImportsRewrite(cu, order, 2, true);
imports.removeImport("java.util.Vector");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Set;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testAddImports_bug23078() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import p.A.*;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { };
ImportRewrite imports= newImportsRewrite(cu, order, 2, true);
imports.addImport("p.Inner");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import p.Inner;\n");
buf.append("import p.A.*;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testAddImports_bug25113() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.awt.Panel;\n");
buf.append("\n");
buf.append("import java.math.BigInteger;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "java.awt", "java" };
ImportRewrite imports= newImportsRewrite(cu, order, 99, true);
imports.addImport("java.applet.Applet");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.awt.Panel;\n");
buf.append("\n");
buf.append("import java.applet.Applet;\n");
buf.append("import java.math.BigInteger;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testAddImports_bug42637() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "java" };
ImportRewrite imports= newImportsRewrite(cu, order, 99, true);
imports.addImport("java.io.Exception");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.io.Exception;\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testAddStaticImports1() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "#", "java" };
ImportRewrite imports= newImportsRewrite(cu, order, 99, true);
imports.addStaticImport("java.lang.Math", "min", true);
imports.addImport("java.lang.Math");
imports.addStaticImport("java.lang.Math", "max", true);
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import static java.lang.Math.max;\n");
buf.append("import static java.lang.Math.min;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testAddStaticImports2() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "#", "java" };
ImportRewrite imports= newImportsRewrite(cu, order, 99, true);
imports.addStaticImport("xx.MyConstants", "SIZE", true);
imports.addStaticImport("xy.MyConstants", "*", true);
imports.addImport("xy.MyConstants");
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import static xx.MyConstants.SIZE;\n");
buf.append("import static xy.MyConstants.*;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("import xy.MyConstants;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
public void testImportStructureWithSignatures() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package test1;\n");
buf.append("import java.util.*;\n");
buf.append("import java.net.*;\n");
buf.append("import java.io.*;\n");
buf.append("public class A {\n");
buf.append(" public void foo() {\n");
buf.append(" IOException s;\n");
buf.append(" URL[][] t;\n");
buf.append(" List<SocketAddress> x;\n");
buf.append(" }\n");
buf.append("}\n");
String content= buf.toString();
ICompilationUnit cu1= pack1.createCompilationUnit("A.java", content, false, null);
buf= new StringBuffer();
buf.append("package test1;\n");
buf.append("public class B {\n");
buf.append("}\n");
String content2= buf.toString();
ICompilationUnit cu2= pack1.createCompilationUnit("B.java", content2, false, null);
String[] order= new String[] { "java.util", "java.io", "java.net" };
int threshold= 99;
AST ast= AST.newAST(AST.JLS3);
ImportRewrite importsRewrite= newImportsRewrite(cu2, order, threshold, true);
{
IJavaElement[] elements= cu1.codeSelect(content.indexOf("IOException"), "IOException".length());
assertEquals(1, elements.length);
String key= ((IType) elements[0]).getKey();
String signature= new BindingKey(key).toSignature();
importsRewrite.addImportFromSignature(signature, ast);
}
{
IJavaElement[] elements= cu1.codeSelect(content.indexOf("URL"), "URL".length());
assertEquals(1, elements.length);
String key= ((IType) elements[0]).getKey();
String signature= new BindingKey(key).toSignature();
importsRewrite.addImportFromSignature(signature, ast);
}
{
IJavaElement[] elements= cu1.codeSelect(content.indexOf("List"), "List".length());
assertEquals(1, elements.length);
String key= ((IType) elements[0]).getKey();
String signature= new BindingKey(key).toSignature();
importsRewrite.addImportFromSignature(signature, ast);
}
apply(importsRewrite);
buf= new StringBuffer();
buf.append("package test1;\n");
buf.append("\n");
buf.append("import java.util.List;\n");
buf.append("\n");
buf.append("import java.io.IOException;\n");
buf.append("\n");
buf.append("import java.net.SocketAddress;\n");
buf.append("import java.net.URL;\n");
buf.append("\n");
buf.append("public class B {\n");
buf.append("}\n");
assertEqualStringIgnoreDelim(cu2.getSource(), buf.toString());
}
public void testAddTypesWithCaptures1() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" getClass();\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
ASTParser parser= ASTParser.newParser(AST.JLS3);
parser.setSource(cu);
parser.setResolveBindings(true);
CompilationUnit astRoot= (CompilationUnit) parser.createAST(null);
String str= "getClass()";
MethodInvocation inv= (MethodInvocation) NodeFinder.perform(astRoot, buf.indexOf(str), str.length());
ITypeBinding binding= inv.resolveTypeBinding();
ImportRewrite rewrite= newImportsRewrite(astRoot, new String[0], 99, 99, true);
String string= rewrite.addImport(binding);
assertEquals("Class<? extends E>", string);
Type resNode= rewrite.addImport(binding, astRoot.getAST());
assertEquals("Class<? extends E>", ASTNodes.asString(resNode));
String signature= new BindingKey(binding.getKey()).toSignature();
Type resNode2= rewrite.addImportFromSignature(signature, astRoot.getAST());
assertEquals("Class<? extends E>", ASTNodes.asString(resNode2));
}
private static final boolean BUG_120082= true;
public void testAddTypesWithCaptures2() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("public class E<X> {\n");
buf.append(" public static <T> E<T> bar(T t) { return null; }\n");
buf.append(" public void foo(E<?> e) {\n");
buf.append(" bar(e);\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
ASTParser parser= ASTParser.newParser(AST.JLS3);
parser.setSource(cu);
parser.setResolveBindings(true);
CompilationUnit astRoot= (CompilationUnit) parser.createAST(null);
String str= "bar(e)";
MethodInvocation inv= (MethodInvocation) NodeFinder.perform(astRoot, buf.indexOf(str), str.length());
ITypeBinding binding= inv.resolveTypeBinding();
ImportRewrite rewrite= newImportsRewrite(astRoot, new String[0], 99, 99, true);
String string= rewrite.addImport(binding);
assertEquals("E<?>", string);
Type resNode= rewrite.addImport(binding, astRoot.getAST());
assertEquals("E<?>", ASTNodes.asString(resNode));
if (!BUG_120082) {
String signature= new BindingKey(binding.getKey()).toSignature();
Type resNode2= rewrite.addImportFromSignature(signature, astRoot.getAST());
assertEquals("E<?>", ASTNodes.asString(resNode2));
}
}
public void testAddTypesWithCaptures3() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("public class E<X> {\n");
buf.append(" public static <T> E<? extends T> bar(T t) { return null; }\n");
buf.append(" public void foo(E<?> e) {\n");
buf.append(" bar(e);\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
ASTParser parser= ASTParser.newParser(AST.JLS3);
parser.setSource(cu);
parser.setResolveBindings(true);
CompilationUnit astRoot= (CompilationUnit) parser.createAST(null);
String str= "bar(e)";
MethodInvocation inv= (MethodInvocation) NodeFinder.perform(astRoot, buf.indexOf(str), str.length());
ITypeBinding binding= inv.resolveTypeBinding();
ImportRewrite rewrite= newImportsRewrite(astRoot, new String[0], 99, 99, true);
String string= rewrite.addImport(binding);
assertEquals("E<?>", string);
Type resNode= rewrite.addImport(binding, astRoot.getAST());
assertEquals("E<?>", ASTNodes.asString(resNode));
if (!BUG_120082) {
String signature= new BindingKey(binding.getKey()).toSignature();
Type resNode2= rewrite.addImportFromSignature(signature, astRoot.getAST());
assertEquals("E<?>", ASTNodes.asString(resNode2));
}
}
public void testImportStructureWithSignatures2() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package test1;\n");
buf.append("import java.util.*;\n");
buf.append("import java.net.*;\n");
buf.append("import java.io.*;\n");
buf.append("public class A {\n");
buf.append(" public void foo() {\n");
buf.append(" Map<?, ? extends Set<? super ServerSocket>> z;\n");
buf.append(" }\n");
buf.append("}\n");
String content= buf.toString();
ICompilationUnit cu1= pack1.createCompilationUnit("A.java", content, false, null);
buf= new StringBuffer();
buf.append("package test1;\n");
buf.append("public class B {\n");
buf.append("}\n");
String content2= buf.toString();
ICompilationUnit cu2= pack1.createCompilationUnit("B.java", content2, false, null);
String[] order= new String[] { "java.util", "java.io", "java.net" };
int threshold= 99;
AST ast= AST.newAST(AST.JLS3);
ImportRewrite importsRewrite= newImportsRewrite(cu2, order, threshold, true);
{
IJavaElement[] elements= cu1.codeSelect(content.indexOf("Map"), "Map".length());
assertEquals(1, elements.length);
String key= ((IType) elements[0]).getKey();
String signature= new BindingKey(key).toSignature();
importsRewrite.addImportFromSignature(signature, ast);
}
apply(importsRewrite);
buf= new StringBuffer();
buf.append("package test1;\n");
buf.append("\n");
buf.append("import java.util.Map;\n");
buf.append("import java.util.Set;\n");
buf.append("\n");
buf.append("import java.net.ServerSocket;\n");
buf.append("\n");
buf.append("public class B {\n");
buf.append("}\n");
assertEqualStringIgnoreDelim(cu2.getSource(), buf.toString());
}
public void testAddedRemovedImportsAPI() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" public final static int CONST= 9;\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
String[] order= new String[] { "#", "java" };
ImportRewrite imports= newImportsRewrite(cu, order, 99, true);
imports.addStaticImport("java.lang.Math", "min", true);
imports.addImport("java.lang.Math");
assertAddedAndRemoved(imports,
new String[] { "java.lang.Math" }, new String[] {},
new String[] { "java.lang.Math.min" }, new String[] {}
);
imports.addImport("java.lang.Math");
imports.addStaticImport("java.lang.Math", "max", true);
assertAddedAndRemoved(imports,
new String[] { "java.lang.Math" }, new String[] {},
new String[] { "java.lang.Math.min", "java.lang.Math.max" }, new String[] {}
);
imports.removeImport("java.lang.Math");
imports.removeImport("java.util.Vector");
imports.removeStaticImport("java.lang.Math.dup");
assertAddedAndRemoved(imports,
new String[] { }, new String[] { "java.util.Vector"},
new String[] { "java.lang.Math.min", "java.lang.Math.max" }, new String[] {}
);
imports.addImport("java.util.Vector");
imports.addStaticImport("pack1.C", "CONST", true);
assertAddedAndRemoved(imports,
new String[] { }, new String[] { },
new String[] { "java.lang.Math.min", "java.lang.Math.max", "pack1.C.CONST" }, new String[] {}
);
apply(imports);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import static java.lang.Math.max;\n");
buf.append("import static java.lang.Math.min;\n");
buf.append("import static pack1.C.CONST;\n");
buf.append("\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" public final static int CONST= 9;\n");
buf.append("}\n");
assertEqualString(cu.getSource(), buf.toString());
}
private void assertAddedAndRemoved(ImportRewrite imports, String[] expectedAdded, String[] expectedRemoved, String[] expectedAddedStatic, String[] expectedRemovedStatic) {
assertEqualStringsIgnoreOrder(imports.getAddedImports(), expectedAdded);
assertEqualStringsIgnoreOrder(imports.getAddedStaticImports(), expectedAddedStatic);
assertEqualStringsIgnoreOrder(imports.getRemovedImports(), expectedRemoved);
assertEqualStringsIgnoreOrder(imports.getRemovedStaticImports(), expectedRemovedStatic);
}
public void testAddImportAction1() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" java.util.Vector c= null;\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
IPath path= cu.getPath();
FileBuffers.getTextFileBufferManager().connect(path, null);
try {
IDocument doc= FileBuffers.getTextFileBufferManager().getTextFileBuffer(path).getDocument();
int selOffset= buf.indexOf("Vector");
AddImportsOperation op= new AddImportsOperation(cu, doc, selOffset, 0, null);
op.run(null);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" Vector c= null;\n");
buf.append("}\n");
assertEqualString(doc.get(), buf.toString());
} finally {
FileBuffers.getTextFileBufferManager().disconnect(path, null);
}
}
public void testAddImportAction2() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" Vector c= null;\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
IPath path= cu.getPath();
FileBuffers.getTextFileBufferManager().connect(path, null);
try {
IDocument doc= FileBuffers.getTextFileBufferManager().getTextFileBuffer(path).getDocument();
int selOffset= buf.indexOf("Vector");
AddImportsOperation op= new AddImportsOperation(cu, doc, selOffset, 0, null);
op.run(null);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" Vector c= null;\n");
buf.append("}\n");
assertEqualString(doc.get(), buf.toString());
} finally {
FileBuffers.getTextFileBufferManager().disconnect(path, null);
}
}
public void testAddImportAction3() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" Vector c= null\n"); // missing semicolon
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
IPath path= cu.getPath();
FileBuffers.getTextFileBufferManager().connect(path, null);
try {
IDocument doc= FileBuffers.getTextFileBufferManager().getTextFileBuffer(path).getDocument();
int selOffset= buf.indexOf("Vector");
AddImportsOperation op= new AddImportsOperation(cu, doc, selOffset, 0, null);
op.run(null);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" Vector c= null\n");
buf.append("}\n");
assertEqualString(doc.get(), buf.toString());
} finally {
FileBuffers.getTextFileBufferManager().disconnect(path, null);
}
}
public void testAddImportAction4() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" java.util.Vector c= null\n"); // missing semicolon
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
IPath path= cu.getPath();
FileBuffers.getTextFileBufferManager().connect(path, null);
try {
IDocument doc= FileBuffers.getTextFileBufferManager().getTextFileBuffer(path).getDocument();
int selOffset= buf.indexOf("Vector");
AddImportsOperation op= new AddImportsOperation(cu, doc, selOffset, 0, null);
op.run(null);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" Vector c= null\n");
buf.append("}\n");
assertEqualString(doc.get(), buf.toString());
} finally {
FileBuffers.getTextFileBufferManager().disconnect(path, null);
}
}
public void testAddImports_bug107206() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" java.util.Vector.class x;\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
IPath path= cu.getPath();
FileBuffers.getTextFileBufferManager().connect(path, null);
try {
IDocument doc= FileBuffers.getTextFileBufferManager().getTextFileBuffer(path).getDocument();
int selOffset= buf.indexOf("Vector.class") + "Vector.class".length();
AddImportsOperation op= new AddImportsOperation(cu, doc, selOffset, 0, null);
op.run(null);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" java.util.Vector.class x;\n"); // no change
buf.append("}\n");
assertEqualString(doc.get(), buf.toString());
} finally {
FileBuffers.getTextFileBufferManager().disconnect(path, null);
}
}
public void testAddImportActionStatic1() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" String str= java.io.File.separator;\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
IPath path= cu.getPath();
FileBuffers.getTextFileBufferManager().connect(path, null);
try {
IDocument doc= FileBuffers.getTextFileBufferManager().getTextFileBuffer(path).getDocument();
int selOffset= buf.indexOf("separator");
AddImportsOperation op= new AddImportsOperation(cu, doc, selOffset, 0, null);
op.run(null);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import static java.io.File.separator;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append(" String str= separator;\n");
buf.append("}\n");
assertEqualString(doc.get(), buf.toString());
} finally {
FileBuffers.getTextFileBufferManager().disconnect(path, null);
}
}
public void testAddImportContextSensitive01() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" void foo() {//<-insert\n}\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertImportQualifierAsExpected(cu, "java.lang.Math.PI", "PI", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[] {"java.lang.Math.PI"});
}
public void testAddImportContextSensitive02() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" public static final double PI= 3.0;\n");
buf.append(" void foo() {//<-insert\n}\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertImportQualifierAsExpected(cu, "java.lang.Math.PI", "java.lang.Math.PI", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[0]);
}
public void testAddImportContextSensitive03() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" void foo() {//<-insert\n}\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertStaticImportAsExpected(cu, "java.lang.Math", "PI", "PI", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[] {"java.lang.Math.PI"});
}
public void testAddImportContextSensitive04() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" public static final double PI= 3.0;\n");
buf.append(" void foo() {//<-insert\n}\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertStaticImportAsExpected(cu, "java.lang.Math", "PI", "java.lang.Math.PI", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[0]);
}
public void testAddImportContextSensitive05() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" private class E11 {\n");
buf.append(" class E12 {\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("//<-insert\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertImportQualifierAsExpected(cu, "pack2.E1.E11.E12", "E12", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[] {"pack2.E1.E11.E12"});
}
public void testAddImportContextSensitive06() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" private class E11 {\n");
buf.append(" class E12 { \n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("//<-insert\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertImportQualifierAsExpected(cu, "pack1.E1.E11.E12", "pack1.E1.E11.E12", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[0]);
}
public void testAddImportContextSensitive07() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" private class E11 {\n");
buf.append(" class E12 { \n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private class E21 {\n");
buf.append(" //<-insert\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertImportQualifierAsExpected(cu, "pack1.E1.E11.E12", "pack1.E1.E11.E12", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[0]);
}
public void testAddImportContextSensitive08() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" public static class E2 {}\n");
buf.append(" interface I1 {void bar();}\n");
buf.append(" public void foo() {\n");
buf.append(" I1 i1= new I1() {\n");
buf.append(" public void bar() {\n");
buf.append(" //<-insert\n");
buf.append(" }\n");
buf.append(" };\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertImportQualifierAsExpected(cu, "pack1.E1.E2", "E2", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[0]);
}
public void testAddImportContextSensitive09() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E1 {\n");
buf.append(" public static class E2 {\n");
buf.append(" public static class E22 {}\n");
buf.append(" }\n");
buf.append(" interface I1 {void bar();}\n");
buf.append(" public void foo() {\n");
buf.append(" I1 i1= new I1() {\n");
buf.append(" public void bar() {\n");
buf.append(" //<-insert\n");
buf.append(" }\n");
buf.append(" };\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
String[] addedImports= assertImportQualifierAsExpected(cu, "pack1.E1.E2.E22", "pack1.E1.E2.E22", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[0]);
}
public void testAddImportContextSensitive10() throws Exception {
IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
StringBuffer buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public abstract class E1 {\n");
buf.append(" protected class C {}\n");
buf.append("}\n");
pack1.createCompilationUnit("E1.java", buf.toString(), false, null);
buf= new StringBuffer();
buf.append("package pack1;\n");
buf.append("public class E2 extends E1 {\n");
buf.append(" //<-insert\n");
buf.append("}\n");
ICompilationUnit cu= pack1.createCompilationUnit("E2.java", buf.toString(), false, null);
String[] addedImports= assertImportQualifierAsExpected(cu, "pack1.E1.C", "C", new String[0], 99, 99);
assertEqualStringsIgnoreOrder(addedImports, new String[0]);
}
private String[] assertImportQualifierAsExpected(ICompilationUnit cu, String toImport, String expectedQualifier, String[] importOrder, int threshold, int staticThreshold) throws JavaModelException {
String buf= cu.getSource();
String selection= "//<-insert";
int offset= buf.indexOf(selection);
int length= 0;
AssistContext context= new AssistContext(cu, offset, length);
ImportRewrite importRewrite= newImportsRewrite(context.getASTRoot(), importOrder, threshold, staticThreshold, true);
String qualifier= importRewrite.addImport(toImport, new ContextSensitiveImportRewriteContext(context.getASTRoot(), offset, importRewrite));
assertEquals("Type conflict not detected", expectedQualifier, qualifier);
return importRewrite.getAddedImports();
}
private String[] assertStaticImportAsExpected(ICompilationUnit cu, String declaringClassName, String fieldName, String expectedQualifier, String[] importOrder, int threshold, int staticThreshold) throws JavaModelException {
String code= cu.getSource();
String selection= "//<-insert";
int offset= code.indexOf(selection);
int length= 0;
AssistContext context= new AssistContext(cu, offset, length);
ImportRewrite importRewrite= newImportsRewrite(context.getASTRoot(), importOrder, threshold, staticThreshold, true);
String qualifier= importRewrite.addStaticImport(declaringClassName, fieldName, true, new ContextSensitiveImportRewriteContext(context.getASTRoot(), offset, importRewrite));
assertEquals("Type conflict not detected", expectedQualifier, qualifier);
return importRewrite.getAddedStaticImports();
}
private ImportRewrite newImportsRewrite(ICompilationUnit cu, String[] order, int threshold, boolean restoreExistingImports) throws CoreException, BackingStoreException {
return newImportsRewrite(cu, order, threshold, threshold, restoreExistingImports);
}
private void apply(ImportRewrite rewrite) throws CoreException {
TextEdit edit= rewrite.rewriteImports(null);
JavaModelUtil.applyEdit(rewrite.getCompilationUnit(), edit, true, null);
}
}