/*******************************************************************************
* Copyright (c) 2000, 2009 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 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.Block;
import org.eclipse.che.ide.ext.java.jdt.core.dom.CastExpression;
import org.eclipse.che.ide.ext.java.jdt.core.dom.CompilationUnit;
import org.eclipse.che.ide.ext.java.jdt.core.dom.Expression;
import org.eclipse.che.ide.ext.java.jdt.core.dom.ExpressionStatement;
import org.eclipse.che.ide.ext.java.jdt.core.dom.ForStatement;
import org.eclipse.che.ide.ext.java.jdt.core.dom.IfStatement;
import org.eclipse.che.ide.ext.java.jdt.core.dom.MethodDeclaration;
import org.eclipse.che.ide.ext.java.jdt.core.dom.MethodInvocation;
import org.eclipse.che.ide.ext.java.jdt.core.dom.ParenthesizedExpression;
import org.eclipse.che.ide.ext.java.jdt.core.dom.PrefixExpression;
import org.eclipse.che.ide.ext.java.jdt.core.dom.ReturnStatement;
import org.eclipse.che.ide.ext.java.jdt.core.dom.Statement;
import org.eclipse.che.ide.ext.java.jdt.core.dom.Type;
import org.eclipse.che.ide.ext.java.jdt.core.dom.TypeDeclaration;
import org.eclipse.che.ide.ext.java.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.che.ide.ext.java.jdt.core.dom.VariableDeclarationStatement;
import org.eclipse.che.ide.ext.java.jdt.core.dom.WhileStatement;
import org.eclipse.che.ide.ext.java.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.che.ide.ext.java.jdt.core.dom.rewrite.ListRewrite;
import org.eclipse.che.ide.ext.java.jdt.internal.compiler.env.ICompilationUnit;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class ASTRewritingMoveCodeTest extends ASTRewritingTest {
@Test
public void testMove() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" int x;\n");
buf.append(" public void foo() {\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
List bodyDecls = type.bodyDeclarations();
ASTNode first = (ASTNode)bodyDecls.get(0);
ASTNode placeholder = rewrite.createMoveTarget(first);
rewrite.getListRewrite(type, TypeDeclaration.BODY_DECLARATIONS_PROPERTY).insertLast(placeholder, null);
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" }\n");
buf.append(" int x;\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveDeclSameLevelCD() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" i= 0;\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // move inner type to the end of the type & move, copy statements from constructor to method
List members = type.bodyDeclarations();
assertTrue("Has declarations", !members.isEmpty());
assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
TypeDeclaration innerType = (TypeDeclaration)members.get(0);
rewrite.remove(innerType, null);
ASTNode movedNode = rewrite.createCopyTarget(innerType);
rewrite.getListRewrite(type, TypeDeclaration.BODY_DECLARATIONS_PROPERTY).insertLast(movedNode, null);
Statement toMove;
Statement toCopy;
{
MethodDeclaration methodDecl = findMethodDeclaration(type, "E");
assertTrue("Cannot find Constructor E", methodDecl != null);
Block body = methodDecl.getBody();
assertTrue("No body", body != null);
List statements = body.statements();
assertTrue("Not expected number of statements", statements.size() == 4);
toMove = (Statement)statements.get(1);
toCopy = (Statement)statements.get(3);
rewrite.remove(toMove, null);
}
{
MethodDeclaration methodDecl = findMethodDeclaration(type, "gee");
assertTrue("Cannot find gee()", methodDecl != null);
Block body = methodDecl.getBody();
assertTrue("No body", body != null);
List statements = body.statements();
assertTrue("Has statements", statements.isEmpty());
ASTNode insertNodeForMove = rewrite.createCopyTarget(toMove);
ASTNode insertNodeForCopy = rewrite.createCopyTarget(toCopy);
rewrite.getListRewrite(body, Block.STATEMENTS_PROPERTY).insertLast(insertNodeForCopy, null);
rewrite.getListRewrite(body, Block.STATEMENTS_PROPERTY).insertLast(insertNodeForMove, null);
}
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" i= 0;\n");
buf.append(" }\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveDeclSameLevel() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" i= 0;\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // move inner type to the end of the type & move, copy statements from constructor to method
List members = type.bodyDeclarations();
assertTrue("Has declarations", !members.isEmpty());
assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
TypeDeclaration innerType = (TypeDeclaration)members.get(0);
ASTNode movedNode = rewrite.createMoveTarget(innerType);
rewrite.getListRewrite(type, TypeDeclaration.BODY_DECLARATIONS_PROPERTY).insertLast(movedNode, null);
Statement toMove;
Statement toCopy;
{
MethodDeclaration methodDecl = findMethodDeclaration(type, "E");
assertTrue("Cannot find Constructor E", methodDecl != null);
Block body = methodDecl.getBody();
assertTrue("No body", body != null);
List statements = body.statements();
assertTrue("Not expected number of statements", statements.size() == 4);
toMove = (Statement)statements.get(1);
toCopy = (Statement)statements.get(3);
}
{
MethodDeclaration methodDecl = findMethodDeclaration(type, "gee");
assertTrue("Cannot find gee()", methodDecl != null);
Block body = methodDecl.getBody();
assertTrue("No body", body != null);
List statements = body.statements();
assertTrue("Has statements", statements.isEmpty());
ASTNode insertNodeForMove = rewrite.createMoveTarget(toMove);
ASTNode insertNodeForCopy = rewrite.createCopyTarget(toCopy);
rewrite.getListRewrite(body, Block.STATEMENTS_PROPERTY).insertLast(insertNodeForCopy, null);
rewrite.getListRewrite(body, Block.STATEMENTS_PROPERTY).insertLast(insertNodeForMove, null);
}
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" i= 0;\n");
buf.append(" }\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveDeclDifferentLevelCD() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" i= 0;\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRoot.getAST();
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{
List members = type.bodyDeclarations();
assertTrue("Has declarations", !members.isEmpty());
assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
TypeDeclaration innerType = (TypeDeclaration)members.get(0);
List innerMembers = innerType.bodyDeclarations();
assertTrue("Not expected number of inner members", innerMembers.size() == 1);
{ // move outer as inner of inner.
TypeDeclaration outerType = findTypeDeclaration(astRoot, "G");
assertTrue("G not found", outerType != null);
rewrite.remove(outerType, null);
ASTNode insertNodeForCopy = rewrite.createCopyTarget(outerType);
rewrite.getListRewrite(innerType, TypeDeclaration.BODY_DECLARATIONS_PROPERTY).insertLast(insertNodeForCopy,
null);
}
{ // copy method of inner to main type
MethodDeclaration methodDecl = (MethodDeclaration)innerMembers.get(0);
ASTNode insertNodeForMove = rewrite.createCopyTarget(methodDecl);
rewrite.getListRewrite(type, TypeDeclaration.BODY_DECLARATIONS_PROPERTY)
.insertLast(insertNodeForMove, null);
}
{ // nest body of constructor in a while statement
MethodDeclaration methodDecl = findMethodDeclaration(type, "E");
assertTrue("Cannot find Constructor E", methodDecl != null);
Block body = methodDecl.getBody();
WhileStatement whileStatement = ast.newWhileStatement();
whileStatement.setExpression(ast.newBooleanLiteral(true));
Statement insertNodeForCopy = (Statement)rewrite.createCopyTarget(body);
whileStatement.setBody(insertNodeForCopy); // set existing body
Block newBody = ast.newBlock();
List newStatements = newBody.statements();
newStatements.add(whileStatement);
rewrite.replace(body, newBody, null);
}
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append("\n");
buf.append(" interface G {\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" while (true) {\n");
buf.append(" super();\n");
buf.append(" i= 0;\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveDeclDifferentLevel() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" i= 0;\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRoot.getAST();
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{
List members = type.bodyDeclarations();
assertTrue("Has declarations", !members.isEmpty());
assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
TypeDeclaration innerType = (TypeDeclaration)members.get(0);
List innerMembers = innerType.bodyDeclarations();
assertTrue("Not expected number of inner members", innerMembers.size() == 1);
{ // move outer as inner of inner.
TypeDeclaration outerType = findTypeDeclaration(astRoot, "G");
assertTrue("G not found", outerType != null);
ASTNode insertNodeForCopy = rewrite.createMoveTarget(outerType);
rewrite.getListRewrite(innerType, TypeDeclaration.BODY_DECLARATIONS_PROPERTY).insertLast(insertNodeForCopy,
null);
}
{ // copy method of inner to main type
MethodDeclaration methodDecl = (MethodDeclaration)innerMembers.get(0);
ASTNode insertNodeForMove = rewrite.createCopyTarget(methodDecl);
rewrite.getListRewrite(type, TypeDeclaration.BODY_DECLARATIONS_PROPERTY)
.insertLast(insertNodeForMove, null);
}
{ // nest body of constructor in a while statement
MethodDeclaration methodDecl = findMethodDeclaration(type, "E");
assertTrue("Cannot find Constructor E", methodDecl != null);
Block body = methodDecl.getBody();
WhileStatement whileStatement = ast.newWhileStatement();
whileStatement.setExpression(ast.newBooleanLiteral(true));
Statement insertNodeForCopy = (Statement)rewrite.createCopyTarget(body);
whileStatement.setBody(insertNodeForCopy); // set existing body
Block newBody = ast.newBlock();
List newStatements = newBody.statements();
newStatements.add(whileStatement);
rewrite.replace(body, newBody, null);
}
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append("\n");
buf.append(" interface G {\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" while (true) {\n");
buf.append(" super();\n");
buf.append(" i= 0;\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveStatementsCD() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" i= 0;\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRoot.getAST();
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // move first statments inside an ifstatement, move second statment inside a new while statement
// that is in the ifstatement
MethodDeclaration methodDecl = findMethodDeclaration(type, "E");
assertTrue("Cannot find Constructor E", methodDecl != null);
Block body = methodDecl.getBody();
List statements = body.statements();
assertTrue("Cannot find if statement", statements.get(3) instanceof IfStatement);
IfStatement ifStatement = (IfStatement)statements.get(3);
Statement insertNodeForCopy1 = (Statement)rewrite.createCopyTarget((ASTNode)statements.get(1));
Statement insertNodeForCopy2 = (Statement)rewrite.createCopyTarget((ASTNode)statements.get(2));
Block whileBody = ast.newBlock();
WhileStatement whileStatement = ast.newWhileStatement();
whileStatement.setExpression(ast.newBooleanLiteral(true));
whileStatement.setBody(whileBody);
List whileBodyStatements = whileBody.statements();
whileBodyStatements.add(insertNodeForCopy2);
assertTrue("if statement body not a block", ifStatement.getThenStatement() instanceof Block);
Block block = (Block)ifStatement.getThenStatement();
rewrite.getListRewrite(block, Block.STATEMENTS_PROPERTY).insertFirst(whileStatement, null);
rewrite.getListRewrite(block, Block.STATEMENTS_PROPERTY).insertAfter(insertNodeForCopy1, whileStatement, null);
rewrite.remove((ASTNode)statements.get(1), null);
rewrite.remove((ASTNode)statements.get(2), null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" public static class EInner {\n");
buf.append(" public void xee() {\n");
buf.append(" /* does nothing */\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" if (System.out == null) {\n");
buf.append(" while (true) {\n");
buf.append(" k= 9;\n");
buf.append(" }\n");
buf.append(" i= 0;\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveStatements() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" i= 0;\n");
buf.append(" k= 9;\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRoot.getAST();
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // move first statments inside an ifstatement, move second statment inside a new while statement
// that is in the ifstatement
MethodDeclaration methodDecl = findMethodDeclaration(type, "E");
assertTrue("Cannot find Constructor E", methodDecl != null);
Block body = methodDecl.getBody();
List statements = body.statements();
assertTrue("Cannot find if statement", statements.get(3) instanceof IfStatement);
IfStatement ifStatement = (IfStatement)statements.get(3);
Statement insertNodeForCopy1 = (Statement)rewrite.createMoveTarget((ASTNode)statements.get(1));
Statement insertNodeForCopy2 = (Statement)rewrite.createMoveTarget((ASTNode)statements.get(2));
Block whileBody = ast.newBlock();
WhileStatement whileStatement = ast.newWhileStatement();
whileStatement.setExpression(ast.newBooleanLiteral(true));
whileStatement.setBody(whileBody);
List whileBodyStatements = whileBody.statements();
whileBodyStatements.add(insertNodeForCopy2);
assertTrue("if statement body not a block", ifStatement.getThenStatement() instanceof Block);
Block block = (Block)ifStatement.getThenStatement();
rewrite.getListRewrite(block, Block.STATEMENTS_PROPERTY).insertFirst(whileStatement, null);
rewrite.getListRewrite(block, Block.STATEMENTS_PROPERTY).insertAfter(insertNodeForCopy1, whileStatement, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E extends Exception implements Runnable, Serializable {\n");
buf.append(" private /* inner comment */ int i;\n");
buf.append(" private int k;\n");
buf.append(" public E() {\n");
buf.append(" super();\n");
buf.append(" if (System.out == null) {\n");
buf.append(" while (true) {\n");
buf.append(" k= 9;\n");
buf.append(" }\n");
buf.append(" i= 0;\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void gee() {\n");
buf.append(" }\n");
buf.append("}\n");
buf.append("interface G {\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testCopyFromDeleted() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void goo() {\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // delete method foo, but copy if statement to goo
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
assertTrue("Cannot find foo", methodDecl != null);
rewrite.remove(methodDecl, null);
Block body = methodDecl.getBody();
List statements = body.statements();
assertTrue("Cannot find if statement", statements.size() == 1);
ASTNode placeHolder = rewrite.createMoveTarget((ASTNode)statements.get(0));
MethodDeclaration methodGoo = findMethodDeclaration(type, "goo");
assertTrue("Cannot find goo", methodGoo != null);
rewrite.getListRewrite(methodGoo.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeHolder, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void goo() {\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee(); // cool\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testChangesInMoveCD() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee( /* cool */);\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void goo() {\n");
buf.append(" x= 1;\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRoot.getAST();
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // replace statement in goo with moved ifStatement from foo. add a node to if statement
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
assertTrue("Cannot find foo", methodDecl != null);
List fooStatements = methodDecl.getBody().statements();
assertTrue("Cannot find if statement", fooStatements.size() == 1);
// prepare ifStatement to move
IfStatement ifStatement = (IfStatement)fooStatements.get(0);
rewrite.remove(ifStatement, null);
ASTNode placeHolder = rewrite.createCopyTarget(ifStatement);
// add return statement to ifStatement block
ReturnStatement returnStatement = ast.newReturnStatement();
Block then = (Block)ifStatement.getThenStatement();
rewrite.getListRewrite(then, Block.STATEMENTS_PROPERTY).insertLast(returnStatement, null);
// replace statement in goo with moved ifStatement
MethodDeclaration methodGoo = findMethodDeclaration(type, "goo");
assertTrue("Cannot find goo", methodGoo != null);
List gooStatements = methodGoo.getBody().statements();
assertTrue("Cannot find statement in goo", gooStatements.size() == 1);
rewrite.replace((ASTNode)gooStatements.get(0), placeHolder, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" }\n");
buf.append(" public void goo() {\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee( /* cool */);\n");
buf.append(" return;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testChangesInMove() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee( /* cool */);\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append(" public void goo() {\n");
buf.append(" x= 1;\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRoot.getAST();
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // replace statement in goo with moved ifStatement from foo. add a node to if statement
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
assertTrue("Cannot find foo", methodDecl != null);
List fooStatements = methodDecl.getBody().statements();
assertTrue("Cannot find if statement", fooStatements.size() == 1);
// prepare ifStatement to move
IfStatement ifStatement = (IfStatement)fooStatements.get(0);
ASTNode placeHolder = rewrite.createMoveTarget(ifStatement);
// add return statement to ifStatement block
ReturnStatement returnStatement = ast.newReturnStatement();
Block then = (Block)ifStatement.getThenStatement();
rewrite.getListRewrite(then, Block.STATEMENTS_PROPERTY).insertLast(returnStatement, null);
// replace statement in goo with moved ifStatement
MethodDeclaration methodGoo = findMethodDeclaration(type, "goo");
assertTrue("Cannot find goo", methodGoo != null);
List gooStatements = methodGoo.getBody().statements();
assertTrue("Cannot find statement in goo", gooStatements.size() == 1);
rewrite.replace((ASTNode)gooStatements.get(0), placeHolder, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" }\n");
buf.append(" public void goo() {\n");
buf.append(" if (System.out == null) {\n");
buf.append(" gee( /* cool */);\n");
buf.append(" return;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testSwapCD() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" goo(xoo(/*hello*/), k * 2);\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // swap the two arguments
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
assertTrue("Cannot find foo", methodDecl != null);
List fooStatements = methodDecl.getBody().statements();
assertTrue("More statements than expected", fooStatements.size() == 1);
ExpressionStatement statement = (ExpressionStatement)fooStatements.get(0);
MethodInvocation invocation = (MethodInvocation)statement.getExpression();
List arguments = invocation.arguments();
assertTrue("More arguments than expected", arguments.size() == 2);
ASTNode arg0 = (ASTNode)arguments.get(0);
ASTNode arg1 = (ASTNode)arguments.get(1);
ASTNode placeHolder0 = rewrite.createCopyTarget(arg0);
ASTNode placeHolder1 = rewrite.createCopyTarget(arg1);
rewrite.replace(arg0, placeHolder1, null);
rewrite.replace(arg1, placeHolder0, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" goo(k * 2, xoo(/*hello*/));\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testSwap() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" goo(xoo(/*hello*/), k * 2);\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
{ // swap the two arguments
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
assertTrue("Cannot find foo", methodDecl != null);
List fooStatements = methodDecl.getBody().statements();
assertTrue("More statements than expected", fooStatements.size() == 1);
ExpressionStatement statement = (ExpressionStatement)fooStatements.get(0);
MethodInvocation invocation = (MethodInvocation)statement.getExpression();
List arguments = invocation.arguments();
assertTrue("More arguments than expected", arguments.size() == 2);
ASTNode arg0 = (ASTNode)arguments.get(0);
ASTNode arg1 = (ASTNode)arguments.get(1);
ASTNode placeHolder0 = rewrite.createMoveTarget(arg0);
ASTNode placeHolder1 = rewrite.createMoveTarget(arg1);
rewrite.replace(arg0, placeHolder1, null); // replace instead of remove
rewrite.replace(arg1, placeHolder0, null); // replace instead of remove
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" goo(k * 2, xoo(/*hello*/));\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMultipleCopiesOfSameNode() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
List ifStatementBody = ((Block)ifStatement.getThenStatement()).statements();
ASTNode node = (ASTNode)ifStatementBody.get(1);
ASTNode placeholder1 = rewrite.createCopyTarget(node);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder1, null);
ASTNode placeholder2 = rewrite.createCopyTarget(node);
rewrite.replace((ASTNode)ifStatementBody.get(0), placeholder2, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" i++; // comment\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" i++; // comment\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testCopyMultipleNodes() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first = (ASTNode)thenStatements.get(0);
ASTNode last = (ASTNode)thenStatements.get(1);
ASTNode placeholder = listRewrite.createCopyTarget(first, last);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testCopyMultipleNodes0() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first = (ASTNode)thenStatements.get(0);
ASTNode second = (ASTNode)thenStatements.get(1);
ASTNode placeholder = listRewrite.createCopyTarget(first, second);
// replace the first
AST ast = astRoot.getAST();
PrefixExpression expression = ast.newPrefixExpression();
expression.setOperand(ast.newSimpleName("i"));
expression.setOperator(PrefixExpression.Operator.DECREMENT);
ExpressionStatement newStatement = ast.newExpressionStatement(expression);
listRewrite.replace(first, newStatement, null);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" --i;\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" --i;\n");
buf.append(" i++; // comment\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testCopyMultipleNodes1() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first = (ASTNode)thenStatements.get(0);
ASTNode second = (ASTNode)thenStatements.get(1);
ASTNode placeholder = listRewrite.createCopyTarget(first, second);
// insert between the copied
AST ast = astRoot.getAST();
PrefixExpression expression = ast.newPrefixExpression();
expression.setOperand(ast.newSimpleName("i"));
expression.setOperator(PrefixExpression.Operator.DECREMENT);
ExpressionStatement newStatement = ast.newExpressionStatement(expression);
listRewrite.insertAfter(newStatement, first, null);
// remove the last
listRewrite.remove((ASTNode)thenStatements.get(2), null);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" --i;\n");
buf.append(" i++; // comment\n");
buf.append(" }\n");
buf.append(" foo();\n");
buf.append(" --i;\n");
buf.append(" i++; // comment\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testCopyMultipleNodes2() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo(1);\n");
buf.append(" foo(2); // comment\n");
buf.append(" foo(3);\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode second = (ASTNode)thenStatements.get(1);
ASTNode last = (ASTNode)thenStatements.get(2);
ASTNode placeholder1 = listRewrite.createCopyTarget(second, last);
rewrite.replace(ifStatement, placeholder1, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" foo(2); // comment\n");
buf.append(" foo(3);\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testCopyMultipleNodes3() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo(1);\n");
buf.append(" foo(2);\n");
buf.append(" foo(3);\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first = (ASTNode)thenStatements.get(0);
ASTNode second = (ASTNode)thenStatements.get(1);
ASTNode last = (ASTNode)thenStatements.get(2);
ASTNode placeholder1 = listRewrite.createCopyTarget(first, second);
ASTNode placeholder2 = listRewrite.createCopyTarget(first, last);
listRewrite.insertAfter(placeholder1, last, null);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder2, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo(1);\n");
buf.append(" foo(2);\n");
buf.append(" foo(3);\n");
buf.append(" foo(1);\n");
buf.append(" foo(2);\n");
buf.append(" }\n");
buf.append(" foo(1);\n");
buf.append(" foo(2);\n");
buf.append(" foo(3);\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testCopyMultipleNodes4() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo(1);\n");
buf.append(" foo(2);\n");
buf.append(" foo(3);\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first = (ASTNode)thenStatements.get(0);
ASTNode second = (ASTNode)thenStatements.get(1);
ASTNode last = (ASTNode)thenStatements.get(2);
ASTNode placeholder1 = listRewrite.createCopyTarget(first, last);
ASTNode placeholder2 = listRewrite.createCopyTarget(first, second);
ASTNode placeholder3 = rewrite.createMoveTarget(first);
listRewrite.insertAfter(placeholder1, last, null);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder2, null);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertFirst(placeholder3, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" foo(1);\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo(2);\n");
buf.append(" foo(3);\n");
buf.append(" foo(2);\n");
buf.append(" foo(3);\n");
buf.append(" }\n");
buf.append(" foo(2);\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMultipleCopiesOfSameNodeAndMove() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
List ifStatementBody = ((Block)ifStatement.getThenStatement()).statements();
ASTNode node = (ASTNode)ifStatementBody.get(1);
ASTNode placeholder1 = rewrite.createCopyTarget(node);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder1, null);
ASTNode placeholder2 = rewrite.createCopyTarget(node);
rewrite.replace((ASTNode)ifStatementBody.get(0), placeholder2, null);
ASTNode placeholder3 = rewrite.createMoveTarget(node);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertFirst(placeholder3, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" i++; // comment\n");
buf.append(" if (i == 0) {\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" i++; // comment\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveMultipleNodes() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first = (ASTNode)thenStatements.get(0);
ASTNode last = (ASTNode)thenStatements.get(1);
ASTNode placeholder = listRewrite.createMoveTarget(first, last);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" i++;\n");
buf.append(" }\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveMultipleNodes2() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" i--;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first1 = (ASTNode)thenStatements.get(0);
ASTNode last1 = (ASTNode)thenStatements.get(1);
ASTNode placeholder1 = listRewrite.createMoveTarget(first1, last1);
ASTNode first2 = (ASTNode)thenStatements.get(2);
ASTNode last2 = (ASTNode)thenStatements.get(3);
ASTNode placeholder2 = listRewrite.createMoveTarget(first2, last2);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertFirst(placeholder1, null);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertLast(placeholder2, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" if (i == 0) {\n");
buf.append(" }\n");
buf.append(" i++;\n");
buf.append(" i--;\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveMultipleNodes3() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" i--;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first = (ASTNode)thenStatements.get(0);
ASTNode between = (ASTNode)thenStatements.get(1);
ASTNode last = (ASTNode)thenStatements.get(3);
ASTNode placeholder1 = listRewrite.createMoveTarget(first, last);
ASTNode placeholder2 = listRewrite.createCopyTarget(first, between);
rewrite.replace(ifStatement, placeholder1, null);
rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY).insertFirst(placeholder2, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" i--;\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveMultipleNodes4() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" if (i == 0) {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i++;\n");
buf.append(" i--;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
IfStatement ifStatement = (IfStatement)statements.get(0);
Block thenBlock = (Block)ifStatement.getThenStatement();
ListRewrite listRewrite = rewrite.getListRewrite(thenBlock, Block.STATEMENTS_PROPERTY);
List thenStatements = thenBlock.statements();
ASTNode first1 = (ASTNode)thenStatements.get(0);
ASTNode last1 = (ASTNode)thenStatements.get(2);
listRewrite.createMoveTarget(first1, last1);
ASTNode first2 = (ASTNode)thenStatements.get(2);
ASTNode last2 = (ASTNode)thenStatements.get(3);
try {
listRewrite.createMoveTarget(first2, last2);
assertFalse(true);
} catch (IllegalArgumentException e) {
// overlapping move ranges
}
}
}
@Test
public void testReplaceMoveMultiple() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i--;\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
ASTNode first = (ASTNode)statements.get(0);
ASTNode last = (ASTNode)statements.get(2);
ListRewrite listRewrite = rewrite.getListRewrite(methodDecl.getBody(), Block.STATEMENTS_PROPERTY);
Block newBlock = astRoot.getAST().newBlock();
ASTNode placeholder1 = listRewrite.createMoveTarget(first, last, newBlock, null);
newBlock.statements().add(placeholder1);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" {\n");
buf.append(" foo();\n");
buf.append(" i++; // comment\n");
buf.append(" i--;\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveForStatementToForBlockCD() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" for(int i= 0; i < 8; i++)\n");
buf.append(" foo();\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRoot.getAST();
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
ForStatement forStatement = (ForStatement)statements.get(0);
Statement body = forStatement.getBody();
ASTNode placeholder = rewrite.createCopyTarget(body);
Block newBody = ast.newBlock();
newBody.statements().add(placeholder);
rewrite.replace(body, newBody, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" for(int i= 0; i < 8; i++) {\n");
buf.append(" foo();\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testMoveForStatementToForBlock() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" for(int i= 0; i < 8; i++)\n");
buf.append(" foo();\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
AST ast = astRoot.getAST();
assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
TypeDeclaration type = findTypeDeclaration(astRoot, "E");
MethodDeclaration methodDecl = findMethodDeclaration(type, "foo");
{
List statements = methodDecl.getBody().statements();
ForStatement forStatement = (ForStatement)statements.get(0);
Statement body = forStatement.getBody();
ASTNode placeholder = rewrite.createMoveTarget(body);
Block newBody = ast.newBlock();
newBody.statements().add(placeholder);
rewrite.replace(body, newBody, null);
}
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo() {\n");
buf.append(" for(int i= 0; i < 8; i++) {\n");
buf.append(" foo();\n");
buf.append(" }\n");
buf.append(" }\n");
buf.append("}\n");
assertEqualString(preview, buf.toString());
}
@Test
public void testNestedCopies() throws Exception {
StringBuffer buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo(Object o) {\n");
buf.append(" int i= (String) o.indexOf('1');\n");
buf.append(" }\n");
buf.append("}\n");
ICompilationUnit cu =
new org.eclipse.che.ide.ext.java.jdt.compiler.batch.CompilationUnit(buf.toString().toCharArray(), "E.java", "");
CompilationUnit astRoot = createAST(cu);
AST ast = astRoot.getAST();
ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST());
TypeDeclaration typeDecl = findTypeDeclaration(astRoot, "E");
MethodDeclaration methDecl = findMethodDeclaration(typeDecl, "foo");
VariableDeclarationStatement varStat = (VariableDeclarationStatement)methDecl.getBody().statements().get(0);
CastExpression expression =
(CastExpression)((VariableDeclarationFragment)varStat.fragments().get(0)).getInitializer();
MethodInvocation invocation = (MethodInvocation)expression.getExpression();
CastExpression newCast = ast.newCastExpression();
newCast.setType((Type)rewrite.createCopyTarget(expression.getType()));
newCast.setExpression((Expression)rewrite.createCopyTarget(invocation.getExpression()));
ParenthesizedExpression parents = ast.newParenthesizedExpression();
parents.setExpression(newCast);
ASTNode node = rewrite.createCopyTarget(invocation);
rewrite.replace(expression, node, null);
rewrite.replace(invocation.getExpression(), parents, null);
String preview = evaluateRewrite(cu, rewrite);
buf = new StringBuffer();
buf.append("package test1;\n");
buf.append("public class E {\n");
buf.append(" public void foo(Object o) {\n");
buf.append(" int i= ((String) o).indexOf('1');\n");
buf.append(" }\n");
buf.append("}\n");
String expected = buf.toString();
assertEqualString(preview, expected);
}
}