OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'dart:io'; | 5 import 'dart:io'; |
6 | 6 |
7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
8 import 'package:analyzer/dart/ast/token.dart'; | 8 import 'package:analyzer/dart/ast/token.dart'; |
9 import 'package:analyzer/dart/element/element.dart'; | 9 import 'package:analyzer/dart/element/element.dart'; |
10 import 'package:analyzer/dart/element/type.dart'; | 10 import 'package:analyzer/dart/element/type.dart'; |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 void writeExportElement(ExportElement e) { | 262 void writeExportElement(ExportElement e) { |
263 writeMetadata(e, '', '\n'); | 263 writeMetadata(e, '', '\n'); |
264 buffer.write('export '); | 264 buffer.write('export '); |
265 writeUri(e.exportedLibrary?.source); | 265 writeUri(e.exportedLibrary?.source); |
266 | 266 |
267 e.combinators.forEach(writeNamespaceCombinator); | 267 e.combinators.forEach(writeNamespaceCombinator); |
268 | 268 |
269 buffer.writeln(';'); | 269 buffer.writeln(';'); |
270 } | 270 } |
271 | 271 |
272 void writeExpression(AstNode e) { | 272 void writeExpression(AstNode e, [Expression enclosing]) { |
| 273 bool needsParenthesis = e is Expression && |
| 274 enclosing != null && |
| 275 e.precedence < enclosing.precedence; |
| 276 |
| 277 if (needsParenthesis) { |
| 278 buffer.write('('); |
| 279 } |
| 280 |
273 if (e is Annotation) { | 281 if (e is Annotation) { |
274 buffer.write('@'); | 282 buffer.write('@'); |
275 writeExpression(e.name); | 283 writeExpression(e.name); |
276 if (e.constructorName != null) { | 284 if (e.constructorName != null) { |
277 buffer.write('.'); | 285 buffer.write('.'); |
278 writeExpression(e.constructorName); | 286 writeExpression(e.constructorName); |
279 } | 287 } |
280 if (e.arguments != null) { | 288 if (e.arguments != null) { |
281 writeList('(', ')', e.arguments.arguments, ', ', writeExpression, | 289 writeList('(', ')', e.arguments.arguments, ', ', writeExpression, |
282 includeEmpty: true); | 290 includeEmpty: true); |
283 } | 291 } |
284 } else if (e is AssertInitializer) { | 292 } else if (e is AssertInitializer) { |
285 buffer.write('assert('); | 293 buffer.write('assert('); |
286 writeExpression(e.condition); | 294 writeExpression(e.condition); |
287 if (e.message != null) { | 295 if (e.message != null) { |
288 buffer.write(', '); | 296 buffer.write(', '); |
289 writeExpression(e.message); | 297 writeExpression(e.message); |
290 } | 298 } |
291 buffer.write(')'); | 299 buffer.write(')'); |
292 } else if (e is BinaryExpression) { | 300 } else if (e is BinaryExpression) { |
293 writeExpression(e.leftOperand); | 301 writeExpression(e.leftOperand, e); |
294 buffer.write(' '); | 302 buffer.write(' '); |
295 buffer.write(e.operator.lexeme); | 303 buffer.write(e.operator.lexeme); |
296 buffer.write(' '); | 304 buffer.write(' '); |
297 writeExpression(e.rightOperand); | 305 writeExpression(e.rightOperand, e); |
298 } else if (e is BooleanLiteral) { | 306 } else if (e is BooleanLiteral) { |
299 buffer.write(e.value); | 307 buffer.write(e.value); |
300 } else if (e is ConditionalExpression) { | 308 } else if (e is ConditionalExpression) { |
301 writeExpression(e.condition); | 309 writeExpression(e.condition); |
302 buffer.write(' ? '); | 310 buffer.write(' ? '); |
303 writeExpression(e.thenExpression); | 311 writeExpression(e.thenExpression); |
304 buffer.write(' : '); | 312 buffer.write(' : '); |
305 writeExpression(e.elseExpression); | 313 writeExpression(e.elseExpression); |
306 } else if (e is ConstructorFieldInitializer) { | 314 } else if (e is ConstructorFieldInitializer) { |
307 writeExpression(e.fieldName); | 315 writeExpression(e.fieldName); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 writeExpression(e.key); | 361 writeExpression(e.key); |
354 buffer.write(': '); | 362 buffer.write(': '); |
355 writeExpression(e.value); | 363 writeExpression(e.value); |
356 } else if (e is NamedExpression) { | 364 } else if (e is NamedExpression) { |
357 writeExpression(e.name); | 365 writeExpression(e.name); |
358 buffer.write(e.expression); | 366 buffer.write(e.expression); |
359 } else if (e is NullLiteral) { | 367 } else if (e is NullLiteral) { |
360 buffer.write('null'); | 368 buffer.write('null'); |
361 } else if (e is PrefixExpression) { | 369 } else if (e is PrefixExpression) { |
362 buffer.write(e.operator.lexeme); | 370 buffer.write(e.operator.lexeme); |
363 writeExpression(e.operand); | 371 writeExpression(e.operand, e); |
364 } else if (e is PrefixedIdentifier) { | 372 } else if (e is PrefixedIdentifier) { |
365 writeExpression(e.prefix); | 373 writeExpression(e.prefix); |
366 buffer.write('.'); | 374 buffer.write('.'); |
367 writeExpression(e.identifier); | 375 writeExpression(e.identifier); |
368 } else if (e is PropertyAccess) { | 376 } else if (e is PropertyAccess) { |
369 writeExpression(e.target); | 377 writeExpression(e.target, e); |
370 buffer.write('.'); | 378 buffer.write('.'); |
371 writeExpression(e.propertyName); | 379 writeExpression(e.propertyName); |
372 } else if (e is RedirectingConstructorInvocation) { | 380 } else if (e is RedirectingConstructorInvocation) { |
373 buffer.write('this'); | 381 buffer.write('this'); |
374 if (e.constructorName != null) { | 382 if (e.constructorName != null) { |
375 buffer.write('.'); | 383 buffer.write('.'); |
376 writeExpression(e.constructorName); | 384 writeExpression(e.constructorName); |
377 } | 385 } |
378 writeList('(', ')', e.argumentList.arguments, ', ', writeExpression, | 386 writeList('(', ')', e.argumentList.arguments, ', ', writeExpression, |
379 includeEmpty: true); | 387 includeEmpty: true); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 } else if (e is ThisExpression) { | 422 } else if (e is ThisExpression) { |
415 buffer.write('this'); | 423 buffer.write('this'); |
416 } else if (e is TypeName) { | 424 } else if (e is TypeName) { |
417 writeExpression(e.name); | 425 writeExpression(e.name); |
418 if (e.typeArguments != null) { | 426 if (e.typeArguments != null) { |
419 writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression); | 427 writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression); |
420 } | 428 } |
421 } else { | 429 } else { |
422 fail('Unsupported expression type: ${e.runtimeType}'); | 430 fail('Unsupported expression type: ${e.runtimeType}'); |
423 } | 431 } |
| 432 |
| 433 if (needsParenthesis) { |
| 434 buffer.write(')'); |
| 435 } |
424 } | 436 } |
425 | 437 |
426 void writeFunctionElement(FunctionElement e) { | 438 void writeFunctionElement(FunctionElement e) { |
427 writeDocumentation(e); | 439 writeDocumentation(e); |
428 writeMetadata(e, '', '\n'); | 440 writeMetadata(e, '', '\n'); |
429 | 441 |
430 writeIf(e.isExternal, 'external '); | 442 writeIf(e.isExternal, 'external '); |
431 | 443 |
432 writeType2(e.returnType); | 444 writeType2(e.returnType); |
433 | 445 |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 return components.join(';'); | 870 return components.join(';'); |
859 } | 871 } |
860 } | 872 } |
861 | 873 |
862 class _Replacement { | 874 class _Replacement { |
863 final int offset; | 875 final int offset; |
864 final int end; | 876 final int end; |
865 final String text; | 877 final String text; |
866 _Replacement(this.offset, this.end, this.text); | 878 _Replacement(this.offset, this.end, this.text); |
867 } | 879 } |
OLD | NEW |