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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.src.dart.ast.utilities; 5 library analyzer.src.dart.ast.utilities;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
11 import 'package:analyzer/dart/ast/visitor.dart'; 11 import 'package:analyzer/dart/ast/visitor.dart';
12 import 'package:analyzer/dart/element/element.dart'; 12 import 'package:analyzer/dart/element/element.dart';
13 import 'package:analyzer/exception/exception.dart'; 13 import 'package:analyzer/exception/exception.dart';
14 import 'package:analyzer/src/dart/ast/ast.dart'; 14 import 'package:analyzer/src/dart/ast/ast.dart';
15 import 'package:analyzer/src/dart/ast/token.dart'; 15 import 'package:analyzer/src/dart/ast/token.dart';
16 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine; 16 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
17 import 'package:analyzer/src/generated/java_core.dart'; 17 import 'package:analyzer/src/generated/java_core.dart';
18 import 'package:analyzer/src/generated/utilities_collection.dart' show TokenMap; 18 import 'package:analyzer/src/generated/utilities_collection.dart' show TokenMap;
19 import 'package:analyzer/src/generated/utilities_dart.dart'; 19 import 'package:analyzer/src/generated/utilities_dart.dart';
20 import 'package:meta/meta.dart';
20 21
21 /** 22 /**
22 * A function used to handle exceptions that are thrown by delegates while using 23 * A function used to handle exceptions that are thrown by delegates while using
23 * an [ExceptionHandlingDelegatingAstVisitor]. 24 * an [ExceptionHandlingDelegatingAstVisitor].
24 */ 25 */
25 typedef void ExceptionInDelegateHandler( 26 typedef void ExceptionInDelegateHandler(
26 AstNode node, AstVisitor visitor, dynamic exception, StackTrace stackTrace); 27 AstNode node, AstVisitor visitor, dynamic exception, StackTrace stackTrace);
27 28
28 /** 29 /**
29 * An AST visitor that will clone any AST structure that it visits. The cloner 30 * An AST visitor that will clone any AST structure that it visits. The cloner
(...skipping 7876 matching lines...) Expand 10 before | Expand all | Expand 10 after
7906 * Safely visit the given [token], printing the [suffix] after the token if it 7907 * Safely visit the given [token], printing the [suffix] after the token if it
7907 * is non-`null`. 7908 * is non-`null`.
7908 */ 7909 */
7909 void _visitTokenWithSuffix(Token token, String suffix) { 7910 void _visitTokenWithSuffix(Token token, String suffix) {
7910 if (token != null) { 7911 if (token != null) {
7911 _writer.print(token.lexeme); 7912 _writer.print(token.lexeme);
7912 _writer.print(suffix); 7913 _writer.print(suffix);
7913 } 7914 }
7914 } 7915 }
7915 } 7916 }
7917
7918 /**
7919 * A visitor used to write a source representation of a visited AST node (and
7920 * all of it's children) to a sink.
7921 */
7922 class ToSourceVisitor2 implements AstVisitor<Object> {
7923 /**
7924 * The sink to which the source is to be written.
7925 */
7926 @protected
7927 final StringSink sink;
7928
7929 /**
7930 * Initialize a newly created visitor to write source code representing the
7931 * visited nodes to the given [sink].
7932 */
7933 ToSourceVisitor2(this.sink);
7934
7935 /**
7936 * Visit the given function [body], printing the [prefix] before if the body
7937 * is not empty.
7938 */
7939 @protected
7940 void safelyVisitFunctionWithPrefix(String prefix, FunctionBody body) {
7941 if (body is! EmptyFunctionBody) {
7942 sink.write(prefix);
7943 }
7944 safelyVisitNode(body);
7945 }
7946
7947 /**
7948 * Safely visit the given [node].
7949 */
7950 @protected
7951 void safelyVisitNode(AstNode node) {
7952 if (node != null) {
7953 node.accept(this);
7954 }
7955 }
7956
7957 /**
7958 * Print a list of [nodes] without any separation.
7959 */
7960 @protected
7961 void safelyVisitNodeList(NodeList<AstNode> nodes) {
7962 safelyVisitNodeListWithSeparator(nodes, "");
7963 }
7964
7965 /**
7966 * Print a list of [nodes], separated by the given [separator].
7967 */
7968 @protected
7969 void safelyVisitNodeListWithSeparator(
7970 NodeList<AstNode> nodes, String separator) {
7971 if (nodes != null) {
7972 int size = nodes.length;
7973 for (int i = 0; i < size; i++) {
7974 if (i > 0) {
7975 sink.write(separator);
7976 }
7977 nodes[i].accept(this);
7978 }
7979 }
7980 }
7981
7982 /**
7983 * Print a list of [nodes], prefixed by the given [prefix] if the list is not
7984 * empty, and separated by the given [separator].
7985 */
7986 @protected
7987 void safelyVisitNodeListWithSeparatorAndPrefix(
7988 String prefix, NodeList<AstNode> nodes, String separator) {
7989 if (nodes != null) {
7990 int size = nodes.length;
7991 if (size > 0) {
7992 sink.write(prefix);
7993 for (int i = 0; i < size; i++) {
7994 if (i > 0) {
7995 sink.write(separator);
7996 }
7997 nodes[i].accept(this);
7998 }
7999 }
8000 }
8001 }
8002
8003 /**
8004 * Print a list of [nodes], separated by the given [separator], followed by
8005 * the given [suffix] if the list is not empty.
8006 */
8007 @protected
8008 void safelyVisitNodeListWithSeparatorAndSuffix(
8009 NodeList<AstNode> nodes, String separator, String suffix) {
8010 if (nodes != null) {
8011 int size = nodes.length;
8012 if (size > 0) {
8013 for (int i = 0; i < size; i++) {
8014 if (i > 0) {
8015 sink.write(separator);
8016 }
8017 nodes[i].accept(this);
8018 }
8019 sink.write(suffix);
8020 }
8021 }
8022 }
8023
8024 /**
8025 * Safely visit the given [node], printing the [prefix] before the node if it
8026 * is non-`null`.
8027 */
8028 @protected
8029 void safelyVisitNodeWithPrefix(String prefix, AstNode node) {
8030 if (node != null) {
8031 sink.write(prefix);
8032 node.accept(this);
8033 }
8034 }
8035
8036 /**
8037 * Safely visit the given [node], printing the [suffix] after the node if it
8038 * is non-`null`.
8039 */
8040 @protected
8041 void safelyVisitNodeWithSuffix(AstNode node, String suffix) {
8042 if (node != null) {
8043 node.accept(this);
8044 sink.write(suffix);
8045 }
8046 }
8047
8048 /**
8049 * Safely visit the given [token], printing the [suffix] after the token if it
8050 * is non-`null`.
8051 */
8052 @protected
8053 void safelyVisitTokenWithSuffix(Token token, String suffix) {
8054 if (token != null) {
8055 sink.write(token.lexeme);
8056 sink.write(suffix);
8057 }
8058 }
8059
8060 @override
8061 Object visitAdjacentStrings(AdjacentStrings node) {
8062 safelyVisitNodeListWithSeparator(node.strings, " ");
8063 return null;
8064 }
8065
8066 @override
8067 Object visitAnnotation(Annotation node) {
8068 sink.write('@');
8069 safelyVisitNode(node.name);
8070 safelyVisitNodeWithPrefix(".", node.constructorName);
8071 safelyVisitNode(node.arguments);
8072 return null;
8073 }
8074
8075 @override
8076 Object visitArgumentList(ArgumentList node) {
8077 sink.write('(');
8078 safelyVisitNodeListWithSeparator(node.arguments, ", ");
8079 sink.write(')');
8080 return null;
8081 }
8082
8083 @override
8084 Object visitAsExpression(AsExpression node) {
8085 safelyVisitNode(node.expression);
8086 sink.write(" as ");
8087 safelyVisitNode(node.type);
8088 return null;
8089 }
8090
8091 @override
8092 Object visitAssertStatement(AssertStatement node) {
8093 sink.write("assert (");
8094 safelyVisitNode(node.condition);
8095 if (node.message != null) {
8096 sink.write(', ');
8097 safelyVisitNode(node.message);
8098 }
8099 sink.write(");");
8100 return null;
8101 }
8102
8103 @override
8104 Object visitAssignmentExpression(AssignmentExpression node) {
8105 safelyVisitNode(node.leftHandSide);
8106 sink.write(' ');
8107 sink.write(node.operator.lexeme);
8108 sink.write(' ');
8109 safelyVisitNode(node.rightHandSide);
8110 return null;
8111 }
8112
8113 @override
8114 Object visitAwaitExpression(AwaitExpression node) {
8115 sink.write("await ");
8116 safelyVisitNode(node.expression);
8117 return null;
8118 }
8119
8120 @override
8121 Object visitBinaryExpression(BinaryExpression node) {
8122 safelyVisitNode(node.leftOperand);
8123 sink.write(' ');
8124 sink.write(node.operator.lexeme);
8125 sink.write(' ');
8126 safelyVisitNode(node.rightOperand);
8127 return null;
8128 }
8129
8130 @override
8131 Object visitBlock(Block node) {
8132 sink.write('{');
8133 safelyVisitNodeListWithSeparator(node.statements, " ");
8134 sink.write('}');
8135 return null;
8136 }
8137
8138 @override
8139 Object visitBlockFunctionBody(BlockFunctionBody node) {
8140 Token keyword = node.keyword;
8141 if (keyword != null) {
8142 sink.write(keyword.lexeme);
8143 if (node.star != null) {
8144 sink.write('*');
8145 }
8146 sink.write(' ');
8147 }
8148 safelyVisitNode(node.block);
8149 return null;
8150 }
8151
8152 @override
8153 Object visitBooleanLiteral(BooleanLiteral node) {
8154 sink.write(node.literal.lexeme);
8155 return null;
8156 }
8157
8158 @override
8159 Object visitBreakStatement(BreakStatement node) {
8160 sink.write("break");
8161 safelyVisitNodeWithPrefix(" ", node.label);
8162 sink.write(";");
8163 return null;
8164 }
8165
8166 @override
8167 Object visitCascadeExpression(CascadeExpression node) {
8168 safelyVisitNode(node.target);
8169 safelyVisitNodeList(node.cascadeSections);
8170 return null;
8171 }
8172
8173 @override
8174 Object visitCatchClause(CatchClause node) {
8175 safelyVisitNodeWithPrefix("on ", node.exceptionType);
8176 if (node.catchKeyword != null) {
8177 if (node.exceptionType != null) {
8178 sink.write(' ');
8179 }
8180 sink.write("catch (");
8181 safelyVisitNode(node.exceptionParameter);
8182 safelyVisitNodeWithPrefix(", ", node.stackTraceParameter);
8183 sink.write(") ");
8184 } else {
8185 sink.write(" ");
8186 }
8187 safelyVisitNode(node.body);
8188 return null;
8189 }
8190
8191 @override
8192 Object visitClassDeclaration(ClassDeclaration node) {
8193 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8194 safelyVisitTokenWithSuffix(node.abstractKeyword, " ");
8195 sink.write("class ");
8196 safelyVisitNode(node.name);
8197 safelyVisitNode(node.typeParameters);
8198 safelyVisitNodeWithPrefix(" ", node.extendsClause);
8199 safelyVisitNodeWithPrefix(" ", node.withClause);
8200 safelyVisitNodeWithPrefix(" ", node.implementsClause);
8201 sink.write(" {");
8202 safelyVisitNodeListWithSeparator(node.members, " ");
8203 sink.write("}");
8204 return null;
8205 }
8206
8207 @override
8208 Object visitClassTypeAlias(ClassTypeAlias node) {
8209 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8210 if (node.abstractKeyword != null) {
8211 sink.write("abstract ");
8212 }
8213 sink.write("class ");
8214 safelyVisitNode(node.name);
8215 safelyVisitNode(node.typeParameters);
8216 sink.write(" = ");
8217 safelyVisitNode(node.superclass);
8218 safelyVisitNodeWithPrefix(" ", node.withClause);
8219 safelyVisitNodeWithPrefix(" ", node.implementsClause);
8220 sink.write(";");
8221 return null;
8222 }
8223
8224 @override
8225 Object visitComment(Comment node) => null;
8226
8227 @override
8228 Object visitCommentReference(CommentReference node) => null;
8229
8230 @override
8231 Object visitCompilationUnit(CompilationUnit node) {
8232 ScriptTag scriptTag = node.scriptTag;
8233 NodeList<Directive> directives = node.directives;
8234 safelyVisitNode(scriptTag);
8235 String prefix = scriptTag == null ? "" : " ";
8236 safelyVisitNodeListWithSeparatorAndPrefix(prefix, directives, " ");
8237 prefix = scriptTag == null && directives.isEmpty ? "" : " ";
8238 safelyVisitNodeListWithSeparatorAndPrefix(prefix, node.declarations, " ");
8239 return null;
8240 }
8241
8242 @override
8243 Object visitConditionalExpression(ConditionalExpression node) {
8244 safelyVisitNode(node.condition);
8245 sink.write(" ? ");
8246 safelyVisitNode(node.thenExpression);
8247 sink.write(" : ");
8248 safelyVisitNode(node.elseExpression);
8249 return null;
8250 }
8251
8252 @override
8253 Object visitConfiguration(Configuration node) {
8254 sink.write('if (');
8255 safelyVisitNode(node.name);
8256 safelyVisitNodeWithPrefix(" == ", node.value);
8257 sink.write(') ');
8258 safelyVisitNode(node.uri);
8259 return null;
8260 }
8261
8262 @override
8263 Object visitConstructorDeclaration(ConstructorDeclaration node) {
8264 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8265 safelyVisitTokenWithSuffix(node.externalKeyword, " ");
8266 safelyVisitTokenWithSuffix(node.constKeyword, " ");
8267 safelyVisitTokenWithSuffix(node.factoryKeyword, " ");
8268 safelyVisitNode(node.returnType);
8269 safelyVisitNodeWithPrefix(".", node.name);
8270 safelyVisitNode(node.parameters);
8271 safelyVisitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
8272 safelyVisitNodeWithPrefix(" = ", node.redirectedConstructor);
8273 safelyVisitFunctionWithPrefix(" ", node.body);
8274 return null;
8275 }
8276
8277 @override
8278 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
8279 safelyVisitTokenWithSuffix(node.thisKeyword, ".");
8280 safelyVisitNode(node.fieldName);
8281 sink.write(" = ");
8282 safelyVisitNode(node.expression);
8283 return null;
8284 }
8285
8286 @override
8287 Object visitConstructorName(ConstructorName node) {
8288 safelyVisitNode(node.type);
8289 safelyVisitNodeWithPrefix(".", node.name);
8290 return null;
8291 }
8292
8293 @override
8294 Object visitContinueStatement(ContinueStatement node) {
8295 sink.write("continue");
8296 safelyVisitNodeWithPrefix(" ", node.label);
8297 sink.write(";");
8298 return null;
8299 }
8300
8301 @override
8302 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
8303 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8304 safelyVisitTokenWithSuffix(node.keyword, " ");
8305 safelyVisitNodeWithSuffix(node.type, " ");
8306 safelyVisitNode(node.identifier);
8307 return null;
8308 }
8309
8310 @override
8311 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
8312 safelyVisitNode(node.parameter);
8313 if (node.separator != null) {
8314 sink.write(" ");
8315 sink.write(node.separator.lexeme);
8316 safelyVisitNodeWithPrefix(" ", node.defaultValue);
8317 }
8318 return null;
8319 }
8320
8321 @override
8322 Object visitDoStatement(DoStatement node) {
8323 sink.write("do ");
8324 safelyVisitNode(node.body);
8325 sink.write(" while (");
8326 safelyVisitNode(node.condition);
8327 sink.write(");");
8328 return null;
8329 }
8330
8331 @override
8332 Object visitDottedName(DottedName node) {
8333 safelyVisitNodeListWithSeparator(node.components, ".");
8334 return null;
8335 }
8336
8337 @override
8338 Object visitDoubleLiteral(DoubleLiteral node) {
8339 sink.write(node.literal.lexeme);
8340 return null;
8341 }
8342
8343 @override
8344 Object visitEmptyFunctionBody(EmptyFunctionBody node) {
8345 sink.write(';');
8346 return null;
8347 }
8348
8349 @override
8350 Object visitEmptyStatement(EmptyStatement node) {
8351 sink.write(';');
8352 return null;
8353 }
8354
8355 @override
8356 Object visitEnumConstantDeclaration(EnumConstantDeclaration node) {
8357 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8358 safelyVisitNode(node.name);
8359 return null;
8360 }
8361
8362 @override
8363 Object visitEnumDeclaration(EnumDeclaration node) {
8364 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8365 sink.write("enum ");
8366 safelyVisitNode(node.name);
8367 sink.write(" {");
8368 safelyVisitNodeListWithSeparator(node.constants, ", ");
8369 sink.write("}");
8370 return null;
8371 }
8372
8373 @override
8374 Object visitExportDirective(ExportDirective node) {
8375 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8376 sink.write("export ");
8377 safelyVisitNode(node.uri);
8378 safelyVisitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
8379 sink.write(';');
8380 return null;
8381 }
8382
8383 @override
8384 Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
8385 Token keyword = node.keyword;
8386 if (keyword != null) {
8387 sink.write(keyword.lexeme);
8388 sink.write(' ');
8389 }
8390 sink.write("=> ");
8391 safelyVisitNode(node.expression);
8392 if (node.semicolon != null) {
8393 sink.write(';');
8394 }
8395 return null;
8396 }
8397
8398 @override
8399 Object visitExpressionStatement(ExpressionStatement node) {
8400 safelyVisitNode(node.expression);
8401 sink.write(';');
8402 return null;
8403 }
8404
8405 @override
8406 Object visitExtendsClause(ExtendsClause node) {
8407 sink.write("extends ");
8408 safelyVisitNode(node.superclass);
8409 return null;
8410 }
8411
8412 @override
8413 Object visitFieldDeclaration(FieldDeclaration node) {
8414 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8415 safelyVisitTokenWithSuffix(node.staticKeyword, " ");
8416 safelyVisitNode(node.fields);
8417 sink.write(";");
8418 return null;
8419 }
8420
8421 @override
8422 Object visitFieldFormalParameter(FieldFormalParameter node) {
8423 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
8424 safelyVisitTokenWithSuffix(node.keyword, " ");
8425 safelyVisitNodeWithSuffix(node.type, " ");
8426 sink.write("this.");
8427 safelyVisitNode(node.identifier);
8428 safelyVisitNode(node.typeParameters);
8429 safelyVisitNode(node.parameters);
8430 return null;
8431 }
8432
8433 @override
8434 Object visitForEachStatement(ForEachStatement node) {
8435 DeclaredIdentifier loopVariable = node.loopVariable;
8436 if (node.awaitKeyword != null) {
8437 sink.write("await ");
8438 }
8439 sink.write("for (");
8440 if (loopVariable == null) {
8441 safelyVisitNode(node.identifier);
8442 } else {
8443 safelyVisitNode(loopVariable);
8444 }
8445 sink.write(" in ");
8446 safelyVisitNode(node.iterable);
8447 sink.write(") ");
8448 safelyVisitNode(node.body);
8449 return null;
8450 }
8451
8452 @override
8453 Object visitFormalParameterList(FormalParameterList node) {
8454 String groupEnd = null;
8455 sink.write('(');
8456 NodeList<FormalParameter> parameters = node.parameters;
8457 int size = parameters.length;
8458 for (int i = 0; i < size; i++) {
8459 FormalParameter parameter = parameters[i];
8460 if (i > 0) {
8461 sink.write(", ");
8462 }
8463 if (groupEnd == null && parameter is DefaultFormalParameter) {
8464 if (parameter.kind == ParameterKind.NAMED) {
8465 groupEnd = "}";
8466 sink.write('{');
8467 } else {
8468 groupEnd = "]";
8469 sink.write('[');
8470 }
8471 }
8472 parameter.accept(this);
8473 }
8474 if (groupEnd != null) {
8475 sink.write(groupEnd);
8476 }
8477 sink.write(')');
8478 return null;
8479 }
8480
8481 @override
8482 Object visitForStatement(ForStatement node) {
8483 Expression initialization = node.initialization;
8484 sink.write("for (");
8485 if (initialization != null) {
8486 safelyVisitNode(initialization);
8487 } else {
8488 safelyVisitNode(node.variables);
8489 }
8490 sink.write(";");
8491 safelyVisitNodeWithPrefix(" ", node.condition);
8492 sink.write(";");
8493 safelyVisitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
8494 sink.write(") ");
8495 safelyVisitNode(node.body);
8496 return null;
8497 }
8498
8499 @override
8500 Object visitFunctionDeclaration(FunctionDeclaration node) {
8501 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8502 safelyVisitTokenWithSuffix(node.externalKeyword, " ");
8503 safelyVisitNodeWithSuffix(node.returnType, " ");
8504 safelyVisitTokenWithSuffix(node.propertyKeyword, " ");
8505 safelyVisitNode(node.name);
8506 safelyVisitNode(node.functionExpression);
8507 return null;
8508 }
8509
8510 @override
8511 Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
8512 safelyVisitNode(node.functionDeclaration);
8513 return null;
8514 }
8515
8516 @override
8517 Object visitFunctionExpression(FunctionExpression node) {
8518 safelyVisitNode(node.typeParameters);
8519 safelyVisitNode(node.parameters);
8520 if (node.body is! EmptyFunctionBody) {
8521 sink.write(' ');
8522 }
8523 safelyVisitNode(node.body);
8524 return null;
8525 }
8526
8527 @override
8528 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
8529 safelyVisitNode(node.function);
8530 safelyVisitNode(node.typeArguments);
8531 safelyVisitNode(node.argumentList);
8532 return null;
8533 }
8534
8535 @override
8536 Object visitFunctionTypeAlias(FunctionTypeAlias node) {
8537 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8538 sink.write("typedef ");
8539 safelyVisitNodeWithSuffix(node.returnType, " ");
8540 safelyVisitNode(node.name);
8541 safelyVisitNode(node.typeParameters);
8542 safelyVisitNode(node.parameters);
8543 sink.write(";");
8544 return null;
8545 }
8546
8547 @override
8548 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
8549 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
8550 safelyVisitNodeWithSuffix(node.returnType, " ");
8551 safelyVisitNode(node.identifier);
8552 safelyVisitNode(node.typeParameters);
8553 safelyVisitNode(node.parameters);
8554 if (node.question != null) {
8555 sink.write('?');
8556 }
8557 return null;
8558 }
8559
8560 @override
8561 Object visitHideCombinator(HideCombinator node) {
8562 sink.write("hide ");
8563 safelyVisitNodeListWithSeparator(node.hiddenNames, ", ");
8564 return null;
8565 }
8566
8567 @override
8568 Object visitIfStatement(IfStatement node) {
8569 sink.write("if (");
8570 safelyVisitNode(node.condition);
8571 sink.write(") ");
8572 safelyVisitNode(node.thenStatement);
8573 safelyVisitNodeWithPrefix(" else ", node.elseStatement);
8574 return null;
8575 }
8576
8577 @override
8578 Object visitImplementsClause(ImplementsClause node) {
8579 sink.write("implements ");
8580 safelyVisitNodeListWithSeparator(node.interfaces, ", ");
8581 return null;
8582 }
8583
8584 @override
8585 Object visitImportDirective(ImportDirective node) {
8586 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8587 sink.write("import ");
8588 safelyVisitNode(node.uri);
8589 if (node.deferredKeyword != null) {
8590 sink.write(" deferred");
8591 }
8592 safelyVisitNodeWithPrefix(" as ", node.prefix);
8593 safelyVisitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
8594 sink.write(';');
8595 return null;
8596 }
8597
8598 @override
8599 Object visitIndexExpression(IndexExpression node) {
8600 if (node.isCascaded) {
8601 sink.write("..");
8602 } else {
8603 safelyVisitNode(node.target);
8604 }
8605 sink.write('[');
8606 safelyVisitNode(node.index);
8607 sink.write(']');
8608 return null;
8609 }
8610
8611 @override
8612 Object visitInstanceCreationExpression(InstanceCreationExpression node) {
8613 safelyVisitTokenWithSuffix(node.keyword, " ");
8614 safelyVisitNode(node.constructorName);
8615 safelyVisitNode(node.argumentList);
8616 return null;
8617 }
8618
8619 @override
8620 Object visitIntegerLiteral(IntegerLiteral node) {
8621 sink.write(node.literal.lexeme);
8622 return null;
8623 }
8624
8625 @override
8626 Object visitInterpolationExpression(InterpolationExpression node) {
8627 if (node.rightBracket != null) {
8628 sink.write("\${");
8629 safelyVisitNode(node.expression);
8630 sink.write("}");
8631 } else {
8632 sink.write("\$");
8633 safelyVisitNode(node.expression);
8634 }
8635 return null;
8636 }
8637
8638 @override
8639 Object visitInterpolationString(InterpolationString node) {
8640 sink.write(node.contents.lexeme);
8641 return null;
8642 }
8643
8644 @override
8645 Object visitIsExpression(IsExpression node) {
8646 safelyVisitNode(node.expression);
8647 if (node.notOperator == null) {
8648 sink.write(" is ");
8649 } else {
8650 sink.write(" is! ");
8651 }
8652 safelyVisitNode(node.type);
8653 return null;
8654 }
8655
8656 @override
8657 Object visitLabel(Label node) {
8658 safelyVisitNode(node.label);
8659 sink.write(":");
8660 return null;
8661 }
8662
8663 @override
8664 Object visitLabeledStatement(LabeledStatement node) {
8665 safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
8666 safelyVisitNode(node.statement);
8667 return null;
8668 }
8669
8670 @override
8671 Object visitLibraryDirective(LibraryDirective node) {
8672 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8673 sink.write("library ");
8674 safelyVisitNode(node.name);
8675 sink.write(';');
8676 return null;
8677 }
8678
8679 @override
8680 Object visitLibraryIdentifier(LibraryIdentifier node) {
8681 sink.write(node.name);
8682 return null;
8683 }
8684
8685 @override
8686 Object visitListLiteral(ListLiteral node) {
8687 if (node.constKeyword != null) {
8688 sink.write(node.constKeyword.lexeme);
8689 sink.write(' ');
8690 }
8691 safelyVisitNodeWithSuffix(node.typeArguments, " ");
8692 sink.write("[");
8693 safelyVisitNodeListWithSeparator(node.elements, ", ");
8694 sink.write("]");
8695 return null;
8696 }
8697
8698 @override
8699 Object visitMapLiteral(MapLiteral node) {
8700 if (node.constKeyword != null) {
8701 sink.write(node.constKeyword.lexeme);
8702 sink.write(' ');
8703 }
8704 safelyVisitNodeWithSuffix(node.typeArguments, " ");
8705 sink.write("{");
8706 safelyVisitNodeListWithSeparator(node.entries, ", ");
8707 sink.write("}");
8708 return null;
8709 }
8710
8711 @override
8712 Object visitMapLiteralEntry(MapLiteralEntry node) {
8713 safelyVisitNode(node.key);
8714 sink.write(" : ");
8715 safelyVisitNode(node.value);
8716 return null;
8717 }
8718
8719 @override
8720 Object visitMethodDeclaration(MethodDeclaration node) {
8721 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8722 safelyVisitTokenWithSuffix(node.externalKeyword, " ");
8723 safelyVisitTokenWithSuffix(node.modifierKeyword, " ");
8724 safelyVisitNodeWithSuffix(node.returnType, " ");
8725 safelyVisitTokenWithSuffix(node.propertyKeyword, " ");
8726 safelyVisitTokenWithSuffix(node.operatorKeyword, " ");
8727 safelyVisitNode(node.name);
8728 if (!node.isGetter) {
8729 safelyVisitNode(node.typeParameters);
8730 safelyVisitNode(node.parameters);
8731 }
8732 safelyVisitFunctionWithPrefix(" ", node.body);
8733 return null;
8734 }
8735
8736 @override
8737 Object visitMethodInvocation(MethodInvocation node) {
8738 if (node.isCascaded) {
8739 sink.write("..");
8740 } else {
8741 if (node.target != null) {
8742 node.target.accept(this);
8743 sink.write(node.operator.lexeme);
8744 }
8745 }
8746 safelyVisitNode(node.methodName);
8747 safelyVisitNode(node.typeArguments);
8748 safelyVisitNode(node.argumentList);
8749 return null;
8750 }
8751
8752 @override
8753 Object visitNamedExpression(NamedExpression node) {
8754 safelyVisitNode(node.name);
8755 safelyVisitNodeWithPrefix(" ", node.expression);
8756 return null;
8757 }
8758
8759 @override
8760 Object visitNativeClause(NativeClause node) {
8761 sink.write("native ");
8762 safelyVisitNode(node.name);
8763 return null;
8764 }
8765
8766 @override
8767 Object visitNativeFunctionBody(NativeFunctionBody node) {
8768 sink.write("native ");
8769 safelyVisitNode(node.stringLiteral);
8770 sink.write(';');
8771 return null;
8772 }
8773
8774 @override
8775 Object visitNullLiteral(NullLiteral node) {
8776 sink.write("null");
8777 return null;
8778 }
8779
8780 @override
8781 Object visitParenthesizedExpression(ParenthesizedExpression node) {
8782 sink.write('(');
8783 safelyVisitNode(node.expression);
8784 sink.write(')');
8785 return null;
8786 }
8787
8788 @override
8789 Object visitPartDirective(PartDirective node) {
8790 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8791 sink.write("part ");
8792 safelyVisitNode(node.uri);
8793 sink.write(';');
8794 return null;
8795 }
8796
8797 @override
8798 Object visitPartOfDirective(PartOfDirective node) {
8799 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
8800 sink.write("part of ");
8801 safelyVisitNode(node.libraryName);
8802 sink.write(';');
8803 return null;
8804 }
8805
8806 @override
8807 Object visitPostfixExpression(PostfixExpression node) {
8808 safelyVisitNode(node.operand);
8809 sink.write(node.operator.lexeme);
8810 return null;
8811 }
8812
8813 @override
8814 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
8815 safelyVisitNode(node.prefix);
8816 sink.write('.');
8817 safelyVisitNode(node.identifier);
8818 return null;
8819 }
8820
8821 @override
8822 Object visitPrefixExpression(PrefixExpression node) {
8823 sink.write(node.operator.lexeme);
8824 safelyVisitNode(node.operand);
8825 return null;
8826 }
8827
8828 @override
8829 Object visitPropertyAccess(PropertyAccess node) {
8830 if (node.isCascaded) {
8831 sink.write("..");
8832 } else {
8833 safelyVisitNode(node.target);
8834 sink.write(node.operator.lexeme);
8835 }
8836 safelyVisitNode(node.propertyName);
8837 return null;
8838 }
8839
8840 @override
8841 Object visitRedirectingConstructorInvocation(
8842 RedirectingConstructorInvocation node) {
8843 sink.write("this");
8844 safelyVisitNodeWithPrefix(".", node.constructorName);
8845 safelyVisitNode(node.argumentList);
8846 return null;
8847 }
8848
8849 @override
8850 Object visitRethrowExpression(RethrowExpression node) {
8851 sink.write("rethrow");
8852 return null;
8853 }
8854
8855 @override
8856 Object visitReturnStatement(ReturnStatement node) {
8857 Expression expression = node.expression;
8858 if (expression == null) {
8859 sink.write("return;");
8860 } else {
8861 sink.write("return ");
8862 expression.accept(this);
8863 sink.write(";");
8864 }
8865 return null;
8866 }
8867
8868 @override
8869 Object visitScriptTag(ScriptTag node) {
8870 sink.write(node.scriptTag.lexeme);
8871 return null;
8872 }
8873
8874 @override
8875 Object visitShowCombinator(ShowCombinator node) {
8876 sink.write("show ");
8877 safelyVisitNodeListWithSeparator(node.shownNames, ", ");
8878 return null;
8879 }
8880
8881 @override
8882 Object visitSimpleFormalParameter(SimpleFormalParameter node) {
8883 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
8884 safelyVisitTokenWithSuffix(node.keyword, " ");
8885 safelyVisitNodeWithSuffix(node.type, " ");
8886 safelyVisitNode(node.identifier);
8887 return null;
8888 }
8889
8890 @override
8891 Object visitSimpleIdentifier(SimpleIdentifier node) {
8892 sink.write(node.token.lexeme);
8893 return null;
8894 }
8895
8896 @override
8897 Object visitSimpleStringLiteral(SimpleStringLiteral node) {
8898 sink.write(node.literal.lexeme);
8899 return null;
8900 }
8901
8902 @override
8903 Object visitStringInterpolation(StringInterpolation node) {
8904 safelyVisitNodeList(node.elements);
8905 return null;
8906 }
8907
8908 @override
8909 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
8910 sink.write("super");
8911 safelyVisitNodeWithPrefix(".", node.constructorName);
8912 safelyVisitNode(node.argumentList);
8913 return null;
8914 }
8915
8916 @override
8917 Object visitSuperExpression(SuperExpression node) {
8918 sink.write("super");
8919 return null;
8920 }
8921
8922 @override
8923 Object visitSwitchCase(SwitchCase node) {
8924 safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
8925 sink.write("case ");
8926 safelyVisitNode(node.expression);
8927 sink.write(": ");
8928 safelyVisitNodeListWithSeparator(node.statements, " ");
8929 return null;
8930 }
8931
8932 @override
8933 Object visitSwitchDefault(SwitchDefault node) {
8934 safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
8935 sink.write("default: ");
8936 safelyVisitNodeListWithSeparator(node.statements, " ");
8937 return null;
8938 }
8939
8940 @override
8941 Object visitSwitchStatement(SwitchStatement node) {
8942 sink.write("switch (");
8943 safelyVisitNode(node.expression);
8944 sink.write(") {");
8945 safelyVisitNodeListWithSeparator(node.members, " ");
8946 sink.write("}");
8947 return null;
8948 }
8949
8950 @override
8951 Object visitSymbolLiteral(SymbolLiteral node) {
8952 sink.write("#");
8953 List<Token> components = node.components;
8954 for (int i = 0; i < components.length; i++) {
8955 if (i > 0) {
8956 sink.write(".");
8957 }
8958 sink.write(components[i].lexeme);
8959 }
8960 return null;
8961 }
8962
8963 @override
8964 Object visitThisExpression(ThisExpression node) {
8965 sink.write("this");
8966 return null;
8967 }
8968
8969 @override
8970 Object visitThrowExpression(ThrowExpression node) {
8971 sink.write("throw ");
8972 safelyVisitNode(node.expression);
8973 return null;
8974 }
8975
8976 @override
8977 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
8978 safelyVisitNodeWithSuffix(node.variables, ";");
8979 return null;
8980 }
8981
8982 @override
8983 Object visitTryStatement(TryStatement node) {
8984 sink.write("try ");
8985 safelyVisitNode(node.body);
8986 safelyVisitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
8987 safelyVisitNodeWithPrefix(" finally ", node.finallyBlock);
8988 return null;
8989 }
8990
8991 @override
8992 Object visitTypeArgumentList(TypeArgumentList node) {
8993 sink.write('<');
8994 safelyVisitNodeListWithSeparator(node.arguments, ", ");
8995 sink.write('>');
8996 return null;
8997 }
8998
8999 @override
9000 Object visitTypeName(TypeName node) {
9001 safelyVisitNode(node.name);
9002 safelyVisitNode(node.typeArguments);
9003 if (node.question != null) {
9004 sink.write('?');
9005 }
9006 return null;
9007 }
9008
9009 @override
9010 Object visitTypeParameter(TypeParameter node) {
9011 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
9012 safelyVisitNode(node.name);
9013 safelyVisitNodeWithPrefix(" extends ", node.bound);
9014 return null;
9015 }
9016
9017 @override
9018 Object visitTypeParameterList(TypeParameterList node) {
9019 sink.write('<');
9020 safelyVisitNodeListWithSeparator(node.typeParameters, ", ");
9021 sink.write('>');
9022 return null;
9023 }
9024
9025 @override
9026 Object visitVariableDeclaration(VariableDeclaration node) {
9027 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
9028 safelyVisitNode(node.name);
9029 safelyVisitNodeWithPrefix(" = ", node.initializer);
9030 return null;
9031 }
9032
9033 @override
9034 Object visitVariableDeclarationList(VariableDeclarationList node) {
9035 safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
9036 safelyVisitTokenWithSuffix(node.keyword, " ");
9037 safelyVisitNodeWithSuffix(node.type, " ");
9038 safelyVisitNodeListWithSeparator(node.variables, ", ");
9039 return null;
9040 }
9041
9042 @override
9043 Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
9044 safelyVisitNode(node.variables);
9045 sink.write(";");
9046 return null;
9047 }
9048
9049 @override
9050 Object visitWhileStatement(WhileStatement node) {
9051 sink.write("while (");
9052 safelyVisitNode(node.condition);
9053 sink.write(") ");
9054 safelyVisitNode(node.body);
9055 return null;
9056 }
9057
9058 @override
9059 Object visitWithClause(WithClause node) {
9060 sink.write("with ");
9061 safelyVisitNodeListWithSeparator(node.mixinTypes, ", ");
9062 return null;
9063 }
9064
9065 @override
9066 Object visitYieldStatement(YieldStatement node) {
9067 if (node.star != null) {
9068 sink.write("yield* ");
9069 } else {
9070 sink.write("yield ");
9071 }
9072 safelyVisitNode(node.expression);
9073 sink.write(";");
9074 return null;
9075 }
9076 }
OLDNEW
« 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