/* * Copyright (c) 2013, 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.parser; import com.google.dart.engine.ast.*; import com.google.dart.engine.scanner.Token; /** * Instances of the class {@code ResolutionCopier} copies resolution information from one AST * structure to another as long as the structures of the corresponding children of a pair of nodes * are the same. */ public class ResolutionCopier implements AstVisitor<Boolean> { /** * Copy resolution data from one node to another. * * @param fromNode the node from which resolution information will be copied * @param toNode the node to which resolution information will be copied */ public static void copyResolutionData(AstNode fromNode, AstNode toNode) { ResolutionCopier copier = new ResolutionCopier(); copier.isEqualNodes(fromNode, toNode); } /** * The AST node with which the node being visited is to be compared. This is only valid at the * beginning of each visit method (until {@link #isEqualNodes(AstNode, AstNode)} is invoked). */ private AstNode toNode; @Override public Boolean visitAdjacentStrings(AdjacentStrings node) { AdjacentStrings toNode = (AdjacentStrings) this.toNode; return isEqualNodeLists(node.getStrings(), toNode.getStrings()); } @Override public Boolean visitAnnotation(Annotation node) { Annotation toNode = (Annotation) this.toNode; if (isEqualTokens(node.getAtSign(), toNode.getAtSign()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getConstructorName(), toNode.getConstructorName()) & isEqualNodes(node.getArguments(), toNode.getArguments())) { toNode.setElement(node.getElement()); return true; } return false; } @Override public Boolean visitArgumentList(ArgumentList node) { ArgumentList toNode = (ArgumentList) this.toNode; return isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodeLists(node.getArguments(), toNode.getArguments()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()); } @Override public Boolean visitAsExpression(AsExpression node) { AsExpression toNode = (AsExpression) this.toNode; if (isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getAsOperator(), toNode.getAsOperator()) & isEqualNodes(node.getType(), toNode.getType())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitAssertStatement(AssertStatement node) { AssertStatement toNode = (AssertStatement) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getCondition(), toNode.getCondition()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitAssignmentExpression(AssignmentExpression node) { AssignmentExpression toNode = (AssignmentExpression) this.toNode; if (isEqualNodes(node.getLeftHandSide(), toNode.getLeftHandSide()) & isEqualTokens(node.getOperator(), toNode.getOperator()) & isEqualNodes(node.getRightHandSide(), toNode.getRightHandSide())) { toNode.setPropagatedElement(node.getPropagatedElement()); toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticElement(node.getStaticElement()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitAwaitExpression(AwaitExpression node) { AwaitExpression toNode = (AwaitExpression) this.toNode; return isEqualTokens(node.getAwaitKeyword(), toNode.getAwaitKeyword()) & isEqualNodes(node.getExpression(), toNode.getExpression()); } @Override public Boolean visitBinaryExpression(BinaryExpression node) { BinaryExpression toNode = (BinaryExpression) this.toNode; if (isEqualNodes(node.getLeftOperand(), toNode.getLeftOperand()) & isEqualTokens(node.getOperator(), toNode.getOperator()) & isEqualNodes(node.getRightOperand(), toNode.getRightOperand())) { toNode.setPropagatedElement(node.getPropagatedElement()); toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticElement(node.getStaticElement()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitBlock(Block node) { Block toNode = (Block) this.toNode; return isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodeLists(node.getStatements(), toNode.getStatements()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket()); } @Override public Boolean visitBlockFunctionBody(BlockFunctionBody node) { BlockFunctionBody toNode = (BlockFunctionBody) this.toNode; return isEqualNodes(node.getBlock(), toNode.getBlock()); } @Override public Boolean visitBooleanLiteral(BooleanLiteral node) { BooleanLiteral toNode = (BooleanLiteral) this.toNode; if (isEqualTokens(node.getLiteral(), toNode.getLiteral()) & node.getValue() == toNode.getValue()) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitBreakStatement(BreakStatement node) { BreakStatement toNode = (BreakStatement) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getLabel(), toNode.getLabel()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitCascadeExpression(CascadeExpression node) { CascadeExpression toNode = (CascadeExpression) this.toNode; if (isEqualNodes(node.getTarget(), toNode.getTarget()) & isEqualNodeLists(node.getCascadeSections(), toNode.getCascadeSections())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitCatchClause(CatchClause node) { CatchClause toNode = (CatchClause) this.toNode; return isEqualTokens(node.getOnKeyword(), toNode.getOnKeyword()) & isEqualNodes(node.getExceptionType(), toNode.getExceptionType()) & isEqualTokens(node.getCatchKeyword(), toNode.getCatchKeyword()) & isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getExceptionParameter(), toNode.getExceptionParameter()) & isEqualTokens(node.getComma(), toNode.getComma()) & isEqualNodes(node.getStackTraceParameter(), toNode.getStackTraceParameter()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()) & isEqualNodes(node.getBody(), toNode.getBody()); } @Override public Boolean visitClassDeclaration(ClassDeclaration node) { ClassDeclaration toNode = (ClassDeclaration) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getAbstractKeyword(), toNode.getAbstractKeyword()) & isEqualTokens(node.getClassKeyword(), toNode.getClassKeyword()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualNodes(node.getTypeParameters(), toNode.getTypeParameters()) & isEqualNodes(node.getExtendsClause(), toNode.getExtendsClause()) & isEqualNodes(node.getWithClause(), toNode.getWithClause()) & isEqualNodes(node.getImplementsClause(), toNode.getImplementsClause()) & isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodeLists(node.getMembers(), toNode.getMembers()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket()); } @Override public Boolean visitClassTypeAlias(ClassTypeAlias node) { ClassTypeAlias toNode = (ClassTypeAlias) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualNodes(node.getTypeParameters(), toNode.getTypeParameters()) & isEqualTokens(node.getEquals(), toNode.getEquals()) & isEqualTokens(node.getAbstractKeyword(), toNode.getAbstractKeyword()) & isEqualNodes(node.getSuperclass(), toNode.getSuperclass()) & isEqualNodes(node.getWithClause(), toNode.getWithClause()) & isEqualNodes(node.getImplementsClause(), toNode.getImplementsClause()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitComment(Comment node) { Comment toNode = (Comment) this.toNode; return isEqualNodeLists(node.getReferences(), toNode.getReferences()); } @Override public Boolean visitCommentReference(CommentReference node) { CommentReference toNode = (CommentReference) this.toNode; return isEqualTokens(node.getNewKeyword(), toNode.getNewKeyword()) & isEqualNodes(node.getIdentifier(), toNode.getIdentifier()); } @Override public Boolean visitCompilationUnit(CompilationUnit node) { CompilationUnit toNode = (CompilationUnit) this.toNode; if (isEqualTokens(node.getBeginToken(), toNode.getBeginToken()) & isEqualNodes(node.getScriptTag(), toNode.getScriptTag()) & isEqualNodeLists(node.getDirectives(), toNode.getDirectives()) & isEqualNodeLists(node.getDeclarations(), toNode.getDeclarations()) & isEqualTokens(node.getEndToken(), toNode.getEndToken())) { toNode.setElement(node.getElement()); return true; } return false; } @Override public Boolean visitConditionalExpression(ConditionalExpression node) { ConditionalExpression toNode = (ConditionalExpression) this.toNode; if (isEqualNodes(node.getCondition(), toNode.getCondition()) & isEqualTokens(node.getQuestion(), toNode.getQuestion()) & isEqualNodes(node.getThenExpression(), toNode.getThenExpression()) & isEqualTokens(node.getColon(), toNode.getColon()) & isEqualNodes(node.getElseExpression(), toNode.getElseExpression())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitConstructorDeclaration(ConstructorDeclaration node) { ConstructorDeclaration toNode = (ConstructorDeclaration) this.toNode; if (isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getExternalKeyword(), toNode.getExternalKeyword()) & isEqualTokens(node.getConstKeyword(), toNode.getConstKeyword()) & isEqualTokens(node.getFactoryKeyword(), toNode.getFactoryKeyword()) & isEqualNodes(node.getReturnType(), toNode.getReturnType()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualNodes(node.getParameters(), toNode.getParameters()) & isEqualTokens(node.getSeparator(), toNode.getSeparator()) & isEqualNodeLists(node.getInitializers(), toNode.getInitializers()) & isEqualNodes(node.getRedirectedConstructor(), toNode.getRedirectedConstructor()) & isEqualNodes(node.getBody(), toNode.getBody())) { toNode.setElement(node.getElement()); return true; } return false; } @Override public Boolean visitConstructorFieldInitializer(ConstructorFieldInitializer node) { ConstructorFieldInitializer toNode = (ConstructorFieldInitializer) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getFieldName(), toNode.getFieldName()) & isEqualTokens(node.getEquals(), toNode.getEquals()) & isEqualNodes(node.getExpression(), toNode.getExpression()); } @Override public Boolean visitConstructorName(ConstructorName node) { ConstructorName toNode = (ConstructorName) this.toNode; if (isEqualNodes(node.getType(), toNode.getType()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getName(), toNode.getName())) { toNode.setStaticElement(node.getStaticElement()); return true; } return false; } @Override public Boolean visitContinueStatement(ContinueStatement node) { ContinueStatement toNode = (ContinueStatement) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getLabel(), toNode.getLabel()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitDeclaredIdentifier(DeclaredIdentifier node) { DeclaredIdentifier toNode = (DeclaredIdentifier) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getType(), toNode.getType()) & isEqualNodes(node.getIdentifier(), toNode.getIdentifier()); } @Override public Boolean visitDefaultFormalParameter(DefaultFormalParameter node) { DefaultFormalParameter toNode = (DefaultFormalParameter) this.toNode; return isEqualNodes(node.getParameter(), toNode.getParameter()) & node.getKind() == toNode.getKind() & isEqualTokens(node.getSeparator(), toNode.getSeparator()) & isEqualNodes(node.getDefaultValue(), toNode.getDefaultValue()); } @Override public Boolean visitDoStatement(DoStatement node) { DoStatement toNode = (DoStatement) this.toNode; return isEqualTokens(node.getDoKeyword(), toNode.getDoKeyword()) & isEqualNodes(node.getBody(), toNode.getBody()) & isEqualTokens(node.getWhileKeyword(), toNode.getWhileKeyword()) & isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getCondition(), toNode.getCondition()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitDoubleLiteral(DoubleLiteral node) { DoubleLiteral toNode = (DoubleLiteral) this.toNode; if (isEqualTokens(node.getLiteral(), toNode.getLiteral()) & node.getValue() == toNode.getValue()) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitEmptyFunctionBody(EmptyFunctionBody node) { EmptyFunctionBody toNode = (EmptyFunctionBody) this.toNode; return isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitEmptyStatement(EmptyStatement node) { EmptyStatement toNode = (EmptyStatement) this.toNode; return isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitEnumConstantDeclaration(EnumConstantDeclaration node) { EnumConstantDeclaration toNode = (EnumConstantDeclaration) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualNodes(node.getName(), toNode.getName()); } @Override public Boolean visitEnumDeclaration(EnumDeclaration node) { EnumDeclaration toNode = (EnumDeclaration) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodeLists(node.getConstants(), toNode.getConstants()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket()); } @Override public Boolean visitExportDirective(ExportDirective node) { ExportDirective toNode = (ExportDirective) this.toNode; if (isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getUri(), toNode.getUri()) & isEqualNodeLists(node.getCombinators(), toNode.getCombinators()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon())) { toNode.setElement(node.getElement()); return true; } return false; } @Override public Boolean visitExpressionFunctionBody(ExpressionFunctionBody node) { ExpressionFunctionBody toNode = (ExpressionFunctionBody) this.toNode; return isEqualTokens(node.getFunctionDefinition(), toNode.getFunctionDefinition()) & isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitExpressionStatement(ExpressionStatement node) { ExpressionStatement toNode = (ExpressionStatement) this.toNode; return isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitExtendsClause(ExtendsClause node) { ExtendsClause toNode = (ExtendsClause) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getSuperclass(), toNode.getSuperclass()); } @Override public Boolean visitFieldDeclaration(FieldDeclaration node) { FieldDeclaration toNode = (FieldDeclaration) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getStaticKeyword(), toNode.getStaticKeyword()) & isEqualNodes(node.getFields(), toNode.getFields()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitFieldFormalParameter(FieldFormalParameter node) { FieldFormalParameter toNode = (FieldFormalParameter) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getType(), toNode.getType()) & isEqualTokens(node.getThisToken(), toNode.getThisToken()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getIdentifier(), toNode.getIdentifier()); } @Override public Boolean visitForEachStatement(ForEachStatement node) { ForEachStatement toNode = (ForEachStatement) this.toNode; return isEqualTokens(node.getForKeyword(), toNode.getForKeyword()) & isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getLoopVariable(), toNode.getLoopVariable()) & isEqualTokens(node.getInKeyword(), toNode.getInKeyword()) & isEqualNodes(node.getIterator(), toNode.getIterator()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()) & isEqualNodes(node.getBody(), toNode.getBody()); } @Override public Boolean visitFormalParameterList(FormalParameterList node) { FormalParameterList toNode = (FormalParameterList) this.toNode; return isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodeLists(node.getParameters(), toNode.getParameters()) & isEqualTokens(node.getLeftDelimiter(), toNode.getLeftDelimiter()) & isEqualTokens(node.getRightDelimiter(), toNode.getRightDelimiter()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()); } @Override public Boolean visitForStatement(ForStatement node) { ForStatement toNode = (ForStatement) this.toNode; return isEqualTokens(node.getForKeyword(), toNode.getForKeyword()) & isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getVariables(), toNode.getVariables()) & isEqualNodes(node.getInitialization(), toNode.getInitialization()) & isEqualTokens(node.getLeftSeparator(), toNode.getLeftSeparator()) & isEqualNodes(node.getCondition(), toNode.getCondition()) & isEqualTokens(node.getRightSeparator(), toNode.getRightSeparator()) & isEqualNodeLists(node.getUpdaters(), toNode.getUpdaters()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()) & isEqualNodes(node.getBody(), toNode.getBody()); } @Override public Boolean visitFunctionDeclaration(FunctionDeclaration node) { FunctionDeclaration toNode = (FunctionDeclaration) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getExternalKeyword(), toNode.getExternalKeyword()) & isEqualNodes(node.getReturnType(), toNode.getReturnType()) & isEqualTokens(node.getPropertyKeyword(), toNode.getPropertyKeyword()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualNodes(node.getFunctionExpression(), toNode.getFunctionExpression()); } @Override public Boolean visitFunctionDeclarationStatement(FunctionDeclarationStatement node) { FunctionDeclarationStatement toNode = (FunctionDeclarationStatement) this.toNode; return isEqualNodes(node.getFunctionDeclaration(), toNode.getFunctionDeclaration()); } @Override public Boolean visitFunctionExpression(FunctionExpression node) { FunctionExpression toNode = (FunctionExpression) this.toNode; if (isEqualNodes(node.getParameters(), toNode.getParameters()) & isEqualNodes(node.getBody(), toNode.getBody())) { toNode.setElement(node.getElement()); toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { FunctionExpressionInvocation toNode = (FunctionExpressionInvocation) this.toNode; if (isEqualNodes(node.getFunction(), toNode.getFunction()) & isEqualNodes(node.getArgumentList(), toNode.getArgumentList())) { toNode.setPropagatedElement(node.getPropagatedElement()); toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticElement(node.getStaticElement()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitFunctionTypeAlias(FunctionTypeAlias node) { FunctionTypeAlias toNode = (FunctionTypeAlias) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getReturnType(), toNode.getReturnType()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualNodes(node.getTypeParameters(), toNode.getTypeParameters()) & isEqualNodes(node.getParameters(), toNode.getParameters()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { FunctionTypedFormalParameter toNode = (FunctionTypedFormalParameter) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualNodes(node.getReturnType(), toNode.getReturnType()) & isEqualNodes(node.getIdentifier(), toNode.getIdentifier()) & isEqualNodes(node.getParameters(), toNode.getParameters()); } @Override public Boolean visitHideCombinator(HideCombinator node) { HideCombinator toNode = (HideCombinator) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodeLists(node.getHiddenNames(), toNode.getHiddenNames()); } @Override public Boolean visitIfStatement(IfStatement node) { IfStatement toNode = (IfStatement) this.toNode; return isEqualTokens(node.getIfKeyword(), toNode.getIfKeyword()) & isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getCondition(), toNode.getCondition()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()) & isEqualNodes(node.getThenStatement(), toNode.getThenStatement()) & isEqualTokens(node.getElseKeyword(), toNode.getElseKeyword()) & isEqualNodes(node.getElseStatement(), toNode.getElseStatement()); } @Override public Boolean visitImplementsClause(ImplementsClause node) { ImplementsClause toNode = (ImplementsClause) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodeLists(node.getInterfaces(), toNode.getInterfaces()); } @Override public Boolean visitImportDirective(ImportDirective node) { ImportDirective toNode = (ImportDirective) this.toNode; if (isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getUri(), toNode.getUri()) & isEqualTokens(node.getAsToken(), toNode.getAsToken()) & isEqualNodes(node.getPrefix(), toNode.getPrefix()) & isEqualNodeLists(node.getCombinators(), toNode.getCombinators()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon())) { toNode.setElement(node.getElement()); return true; } return false; } @Override public Boolean visitIndexExpression(IndexExpression node) { IndexExpression toNode = (IndexExpression) this.toNode; if (isEqualNodes(node.getTarget(), toNode.getTarget()) & isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodes(node.getIndex(), toNode.getIndex()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket())) { toNode.setAuxiliaryElements(node.getAuxiliaryElements()); toNode.setPropagatedElement(node.getPropagatedElement()); toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticElement(node.getStaticElement()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitInstanceCreationExpression(InstanceCreationExpression node) { InstanceCreationExpression toNode = (InstanceCreationExpression) this.toNode; if (isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getConstructorName(), toNode.getConstructorName()) & isEqualNodes(node.getArgumentList(), toNode.getArgumentList())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticElement(node.getStaticElement()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitIntegerLiteral(IntegerLiteral node) { IntegerLiteral toNode = (IntegerLiteral) this.toNode; if (isEqualTokens(node.getLiteral(), toNode.getLiteral()) & node.getValue() == toNode.getValue()) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitInterpolationExpression(InterpolationExpression node) { InterpolationExpression toNode = (InterpolationExpression) this.toNode; return isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket()); } @Override public Boolean visitInterpolationString(InterpolationString node) { InterpolationString toNode = (InterpolationString) this.toNode; return isEqualTokens(node.getContents(), toNode.getContents()) & node.getValue().equals(toNode.getValue()); } @Override public Boolean visitIsExpression(IsExpression node) { IsExpression toNode = (IsExpression) this.toNode; if (isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getIsOperator(), toNode.getIsOperator()) & isEqualTokens(node.getNotOperator(), toNode.getNotOperator()) & isEqualNodes(node.getType(), toNode.getType())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitLabel(Label node) { Label toNode = (Label) this.toNode; return isEqualNodes(node.getLabel(), toNode.getLabel()) & isEqualTokens(node.getColon(), toNode.getColon()); } @Override public Boolean visitLabeledStatement(LabeledStatement node) { LabeledStatement toNode = (LabeledStatement) this.toNode; return isEqualNodeLists(node.getLabels(), toNode.getLabels()) & isEqualNodes(node.getStatement(), toNode.getStatement()); } @Override public Boolean visitLibraryDirective(LibraryDirective node) { LibraryDirective toNode = (LibraryDirective) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getLibraryToken(), toNode.getLibraryToken()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitLibraryIdentifier(LibraryIdentifier node) { LibraryIdentifier toNode = (LibraryIdentifier) this.toNode; if (isEqualNodeLists(node.getComponents(), toNode.getComponents())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitListLiteral(ListLiteral node) { ListLiteral toNode = (ListLiteral) this.toNode; if (isEqualTokens(node.getConstKeyword(), toNode.getConstKeyword()) & isEqualNodes(node.getTypeArguments(), toNode.getTypeArguments()) & isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodeLists(node.getElements(), toNode.getElements()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitMapLiteral(MapLiteral node) { MapLiteral toNode = (MapLiteral) this.toNode; if (isEqualTokens(node.getConstKeyword(), toNode.getConstKeyword()) & isEqualNodes(node.getTypeArguments(), toNode.getTypeArguments()) & isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodeLists(node.getEntries(), toNode.getEntries()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitMapLiteralEntry(MapLiteralEntry node) { MapLiteralEntry toNode = (MapLiteralEntry) this.toNode; return isEqualNodes(node.getKey(), toNode.getKey()) & isEqualTokens(node.getSeparator(), toNode.getSeparator()) & isEqualNodes(node.getValue(), toNode.getValue()); } @Override public Boolean visitMethodDeclaration(MethodDeclaration node) { MethodDeclaration toNode = (MethodDeclaration) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getExternalKeyword(), toNode.getExternalKeyword()) & isEqualTokens(node.getModifierKeyword(), toNode.getModifierKeyword()) & isEqualNodes(node.getReturnType(), toNode.getReturnType()) & isEqualTokens(node.getPropertyKeyword(), toNode.getPropertyKeyword()) & isEqualTokens(node.getPropertyKeyword(), toNode.getPropertyKeyword()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualNodes(node.getParameters(), toNode.getParameters()) & isEqualNodes(node.getBody(), toNode.getBody()); } @Override public Boolean visitMethodInvocation(MethodInvocation node) { MethodInvocation toNode = (MethodInvocation) this.toNode; if (isEqualNodes(node.getTarget(), toNode.getTarget()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getMethodName(), toNode.getMethodName()) & isEqualNodes(node.getArgumentList(), toNode.getArgumentList())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitNamedExpression(NamedExpression node) { NamedExpression toNode = (NamedExpression) this.toNode; if (isEqualNodes(node.getName(), toNode.getName()) & isEqualNodes(node.getExpression(), toNode.getExpression())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitNativeClause(NativeClause node) { NativeClause toNode = (NativeClause) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getName(), toNode.getName()); } @Override public Boolean visitNativeFunctionBody(NativeFunctionBody node) { NativeFunctionBody toNode = (NativeFunctionBody) this.toNode; return isEqualTokens(node.getNativeToken(), toNode.getNativeToken()) & isEqualNodes(node.getStringLiteral(), toNode.getStringLiteral()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitNullLiteral(NullLiteral node) { NullLiteral toNode = (NullLiteral) this.toNode; if (isEqualTokens(node.getLiteral(), toNode.getLiteral())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitParenthesizedExpression(ParenthesizedExpression node) { ParenthesizedExpression toNode = (ParenthesizedExpression) this.toNode; if (isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitPartDirective(PartDirective node) { PartDirective toNode = (PartDirective) this.toNode; if (isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getPartToken(), toNode.getPartToken()) & isEqualNodes(node.getUri(), toNode.getUri()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon())) { toNode.setElement(node.getElement()); return true; } return false; } @Override public Boolean visitPartOfDirective(PartOfDirective node) { PartOfDirective toNode = (PartOfDirective) this.toNode; if (isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getPartToken(), toNode.getPartToken()) & isEqualTokens(node.getOfToken(), toNode.getOfToken()) & isEqualNodes(node.getLibraryName(), toNode.getLibraryName()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon())) { toNode.setElement(node.getElement()); return true; } return false; } @Override public Boolean visitPostfixExpression(PostfixExpression node) { PostfixExpression toNode = (PostfixExpression) this.toNode; if (isEqualNodes(node.getOperand(), toNode.getOperand()) & isEqualTokens(node.getOperator(), toNode.getOperator())) { toNode.setPropagatedElement(node.getPropagatedElement()); toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticElement(node.getStaticElement()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitPrefixedIdentifier(PrefixedIdentifier node) { PrefixedIdentifier toNode = (PrefixedIdentifier) this.toNode; if (isEqualNodes(node.getPrefix(), toNode.getPrefix()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getIdentifier(), toNode.getIdentifier())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitPrefixExpression(PrefixExpression node) { PrefixExpression toNode = (PrefixExpression) this.toNode; if (isEqualTokens(node.getOperator(), toNode.getOperator()) & isEqualNodes(node.getOperand(), toNode.getOperand())) { toNode.setPropagatedElement(node.getPropagatedElement()); toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticElement(node.getStaticElement()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitPropertyAccess(PropertyAccess node) { PropertyAccess toNode = (PropertyAccess) this.toNode; if (isEqualNodes(node.getTarget(), toNode.getTarget()) & isEqualTokens(node.getOperator(), toNode.getOperator()) & isEqualNodes(node.getPropertyName(), toNode.getPropertyName())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) { RedirectingConstructorInvocation toNode = (RedirectingConstructorInvocation) this.toNode; if (isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getConstructorName(), toNode.getConstructorName()) & isEqualNodes(node.getArgumentList(), toNode.getArgumentList())) { toNode.setStaticElement(node.getStaticElement()); return true; } return false; } @Override public Boolean visitRethrowExpression(RethrowExpression node) { RethrowExpression toNode = (RethrowExpression) this.toNode; if (isEqualTokens(node.getKeyword(), toNode.getKeyword())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitReturnStatement(ReturnStatement node) { ReturnStatement toNode = (ReturnStatement) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitScriptTag(ScriptTag node) { ScriptTag toNode = (ScriptTag) this.toNode; return isEqualTokens(node.getScriptTag(), toNode.getScriptTag()); } @Override public Boolean visitShowCombinator(ShowCombinator node) { ShowCombinator toNode = (ShowCombinator) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodeLists(node.getShownNames(), toNode.getShownNames()); } @Override public Boolean visitSimpleFormalParameter(SimpleFormalParameter node) { SimpleFormalParameter toNode = (SimpleFormalParameter) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getType(), toNode.getType()) & isEqualNodes(node.getIdentifier(), toNode.getIdentifier()); } @Override public Boolean visitSimpleIdentifier(SimpleIdentifier node) { SimpleIdentifier toNode = (SimpleIdentifier) this.toNode; if (isEqualTokens(node.getToken(), toNode.getToken())) { toNode.setStaticElement(node.getStaticElement()); toNode.setStaticType(node.getStaticType()); toNode.setPropagatedElement(node.getPropagatedElement()); toNode.setPropagatedType(node.getPropagatedType()); toNode.setAuxiliaryElements(node.getAuxiliaryElements()); return true; } return false; } @Override public Boolean visitSimpleStringLiteral(SimpleStringLiteral node) { SimpleStringLiteral toNode = (SimpleStringLiteral) this.toNode; if (isEqualTokens(node.getLiteral(), toNode.getLiteral()) & node.getValue() == toNode.getValue()) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitStringInterpolation(StringInterpolation node) { StringInterpolation toNode = (StringInterpolation) this.toNode; if (isEqualNodeLists(node.getElements(), toNode.getElements())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitSuperConstructorInvocation(SuperConstructorInvocation node) { SuperConstructorInvocation toNode = (SuperConstructorInvocation) this.toNode; if (isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualTokens(node.getPeriod(), toNode.getPeriod()) & isEqualNodes(node.getConstructorName(), toNode.getConstructorName()) & isEqualNodes(node.getArgumentList(), toNode.getArgumentList())) { toNode.setStaticElement(node.getStaticElement()); return true; } return false; } @Override public Boolean visitSuperExpression(SuperExpression node) { SuperExpression toNode = (SuperExpression) this.toNode; if (isEqualTokens(node.getKeyword(), toNode.getKeyword())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitSwitchCase(SwitchCase node) { SwitchCase toNode = (SwitchCase) this.toNode; return isEqualNodeLists(node.getLabels(), toNode.getLabels()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getColon(), toNode.getColon()) & isEqualNodeLists(node.getStatements(), toNode.getStatements()); } @Override public Boolean visitSwitchDefault(SwitchDefault node) { SwitchDefault toNode = (SwitchDefault) this.toNode; return isEqualNodeLists(node.getLabels(), toNode.getLabels()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualTokens(node.getColon(), toNode.getColon()) & isEqualNodeLists(node.getStatements(), toNode.getStatements()); } @Override public Boolean visitSwitchStatement(SwitchStatement node) { SwitchStatement toNode = (SwitchStatement) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()) & isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodeLists(node.getMembers(), toNode.getMembers()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket()); } @Override public Boolean visitSymbolLiteral(SymbolLiteral node) { SymbolLiteral toNode = (SymbolLiteral) this.toNode; if (isEqualTokens(node.getPoundSign(), toNode.getPoundSign()) & isEqualTokenLists(node.getComponents(), toNode.getComponents())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitThisExpression(ThisExpression node) { ThisExpression toNode = (ThisExpression) this.toNode; if (isEqualTokens(node.getKeyword(), toNode.getKeyword())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitThrowExpression(ThrowExpression node) { ThrowExpression toNode = (ThrowExpression) this.toNode; if (isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getExpression(), toNode.getExpression())) { toNode.setPropagatedType(node.getPropagatedType()); toNode.setStaticType(node.getStaticType()); return true; } return false; } @Override public Boolean visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { TopLevelVariableDeclaration toNode = (TopLevelVariableDeclaration) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualNodes(node.getVariables(), toNode.getVariables()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitTryStatement(TryStatement node) { TryStatement toNode = (TryStatement) this.toNode; return isEqualTokens(node.getTryKeyword(), toNode.getTryKeyword()) & isEqualNodes(node.getBody(), toNode.getBody()) & isEqualNodeLists(node.getCatchClauses(), toNode.getCatchClauses()) & isEqualTokens(node.getFinallyKeyword(), toNode.getFinallyKeyword()) & isEqualNodes(node.getFinallyBlock(), toNode.getFinallyBlock()); } @Override public Boolean visitTypeArgumentList(TypeArgumentList node) { TypeArgumentList toNode = (TypeArgumentList) this.toNode; return isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodeLists(node.getArguments(), toNode.getArguments()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket()); } @Override public Boolean visitTypeName(TypeName node) { TypeName toNode = (TypeName) this.toNode; if (isEqualNodes(node.getName(), toNode.getName()) & isEqualNodes(node.getTypeArguments(), toNode.getTypeArguments())) { toNode.setType(node.getType()); return true; } return false; } @Override public Boolean visitTypeParameter(TypeParameter node) { TypeParameter toNode = (TypeParameter) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getBound(), toNode.getBound()); } @Override public Boolean visitTypeParameterList(TypeParameterList node) { TypeParameterList toNode = (TypeParameterList) this.toNode; return isEqualTokens(node.getLeftBracket(), toNode.getLeftBracket()) & isEqualNodeLists(node.getTypeParameters(), toNode.getTypeParameters()) & isEqualTokens(node.getRightBracket(), toNode.getRightBracket()); } @Override public Boolean visitVariableDeclaration(VariableDeclaration node) { VariableDeclaration toNode = (VariableDeclaration) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualNodes(node.getName(), toNode.getName()) & isEqualTokens(node.getEquals(), toNode.getEquals()) & isEqualNodes(node.getInitializer(), toNode.getInitializer()); } @Override public Boolean visitVariableDeclarationList(VariableDeclarationList node) { VariableDeclarationList toNode = (VariableDeclarationList) this.toNode; return isEqualNodes(node.getDocumentationComment(), toNode.getDocumentationComment()) & isEqualNodeLists(node.getMetadata(), toNode.getMetadata()) & isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualNodes(node.getType(), toNode.getType()) & isEqualNodeLists(node.getVariables(), toNode.getVariables()); } @Override public Boolean visitVariableDeclarationStatement(VariableDeclarationStatement node) { VariableDeclarationStatement toNode = (VariableDeclarationStatement) this.toNode; return isEqualNodes(node.getVariables(), toNode.getVariables()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } @Override public Boolean visitWhileStatement(WhileStatement node) { WhileStatement toNode = (WhileStatement) this.toNode; return isEqualTokens(node.getKeyword(), toNode.getKeyword()) & isEqualTokens(node.getLeftParenthesis(), toNode.getLeftParenthesis()) & isEqualNodes(node.getCondition(), toNode.getCondition()) & isEqualTokens(node.getRightParenthesis(), toNode.getRightParenthesis()) & isEqualNodes(node.getBody(), toNode.getBody()); } @Override public Boolean visitWithClause(WithClause node) { WithClause toNode = (WithClause) this.toNode; return isEqualTokens(node.getWithKeyword(), toNode.getWithKeyword()) & isEqualNodeLists(node.getMixinTypes(), toNode.getMixinTypes()); } @Override public Boolean visitYieldStatement(YieldStatement node) { YieldStatement toNode = (YieldStatement) this.toNode; return isEqualTokens(node.getYieldKeyword(), toNode.getYieldKeyword()) & isEqualNodes(node.getExpression(), toNode.getExpression()) & isEqualTokens(node.getSemicolon(), toNode.getSemicolon()); } /** * Return {@code true} if the given lists of AST nodes have the same size and corresponding * elements are equal. * * @param first the first node being compared * @param second the second node being compared * @return {@code true} if the given AST nodes have the same size and corresponding elements are * equal */ private <E extends AstNode> boolean isEqualNodeLists(NodeList<E> first, NodeList<E> second) { if (first == null) { return second == null; } else if (second == null) { return false; } int size = first.size(); if (second.size() != size) { return false; } boolean equal = true; for (int i = 0; i < size; i++) { if (!isEqualNodes(first.get(i), second.get(i))) { equal = false; } } return equal; } /** * Return {@code true} if the given AST nodes have the same structure. As a side-effect, if the * nodes do have the same structure, any resolution data from the first node will be copied to the * second node. * * @param fromNode the node from which resolution information will be copied * @param toNode the node to which resolution information will be copied * @return {@code true} if the given AST nodes have the same structure */ private boolean isEqualNodes(AstNode fromNode, AstNode toNode) { if (fromNode == null) { return toNode == null; } else if (toNode == null) { return false; } else if (fromNode.getClass() == toNode.getClass()) { this.toNode = toNode; return fromNode.accept(this); } // // Check for a simple transformation caused by entering a period. // if (toNode instanceof PrefixedIdentifier) { SimpleIdentifier prefix = ((PrefixedIdentifier) toNode).getPrefix(); if (fromNode.getClass() == prefix.getClass()) { this.toNode = prefix; return fromNode.accept(this); } } else if (toNode instanceof PropertyAccess) { Expression target = ((PropertyAccess) toNode).getTarget(); if (fromNode.getClass() == target.getClass()) { this.toNode = target; return fromNode.accept(this); } } return false; } /** * Return {@code true} if the given arrays of tokens have the same length and corresponding * elements are equal. * * @param first the first node being compared * @param second the second node being compared * @return {@code true} if the given arrays of tokens have the same length and corresponding * elements are equal */ private boolean isEqualTokenLists(Token[] first, Token[] second) { int length = first.length; if (second.length != length) { return false; } for (int i = 0; i < length; i++) { if (!isEqualTokens(first[i], second[i])) { return false; } } return true; } /** * Return {@code true} if the given tokens have the same structure. * * @param first the first node being compared * @param second the second node being compared * @return {@code true} if the given tokens have the same structure */ private boolean isEqualTokens(Token first, Token second) { if (first == null) { return second == null; } else if (second == null) { return false; } return first.getLexeme().equals(second.getLexeme()); } }