/*
* Copyright (c) 2014, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.engine.utilities.ast;
import com.google.dart.engine.ast.*;
/**
* Instances of the class {@code NodeReplacer} implement an object that will replace one child node
* in an AST node with another node.
*/
public class NodeReplacer implements AstVisitor<Boolean> {
/**
* Replace the old node with the new node in the AST structure containing the old node.
*
* @param oldNode
* @param newNode
* @return {@code true} if the replacement was successful
* @throws IllegalArgumentException if either node is {@code null}, if the old node does not have
* a parent node, or if the AST structure has been corrupted
*/
public static boolean replace(AstNode oldNode, AstNode newNode) {
if (oldNode == null || newNode == null) {
throw new IllegalArgumentException("The old and new nodes must be non-null");
} else if (oldNode == newNode) {
return true;
}
AstNode parent = oldNode.getParent();
if (parent == null) {
throw new IllegalArgumentException("The old node is not a child of another node");
}
NodeReplacer replacer = new NodeReplacer(oldNode, newNode);
return parent.accept(replacer);
}
private AstNode oldNode;
private AstNode newNode;
private NodeReplacer(AstNode oldNode, AstNode newNode) {
this.oldNode = oldNode;
this.newNode = newNode;
}
@Override
public Boolean visitAdjacentStrings(AdjacentStrings node) {
if (replaceInList(node.getStrings())) {
return Boolean.TRUE;
}
return visitNode(node);
}
public Boolean visitAnnotatedNode(AnnotatedNode node) {
if (node.getDocumentationComment() == oldNode) {
node.setDocumentationComment((Comment) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getMetadata())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitAnnotation(Annotation node) {
if (node.getArguments() == oldNode) {
node.setArguments((ArgumentList) newNode);
return Boolean.TRUE;
} else if (node.getConstructorName() == oldNode) {
node.setConstructorName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getName() == oldNode) {
node.setName((Identifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitArgumentList(ArgumentList node) {
if (replaceInList(node.getArguments())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitAsExpression(AsExpression node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
} else if (node.getType() == oldNode) {
node.setType((TypeName) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitAssertStatement(AssertStatement node) {
if (node.getCondition() == oldNode) {
node.setCondition((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitAssignmentExpression(AssignmentExpression node) {
if (node.getLeftHandSide() == oldNode) {
node.setLeftHandSide((Expression) newNode);
return Boolean.TRUE;
} else if (node.getRightHandSide() == oldNode) {
node.setRightHandSide((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitAwaitExpression(AwaitExpression node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
}
return visitNode(node);
}
@Override
public Boolean visitBinaryExpression(BinaryExpression node) {
if (node.getLeftOperand() == oldNode) {
node.setLeftOperand((Expression) newNode);
return Boolean.TRUE;
} else if (node.getRightOperand() == oldNode) {
node.setRightOperand((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitBlock(Block node) {
if (replaceInList(node.getStatements())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitBlockFunctionBody(BlockFunctionBody node) {
if (node.getBlock() == oldNode) {
node.setBlock((Block) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitBooleanLiteral(BooleanLiteral node) {
return visitNode(node);
}
@Override
public Boolean visitBreakStatement(BreakStatement node) {
if (node.getLabel() == oldNode) {
node.setLabel((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitCascadeExpression(CascadeExpression node) {
if (node.getTarget() == oldNode) {
node.setTarget((Expression) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getCascadeSections())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitCatchClause(CatchClause node) {
if (node.getExceptionType() == oldNode) {
node.setExceptionType((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getExceptionParameter() == oldNode) {
node.setExceptionParameter((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getStackTraceParameter() == oldNode) {
node.setStackTraceParameter((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitClassDeclaration(ClassDeclaration node) {
if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getTypeParameters() == oldNode) {
node.setTypeParameters((TypeParameterList) newNode);
return Boolean.TRUE;
} else if (node.getExtendsClause() == oldNode) {
node.setExtendsClause((ExtendsClause) newNode);
return Boolean.TRUE;
} else if (node.getWithClause() == oldNode) {
node.setWithClause((WithClause) newNode);
return Boolean.TRUE;
} else if (node.getImplementsClause() == oldNode) {
node.setImplementsClause((ImplementsClause) newNode);
return Boolean.TRUE;
} else if (node.getNativeClause() == oldNode) {
node.setNativeClause((NativeClause) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getMembers())) {
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitClassTypeAlias(ClassTypeAlias node) {
if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getTypeParameters() == oldNode) {
node.setTypeParameters((TypeParameterList) newNode);
return Boolean.TRUE;
} else if (node.getSuperclass() == oldNode) {
node.setSuperclass((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getWithClause() == oldNode) {
node.setWithClause((WithClause) newNode);
return Boolean.TRUE;
} else if (node.getImplementsClause() == oldNode) {
node.setImplementsClause((ImplementsClause) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitComment(Comment node) {
if (replaceInList(node.getReferences())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitCommentReference(CommentReference node) {
if (node.getIdentifier() == oldNode) {
node.setIdentifier((Identifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitCompilationUnit(CompilationUnit node) {
if (node.getScriptTag() == oldNode) {
node.setScriptTag((ScriptTag) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getDirectives())) {
return Boolean.TRUE;
} else if (replaceInList(node.getDeclarations())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitConditionalExpression(ConditionalExpression node) {
if (node.getCondition() == oldNode) {
node.setCondition((Expression) newNode);
return Boolean.TRUE;
} else if (node.getThenExpression() == oldNode) {
node.setThenExpression((Expression) newNode);
return Boolean.TRUE;
} else if (node.getElseExpression() == oldNode) {
node.setElseExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitConstructorDeclaration(ConstructorDeclaration node) {
if (node.getReturnType() == oldNode) {
node.setReturnType((Identifier) newNode);
return Boolean.TRUE;
} else if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getParameters() == oldNode) {
node.setParameters((FormalParameterList) newNode);
return Boolean.TRUE;
} else if (node.getRedirectedConstructor() == oldNode) {
node.setRedirectedConstructor((ConstructorName) newNode);
return Boolean.TRUE;
} else if (node.getBody() == oldNode) {
node.setBody((FunctionBody) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getInitializers())) {
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
if (node.getFieldName() == oldNode) {
node.setFieldName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitConstructorName(ConstructorName node) {
if (node.getType() == oldNode) {
node.setType((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitContinueStatement(ContinueStatement node) {
if (node.getLabel() == oldNode) {
node.setLabel((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitDeclaredIdentifier(DeclaredIdentifier node) {
if (node.getType() == oldNode) {
node.setType((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getIdentifier() == oldNode) {
node.setIdentifier((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitDefaultFormalParameter(DefaultFormalParameter node) {
if (node.getParameter() == oldNode) {
node.setParameter((NormalFormalParameter) newNode);
return Boolean.TRUE;
} else if (node.getDefaultValue() == oldNode) {
node.setDefaultValue((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitDoStatement(DoStatement node) {
if (node.getBody() == oldNode) {
node.setBody((Statement) newNode);
return Boolean.TRUE;
} else if (node.getCondition() == oldNode) {
node.setCondition((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitDoubleLiteral(DoubleLiteral node) {
return visitNode(node);
}
@Override
public Boolean visitEmptyFunctionBody(EmptyFunctionBody node) {
return visitNode(node);
}
@Override
public Boolean visitEmptyStatement(EmptyStatement node) {
return visitNode(node);
}
@Override
public Boolean visitEnumConstantDeclaration(EnumConstantDeclaration node) {
if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitEnumDeclaration(EnumDeclaration node) {
if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getConstants())) {
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitExportDirective(ExportDirective node) {
return visitNamespaceDirective(node);
}
@Override
public Boolean visitExpressionFunctionBody(ExpressionFunctionBody node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitExpressionStatement(ExpressionStatement node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitExtendsClause(ExtendsClause node) {
if (node.getSuperclass() == oldNode) {
node.setSuperclass((TypeName) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitFieldDeclaration(FieldDeclaration node) {
if (node.getFields() == oldNode) {
node.setFields((VariableDeclarationList) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitFieldFormalParameter(FieldFormalParameter node) {
if (node.getType() == oldNode) {
node.setType((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getParameters() == oldNode) {
node.setParameters((FormalParameterList) newNode);
return Boolean.TRUE;
}
return visitNormalFormalParameter(node);
}
@Override
public Boolean visitForEachStatement(ForEachStatement node) {
if (node.getLoopVariable() == oldNode) {
node.setLoopVariable((DeclaredIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getIdentifier() == oldNode) {
node.setIdentifier((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getIterator() == oldNode) {
node.setIterator((Expression) newNode);
return Boolean.TRUE;
} else if (node.getBody() == oldNode) {
node.setBody((Statement) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitFormalParameterList(FormalParameterList node) {
if (replaceInList(node.getParameters())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitForStatement(ForStatement node) {
if (node.getVariables() == oldNode) {
node.setVariables((VariableDeclarationList) newNode);
return Boolean.TRUE;
} else if (node.getInitialization() == oldNode) {
node.setInitialization((Expression) newNode);
return Boolean.TRUE;
} else if (node.getCondition() == oldNode) {
node.setCondition((Expression) newNode);
return Boolean.TRUE;
} else if (node.getBody() == oldNode) {
node.setBody((Statement) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getUpdaters())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitFunctionDeclaration(FunctionDeclaration node) {
if (node.getReturnType() == oldNode) {
node.setReturnType((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getFunctionExpression() == oldNode) {
node.setFunctionExpression((FunctionExpression) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
if (node.getFunctionDeclaration() == oldNode) {
node.setFunctionDeclaration((FunctionDeclaration) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitFunctionExpression(FunctionExpression node) {
if (node.getParameters() == oldNode) {
node.setParameters((FormalParameterList) newNode);
return Boolean.TRUE;
} else if (node.getBody() == oldNode) {
node.setBody((FunctionBody) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
if (node.getFunction() == oldNode) {
node.setFunction((Expression) newNode);
return Boolean.TRUE;
} else if (node.getArgumentList() == oldNode) {
node.setArgumentList((ArgumentList) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitFunctionTypeAlias(FunctionTypeAlias node) {
if (node.getReturnType() == oldNode) {
node.setReturnType((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getTypeParameters() == oldNode) {
node.setTypeParameters((TypeParameterList) newNode);
return Boolean.TRUE;
} else if (node.getParameters() == oldNode) {
node.setParameters((FormalParameterList) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
if (node.getReturnType() == oldNode) {
node.setReturnType((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getParameters() == oldNode) {
node.setParameters((FormalParameterList) newNode);
return Boolean.TRUE;
}
return visitNormalFormalParameter(node);
}
@Override
public Boolean visitHideCombinator(HideCombinator node) {
if (replaceInList(node.getHiddenNames())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitIfStatement(IfStatement node) {
if (node.getCondition() == oldNode) {
node.setCondition((Expression) newNode);
return Boolean.TRUE;
} else if (node.getThenStatement() == oldNode) {
node.setThenStatement((Statement) newNode);
return Boolean.TRUE;
} else if (node.getElseStatement() == oldNode) {
node.setElseStatement((Statement) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitImplementsClause(ImplementsClause node) {
if (replaceInList(node.getInterfaces())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitImportDirective(ImportDirective node) {
if (node.getPrefix() == oldNode) {
node.setPrefix((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitNamespaceDirective(node);
}
@Override
public Boolean visitIndexExpression(IndexExpression node) {
if (node.getTarget() == oldNode) {
node.setTarget((Expression) newNode);
return Boolean.TRUE;
} else if (node.getIndex() == oldNode) {
node.setIndex((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitInstanceCreationExpression(InstanceCreationExpression node) {
if (node.getConstructorName() == oldNode) {
node.setConstructorName((ConstructorName) newNode);
return Boolean.TRUE;
} else if (node.getArgumentList() == oldNode) {
node.setArgumentList((ArgumentList) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitIntegerLiteral(IntegerLiteral node) {
return visitNode(node);
}
@Override
public Boolean visitInterpolationExpression(InterpolationExpression node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitInterpolationString(InterpolationString node) {
return visitNode(node);
}
@Override
public Boolean visitIsExpression(IsExpression node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
} else if (node.getType() == oldNode) {
node.setType((TypeName) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitLabel(Label node) {
if (node.getLabel() == oldNode) {
node.setLabel((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitLabeledStatement(LabeledStatement node) {
if (node.getStatement() == oldNode) {
node.setStatement((Statement) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getLabels())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitLibraryDirective(LibraryDirective node) {
if (node.getName() == oldNode) {
node.setName((LibraryIdentifier) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitLibraryIdentifier(LibraryIdentifier node) {
if (replaceInList(node.getComponents())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitListLiteral(ListLiteral node) {
if (replaceInList(node.getElements())) {
return Boolean.TRUE;
}
return visitTypedLiteral(node);
}
@Override
public Boolean visitMapLiteral(MapLiteral node) {
if (replaceInList(node.getEntries())) {
return Boolean.TRUE;
}
return visitTypedLiteral(node);
}
@Override
public Boolean visitMapLiteralEntry(MapLiteralEntry node) {
if (node.getKey() == oldNode) {
node.setKey((Expression) newNode);
return Boolean.TRUE;
} else if (node.getValue() == oldNode) {
node.setValue((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitMethodDeclaration(MethodDeclaration node) {
if (node.getReturnType() == oldNode) {
node.setReturnType((TypeName) newNode);
return Boolean.TRUE;
} else if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getParameters() == oldNode) {
node.setParameters((FormalParameterList) newNode);
return Boolean.TRUE;
} else if (node.getBody() == oldNode) {
node.setBody((FunctionBody) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitMethodInvocation(MethodInvocation node) {
if (node.getTarget() == oldNode) {
node.setTarget((Expression) newNode);
return Boolean.TRUE;
} else if (node.getMethodName() == oldNode) {
node.setMethodName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getArgumentList() == oldNode) {
node.setArgumentList((ArgumentList) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitNamedExpression(NamedExpression node) {
if (node.getName() == oldNode) {
node.setName((Label) newNode);
return Boolean.TRUE;
} else if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
public Boolean visitNamespaceDirective(NamespaceDirective node) {
if (replaceInList(node.getCombinators())) {
return Boolean.TRUE;
}
return visitUriBasedDirective(node);
}
@Override
public Boolean visitNativeClause(NativeClause node) {
if (node.getName() == oldNode) {
node.setName((StringLiteral) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitNativeFunctionBody(NativeFunctionBody node) {
if (node.getStringLiteral() == oldNode) {
node.setStringLiteral((StringLiteral) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
public Boolean visitNode(AstNode node) {
throw new IllegalArgumentException("The old node is not a child of it's parent");
}
public Boolean visitNormalFormalParameter(NormalFormalParameter node) {
if (node.getDocumentationComment() == oldNode) {
node.setDocumentationComment((Comment) newNode);
return Boolean.TRUE;
} else if (node.getIdentifier() == oldNode) {
node.setIdentifier((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getMetadata())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitNullLiteral(NullLiteral node) {
return visitNode(node);
}
@Override
public Boolean visitParenthesizedExpression(ParenthesizedExpression node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitPartDirective(PartDirective node) {
return visitUriBasedDirective(node);
}
@Override
public Boolean visitPartOfDirective(PartOfDirective node) {
if (node.getLibraryName() == oldNode) {
node.setLibraryName((LibraryIdentifier) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitPostfixExpression(PostfixExpression node) {
if (node.getOperand() == oldNode) {
node.setOperand((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitPrefixedIdentifier(PrefixedIdentifier node) {
if (node.getPrefix() == oldNode) {
node.setPrefix((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getIdentifier() == oldNode) {
node.setIdentifier((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitPrefixExpression(PrefixExpression node) {
if (node.getOperand() == oldNode) {
node.setOperand((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitPropertyAccess(PropertyAccess node) {
if (node.getTarget() == oldNode) {
node.setTarget((Expression) newNode);
return Boolean.TRUE;
} else if (node.getPropertyName() == oldNode) {
node.setPropertyName((SimpleIdentifier) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
if (node.getConstructorName() == oldNode) {
node.setConstructorName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getArgumentList() == oldNode) {
node.setArgumentList((ArgumentList) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitRethrowExpression(RethrowExpression node) {
return visitNode(node);
}
@Override
public Boolean visitReturnStatement(ReturnStatement node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitScriptTag(ScriptTag scriptTag) {
return visitNode(scriptTag);
}
@Override
public Boolean visitShowCombinator(ShowCombinator node) {
if (replaceInList(node.getShownNames())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitSimpleFormalParameter(SimpleFormalParameter node) {
if (node.getType() == oldNode) {
node.setType((TypeName) newNode);
return Boolean.TRUE;
}
return visitNormalFormalParameter(node);
}
@Override
public Boolean visitSimpleIdentifier(SimpleIdentifier node) {
return visitNode(node);
}
@Override
public Boolean visitSimpleStringLiteral(SimpleStringLiteral node) {
return visitNode(node);
}
@Override
public Boolean visitStringInterpolation(StringInterpolation node) {
if (replaceInList(node.getElements())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitSuperConstructorInvocation(SuperConstructorInvocation node) {
if (node.getConstructorName() == oldNode) {
node.setConstructorName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getArgumentList() == oldNode) {
node.setArgumentList((ArgumentList) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitSuperExpression(SuperExpression node) {
return visitNode(node);
}
@Override
public Boolean visitSwitchCase(SwitchCase node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitSwitchMember(node);
}
@Override
public Boolean visitSwitchDefault(SwitchDefault node) {
return visitSwitchMember(node);
}
public Boolean visitSwitchMember(SwitchMember node) {
if (replaceInList(node.getLabels())) {
return Boolean.TRUE;
} else if (replaceInList(node.getStatements())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitSwitchStatement(SwitchStatement node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getMembers())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitSymbolLiteral(SymbolLiteral node) {
return visitNode(node);
}
@Override
public Boolean visitThisExpression(ThisExpression node) {
return visitNode(node);
}
@Override
public Boolean visitThrowExpression(ThrowExpression node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
if (node.getVariables() == oldNode) {
node.setVariables((VariableDeclarationList) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitTryStatement(TryStatement node) {
if (node.getBody() == oldNode) {
node.setBody((Block) newNode);
return Boolean.TRUE;
} else if (node.getFinallyBlock() == oldNode) {
node.setFinallyBlock((Block) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getCatchClauses())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitTypeArgumentList(TypeArgumentList node) {
if (replaceInList(node.getArguments())) {
return Boolean.TRUE;
}
return visitNode(node);
}
public Boolean visitTypedLiteral(TypedLiteral node) {
if (node.getTypeArguments() == oldNode) {
node.setTypeArguments((TypeArgumentList) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitTypeName(TypeName node) {
if (node.getName() == oldNode) {
node.setName((Identifier) newNode);
return Boolean.TRUE;
} else if (node.getTypeArguments() == oldNode) {
node.setTypeArguments((TypeArgumentList) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitTypeParameter(TypeParameter node) {
if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getBound() == oldNode) {
node.setBound((TypeName) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitTypeParameterList(TypeParameterList node) {
if (replaceInList(node.getTypeParameters())) {
return Boolean.TRUE;
}
return visitNode(node);
}
public Boolean visitUriBasedDirective(UriBasedDirective node) {
if (node.getUri() == oldNode) {
node.setUri((StringLiteral) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitVariableDeclaration(VariableDeclaration node) {
if (node.getName() == oldNode) {
node.setName((SimpleIdentifier) newNode);
return Boolean.TRUE;
} else if (node.getInitializer() == oldNode) {
node.setInitializer((Expression) newNode);
return Boolean.TRUE;
}
return visitAnnotatedNode(node);
}
@Override
public Boolean visitVariableDeclarationList(VariableDeclarationList node) {
if (node.getType() == oldNode) {
node.setType((TypeName) newNode);
return Boolean.TRUE;
} else if (replaceInList(node.getVariables())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitVariableDeclarationStatement(VariableDeclarationStatement node) {
if (node.getVariables() == oldNode) {
node.setVariables((VariableDeclarationList) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitWhileStatement(WhileStatement node) {
if (node.getCondition() == oldNode) {
node.setCondition((Expression) newNode);
return Boolean.TRUE;
} else if (node.getBody() == oldNode) {
node.setBody((Statement) newNode);
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitWithClause(WithClause node) {
if (replaceInList(node.getMixinTypes())) {
return Boolean.TRUE;
}
return visitNode(node);
}
@Override
public Boolean visitYieldStatement(YieldStatement node) {
if (node.getExpression() == oldNode) {
node.setExpression((Expression) newNode);
}
return visitNode(node);
}
@SuppressWarnings("unchecked")
private <E extends AstNode> boolean replaceInList(NodeList<E> list) {
int count = list.size();
for (int i = 0; i < count; i++) {
if (oldNode == list.get(i)) {
list.set(i, (E) newNode);
return true;
}
}
return false;
}
}