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

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

Issue 2429243003: Provide an extensible form of ToSourceVisitor (issue 27169) (Closed)
Patch Set: Created 4 years, 2 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/test/src/dart/ast/utilities_test.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 8cf5463b3f973235cc1bc381263876359cd0605b..a1e5448e20f82238f8b8818f8fac8e1d1170877b 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -17,6 +17,7 @@ import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
import 'package:analyzer/src/generated/java_core.dart';
import 'package:analyzer/src/generated/utilities_collection.dart' show TokenMap;
import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:meta/meta.dart';
/**
* A function used to handle exceptions that are thrown by delegates while using
@@ -7913,3 +7914,1163 @@ class ToSourceVisitor implements AstVisitor<Object> {
}
}
}
+
+/**
+ * A visitor used to write a source representation of a visited AST node (and
+ * all of it's children) to a sink.
+ */
+class ToSourceVisitor2 implements AstVisitor<Object> {
+ /**
+ * The sink to which the source is to be written.
+ */
+ @protected
+ final StringSink sink;
+
+ /**
+ * Initialize a newly created visitor to write source code representing the
+ * visited nodes to the given [sink].
+ */
+ ToSourceVisitor2(this.sink);
+
+ /**
+ * Visit the given function [body], printing the [prefix] before if the body
+ * is not empty.
+ */
+ @protected
+ void safelyVisitFunctionWithPrefix(String prefix, FunctionBody body) {
+ if (body is! EmptyFunctionBody) {
+ sink.write(prefix);
+ }
+ safelyVisitNode(body);
+ }
+
+ /**
+ * Safely visit the given [node].
+ */
+ @protected
+ void safelyVisitNode(AstNode node) {
+ if (node != null) {
+ node.accept(this);
+ }
+ }
+
+ /**
+ * Print a list of [nodes] without any separation.
+ */
+ @protected
+ void safelyVisitNodeList(NodeList<AstNode> nodes) {
+ safelyVisitNodeListWithSeparator(nodes, "");
+ }
+
+ /**
+ * Print a list of [nodes], separated by the given [separator].
+ */
+ @protected
+ void safelyVisitNodeListWithSeparator(
+ NodeList<AstNode> nodes, String separator) {
+ if (nodes != null) {
+ int size = nodes.length;
+ for (int i = 0; i < size; i++) {
+ if (i > 0) {
+ sink.write(separator);
+ }
+ nodes[i].accept(this);
+ }
+ }
+ }
+
+ /**
+ * Print a list of [nodes], prefixed by the given [prefix] if the list is not
+ * empty, and separated by the given [separator].
+ */
+ @protected
+ void safelyVisitNodeListWithSeparatorAndPrefix(
+ String prefix, NodeList<AstNode> nodes, String separator) {
+ if (nodes != null) {
+ int size = nodes.length;
+ if (size > 0) {
+ sink.write(prefix);
+ for (int i = 0; i < size; i++) {
+ if (i > 0) {
+ sink.write(separator);
+ }
+ nodes[i].accept(this);
+ }
+ }
+ }
+ }
+
+ /**
+ * Print a list of [nodes], separated by the given [separator], followed by
+ * the given [suffix] if the list is not empty.
+ */
+ @protected
+ void safelyVisitNodeListWithSeparatorAndSuffix(
+ NodeList<AstNode> nodes, String separator, String suffix) {
+ if (nodes != null) {
+ int size = nodes.length;
+ if (size > 0) {
+ for (int i = 0; i < size; i++) {
+ if (i > 0) {
+ sink.write(separator);
+ }
+ nodes[i].accept(this);
+ }
+ sink.write(suffix);
+ }
+ }
+ }
+
+ /**
+ * Safely visit the given [node], printing the [prefix] before the node if it
+ * is non-`null`.
+ */
+ @protected
+ void safelyVisitNodeWithPrefix(String prefix, AstNode node) {
+ if (node != null) {
+ sink.write(prefix);
+ node.accept(this);
+ }
+ }
+
+ /**
+ * Safely visit the given [node], printing the [suffix] after the node if it
+ * is non-`null`.
+ */
+ @protected
+ void safelyVisitNodeWithSuffix(AstNode node, String suffix) {
+ if (node != null) {
+ node.accept(this);
+ sink.write(suffix);
+ }
+ }
+
+ /**
+ * Safely visit the given [token], printing the [suffix] after the token if it
+ * is non-`null`.
+ */
+ @protected
+ void safelyVisitTokenWithSuffix(Token token, String suffix) {
+ if (token != null) {
+ sink.write(token.lexeme);
+ sink.write(suffix);
+ }
+ }
+
+ @override
+ Object visitAdjacentStrings(AdjacentStrings node) {
+ safelyVisitNodeListWithSeparator(node.strings, " ");
+ return null;
+ }
+
+ @override
+ Object visitAnnotation(Annotation node) {
+ sink.write('@');
+ safelyVisitNode(node.name);
+ safelyVisitNodeWithPrefix(".", node.constructorName);
+ safelyVisitNode(node.arguments);
+ return null;
+ }
+
+ @override
+ Object visitArgumentList(ArgumentList node) {
+ sink.write('(');
+ safelyVisitNodeListWithSeparator(node.arguments, ", ");
+ sink.write(')');
+ return null;
+ }
+
+ @override
+ Object visitAsExpression(AsExpression node) {
+ safelyVisitNode(node.expression);
+ sink.write(" as ");
+ safelyVisitNode(node.type);
+ return null;
+ }
+
+ @override
+ Object visitAssertStatement(AssertStatement node) {
+ sink.write("assert (");
+ safelyVisitNode(node.condition);
+ if (node.message != null) {
+ sink.write(', ');
+ safelyVisitNode(node.message);
+ }
+ sink.write(");");
+ return null;
+ }
+
+ @override
+ Object visitAssignmentExpression(AssignmentExpression node) {
+ safelyVisitNode(node.leftHandSide);
+ sink.write(' ');
+ sink.write(node.operator.lexeme);
+ sink.write(' ');
+ safelyVisitNode(node.rightHandSide);
+ return null;
+ }
+
+ @override
+ Object visitAwaitExpression(AwaitExpression node) {
+ sink.write("await ");
+ safelyVisitNode(node.expression);
+ return null;
+ }
+
+ @override
+ Object visitBinaryExpression(BinaryExpression node) {
+ safelyVisitNode(node.leftOperand);
+ sink.write(' ');
+ sink.write(node.operator.lexeme);
+ sink.write(' ');
+ safelyVisitNode(node.rightOperand);
+ return null;
+ }
+
+ @override
+ Object visitBlock(Block node) {
+ sink.write('{');
+ safelyVisitNodeListWithSeparator(node.statements, " ");
+ sink.write('}');
+ return null;
+ }
+
+ @override
+ Object visitBlockFunctionBody(BlockFunctionBody node) {
+ Token keyword = node.keyword;
+ if (keyword != null) {
+ sink.write(keyword.lexeme);
+ if (node.star != null) {
+ sink.write('*');
+ }
+ sink.write(' ');
+ }
+ safelyVisitNode(node.block);
+ return null;
+ }
+
+ @override
+ Object visitBooleanLiteral(BooleanLiteral node) {
+ sink.write(node.literal.lexeme);
+ return null;
+ }
+
+ @override
+ Object visitBreakStatement(BreakStatement node) {
+ sink.write("break");
+ safelyVisitNodeWithPrefix(" ", node.label);
+ sink.write(";");
+ return null;
+ }
+
+ @override
+ Object visitCascadeExpression(CascadeExpression node) {
+ safelyVisitNode(node.target);
+ safelyVisitNodeList(node.cascadeSections);
+ return null;
+ }
+
+ @override
+ Object visitCatchClause(CatchClause node) {
+ safelyVisitNodeWithPrefix("on ", node.exceptionType);
+ if (node.catchKeyword != null) {
+ if (node.exceptionType != null) {
+ sink.write(' ');
+ }
+ sink.write("catch (");
+ safelyVisitNode(node.exceptionParameter);
+ safelyVisitNodeWithPrefix(", ", node.stackTraceParameter);
+ sink.write(") ");
+ } else {
+ sink.write(" ");
+ }
+ safelyVisitNode(node.body);
+ return null;
+ }
+
+ @override
+ Object visitClassDeclaration(ClassDeclaration node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitTokenWithSuffix(node.abstractKeyword, " ");
+ sink.write("class ");
+ safelyVisitNode(node.name);
+ safelyVisitNode(node.typeParameters);
+ safelyVisitNodeWithPrefix(" ", node.extendsClause);
+ safelyVisitNodeWithPrefix(" ", node.withClause);
+ safelyVisitNodeWithPrefix(" ", node.implementsClause);
+ sink.write(" {");
+ safelyVisitNodeListWithSeparator(node.members, " ");
+ sink.write("}");
+ return null;
+ }
+
+ @override
+ Object visitClassTypeAlias(ClassTypeAlias node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ if (node.abstractKeyword != null) {
+ sink.write("abstract ");
+ }
+ sink.write("class ");
+ safelyVisitNode(node.name);
+ safelyVisitNode(node.typeParameters);
+ sink.write(" = ");
+ safelyVisitNode(node.superclass);
+ safelyVisitNodeWithPrefix(" ", node.withClause);
+ safelyVisitNodeWithPrefix(" ", node.implementsClause);
+ sink.write(";");
+ return null;
+ }
+
+ @override
+ Object visitComment(Comment node) => null;
+
+ @override
+ Object visitCommentReference(CommentReference node) => null;
+
+ @override
+ Object visitCompilationUnit(CompilationUnit node) {
+ ScriptTag scriptTag = node.scriptTag;
+ NodeList<Directive> directives = node.directives;
+ safelyVisitNode(scriptTag);
+ String prefix = scriptTag == null ? "" : " ";
+ safelyVisitNodeListWithSeparatorAndPrefix(prefix, directives, " ");
+ prefix = scriptTag == null && directives.isEmpty ? "" : " ";
+ safelyVisitNodeListWithSeparatorAndPrefix(prefix, node.declarations, " ");
+ return null;
+ }
+
+ @override
+ Object visitConditionalExpression(ConditionalExpression node) {
+ safelyVisitNode(node.condition);
+ sink.write(" ? ");
+ safelyVisitNode(node.thenExpression);
+ sink.write(" : ");
+ safelyVisitNode(node.elseExpression);
+ return null;
+ }
+
+ @override
+ Object visitConfiguration(Configuration node) {
+ sink.write('if (');
+ safelyVisitNode(node.name);
+ safelyVisitNodeWithPrefix(" == ", node.value);
+ sink.write(') ');
+ safelyVisitNode(node.uri);
+ return null;
+ }
+
+ @override
+ Object visitConstructorDeclaration(ConstructorDeclaration node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitTokenWithSuffix(node.externalKeyword, " ");
+ safelyVisitTokenWithSuffix(node.constKeyword, " ");
+ safelyVisitTokenWithSuffix(node.factoryKeyword, " ");
+ safelyVisitNode(node.returnType);
+ safelyVisitNodeWithPrefix(".", node.name);
+ safelyVisitNode(node.parameters);
+ safelyVisitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
+ safelyVisitNodeWithPrefix(" = ", node.redirectedConstructor);
+ safelyVisitFunctionWithPrefix(" ", node.body);
+ return null;
+ }
+
+ @override
+ Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+ safelyVisitTokenWithSuffix(node.thisKeyword, ".");
+ safelyVisitNode(node.fieldName);
+ sink.write(" = ");
+ safelyVisitNode(node.expression);
+ return null;
+ }
+
+ @override
+ Object visitConstructorName(ConstructorName node) {
+ safelyVisitNode(node.type);
+ safelyVisitNodeWithPrefix(".", node.name);
+ return null;
+ }
+
+ @override
+ Object visitContinueStatement(ContinueStatement node) {
+ sink.write("continue");
+ safelyVisitNodeWithPrefix(" ", node.label);
+ sink.write(";");
+ return null;
+ }
+
+ @override
+ Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitTokenWithSuffix(node.keyword, " ");
+ safelyVisitNodeWithSuffix(node.type, " ");
+ safelyVisitNode(node.identifier);
+ return null;
+ }
+
+ @override
+ Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+ safelyVisitNode(node.parameter);
+ if (node.separator != null) {
+ sink.write(" ");
+ sink.write(node.separator.lexeme);
+ safelyVisitNodeWithPrefix(" ", node.defaultValue);
+ }
+ return null;
+ }
+
+ @override
+ Object visitDoStatement(DoStatement node) {
+ sink.write("do ");
+ safelyVisitNode(node.body);
+ sink.write(" while (");
+ safelyVisitNode(node.condition);
+ sink.write(");");
+ return null;
+ }
+
+ @override
+ Object visitDottedName(DottedName node) {
+ safelyVisitNodeListWithSeparator(node.components, ".");
+ return null;
+ }
+
+ @override
+ Object visitDoubleLiteral(DoubleLiteral node) {
+ sink.write(node.literal.lexeme);
+ return null;
+ }
+
+ @override
+ Object visitEmptyFunctionBody(EmptyFunctionBody node) {
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitEmptyStatement(EmptyStatement node) {
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitNode(node.name);
+ return null;
+ }
+
+ @override
+ Object visitEnumDeclaration(EnumDeclaration node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ sink.write("enum ");
+ safelyVisitNode(node.name);
+ sink.write(" {");
+ safelyVisitNodeListWithSeparator(node.constants, ", ");
+ sink.write("}");
+ return null;
+ }
+
+ @override
+ Object visitExportDirective(ExportDirective node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ sink.write("export ");
+ safelyVisitNode(node.uri);
+ safelyVisitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+ Token keyword = node.keyword;
+ if (keyword != null) {
+ sink.write(keyword.lexeme);
+ sink.write(' ');
+ }
+ sink.write("=> ");
+ safelyVisitNode(node.expression);
+ if (node.semicolon != null) {
+ sink.write(';');
+ }
+ return null;
+ }
+
+ @override
+ Object visitExpressionStatement(ExpressionStatement node) {
+ safelyVisitNode(node.expression);
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitExtendsClause(ExtendsClause node) {
+ sink.write("extends ");
+ safelyVisitNode(node.superclass);
+ return null;
+ }
+
+ @override
+ Object visitFieldDeclaration(FieldDeclaration node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitTokenWithSuffix(node.staticKeyword, " ");
+ safelyVisitNode(node.fields);
+ sink.write(";");
+ return null;
+ }
+
+ @override
+ Object visitFieldFormalParameter(FieldFormalParameter node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
+ safelyVisitTokenWithSuffix(node.keyword, " ");
+ safelyVisitNodeWithSuffix(node.type, " ");
+ sink.write("this.");
+ safelyVisitNode(node.identifier);
+ safelyVisitNode(node.typeParameters);
+ safelyVisitNode(node.parameters);
+ return null;
+ }
+
+ @override
+ Object visitForEachStatement(ForEachStatement node) {
+ DeclaredIdentifier loopVariable = node.loopVariable;
+ if (node.awaitKeyword != null) {
+ sink.write("await ");
+ }
+ sink.write("for (");
+ if (loopVariable == null) {
+ safelyVisitNode(node.identifier);
+ } else {
+ safelyVisitNode(loopVariable);
+ }
+ sink.write(" in ");
+ safelyVisitNode(node.iterable);
+ sink.write(") ");
+ safelyVisitNode(node.body);
+ return null;
+ }
+
+ @override
+ Object visitFormalParameterList(FormalParameterList node) {
+ String groupEnd = null;
+ sink.write('(');
+ NodeList<FormalParameter> parameters = node.parameters;
+ int size = parameters.length;
+ for (int i = 0; i < size; i++) {
+ FormalParameter parameter = parameters[i];
+ if (i > 0) {
+ sink.write(", ");
+ }
+ if (groupEnd == null && parameter is DefaultFormalParameter) {
+ if (parameter.kind == ParameterKind.NAMED) {
+ groupEnd = "}";
+ sink.write('{');
+ } else {
+ groupEnd = "]";
+ sink.write('[');
+ }
+ }
+ parameter.accept(this);
+ }
+ if (groupEnd != null) {
+ sink.write(groupEnd);
+ }
+ sink.write(')');
+ return null;
+ }
+
+ @override
+ Object visitForStatement(ForStatement node) {
+ Expression initialization = node.initialization;
+ sink.write("for (");
+ if (initialization != null) {
+ safelyVisitNode(initialization);
+ } else {
+ safelyVisitNode(node.variables);
+ }
+ sink.write(";");
+ safelyVisitNodeWithPrefix(" ", node.condition);
+ sink.write(";");
+ safelyVisitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
+ sink.write(") ");
+ safelyVisitNode(node.body);
+ return null;
+ }
+
+ @override
+ Object visitFunctionDeclaration(FunctionDeclaration node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitTokenWithSuffix(node.externalKeyword, " ");
+ safelyVisitNodeWithSuffix(node.returnType, " ");
+ safelyVisitTokenWithSuffix(node.propertyKeyword, " ");
+ safelyVisitNode(node.name);
+ safelyVisitNode(node.functionExpression);
+ return null;
+ }
+
+ @override
+ Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+ safelyVisitNode(node.functionDeclaration);
+ return null;
+ }
+
+ @override
+ Object visitFunctionExpression(FunctionExpression node) {
+ safelyVisitNode(node.typeParameters);
+ safelyVisitNode(node.parameters);
+ if (node.body is! EmptyFunctionBody) {
+ sink.write(' ');
+ }
+ safelyVisitNode(node.body);
+ return null;
+ }
+
+ @override
+ Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+ safelyVisitNode(node.function);
+ safelyVisitNode(node.typeArguments);
+ safelyVisitNode(node.argumentList);
+ return null;
+ }
+
+ @override
+ Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ sink.write("typedef ");
+ safelyVisitNodeWithSuffix(node.returnType, " ");
+ safelyVisitNode(node.name);
+ safelyVisitNode(node.typeParameters);
+ safelyVisitNode(node.parameters);
+ sink.write(";");
+ return null;
+ }
+
+ @override
+ Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
+ safelyVisitNodeWithSuffix(node.returnType, " ");
+ safelyVisitNode(node.identifier);
+ safelyVisitNode(node.typeParameters);
+ safelyVisitNode(node.parameters);
+ if (node.question != null) {
+ sink.write('?');
+ }
+ return null;
+ }
+
+ @override
+ Object visitHideCombinator(HideCombinator node) {
+ sink.write("hide ");
+ safelyVisitNodeListWithSeparator(node.hiddenNames, ", ");
+ return null;
+ }
+
+ @override
+ Object visitIfStatement(IfStatement node) {
+ sink.write("if (");
+ safelyVisitNode(node.condition);
+ sink.write(") ");
+ safelyVisitNode(node.thenStatement);
+ safelyVisitNodeWithPrefix(" else ", node.elseStatement);
+ return null;
+ }
+
+ @override
+ Object visitImplementsClause(ImplementsClause node) {
+ sink.write("implements ");
+ safelyVisitNodeListWithSeparator(node.interfaces, ", ");
+ return null;
+ }
+
+ @override
+ Object visitImportDirective(ImportDirective node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ sink.write("import ");
+ safelyVisitNode(node.uri);
+ if (node.deferredKeyword != null) {
+ sink.write(" deferred");
+ }
+ safelyVisitNodeWithPrefix(" as ", node.prefix);
+ safelyVisitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitIndexExpression(IndexExpression node) {
+ if (node.isCascaded) {
+ sink.write("..");
+ } else {
+ safelyVisitNode(node.target);
+ }
+ sink.write('[');
+ safelyVisitNode(node.index);
+ sink.write(']');
+ return null;
+ }
+
+ @override
+ Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+ safelyVisitTokenWithSuffix(node.keyword, " ");
+ safelyVisitNode(node.constructorName);
+ safelyVisitNode(node.argumentList);
+ return null;
+ }
+
+ @override
+ Object visitIntegerLiteral(IntegerLiteral node) {
+ sink.write(node.literal.lexeme);
+ return null;
+ }
+
+ @override
+ Object visitInterpolationExpression(InterpolationExpression node) {
+ if (node.rightBracket != null) {
+ sink.write("\${");
+ safelyVisitNode(node.expression);
+ sink.write("}");
+ } else {
+ sink.write("\$");
+ safelyVisitNode(node.expression);
+ }
+ return null;
+ }
+
+ @override
+ Object visitInterpolationString(InterpolationString node) {
+ sink.write(node.contents.lexeme);
+ return null;
+ }
+
+ @override
+ Object visitIsExpression(IsExpression node) {
+ safelyVisitNode(node.expression);
+ if (node.notOperator == null) {
+ sink.write(" is ");
+ } else {
+ sink.write(" is! ");
+ }
+ safelyVisitNode(node.type);
+ return null;
+ }
+
+ @override
+ Object visitLabel(Label node) {
+ safelyVisitNode(node.label);
+ sink.write(":");
+ return null;
+ }
+
+ @override
+ Object visitLabeledStatement(LabeledStatement node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+ safelyVisitNode(node.statement);
+ return null;
+ }
+
+ @override
+ Object visitLibraryDirective(LibraryDirective node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ sink.write("library ");
+ safelyVisitNode(node.name);
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitLibraryIdentifier(LibraryIdentifier node) {
+ sink.write(node.name);
+ return null;
+ }
+
+ @override
+ Object visitListLiteral(ListLiteral node) {
+ if (node.constKeyword != null) {
+ sink.write(node.constKeyword.lexeme);
+ sink.write(' ');
+ }
+ safelyVisitNodeWithSuffix(node.typeArguments, " ");
+ sink.write("[");
+ safelyVisitNodeListWithSeparator(node.elements, ", ");
+ sink.write("]");
+ return null;
+ }
+
+ @override
+ Object visitMapLiteral(MapLiteral node) {
+ if (node.constKeyword != null) {
+ sink.write(node.constKeyword.lexeme);
+ sink.write(' ');
+ }
+ safelyVisitNodeWithSuffix(node.typeArguments, " ");
+ sink.write("{");
+ safelyVisitNodeListWithSeparator(node.entries, ", ");
+ sink.write("}");
+ return null;
+ }
+
+ @override
+ Object visitMapLiteralEntry(MapLiteralEntry node) {
+ safelyVisitNode(node.key);
+ sink.write(" : ");
+ safelyVisitNode(node.value);
+ return null;
+ }
+
+ @override
+ Object visitMethodDeclaration(MethodDeclaration node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitTokenWithSuffix(node.externalKeyword, " ");
+ safelyVisitTokenWithSuffix(node.modifierKeyword, " ");
+ safelyVisitNodeWithSuffix(node.returnType, " ");
+ safelyVisitTokenWithSuffix(node.propertyKeyword, " ");
+ safelyVisitTokenWithSuffix(node.operatorKeyword, " ");
+ safelyVisitNode(node.name);
+ if (!node.isGetter) {
+ safelyVisitNode(node.typeParameters);
+ safelyVisitNode(node.parameters);
+ }
+ safelyVisitFunctionWithPrefix(" ", node.body);
+ return null;
+ }
+
+ @override
+ Object visitMethodInvocation(MethodInvocation node) {
+ if (node.isCascaded) {
+ sink.write("..");
+ } else {
+ if (node.target != null) {
+ node.target.accept(this);
+ sink.write(node.operator.lexeme);
+ }
+ }
+ safelyVisitNode(node.methodName);
+ safelyVisitNode(node.typeArguments);
+ safelyVisitNode(node.argumentList);
+ return null;
+ }
+
+ @override
+ Object visitNamedExpression(NamedExpression node) {
+ safelyVisitNode(node.name);
+ safelyVisitNodeWithPrefix(" ", node.expression);
+ return null;
+ }
+
+ @override
+ Object visitNativeClause(NativeClause node) {
+ sink.write("native ");
+ safelyVisitNode(node.name);
+ return null;
+ }
+
+ @override
+ Object visitNativeFunctionBody(NativeFunctionBody node) {
+ sink.write("native ");
+ safelyVisitNode(node.stringLiteral);
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitNullLiteral(NullLiteral node) {
+ sink.write("null");
+ return null;
+ }
+
+ @override
+ Object visitParenthesizedExpression(ParenthesizedExpression node) {
+ sink.write('(');
+ safelyVisitNode(node.expression);
+ sink.write(')');
+ return null;
+ }
+
+ @override
+ Object visitPartDirective(PartDirective node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ sink.write("part ");
+ safelyVisitNode(node.uri);
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitPartOfDirective(PartOfDirective node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ sink.write("part of ");
+ safelyVisitNode(node.libraryName);
+ sink.write(';');
+ return null;
+ }
+
+ @override
+ Object visitPostfixExpression(PostfixExpression node) {
+ safelyVisitNode(node.operand);
+ sink.write(node.operator.lexeme);
+ return null;
+ }
+
+ @override
+ Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+ safelyVisitNode(node.prefix);
+ sink.write('.');
+ safelyVisitNode(node.identifier);
+ return null;
+ }
+
+ @override
+ Object visitPrefixExpression(PrefixExpression node) {
+ sink.write(node.operator.lexeme);
+ safelyVisitNode(node.operand);
+ return null;
+ }
+
+ @override
+ Object visitPropertyAccess(PropertyAccess node) {
+ if (node.isCascaded) {
+ sink.write("..");
+ } else {
+ safelyVisitNode(node.target);
+ sink.write(node.operator.lexeme);
+ }
+ safelyVisitNode(node.propertyName);
+ return null;
+ }
+
+ @override
+ Object visitRedirectingConstructorInvocation(
+ RedirectingConstructorInvocation node) {
+ sink.write("this");
+ safelyVisitNodeWithPrefix(".", node.constructorName);
+ safelyVisitNode(node.argumentList);
+ return null;
+ }
+
+ @override
+ Object visitRethrowExpression(RethrowExpression node) {
+ sink.write("rethrow");
+ return null;
+ }
+
+ @override
+ Object visitReturnStatement(ReturnStatement node) {
+ Expression expression = node.expression;
+ if (expression == null) {
+ sink.write("return;");
+ } else {
+ sink.write("return ");
+ expression.accept(this);
+ sink.write(";");
+ }
+ return null;
+ }
+
+ @override
+ Object visitScriptTag(ScriptTag node) {
+ sink.write(node.scriptTag.lexeme);
+ return null;
+ }
+
+ @override
+ Object visitShowCombinator(ShowCombinator node) {
+ sink.write("show ");
+ safelyVisitNodeListWithSeparator(node.shownNames, ", ");
+ return null;
+ }
+
+ @override
+ Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
+ safelyVisitTokenWithSuffix(node.keyword, " ");
+ safelyVisitNodeWithSuffix(node.type, " ");
+ safelyVisitNode(node.identifier);
+ return null;
+ }
+
+ @override
+ Object visitSimpleIdentifier(SimpleIdentifier node) {
+ sink.write(node.token.lexeme);
+ return null;
+ }
+
+ @override
+ Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+ sink.write(node.literal.lexeme);
+ return null;
+ }
+
+ @override
+ Object visitStringInterpolation(StringInterpolation node) {
+ safelyVisitNodeList(node.elements);
+ return null;
+ }
+
+ @override
+ Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+ sink.write("super");
+ safelyVisitNodeWithPrefix(".", node.constructorName);
+ safelyVisitNode(node.argumentList);
+ return null;
+ }
+
+ @override
+ Object visitSuperExpression(SuperExpression node) {
+ sink.write("super");
+ return null;
+ }
+
+ @override
+ Object visitSwitchCase(SwitchCase node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+ sink.write("case ");
+ safelyVisitNode(node.expression);
+ sink.write(": ");
+ safelyVisitNodeListWithSeparator(node.statements, " ");
+ return null;
+ }
+
+ @override
+ Object visitSwitchDefault(SwitchDefault node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+ sink.write("default: ");
+ safelyVisitNodeListWithSeparator(node.statements, " ");
+ return null;
+ }
+
+ @override
+ Object visitSwitchStatement(SwitchStatement node) {
+ sink.write("switch (");
+ safelyVisitNode(node.expression);
+ sink.write(") {");
+ safelyVisitNodeListWithSeparator(node.members, " ");
+ sink.write("}");
+ return null;
+ }
+
+ @override
+ Object visitSymbolLiteral(SymbolLiteral node) {
+ sink.write("#");
+ List<Token> components = node.components;
+ for (int i = 0; i < components.length; i++) {
+ if (i > 0) {
+ sink.write(".");
+ }
+ sink.write(components[i].lexeme);
+ }
+ return null;
+ }
+
+ @override
+ Object visitThisExpression(ThisExpression node) {
+ sink.write("this");
+ return null;
+ }
+
+ @override
+ Object visitThrowExpression(ThrowExpression node) {
+ sink.write("throw ");
+ safelyVisitNode(node.expression);
+ return null;
+ }
+
+ @override
+ Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+ safelyVisitNodeWithSuffix(node.variables, ";");
+ return null;
+ }
+
+ @override
+ Object visitTryStatement(TryStatement node) {
+ sink.write("try ");
+ safelyVisitNode(node.body);
+ safelyVisitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
+ safelyVisitNodeWithPrefix(" finally ", node.finallyBlock);
+ return null;
+ }
+
+ @override
+ Object visitTypeArgumentList(TypeArgumentList node) {
+ sink.write('<');
+ safelyVisitNodeListWithSeparator(node.arguments, ", ");
+ sink.write('>');
+ return null;
+ }
+
+ @override
+ Object visitTypeName(TypeName node) {
+ safelyVisitNode(node.name);
+ safelyVisitNode(node.typeArguments);
+ if (node.question != null) {
+ sink.write('?');
+ }
+ return null;
+ }
+
+ @override
+ Object visitTypeParameter(TypeParameter node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitNode(node.name);
+ safelyVisitNodeWithPrefix(" extends ", node.bound);
+ return null;
+ }
+
+ @override
+ Object visitTypeParameterList(TypeParameterList node) {
+ sink.write('<');
+ safelyVisitNodeListWithSeparator(node.typeParameters, ", ");
+ sink.write('>');
+ return null;
+ }
+
+ @override
+ Object visitVariableDeclaration(VariableDeclaration node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitNode(node.name);
+ safelyVisitNodeWithPrefix(" = ", node.initializer);
+ return null;
+ }
+
+ @override
+ Object visitVariableDeclarationList(VariableDeclarationList node) {
+ safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+ safelyVisitTokenWithSuffix(node.keyword, " ");
+ safelyVisitNodeWithSuffix(node.type, " ");
+ safelyVisitNodeListWithSeparator(node.variables, ", ");
+ return null;
+ }
+
+ @override
+ Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+ safelyVisitNode(node.variables);
+ sink.write(";");
+ return null;
+ }
+
+ @override
+ Object visitWhileStatement(WhileStatement node) {
+ sink.write("while (");
+ safelyVisitNode(node.condition);
+ sink.write(") ");
+ safelyVisitNode(node.body);
+ return null;
+ }
+
+ @override
+ Object visitWithClause(WithClause node) {
+ sink.write("with ");
+ safelyVisitNodeListWithSeparator(node.mixinTypes, ", ");
+ return null;
+ }
+
+ @override
+ Object visitYieldStatement(YieldStatement node) {
+ if (node.star != null) {
+ sink.write("yield* ");
+ } else {
+ sink.write("yield ");
+ }
+ safelyVisitNode(node.expression);
+ sink.write(";");
+ return null;
+ }
+}
« no previous file with comments | « no previous file | pkg/analyzer/test/src/dart/ast/utilities_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698