diff options
| author | Markus Keller | 2013-10-08 14:25:29 +0000 |
|---|---|---|
| committer | Markus Keller | 2013-10-08 16:42:04 +0000 |
| commit | 80b12656ac31b339fd22081301db662b77277ac4 (patch) | |
| tree | 3343dc9cd46395e8995cb0db1d4199c2708fa126 | |
| parent | 0878e1dc107fb190292b2de3d6e4f25e19c0489c (diff) | |
| download | eclipse.jdt.core-80b12656ac31b339fd22081301db662b77277ac4.tar.gz eclipse.jdt.core-80b12656ac31b339fd22081301db662b77277ac4.tar.xz eclipse.jdt.core-80b12656ac31b339fd22081301db662b77277ac4.zip | |
Bug 418924: [dom ast] ASTRewrite should allow removing left and right operands of infix expressionI20131008-2330I20131008-2000
2 files changed, 114 insertions, 11 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingExpressionsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingExpressionsTest.java index 8d2bf217e1..1f54e1e092 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingExpressionsTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingExpressionsTest.java @@ -12,7 +12,6 @@ package org.eclipse.jdt.core.tests.rewrite.describing; import java.util.List; import junit.framework.Test; -import junit.framework.TestSuite; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IPackageFragment; @@ -74,12 +73,6 @@ public class ASTRewritingExpressionsTest extends ASTRewritingTest { return new Suite(THIS); } - public static Test setUpTest(Test someTest) { - TestSuite suite= new Suite("one test"); - suite.addTest(someTest); - return suite; - } - public static Test suite() { return allTests(); } @@ -1034,6 +1027,88 @@ public class ASTRewritingExpressionsTest extends ASTRewritingTest { } + public void testInfixExpression2() throws Exception { + IPackageFragment pack1= this.sourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class E {\n"); + buf.append(" public void foo() {\n"); + buf.append(" i= 0 + 2;\n"); + buf.append(" j= 1 + 0;\n"); + buf.append(" k= 0 + 2 + 3 + 4 + 5;\n"); + buf.append(" l= 1 + 0 + 3 + 4 + 5;\n"); + buf.append(" m= 0 + 0 + 0 + 4 + 5;\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null); + + CompilationUnit astRoot= createAST(cu); + ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST()); + + assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0); + TypeDeclaration type= findTypeDeclaration(astRoot, "E"); + MethodDeclaration methodDecl= findMethodDeclaration(type, "foo"); + Block block= methodDecl.getBody(); + List statements= block.statements(); + { // remove left side + ExpressionStatement stmt= (ExpressionStatement) statements.get(0); + Assignment assignment= (Assignment) stmt.getExpression(); + InfixExpression expr= (InfixExpression) assignment.getRightHandSide(); + + rewrite.remove(expr.getLeftOperand(), null); + } + + { // remove right side + ExpressionStatement stmt= (ExpressionStatement) statements.get(1); + Assignment assignment= (Assignment) stmt.getExpression(); + InfixExpression expr= (InfixExpression) assignment.getRightHandSide(); + + rewrite.remove(expr.getRightOperand(), null); + } + + { // remove left side (with extended operands) + ExpressionStatement stmt= (ExpressionStatement) statements.get(2); + Assignment assignment= (Assignment) stmt.getExpression(); + InfixExpression expr= (InfixExpression) assignment.getRightHandSide(); + + rewrite.remove(expr.getLeftOperand(), null); + } + + { // remove right side (with extended operands) + ExpressionStatement stmt= (ExpressionStatement) statements.get(3); + Assignment assignment= (Assignment) stmt.getExpression(); + InfixExpression expr= (InfixExpression) assignment.getRightHandSide(); + + rewrite.remove(expr.getRightOperand(), null); + } + + { // remove left, right, and extended operand + ExpressionStatement stmt= (ExpressionStatement) statements.get(4); + Assignment assignment= (Assignment) stmt.getExpression(); + InfixExpression expr= (InfixExpression) assignment.getRightHandSide(); + + rewrite.remove(expr.getLeftOperand(), null); + rewrite.remove(expr.getRightOperand(), null); + rewrite.remove((ASTNode) expr.extendedOperands().get(0), 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= 2;\n"); + buf.append(" j= 1;\n"); + buf.append(" k= 2 + 3 + 4 + 5;\n"); + buf.append(" l= 1 + 3 + 4 + 5;\n"); + buf.append(" m= 4 + 5;\n"); + buf.append(" }\n"); + buf.append("}\n"); + assertEqualString(preview, buf.toString()); + + } + /** @deprecated using deprecated code */ public void testInstanceofExpression() throws Exception { IPackageFragment pack1= this.sourceFolder.createPackageFragment("test1", false, null); diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java index bc307748c5..983e5f3fb3 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 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 @@ -2466,15 +2466,43 @@ public final class ASTRewriteAnalyzer extends ASTVisitor { return doVisitUnchangedChildren(node); } - int pos= rewriteRequiredNode(node, InfixExpression.LEFT_OPERAND_PROPERTY); + Expression right= node.getRightOperand(); + int pos; + + RewriteEvent leftEvent= getEvent(node, InfixExpression.LEFT_OPERAND_PROPERTY); + boolean removeLeft = leftEvent != null && leftEvent.getChangeKind() == RewriteEvent.REMOVED; + RewriteEvent rightEvent= getEvent(node, InfixExpression.RIGHT_OPERAND_PROPERTY); + boolean removeRight = rightEvent != null && rightEvent.getChangeKind() == RewriteEvent.REMOVED; + + if (removeLeft) { + Expression left= node.getLeftOperand(); + int leftStart= getExtendedOffset(left); + pos= getExtendedOffset(right); + TextEditGroup editGroup= getEditGroup(leftEvent); + doTextRemoveAndVisit(leftStart, pos - leftStart, left, editGroup); + } else { + pos = rewriteRequiredNode(node, InfixExpression.LEFT_OPERAND_PROPERTY); + } boolean needsNewOperation= isChanged(node, InfixExpression.OPERATOR_PROPERTY); String operation= getNewValue(node, InfixExpression.OPERATOR_PROPERTY).toString(); - if (needsNewOperation) { + if (needsNewOperation && !removeLeft && !removeRight) { replaceOperation(pos, operation, getEditGroup(node, InfixExpression.OPERATOR_PROPERTY)); } - pos= rewriteRequiredNode(node, InfixExpression.RIGHT_OPERAND_PROPERTY); + if (removeRight) { + int end; + if (removeLeft && node.extendedOperands().size() > 0) { + end= getExtendedOffset((Expression) node.extendedOperands().get(0)); + } else { + end= getExtendedEnd(right); + } + TextEditGroup editGroup= getEditGroup(rightEvent); + doTextRemoveAndVisit(pos, end - pos, right, editGroup); + pos= end; + } else { + pos= rewriteRequiredNode(node, InfixExpression.RIGHT_OPERAND_PROPERTY); + } RewriteEvent event= getEvent(node, InfixExpression.EXTENDED_OPERANDS_PROPERTY); String prefixString= ' ' + operation + ' '; |
