Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Unified Diff: pkg/analyzer/lib/src/dart/ast/utilities.dart

Issue 1791953002: Move ResolutionCopier out of generated (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/generated/parser.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/dart/ast/utilities.dart
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index dbbba10e254634455b8b9bb60781b911c3a2f14b..d8cb6ca6e77678ce1e0643c8c9bf23016607344a 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -5028,6 +5028,1426 @@ class NodeReplacer implements AstVisitor<bool> {
}
/**
+ * An object that 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.
+ */
+class ResolutionCopier implements AstVisitor<bool> {
+ /**
+ * 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 [isEqualNodes] is
+ * invoked).
+ */
+ AstNode _toNode;
+
+ @override
+ bool visitAdjacentStrings(AdjacentStrings node) {
+ AdjacentStrings toNode = this._toNode as AdjacentStrings;
+ if (_isEqualNodeLists(node.strings, toNode.strings)) {
+ toNode.staticType = node.staticType;
+ toNode.propagatedType = node.propagatedType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitAnnotation(Annotation node) {
+ Annotation toNode = this._toNode as Annotation;
+ if (_and(
+ _isEqualTokens(node.atSign, toNode.atSign),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualTokens(node.period, toNode.period),
+ _isEqualNodes(node.constructorName, toNode.constructorName),
+ _isEqualNodes(node.arguments, toNode.arguments))) {
+ toNode.element = node.element;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitArgumentList(ArgumentList node) {
+ ArgumentList toNode = this._toNode as ArgumentList;
+ return _and(
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodeLists(node.arguments, toNode.arguments),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+ }
+
+ @override
+ bool visitAsExpression(AsExpression node) {
+ AsExpression toNode = this._toNode as AsExpression;
+ if (_and(
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.asOperator, toNode.asOperator),
+ _isEqualNodes(node.type, toNode.type))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitAssertStatement(AssertStatement node) {
+ AssertStatement toNode = this._toNode as AssertStatement;
+ return _and(
+ _isEqualTokens(node.assertKeyword, toNode.assertKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.condition, toNode.condition),
+ _isEqualTokens(node.comma, toNode.comma),
+ _isEqualNodes(node.message, toNode.message),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitAssignmentExpression(AssignmentExpression node) {
+ AssignmentExpression toNode = this._toNode as AssignmentExpression;
+ if (_and(
+ _isEqualNodes(node.leftHandSide, toNode.leftHandSide),
+ _isEqualTokens(node.operator, toNode.operator),
+ _isEqualNodes(node.rightHandSide, toNode.rightHandSide))) {
+ toNode.propagatedElement = node.propagatedElement;
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticElement = node.staticElement;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitAwaitExpression(AwaitExpression node) {
+ AwaitExpression toNode = this._toNode as AwaitExpression;
+ if (_and(_isEqualTokens(node.awaitKeyword, toNode.awaitKeyword),
+ _isEqualNodes(node.expression, toNode.expression))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitBinaryExpression(BinaryExpression node) {
+ BinaryExpression toNode = this._toNode as BinaryExpression;
+ if (_and(
+ _isEqualNodes(node.leftOperand, toNode.leftOperand),
+ _isEqualTokens(node.operator, toNode.operator),
+ _isEqualNodes(node.rightOperand, toNode.rightOperand))) {
+ toNode.propagatedElement = node.propagatedElement;
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticElement = node.staticElement;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitBlock(Block node) {
+ Block toNode = this._toNode as Block;
+ return _and(
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodeLists(node.statements, toNode.statements),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket));
+ }
+
+ @override
+ bool visitBlockFunctionBody(BlockFunctionBody node) {
+ BlockFunctionBody toNode = this._toNode as BlockFunctionBody;
+ return _isEqualNodes(node.block, toNode.block);
+ }
+
+ @override
+ bool visitBooleanLiteral(BooleanLiteral node) {
+ BooleanLiteral toNode = this._toNode as BooleanLiteral;
+ if (_and(_isEqualTokens(node.literal, toNode.literal),
+ node.value == toNode.value)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitBreakStatement(BreakStatement node) {
+ BreakStatement toNode = this._toNode as BreakStatement;
+ if (_and(
+ _isEqualTokens(node.breakKeyword, toNode.breakKeyword),
+ _isEqualNodes(node.label, toNode.label),
+ _isEqualTokens(node.semicolon, toNode.semicolon))) {
+ // TODO(paulberry): map node.target to toNode.target.
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitCascadeExpression(CascadeExpression node) {
+ CascadeExpression toNode = this._toNode as CascadeExpression;
+ if (_and(_isEqualNodes(node.target, toNode.target),
+ _isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitCatchClause(CatchClause node) {
+ CatchClause toNode = this._toNode as CatchClause;
+ return _and(
+ _isEqualTokens(node.onKeyword, toNode.onKeyword),
+ _isEqualNodes(node.exceptionType, toNode.exceptionType),
+ _isEqualTokens(node.catchKeyword, toNode.catchKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.exceptionParameter, toNode.exceptionParameter),
+ _isEqualTokens(node.comma, toNode.comma),
+ _isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualNodes(node.body, toNode.body));
+ }
+
+ @override
+ bool visitClassDeclaration(ClassDeclaration node) {
+ ClassDeclaration toNode = this._toNode as ClassDeclaration;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
+ _isEqualTokens(node.classKeyword, toNode.classKeyword),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualNodes(node.typeParameters, toNode.typeParameters),
+ _isEqualNodes(node.extendsClause, toNode.extendsClause),
+ _isEqualNodes(node.withClause, toNode.withClause),
+ _isEqualNodes(node.implementsClause, toNode.implementsClause),
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodeLists(node.members, toNode.members),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket));
+ }
+
+ @override
+ bool visitClassTypeAlias(ClassTypeAlias node) {
+ ClassTypeAlias toNode = this._toNode as ClassTypeAlias;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.typedefKeyword, toNode.typedefKeyword),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualNodes(node.typeParameters, toNode.typeParameters),
+ _isEqualTokens(node.equals, toNode.equals),
+ _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
+ _isEqualNodes(node.superclass, toNode.superclass),
+ _isEqualNodes(node.withClause, toNode.withClause),
+ _isEqualNodes(node.implementsClause, toNode.implementsClause),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitComment(Comment node) {
+ Comment toNode = this._toNode as Comment;
+ return _isEqualNodeLists(node.references, toNode.references);
+ }
+
+ @override
+ bool visitCommentReference(CommentReference node) {
+ CommentReference toNode = this._toNode as CommentReference;
+ return _and(_isEqualTokens(node.newKeyword, toNode.newKeyword),
+ _isEqualNodes(node.identifier, toNode.identifier));
+ }
+
+ @override
+ bool visitCompilationUnit(CompilationUnit node) {
+ CompilationUnit toNode = this._toNode as CompilationUnit;
+ if (_and(
+ _isEqualTokens(node.beginToken, toNode.beginToken),
+ _isEqualNodes(node.scriptTag, toNode.scriptTag),
+ _isEqualNodeLists(node.directives, toNode.directives),
+ _isEqualNodeLists(node.declarations, toNode.declarations),
+ _isEqualTokens(node.endToken, toNode.endToken))) {
+ toNode.element = node.element;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitConditionalExpression(ConditionalExpression node) {
+ ConditionalExpression toNode = this._toNode as ConditionalExpression;
+ if (_and(
+ _isEqualNodes(node.condition, toNode.condition),
+ _isEqualTokens(node.question, toNode.question),
+ _isEqualNodes(node.thenExpression, toNode.thenExpression),
+ _isEqualTokens(node.colon, toNode.colon),
+ _isEqualNodes(node.elseExpression, toNode.elseExpression))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitConfiguration(Configuration node) {
+ Configuration toNode = this._toNode as Configuration;
+ if (_and(
+ _isEqualTokens(node.ifKeyword, toNode.ifKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualTokens(node.equalToken, toNode.equalToken),
+ _isEqualNodes(node.value, toNode.value),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualNodes(node.libraryUri, toNode.libraryUri))) {
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitConstructorDeclaration(ConstructorDeclaration node) {
+ ConstructorDeclaration toNode = this._toNode as ConstructorDeclaration;
+ if (_and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+ _isEqualTokens(node.constKeyword, toNode.constKeyword),
+ _isEqualTokens(node.factoryKeyword, toNode.factoryKeyword),
+ _isEqualNodes(node.returnType, toNode.returnType),
+ _isEqualTokens(node.period, toNode.period),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualNodes(node.parameters, toNode.parameters),
+ _isEqualTokens(node.separator, toNode.separator),
+ _isEqualNodeLists(node.initializers, toNode.initializers),
+ _isEqualNodes(node.redirectedConstructor, toNode.redirectedConstructor),
+ _isEqualNodes(node.body, toNode.body))) {
+ toNode.element = node.element;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+ ConstructorFieldInitializer toNode =
+ this._toNode as ConstructorFieldInitializer;
+ return _and(
+ _isEqualTokens(node.thisKeyword, toNode.thisKeyword),
+ _isEqualTokens(node.period, toNode.period),
+ _isEqualNodes(node.fieldName, toNode.fieldName),
+ _isEqualTokens(node.equals, toNode.equals),
+ _isEqualNodes(node.expression, toNode.expression));
+ }
+
+ @override
+ bool visitConstructorName(ConstructorName node) {
+ ConstructorName toNode = this._toNode as ConstructorName;
+ if (_and(
+ _isEqualNodes(node.type, toNode.type),
+ _isEqualTokens(node.period, toNode.period),
+ _isEqualNodes(node.name, toNode.name))) {
+ toNode.staticElement = node.staticElement;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitContinueStatement(ContinueStatement node) {
+ ContinueStatement toNode = this._toNode as ContinueStatement;
+ if (_and(
+ _isEqualTokens(node.continueKeyword, toNode.continueKeyword),
+ _isEqualNodes(node.label, toNode.label),
+ _isEqualTokens(node.semicolon, toNode.semicolon))) {
+ // TODO(paulberry): map node.target to toNode.target.
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitDeclaredIdentifier(DeclaredIdentifier node) {
+ DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodes(node.type, toNode.type),
+ _isEqualNodes(node.identifier, toNode.identifier));
+ }
+
+ @override
+ bool visitDefaultFormalParameter(DefaultFormalParameter node) {
+ DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter;
+ return _and(
+ _isEqualNodes(node.parameter, toNode.parameter),
+ node.kind == toNode.kind,
+ _isEqualTokens(node.separator, toNode.separator),
+ _isEqualNodes(node.defaultValue, toNode.defaultValue));
+ }
+
+ @override
+ bool visitDoStatement(DoStatement node) {
+ DoStatement toNode = this._toNode as DoStatement;
+ return _and(
+ _isEqualTokens(node.doKeyword, toNode.doKeyword),
+ _isEqualNodes(node.body, toNode.body),
+ _isEqualTokens(node.whileKeyword, toNode.whileKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.condition, toNode.condition),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitDottedName(DottedName node) {
+ DottedName toNode = this._toNode as DottedName;
+ return _isEqualNodeLists(node.components, toNode.components);
+ }
+
+ @override
+ bool visitDoubleLiteral(DoubleLiteral node) {
+ DoubleLiteral toNode = this._toNode as DoubleLiteral;
+ if (_and(_isEqualTokens(node.literal, toNode.literal),
+ node.value == toNode.value)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitEmptyFunctionBody(EmptyFunctionBody node) {
+ EmptyFunctionBody toNode = this._toNode as EmptyFunctionBody;
+ return _isEqualTokens(node.semicolon, toNode.semicolon);
+ }
+
+ @override
+ bool visitEmptyStatement(EmptyStatement node) {
+ EmptyStatement toNode = this._toNode as EmptyStatement;
+ return _isEqualTokens(node.semicolon, toNode.semicolon);
+ }
+
+ @override
+ bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+ EnumConstantDeclaration toNode = this._toNode as EnumConstantDeclaration;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualNodes(node.name, toNode.name));
+ }
+
+ @override
+ bool visitEnumDeclaration(EnumDeclaration node) {
+ EnumDeclaration toNode = this._toNode as EnumDeclaration;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.enumKeyword, toNode.enumKeyword),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodeLists(node.constants, toNode.constants),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket));
+ }
+
+ @override
+ bool visitExportDirective(ExportDirective node) {
+ ExportDirective toNode = this._toNode as ExportDirective;
+ if (_and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodes(node.uri, toNode.uri),
+ _isEqualNodeLists(node.combinators, toNode.combinators),
+ _isEqualTokens(node.semicolon, toNode.semicolon))) {
+ toNode.element = node.element;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
+ ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody;
+ return _and(
+ _isEqualTokens(node.functionDefinition, toNode.functionDefinition),
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitExpressionStatement(ExpressionStatement node) {
+ ExpressionStatement toNode = this._toNode as ExpressionStatement;
+ return _and(_isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitExtendsClause(ExtendsClause node) {
+ ExtendsClause toNode = this._toNode as ExtendsClause;
+ return _and(_isEqualTokens(node.extendsKeyword, toNode.extendsKeyword),
+ _isEqualNodes(node.superclass, toNode.superclass));
+ }
+
+ @override
+ bool visitFieldDeclaration(FieldDeclaration node) {
+ FieldDeclaration toNode = this._toNode as FieldDeclaration;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.staticKeyword, toNode.staticKeyword),
+ _isEqualNodes(node.fields, toNode.fields),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitFieldFormalParameter(FieldFormalParameter node) {
+ FieldFormalParameter toNode = this._toNode as FieldFormalParameter;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodes(node.type, toNode.type),
+ _isEqualTokens(node.thisKeyword, toNode.thisKeyword),
+ _isEqualTokens(node.period, toNode.period),
+ _isEqualNodes(node.identifier, toNode.identifier));
+ }
+
+ @override
+ bool visitForEachStatement(ForEachStatement node) {
+ ForEachStatement toNode = this._toNode as ForEachStatement;
+ return _and(
+ _isEqualTokens(node.forKeyword, toNode.forKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.loopVariable, toNode.loopVariable),
+ _isEqualTokens(node.inKeyword, toNode.inKeyword),
+ _isEqualNodes(node.iterable, toNode.iterable),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualNodes(node.body, toNode.body));
+ }
+
+ @override
+ bool visitFormalParameterList(FormalParameterList node) {
+ FormalParameterList toNode = this._toNode as FormalParameterList;
+ return _and(
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodeLists(node.parameters, toNode.parameters),
+ _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter),
+ _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+ }
+
+ @override
+ bool visitForStatement(ForStatement node) {
+ ForStatement toNode = this._toNode as ForStatement;
+ return _and(
+ _isEqualTokens(node.forKeyword, toNode.forKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.variables, toNode.variables),
+ _isEqualNodes(node.initialization, toNode.initialization),
+ _isEqualTokens(node.leftSeparator, toNode.leftSeparator),
+ _isEqualNodes(node.condition, toNode.condition),
+ _isEqualTokens(node.rightSeparator, toNode.rightSeparator),
+ _isEqualNodeLists(node.updaters, toNode.updaters),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualNodes(node.body, toNode.body));
+ }
+
+ @override
+ bool visitFunctionDeclaration(FunctionDeclaration node) {
+ FunctionDeclaration toNode = this._toNode as FunctionDeclaration;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+ _isEqualNodes(node.returnType, toNode.returnType),
+ _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualNodes(node.functionExpression, toNode.functionExpression));
+ }
+
+ @override
+ bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+ FunctionDeclarationStatement toNode =
+ this._toNode as FunctionDeclarationStatement;
+ return _isEqualNodes(node.functionDeclaration, toNode.functionDeclaration);
+ }
+
+ @override
+ bool visitFunctionExpression(FunctionExpression node) {
+ FunctionExpression toNode = this._toNode as FunctionExpression;
+ if (_and(_isEqualNodes(node.parameters, toNode.parameters),
+ _isEqualNodes(node.body, toNode.body))) {
+ toNode.element = node.element;
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+ FunctionExpressionInvocation toNode =
+ this._toNode as FunctionExpressionInvocation;
+ if (_and(_isEqualNodes(node.function, toNode.function),
+ _isEqualNodes(node.argumentList, toNode.argumentList))) {
+ toNode.propagatedElement = node.propagatedElement;
+ toNode.propagatedInvokeType = node.propagatedInvokeType;
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticInvokeType = node.staticInvokeType;
+ toNode.staticElement = node.staticElement;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitFunctionTypeAlias(FunctionTypeAlias node) {
+ FunctionTypeAlias toNode = this._toNode as FunctionTypeAlias;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.typedefKeyword, toNode.typedefKeyword),
+ _isEqualNodes(node.returnType, toNode.returnType),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualNodes(node.typeParameters, toNode.typeParameters),
+ _isEqualNodes(node.parameters, toNode.parameters),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+ FunctionTypedFormalParameter toNode =
+ this._toNode as FunctionTypedFormalParameter;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualNodes(node.returnType, toNode.returnType),
+ _isEqualNodes(node.identifier, toNode.identifier),
+ _isEqualNodes(node.parameters, toNode.parameters));
+ }
+
+ @override
+ bool visitHideCombinator(HideCombinator node) {
+ HideCombinator toNode = this._toNode as HideCombinator;
+ return _and(_isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodeLists(node.hiddenNames, toNode.hiddenNames));
+ }
+
+ @override
+ bool visitIfStatement(IfStatement node) {
+ IfStatement toNode = this._toNode as IfStatement;
+ return _and(
+ _isEqualTokens(node.ifKeyword, toNode.ifKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.condition, toNode.condition),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualNodes(node.thenStatement, toNode.thenStatement),
+ _isEqualTokens(node.elseKeyword, toNode.elseKeyword),
+ _isEqualNodes(node.elseStatement, toNode.elseStatement));
+ }
+
+ @override
+ bool visitImplementsClause(ImplementsClause node) {
+ ImplementsClause toNode = this._toNode as ImplementsClause;
+ return _and(
+ _isEqualTokens(node.implementsKeyword, toNode.implementsKeyword),
+ _isEqualNodeLists(node.interfaces, toNode.interfaces));
+ }
+
+ @override
+ bool visitImportDirective(ImportDirective node) {
+ ImportDirective toNode = this._toNode as ImportDirective;
+ if (_and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodes(node.uri, toNode.uri),
+ _isEqualTokens(node.asKeyword, toNode.asKeyword),
+ _isEqualNodes(node.prefix, toNode.prefix),
+ _isEqualNodeLists(node.combinators, toNode.combinators),
+ _isEqualTokens(node.semicolon, toNode.semicolon))) {
+ toNode.element = node.element;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitIndexExpression(IndexExpression node) {
+ IndexExpression toNode = this._toNode as IndexExpression;
+ if (_and(
+ _isEqualNodes(node.target, toNode.target),
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodes(node.index, toNode.index),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+ toNode.auxiliaryElements = node.auxiliaryElements;
+ toNode.propagatedElement = node.propagatedElement;
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticElement = node.staticElement;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitInstanceCreationExpression(InstanceCreationExpression node) {
+ InstanceCreationExpression toNode =
+ this._toNode as InstanceCreationExpression;
+ if (_and(
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodes(node.constructorName, toNode.constructorName),
+ _isEqualNodes(node.argumentList, toNode.argumentList))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticElement = node.staticElement;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitIntegerLiteral(IntegerLiteral node) {
+ IntegerLiteral toNode = this._toNode as IntegerLiteral;
+ if (_and(_isEqualTokens(node.literal, toNode.literal),
+ node.value == toNode.value)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitInterpolationExpression(InterpolationExpression node) {
+ InterpolationExpression toNode = this._toNode as InterpolationExpression;
+ return _and(
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket));
+ }
+
+ @override
+ bool visitInterpolationString(InterpolationString node) {
+ InterpolationString toNode = this._toNode as InterpolationString;
+ return _and(_isEqualTokens(node.contents, toNode.contents),
+ node.value == toNode.value);
+ }
+
+ @override
+ bool visitIsExpression(IsExpression node) {
+ IsExpression toNode = this._toNode as IsExpression;
+ if (_and(
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.isOperator, toNode.isOperator),
+ _isEqualTokens(node.notOperator, toNode.notOperator),
+ _isEqualNodes(node.type, toNode.type))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitLabel(Label node) {
+ Label toNode = this._toNode as Label;
+ return _and(_isEqualNodes(node.label, toNode.label),
+ _isEqualTokens(node.colon, toNode.colon));
+ }
+
+ @override
+ bool visitLabeledStatement(LabeledStatement node) {
+ LabeledStatement toNode = this._toNode as LabeledStatement;
+ return _and(_isEqualNodeLists(node.labels, toNode.labels),
+ _isEqualNodes(node.statement, toNode.statement));
+ }
+
+ @override
+ bool visitLibraryDirective(LibraryDirective node) {
+ LibraryDirective toNode = this._toNode as LibraryDirective;
+ if (_and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.libraryKeyword, toNode.libraryKeyword),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualTokens(node.semicolon, toNode.semicolon))) {
+ toNode.element = node.element;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitLibraryIdentifier(LibraryIdentifier node) {
+ LibraryIdentifier toNode = this._toNode as LibraryIdentifier;
+ if (_isEqualNodeLists(node.components, toNode.components)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitListLiteral(ListLiteral node) {
+ ListLiteral toNode = this._toNode as ListLiteral;
+ if (_and(
+ _isEqualTokens(node.constKeyword, toNode.constKeyword),
+ _isEqualNodes(node.typeArguments, toNode.typeArguments),
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodeLists(node.elements, toNode.elements),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitMapLiteral(MapLiteral node) {
+ MapLiteral toNode = this._toNode as MapLiteral;
+ if (_and(
+ _isEqualTokens(node.constKeyword, toNode.constKeyword),
+ _isEqualNodes(node.typeArguments, toNode.typeArguments),
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodeLists(node.entries, toNode.entries),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitMapLiteralEntry(MapLiteralEntry node) {
+ MapLiteralEntry toNode = this._toNode as MapLiteralEntry;
+ return _and(
+ _isEqualNodes(node.key, toNode.key),
+ _isEqualTokens(node.separator, toNode.separator),
+ _isEqualNodes(node.value, toNode.value));
+ }
+
+ @override
+ bool visitMethodDeclaration(MethodDeclaration node) {
+ MethodDeclaration toNode = this._toNode as MethodDeclaration;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+ _isEqualTokens(node.modifierKeyword, toNode.modifierKeyword),
+ _isEqualNodes(node.returnType, toNode.returnType),
+ _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+ _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualNodes(node.parameters, toNode.parameters),
+ _isEqualNodes(node.body, toNode.body));
+ }
+
+ @override
+ bool visitMethodInvocation(MethodInvocation node) {
+ MethodInvocation toNode = this._toNode as MethodInvocation;
+ if (_and(
+ _isEqualNodes(node.target, toNode.target),
+ _isEqualTokens(node.operator, toNode.operator),
+ _isEqualNodes(node.methodName, toNode.methodName),
+ _isEqualNodes(node.argumentList, toNode.argumentList))) {
+ toNode.propagatedInvokeType = node.propagatedInvokeType;
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticInvokeType = node.staticInvokeType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitNamedExpression(NamedExpression node) {
+ NamedExpression toNode = this._toNode as NamedExpression;
+ if (_and(_isEqualNodes(node.name, toNode.name),
+ _isEqualNodes(node.expression, toNode.expression))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitNativeClause(NativeClause node) {
+ NativeClause toNode = this._toNode as NativeClause;
+ return _and(_isEqualTokens(node.nativeKeyword, toNode.nativeKeyword),
+ _isEqualNodes(node.name, toNode.name));
+ }
+
+ @override
+ bool visitNativeFunctionBody(NativeFunctionBody node) {
+ NativeFunctionBody toNode = this._toNode as NativeFunctionBody;
+ return _and(
+ _isEqualTokens(node.nativeKeyword, toNode.nativeKeyword),
+ _isEqualNodes(node.stringLiteral, toNode.stringLiteral),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitNullLiteral(NullLiteral node) {
+ NullLiteral toNode = this._toNode as NullLiteral;
+ if (_isEqualTokens(node.literal, toNode.literal)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitParenthesizedExpression(ParenthesizedExpression node) {
+ ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression;
+ if (_and(
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitPartDirective(PartDirective node) {
+ PartDirective toNode = this._toNode as PartDirective;
+ if (_and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.partKeyword, toNode.partKeyword),
+ _isEqualNodes(node.uri, toNode.uri),
+ _isEqualTokens(node.semicolon, toNode.semicolon))) {
+ toNode.element = node.element;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitPartOfDirective(PartOfDirective node) {
+ PartOfDirective toNode = this._toNode as PartOfDirective;
+ if (_and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.partKeyword, toNode.partKeyword),
+ _isEqualTokens(node.ofKeyword, toNode.ofKeyword),
+ _isEqualNodes(node.libraryName, toNode.libraryName),
+ _isEqualTokens(node.semicolon, toNode.semicolon))) {
+ toNode.element = node.element;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitPostfixExpression(PostfixExpression node) {
+ PostfixExpression toNode = this._toNode as PostfixExpression;
+ if (_and(_isEqualNodes(node.operand, toNode.operand),
+ _isEqualTokens(node.operator, toNode.operator))) {
+ toNode.propagatedElement = node.propagatedElement;
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticElement = node.staticElement;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+ PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
+ if (_and(
+ _isEqualNodes(node.prefix, toNode.prefix),
+ _isEqualTokens(node.period, toNode.period),
+ _isEqualNodes(node.identifier, toNode.identifier))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitPrefixExpression(PrefixExpression node) {
+ PrefixExpression toNode = this._toNode as PrefixExpression;
+ if (_and(_isEqualTokens(node.operator, toNode.operator),
+ _isEqualNodes(node.operand, toNode.operand))) {
+ toNode.propagatedElement = node.propagatedElement;
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticElement = node.staticElement;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitPropertyAccess(PropertyAccess node) {
+ PropertyAccess toNode = this._toNode as PropertyAccess;
+ if (_and(
+ _isEqualNodes(node.target, toNode.target),
+ _isEqualTokens(node.operator, toNode.operator),
+ _isEqualNodes(node.propertyName, toNode.propertyName))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitRedirectingConstructorInvocation(
+ RedirectingConstructorInvocation node) {
+ RedirectingConstructorInvocation toNode =
+ this._toNode as RedirectingConstructorInvocation;
+ if (_and(
+ _isEqualTokens(node.thisKeyword, toNode.thisKeyword),
+ _isEqualTokens(node.period, toNode.period),
+ _isEqualNodes(node.constructorName, toNode.constructorName),
+ _isEqualNodes(node.argumentList, toNode.argumentList))) {
+ toNode.staticElement = node.staticElement;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitRethrowExpression(RethrowExpression node) {
+ RethrowExpression toNode = this._toNode as RethrowExpression;
+ if (_isEqualTokens(node.rethrowKeyword, toNode.rethrowKeyword)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitReturnStatement(ReturnStatement node) {
+ ReturnStatement toNode = this._toNode as ReturnStatement;
+ return _and(
+ _isEqualTokens(node.returnKeyword, toNode.returnKeyword),
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitScriptTag(ScriptTag node) {
+ ScriptTag toNode = this._toNode as ScriptTag;
+ return _isEqualTokens(node.scriptTag, toNode.scriptTag);
+ }
+
+ @override
+ bool visitShowCombinator(ShowCombinator node) {
+ ShowCombinator toNode = this._toNode as ShowCombinator;
+ return _and(_isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodeLists(node.shownNames, toNode.shownNames));
+ }
+
+ @override
+ bool visitSimpleFormalParameter(SimpleFormalParameter node) {
+ SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodes(node.type, toNode.type),
+ _isEqualNodes(node.identifier, toNode.identifier));
+ }
+
+ @override
+ bool visitSimpleIdentifier(SimpleIdentifier node) {
+ SimpleIdentifier toNode = this._toNode as SimpleIdentifier;
+ if (_isEqualTokens(node.token, toNode.token)) {
+ toNode.staticElement = node.staticElement;
+ toNode.staticType = node.staticType;
+ toNode.propagatedElement = node.propagatedElement;
+ toNode.propagatedType = node.propagatedType;
+ toNode.auxiliaryElements = node.auxiliaryElements;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitSimpleStringLiteral(SimpleStringLiteral node) {
+ SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral;
+ if (_and(_isEqualTokens(node.literal, toNode.literal),
+ node.value == toNode.value)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitStringInterpolation(StringInterpolation node) {
+ StringInterpolation toNode = this._toNode as StringInterpolation;
+ if (_isEqualNodeLists(node.elements, toNode.elements)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+ SuperConstructorInvocation toNode =
+ this._toNode as SuperConstructorInvocation;
+ if (_and(
+ _isEqualTokens(node.superKeyword, toNode.superKeyword),
+ _isEqualTokens(node.period, toNode.period),
+ _isEqualNodes(node.constructorName, toNode.constructorName),
+ _isEqualNodes(node.argumentList, toNode.argumentList))) {
+ toNode.staticElement = node.staticElement;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitSuperExpression(SuperExpression node) {
+ SuperExpression toNode = this._toNode as SuperExpression;
+ if (_isEqualTokens(node.superKeyword, toNode.superKeyword)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitSwitchCase(SwitchCase node) {
+ SwitchCase toNode = this._toNode as SwitchCase;
+ return _and(
+ _isEqualNodeLists(node.labels, toNode.labels),
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.colon, toNode.colon),
+ _isEqualNodeLists(node.statements, toNode.statements));
+ }
+
+ @override
+ bool visitSwitchDefault(SwitchDefault node) {
+ SwitchDefault toNode = this._toNode as SwitchDefault;
+ return _and(
+ _isEqualNodeLists(node.labels, toNode.labels),
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualTokens(node.colon, toNode.colon),
+ _isEqualNodeLists(node.statements, toNode.statements));
+ }
+
+ @override
+ bool visitSwitchStatement(SwitchStatement node) {
+ SwitchStatement toNode = this._toNode as SwitchStatement;
+ return _and(
+ _isEqualTokens(node.switchKeyword, toNode.switchKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodeLists(node.members, toNode.members),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket));
+ }
+
+ @override
+ bool visitSymbolLiteral(SymbolLiteral node) {
+ SymbolLiteral toNode = this._toNode as SymbolLiteral;
+ if (_and(_isEqualTokens(node.poundSign, toNode.poundSign),
+ _isEqualTokenLists(node.components, toNode.components))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitThisExpression(ThisExpression node) {
+ ThisExpression toNode = this._toNode as ThisExpression;
+ if (_isEqualTokens(node.thisKeyword, toNode.thisKeyword)) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitThrowExpression(ThrowExpression node) {
+ ThrowExpression toNode = this._toNode as ThrowExpression;
+ if (_and(_isEqualTokens(node.throwKeyword, toNode.throwKeyword),
+ _isEqualNodes(node.expression, toNode.expression))) {
+ toNode.propagatedType = node.propagatedType;
+ toNode.staticType = node.staticType;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+ TopLevelVariableDeclaration toNode =
+ this._toNode as TopLevelVariableDeclaration;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualNodes(node.variables, toNode.variables),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitTryStatement(TryStatement node) {
+ TryStatement toNode = this._toNode as TryStatement;
+ return _and(
+ _isEqualTokens(node.tryKeyword, toNode.tryKeyword),
+ _isEqualNodes(node.body, toNode.body),
+ _isEqualNodeLists(node.catchClauses, toNode.catchClauses),
+ _isEqualTokens(node.finallyKeyword, toNode.finallyKeyword),
+ _isEqualNodes(node.finallyBlock, toNode.finallyBlock));
+ }
+
+ @override
+ bool visitTypeArgumentList(TypeArgumentList node) {
+ TypeArgumentList toNode = this._toNode as TypeArgumentList;
+ return _and(
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodeLists(node.arguments, toNode.arguments),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket));
+ }
+
+ @override
+ bool visitTypeName(TypeName node) {
+ TypeName toNode = this._toNode as TypeName;
+ if (_and(_isEqualNodes(node.name, toNode.name),
+ _isEqualNodes(node.typeArguments, toNode.typeArguments))) {
+ toNode.type = node.type;
+ return true;
+ }
+ return false;
+ }
+
+ @override
+ bool visitTypeParameter(TypeParameter node) {
+ TypeParameter toNode = this._toNode as TypeParameter;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualTokens(node.extendsKeyword, toNode.extendsKeyword),
+ _isEqualNodes(node.bound, toNode.bound));
+ }
+
+ @override
+ bool visitTypeParameterList(TypeParameterList node) {
+ TypeParameterList toNode = this._toNode as TypeParameterList;
+ return _and(
+ _isEqualTokens(node.leftBracket, toNode.leftBracket),
+ _isEqualNodeLists(node.typeParameters, toNode.typeParameters),
+ _isEqualTokens(node.rightBracket, toNode.rightBracket));
+ }
+
+ @override
+ bool visitVariableDeclaration(VariableDeclaration node) {
+ VariableDeclaration toNode = this._toNode as VariableDeclaration;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualNodes(node.name, toNode.name),
+ _isEqualTokens(node.equals, toNode.equals),
+ _isEqualNodes(node.initializer, toNode.initializer));
+ }
+
+ @override
+ bool visitVariableDeclarationList(VariableDeclarationList node) {
+ VariableDeclarationList toNode = this._toNode as VariableDeclarationList;
+ return _and(
+ _isEqualNodes(node.documentationComment, toNode.documentationComment),
+ _isEqualNodeLists(node.metadata, toNode.metadata),
+ _isEqualTokens(node.keyword, toNode.keyword),
+ _isEqualNodes(node.type, toNode.type),
+ _isEqualNodeLists(node.variables, toNode.variables));
+ }
+
+ @override
+ bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+ VariableDeclarationStatement toNode =
+ this._toNode as VariableDeclarationStatement;
+ return _and(_isEqualNodes(node.variables, toNode.variables),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ @override
+ bool visitWhileStatement(WhileStatement node) {
+ WhileStatement toNode = this._toNode as WhileStatement;
+ return _and(
+ _isEqualTokens(node.whileKeyword, toNode.whileKeyword),
+ _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+ _isEqualNodes(node.condition, toNode.condition),
+ _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+ _isEqualNodes(node.body, toNode.body));
+ }
+
+ @override
+ bool visitWithClause(WithClause node) {
+ WithClause toNode = this._toNode as WithClause;
+ return _and(_isEqualTokens(node.withKeyword, toNode.withKeyword),
+ _isEqualNodeLists(node.mixinTypes, toNode.mixinTypes));
+ }
+
+ @override
+ bool visitYieldStatement(YieldStatement node) {
+ YieldStatement toNode = this._toNode as YieldStatement;
+ return _and(
+ _isEqualTokens(node.yieldKeyword, toNode.yieldKeyword),
+ _isEqualNodes(node.expression, toNode.expression),
+ _isEqualTokens(node.semicolon, toNode.semicolon));
+ }
+
+ /**
+ * Return `true` if all of the parameters are `true`.
+ */
+ bool _and(bool b1, bool b2,
+ [bool b3 = true,
+ bool b4 = true,
+ bool b5 = true,
+ bool b6 = true,
+ bool b7 = true,
+ bool b8 = true,
+ bool b9 = true,
+ bool b10 = true,
+ bool b11 = true,
+ bool b12 = true,
+ bool b13 = true]) {
+ // TODO(brianwilkerson) Inline this method.
+ return b1 &&
+ b2 &&
+ b3 &&
+ b4 &&
+ b5 &&
+ b6 &&
+ b7 &&
+ b8 &&
+ b9 &&
+ b10 &&
+ b11 &&
+ b12 &&
+ b13;
+ }
+
+ /**
+ * Return `true` if the [first] and [second] lists of AST nodes have the same
+ * size and corresponding elements are equal.
+ */
+ bool _isEqualNodeLists(NodeList first, NodeList second) {
+ if (first == null) {
+ return second == null;
+ } else if (second == null) {
+ return false;
+ }
+ int size = first.length;
+ if (second.length != size) {
+ return false;
+ }
+ bool equal = true;
+ for (int i = 0; i < size; i++) {
+ if (!_isEqualNodes(first[i], second[i])) {
+ equal = false;
+ }
+ }
+ return equal;
+ }
+
+ /**
+ * Return `true` if the [fromNode] and [toNode] 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.
+ */
+ bool _isEqualNodes(AstNode fromNode, AstNode toNode) {
+ if (fromNode == null) {
+ return toNode == null;
+ } else if (toNode == null) {
+ return false;
+ } else if (fromNode.runtimeType == toNode.runtimeType) {
+ this._toNode = toNode;
+ return fromNode.accept(this);
+ }
+ //
+ // Check for a simple transformation caused by entering a period.
+ //
+ if (toNode is PrefixedIdentifier) {
+ SimpleIdentifier prefix = toNode.prefix;
+ if (fromNode.runtimeType == prefix.runtimeType) {
+ this._toNode = prefix;
+ return fromNode.accept(this);
+ }
+ } else if (toNode is PropertyAccess) {
+ Expression target = toNode.target;
+ if (fromNode.runtimeType == target.runtimeType) {
+ this._toNode = target;
+ return fromNode.accept(this);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Return `true` if the [first] and [second] arrays of tokens have the same
+ * length and corresponding elements are equal.
+ */
+ bool _isEqualTokenLists(List<Token> first, List<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 `true` if the [first] and [second] tokens have the same structure.
+ */
+ bool _isEqualTokens(Token first, Token second) {
+ if (first == null) {
+ return second == null;
+ } else if (second == null) {
+ return false;
+ }
+ return first.lexeme == second.lexeme;
+ }
+
+ /**
+ * Copy resolution data from the [fromNode] to the [toNode].
+ */
+ static void copyResolutionData(AstNode fromNode, AstNode toNode) {
+ ResolutionCopier copier = new ResolutionCopier();
+ copier._isEqualNodes(fromNode, toNode);
+ }
+}
+
+/**
* Traverse the AST from initial child node to successive parents, building a
* collection of local variable and parameter names visible to the initial child
* node. In case of name shadowing, the first name seen is the most specific one
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/generated/parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698