/*******************************************************************************
* Copyright (c) 2000, 2011 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.che.ide.ext.java.client.core.rewrite;
import java.io.IOException;
import java.util.HashMap;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.che.ide.api.text.BadLocationException;
import org.eclipse.che.ide.ext.java.client.BaseTest;
import org.eclipse.che.ide.ext.java.client.core.quickfix.StringAsserts;
import org.eclipse.che.ide.ext.java.jdt.core.JavaCore;
import org.eclipse.che.ide.ext.java.jdt.core.dom.AST;
import org.eclipse.che.ide.ext.java.jdt.core.dom.ASTNode;
import org.eclipse.che.ide.ext.java.jdt.core.dom.ASTParser;
import org.eclipse.che.ide.ext.java.jdt.core.dom.CompilationUnit;
import org.eclipse.che.ide.ext.java.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.che.ide.ext.java.jdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.che.ide.ext.java.worker.WorkerDocument;
import org.eclipse.che.ide.ext.java.jdt.text.Document;
import org.eclipse.che.ide.ext.java.jdt.text.edits.MalformedTreeException;
import org.eclipse.che.ide.ext.java.jdt.text.edits.TextEdit;
import org.eclipse.che.ide.runtime.CoreException;
public class ImportRewriteTest extends BaseTest {
private HashMap<String, String> options;
@Before
public void gwtSetUp() throws Exception {
// IJavaProject proj = createJavaProject("P", new String[]{"src"}, new String[]{"JCL_LIB"}, "bin");
options = JavaCore.getOptions();
options.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, JavaCore.SPACE);
options.put(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, "4");
options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5);
options.put(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5);
options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_5);
options.put(DefaultCodeFormatterConstants.FORMATTER_NUMBER_OF_EMPTY_LINES_TO_PRESERVE, String.valueOf(99));
options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_BETWEEN_IMPORT_GROUPS, String.valueOf(1));
options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_SEMICOLON, JavaCore.DO_NOT_INSERT);
// this.sourceFolder = getPackageFragmentRoot("P", "src");
// waitUntilIndexesReady();
}
@Test
public void testAddImports1() throws Exception {
// IPackageFragment pack1 = this.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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java", "com", "pack"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 2, 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(d.get(), buf.toString());
}
@Test
public void testAddImportsNoEmptyLines() throws Exception {
options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_BETWEEN_IMPORT_GROUPS, String.valueOf(0));
StringBuffer 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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java.util", "java.new", "p"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 2, 2, true);
imports.addImport("java.net.Socket");
imports.addImport("p.A");
apply(imports);
buf = new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Set;\n");
buf.append("import java.net.Socket;\n");
buf.append("import p.A;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(d.get(), buf.toString());
}
@Test
public void testAddImportsMoreEmptyLines() throws Exception {
options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_BETWEEN_IMPORT_GROUPS, String.valueOf(2));
StringBuffer 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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java.util", "java.new", "p"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 2, 2, true);
imports.addImport("java.net.Socket");
imports.addImport("p.A");
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("\n");
buf.append("import java.net.Socket;\n");
buf.append("\n");
buf.append("\n");
buf.append("import p.A;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(d.get(), buf.toString());
}
@Test
public void testAddImports2() throws Exception {
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java", "java.util", "com", "pack"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 2, 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(d.get(), buf.toString());
}
@Test
public void testAddImports3() throws Exception {
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java", "java.util", "com", "pack"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 99, 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(d.get(), buf.toString());
}
@Test
public void testAddImports4() throws Exception {
options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_SEMICOLON, JavaCore.INSERT);
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java", "java.util", "com", "pack"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 99, 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(d.get(), buf.toString());
}
//
// public void testAddImports5() throws Exception
// {
// options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_SEMICOLON,
// JavaCore.INSERT);
//
// StringBuffer buf = new StringBuffer();
// buf.append("package pack1;\n");
// buf.append("\n");
// buf.append("public class C {\n");
// buf.append("}\n");
// Document d = new Document(buf.toString());
// CompilationUnit cu = createCompilationUnit(d, "C");
//
// String[] order = new String[]{"java", "java.util", "com", "pack"};
//
// ImportRewrite imports = newImportsRewrite(d, cu, order, 1, 1, true);
// imports.setUseContextToFilterImplicitImports(true);
// imports.addImport("java.util.Map");
// imports.addImport("java.util.Set");
// imports.addImport("java.util.Map.Entry");
// imports.addImport("java.util.Collections");
//
// apply(imports);
//
// buf = new StringBuffer();
// buf.append("package pack1;\n");
// buf.append("\n");
// buf.append("import java.util.* ;\n");
// buf.append("import java.util.Map.Entry ;\n");
// buf.append("\n");
// buf.append("public class C {\n");
// buf.append("}\n");
// assertEqualString(d.get(), buf.toString());
// }
//
// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=306568
// public void testAddImports6() throws Exception
// {
// IPackageFragment pack1 = this.sourceFolder.createPackageFragment("pack1", false, null);
// StringBuffer buf = new StringBuffer();
// buf.append("package pack1;\n" + "\n" + "import java.util.*;\n" + "\n" + "public class C {\n"
// + " public static void main(String[] args) {\n" + " HashMap h;\n" + "\n"
// + " Map.Entry e= null;\n" + " Entry e2= null;\n" + "\n"
// + " System.out.println(\"hello\");\n" + " }\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, 1, 1, true);
// imports.setUseContextToFilterImplicitImports(true);
// imports.addImport("java.util.Map.Entry");
//
// apply(imports);
//
// buf = new StringBuffer();
// buf.append("package pack1;\n" + "\n" + "import java.util.*;\n" + "import java.util.Map.Entry;\n" + "\n"
// + "public class C {\n" + " public static void main(String[] args) {\n" + " HashMap h;\n" + "\n"
// + " Map.Entry e= null;\n" + " Entry e2= null;\n" + "\n"
// + " System.out.println(\"hello\");\n" + " }\n" + "}");
// assertEqualString(cu.getSource(), buf.toString());
// }
//
// //https://bugs.eclipse.org/bugs/show_bug.cgi?id=309022
// public void testAddImports7() throws Exception
// {
// IPackageFragment pack1 = this.sourceFolder.createPackageFragment("pack1", false, null);
// StringBuffer buf = new StringBuffer();
// buf.append("package pack1;\n" + "\n" + "import java.util.*;\n" + "import java.util.Map.Entry;\n" + "\n"
// + "public class C {\n" + " public static void main(String[] args) {\n" + " HashMap h;\n" + "\n"
// + " Map.Entry e= null;\n" + " Entry e2= null;\n" + "\n" + " PrintWriter pw;\n"
// + " System.out.println(\"hello\");\n" + " }\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, 1, 1, true);
// imports.setUseContextToFilterImplicitImports(true);
// imports.addImport("java.io.PrintWriter");
//
// apply(imports);
//
// buf = new StringBuffer();
// buf.append("package pack1;\n" + "\n" + "import java.io.*;\n" + "\n" + "import java.util.*;\n"
// + "import java.util.Map.Entry;\n" + "\n" + "public class C {\n"
// + " public static void main(String[] args) {\n" + " HashMap h;\n" + "\n"
// + " Map.Entry e= null;\n" + " Entry e2= null;\n" + "\n" + " PrintWriter pw;\n"
// + " System.out.println(\"hello\");\n" + " }\n" + "}");
// assertEqualString(cu.getSource(), buf.toString());
// }
//
@Test
public void testAddImportsWithGroupsOfUnmatched1() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java", "", "org", "#", "pack"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 99, 99, true);
imports.addImport("org.x.Y");
imports.addImport("pack.P");
imports.addImport("my.M");
imports.addImport("java.util.Vector");
imports.addStaticImport("stat.X", "CONST", true);
apply(imports);
buf = new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("import my.M;\n");
buf.append("\n");
buf.append("import org.x.Y;\n");
buf.append("\n");
buf.append("import static stat.X.CONST;\n");
buf.append("\n");
buf.append("import pack.P;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(d.get(), buf.toString());
}
@Test
public void testAddImportsWithGroupsOfUnmatched2() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"org", "com", "pack", "#", ""};
ImportRewrite imports = newImportsRewrite(d, cu, order, 99, 99, true);
imports.addImport("com.x.Y");
imports.addImport("pack.P");
imports.addImport("my.M");
imports.addImport("org.Vector");
imports.addStaticImport("stat.X", "CONST", true);
apply(imports);
buf = new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import org.Vector;\n");
buf.append("\n");
buf.append("import com.x.Y;\n");
buf.append("\n");
buf.append("import pack.P;\n");
buf.append("\n");
buf.append("import static stat.X.CONST;\n");
buf.append("\n");
buf.append("import my.M;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(d.get(), buf.toString());
}
@Test
public void testRemoveImports1() throws Exception {
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java", "com", "pack"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 2, 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(d.get(), buf.toString());
}
@Test
public void testRemoveImports2() throws Exception {
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"java", "com", "pack"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 2, 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(d.get(), buf.toString());
}
//
// public void testRemoveImports3() throws Exception
// {
// IPackageFragment pack = this.sourceFolder.createPackageFragment("pack", false, null);
// StringBuffer buf = new StringBuffer();
// buf.append("package pack;\n");
// buf.append("\n");
// buf.append("public class A {\n");
// buf.append(" public class Inner {\n");
// buf.append(" }\n");
// buf.append("}\n");
// pack.createCompilationUnit("A.java", buf.toString(), false, null);
//
// IPackageFragment test1 = this.sourceFolder.createPackageFragment("test1", false, null);
// buf = new StringBuffer();
// buf.append("package test1;\n");
// buf.append("\n");
// buf.append("import pack.A;\n");
// buf.append("import pack.A.Inner;\n");
// buf.append("import pack.A.NotThere;\n");
// buf.append("import pack.B;\n");
// buf.append("import pack.B.Inner;\n");
// buf.append("import pack.B.NotThere;\n");
// buf.append("\n");
// buf.append("public class T {\n");
// buf.append("}\n");
// ICompilationUnit cuT = test1.createCompilationUnit("T.java", buf.toString(), false, null);
//
// ASTParser parser = ASTParser.newParser(AST.JLS3);
// parser.setSource(cuT);
// parser.setResolveBindings(true);
// CompilationUnit astRoot = (CompilationUnit)parser.createAST(null);
//
// ImportRewrite imports = newImportsRewrite(astRoot, new String[0], 99, 99, true);
// imports.setUseContextToFilterImplicitImports(true);
//
// imports.removeImport("pack.A.Inner");
// imports.removeImport("pack.A.NotThere");
// imports.removeImport("pack.B.Inner");
// imports.removeImport("pack.B.NotThere");
//
// apply(imports);
//
// buf = new StringBuffer();
// buf.append("package test1;\n");
// buf.append("\n");
// buf.append("import pack.A;\n");
// buf.append("import pack.B;\n");
// buf.append("\n");
// buf.append("public class T {\n");
// buf.append("}\n");
// assertEqualString(cuT.getSource(), buf.toString());
// }
//
// public void testAddImports_bug23078() throws Exception
// {
//
// IPackageFragment pack1 = this.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, 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
// {
//
// IPackageFragment pack1 = this.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, 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
// {
//
// IPackageFragment pack1 = this.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, 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 testAddImports_bug121428() throws Exception
// {
//
// IPackageFragment pack1 = this.sourceFolder.createPackageFragment("pack1", false, null);
// StringBuffer buf = new StringBuffer();
// buf.append("package pack1;\n");
// buf.append("\n");
// buf.append("/** comment */\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, 99, false);
// imports.addImport("java.io.Exception");
//
// apply(imports);
//
// buf = new StringBuffer();
// buf.append("package pack1;\n");
// buf.append("\n");
// buf.append("/** comment */\n");
// buf.append("import java.io.Exception;\n");
// buf.append("\n");
// buf.append("public class C {\n");
// buf.append("}\n");
// assertEqualString(cu.getSource(), buf.toString());
// }
//
// /**
// * Test that the Inner class import comes in the right order (i.e. after the enclosing type's import) when re-organized
// *
// * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=194358"
// */
// public void testBug194358() throws Exception
// {
//
// StringBuffer buf = new StringBuffer();
// buf.append("package pack1;\n");
// buf.append("\n");
// buf.append("import pack2.A;\n");
// buf.append("import pack2.A.Inner;\n");
// buf.append("import pack2.B;\n");
// buf.append("\n");
// buf.append("public class C {\n");
// buf.append("}\n");
//
// IPackageFragment pack1 = this.sourceFolder.createPackageFragment("pack1", false, null);
// ICompilationUnit cu = pack1.createCompilationUnit("C.java", buf.toString(), false, null);
//
// // We need to actually make some state in the AST for the classes, to test that we can
// // disambiguate between packages and inner classes (see the bug for details).
// IPackageFragment pack2 = this.sourceFolder.createPackageFragment("pack2", false, null);
// ICompilationUnit aUnit = pack2.createCompilationUnit("A.java", "", false, null);
// ICompilationUnit bUnit = pack2.createCompilationUnit("B.java", "", false, null);
// bUnit.createType("class B {}", null, false, null);
//
// IType aType = aUnit.createType("class A {}", null, false, null);
// aType.createType("class Inner {}", null, false, null);
// String[] order = new String[]{"java"};
//
// ImportRewrite imports = newImportsRewrite(cu, order, 99, 99, false);
// imports.setUseContextToFilterImplicitImports(true);
// imports.addImport("pack2.A");
// imports.addImport("pack2.B");
// imports.addImport("pack2.A.Inner");
//
// apply(imports);
//
// buf = new StringBuffer();
// buf.append("package pack1;\n");
// buf.append("\n");
// buf.append("import pack2.A;\n");
// buf.append("import pack2.A.Inner;\n");
// buf.append("import pack2.B;\n");
// buf.append("\n");
// buf.append("public class C {\n");
// buf.append("}\n");
// assertEqualString(cu.getSource(), buf.toString());
// }
//
// /**
// * Test that a valid inner class import is not removed even when the container
// * class is implicitly available. This tests the case where the classes are in
// * different compilation units.
// *
// * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=194358"
// */
// public void testBug194358a() throws Exception
// {
// StringBuffer buf = new StringBuffer();
// buf.append("package com.pack1;\n");
// buf.append("\n");
// buf.append("import com.pack1.A;\n");
// buf.append("import com.pack1.A.Inner;\n");
// buf.append("import com.pack2.B;\n");
// buf.append("\n");
// buf.append("public class C {\n");
// buf.append("}\n");
//
// IPackageFragment pack1 = this.sourceFolder.createPackageFragment("com.pack1", false, null);
// ICompilationUnit cu = pack1.createCompilationUnit("C.java", buf.toString(), false, null);
// ICompilationUnit aUnit = pack1.createCompilationUnit("A.java", "", false, null);
//
// IPackageFragment pack2 = this.sourceFolder.createPackageFragment("com.pack2", false, null);
// ICompilationUnit bUnit = pack2.createCompilationUnit("B.java", "", false, null);
// bUnit.createType("class B {}", null, false, null);
// IType aType = aUnit.createType("class A {}", null, false, null);
// aType.createType("class Inner {}", null, false, null);
// String[] order = new String[]{"java"};
//
// ImportRewrite imports = newImportsRewrite(cu, order, 99, 99, false);
// imports.setUseContextToFilterImplicitImports(false);
// imports.addImport("com.pack1.A");
// imports.addImport("com.pack1.A.Inner");
// imports.addImport("com.pack2.B");
//
// apply(imports);
//
// buf = new StringBuffer();
// buf.append("package com.pack1;\n");
// buf.append("\n");
// buf.append("import com.pack1.A.Inner;\n");
// buf.append("import com.pack2.B;\n");
// buf.append("\n");
// buf.append("public class C {\n");
// buf.append("}\n");
// assertEqualString(cu.getSource(), buf.toString());
// }
//
// /**
// * Test that the Inner type imports are not removed while organizing even though the
// * containing class is implicitly available - for the case when both the classes are
// * in the same compilation unit
// *
// * see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=235253"
// */
// public void testBug235253() throws Exception
// {
// StringBuffer buf = new StringBuffer();
// buf.append("package bug;\n");
// buf.append("\n");
// buf.append("class Bug {\n");
// buf.append("public void addFile(File file) {}\n");
// buf.append("\tinterface Proto{};\n");
// buf.append("}\n");
// buf.append("class Foo implements Proto{}");
//
// IPackageFragment pack1 = this.sourceFolder.createPackageFragment("bug", false, null);
// ICompilationUnit cu = pack1.createCompilationUnit("Bug.java", buf.toString(), false, null);
// String[] order = new String[]{"bug", "java"};
// ImportRewrite imports = newImportsRewrite(cu, order, 99, 99, false);
// imports.setUseContextToFilterImplicitImports(true);
// imports.addImport("bug.Bug.Proto");
// imports.addImport("java.io.File");
//
// apply(imports);
// buf = new StringBuffer();
// buf.append("package bug;\n");
// buf.append("\n");
// buf.append("import bug.Bug.Proto;\n");
// buf.append("\n");
// buf.append("import java.io.File;\n");
// buf.append("\n");
// buf.append("class Bug {\n");
// buf.append("public void addFile(File file) {}\n");
// buf.append("\tinterface Proto{};\n");
// buf.append("}\n");
// buf.append("class Foo implements Proto{}");
// assertEqualString(cu.getSource(), buf.toString());
// }
//
@Test
public void testAddStaticImports1() throws Exception {
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"#", "java"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 99, 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(d.get(), buf.toString());
}
@Test
public void testAddStaticImports2() throws Exception {
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"#", "java"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 99, 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(d.get(), buf.toString());
}
@Test
public void testAddStaticImports3() throws Exception {
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"#", "java"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 99, 3, true);
imports.addStaticImport("java.lang.Math", "min", true);
imports.addStaticImport("java.lang.Math", "max", true);
imports.addStaticImport("java.lang.Math", "abs", true);
imports.addStaticImport("java.io.File", "pathSeparator", true);
imports.addStaticImport("java.io.File", "separator", true);
imports.addImport("java.util.List");
imports.addImport("java.util.Vector");
imports.addImport("java.util.ArrayList");
apply(imports);
buf = new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import static java.io.File.pathSeparator;\n");
buf.append("import static java.io.File.separator;\n");
buf.append("import static java.lang.Math.*;\n");
buf.append("\n");
buf.append("import java.lang.System;\n");
buf.append("import java.util.ArrayList;\n");
buf.append("import java.util.List;\n");
buf.append("import java.util.Vector;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(d.get(), buf.toString());
}
@Test
public void testAddedRemovedImportsAPI() throws Exception {
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");
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
String[] order = new String[]{"#", "java"};
ImportRewrite imports = newImportsRewrite(d, cu, order, 99, 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(d.get(), buf.toString());
}
@Test
public void testAddImports_bug24804_5() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.lang.AssertionError; //test\n");
buf.append("\n");
buf.append("/** comment2 */\n");
buf.append("\n");
buf.append("/** comment */\n");
buf.append("import java.lang.System;\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
String[] order = new String[]{"java"};
Document d = new WorkerDocument(buf.toString());
CompilationUnit cu = createCompilationUnit(d, "C");
ImportRewrite imports = newImportsRewrite(d, cu, order, 1, 1, false);
imports.addImport("java.io.Exception");
apply(imports);
buf = new StringBuffer();
buf.append("package pack1;\n");
buf.append("\n");
buf.append("import java.io.*;\n");
buf.append("//test\n");
buf.append("/** comment2 */\n");
buf.append("/** comment */\n");
buf.append("\n");
buf.append("public class C {\n");
buf.append("}\n");
assertEqualString(d.get(), buf.toString());
}
/**
* @param d
* @param string
* @return
*/
private CompilationUnit createCompilationUnit(Document d, String string) {
ASTParser p = ASTParser.newParser(AST.JLS3);
p.setSource(d.get().toCharArray());
p.setUnitName(string);
p.setResolveBindings(false);
p.setCompilerOptions(options);
ASTNode ast = p.createAST();
return (CompilationUnit)ast;
}
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);
}
private void assertEqualString(String actual, String expected) {
StringAsserts.assertEqualString(actual, expected);
}
private void assertEqualStringsIgnoreOrder(String[] actual, String[] expecteds) {
StringAsserts.assertEqualStringsIgnoreOrder(actual, expecteds);
}
private void assertEqualStringIgnoreDelim(String actual, String expected) throws IOException {
StringAsserts.assertEqualStringIgnoreDelim(actual, expected);
}
protected ImportRewrite newImportsRewrite(Document document, CompilationUnit cu, String[] order,
int normalThreshold, int staticThreshold, boolean restoreExistingImports) {
ImportRewrite rewrite = ImportRewrite.create(document, cu, restoreExistingImports);
rewrite.setImportOrder(order);
rewrite.setOnDemandImportThreshold(normalThreshold);
rewrite.setStaticOnDemandImportThreshold(staticThreshold);
return rewrite;
}
private void apply(ImportRewrite rewrite) throws CoreException, MalformedTreeException, BadLocationException {
TextEdit edit = rewrite.rewriteImports();
Document document = rewrite.getDocument();
edit.apply(document);
}
}