| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 summary_resynthesizer; | 5 library summary_resynthesizer; |
| 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/element/element.dart'; | 11 import 'package:analyzer/dart/element/element.dart'; |
| 12 import 'package:analyzer/dart/element/type.dart'; | 12 import 'package:analyzer/dart/element/type.dart'; |
| 13 import 'package:analyzer/src/dart/element/element.dart'; | 13 import 'package:analyzer/src/dart/element/element.dart'; |
| 14 import 'package:analyzer/src/dart/element/handle.dart'; | 14 import 'package:analyzer/src/dart/element/handle.dart'; |
| 15 import 'package:analyzer/src/dart/element/member.dart'; | 15 import 'package:analyzer/src/dart/element/member.dart'; |
| 16 import 'package:analyzer/src/dart/element/type.dart'; | 16 import 'package:analyzer/src/dart/element/type.dart'; |
| 17 import 'package:analyzer/src/generated/engine.dart'; | 17 import 'package:analyzer/src/generated/engine.dart'; |
| 18 import 'package:analyzer/src/generated/resolver.dart'; | 18 import 'package:analyzer/src/generated/resolver.dart'; |
| 19 import 'package:analyzer/src/generated/source_io.dart'; | 19 import 'package:analyzer/src/generated/source_io.dart'; |
| 20 import 'package:analyzer/src/generated/testing/ast_factory.dart'; | 20 import 'package:analyzer/src/generated/testing/ast_test_factory.dart'; |
| 21 import 'package:analyzer/src/generated/testing/token_factory.dart'; | 21 import 'package:analyzer/src/generated/testing/token_factory.dart'; |
| 22 import 'package:analyzer/src/summary/format.dart'; | 22 import 'package:analyzer/src/summary/format.dart'; |
| 23 import 'package:analyzer/src/summary/idl.dart'; | 23 import 'package:analyzer/src/summary/idl.dart'; |
| 24 | 24 |
| 25 /** | 25 /** |
| 26 * Implementation of [ElementResynthesizer] used when resynthesizing an element | 26 * Implementation of [ElementResynthesizer] used when resynthesizing an element |
| 27 * model from summaries. | 27 * model from summaries. |
| 28 */ | 28 */ |
| 29 abstract class SummaryResynthesizer extends ElementResynthesizer { | 29 abstract class SummaryResynthesizer extends ElementResynthesizer { |
| 30 /** | 30 /** |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 if (e is ConstructorElement) { | 324 if (e is ConstructorElement) { |
| 325 return e; | 325 return e; |
| 326 } | 326 } |
| 327 } | 327 } |
| 328 throw new StateError( | 328 throw new StateError( |
| 329 'Unable to find the enclosing constructor of $context'); | 329 'Unable to find the enclosing constructor of $context'); |
| 330 } | 330 } |
| 331 | 331 |
| 332 Expression build() { | 332 Expression build() { |
| 333 if (!uc.isValidConst) { | 333 if (!uc.isValidConst) { |
| 334 return AstFactory.identifier3(r'$$invalidConstExpr$$'); | 334 return AstTestFactory.identifier3(r'$$invalidConstExpr$$'); |
| 335 } | 335 } |
| 336 for (UnlinkedExprOperation operation in uc.operations) { | 336 for (UnlinkedExprOperation operation in uc.operations) { |
| 337 switch (operation) { | 337 switch (operation) { |
| 338 case UnlinkedExprOperation.pushNull: | 338 case UnlinkedExprOperation.pushNull: |
| 339 _push(AstFactory.nullLiteral()); | 339 _push(AstTestFactory.nullLiteral()); |
| 340 break; | 340 break; |
| 341 // bool | 341 // bool |
| 342 case UnlinkedExprOperation.pushFalse: | 342 case UnlinkedExprOperation.pushFalse: |
| 343 _push(AstFactory.booleanLiteral(false)); | 343 _push(AstTestFactory.booleanLiteral(false)); |
| 344 break; | 344 break; |
| 345 case UnlinkedExprOperation.pushTrue: | 345 case UnlinkedExprOperation.pushTrue: |
| 346 _push(AstFactory.booleanLiteral(true)); | 346 _push(AstTestFactory.booleanLiteral(true)); |
| 347 break; | 347 break; |
| 348 // literals | 348 // literals |
| 349 case UnlinkedExprOperation.pushInt: | 349 case UnlinkedExprOperation.pushInt: |
| 350 int value = uc.ints[intPtr++]; | 350 int value = uc.ints[intPtr++]; |
| 351 _push(AstFactory.integer(value)); | 351 _push(AstTestFactory.integer(value)); |
| 352 break; | 352 break; |
| 353 case UnlinkedExprOperation.pushLongInt: | 353 case UnlinkedExprOperation.pushLongInt: |
| 354 int value = 0; | 354 int value = 0; |
| 355 int count = uc.ints[intPtr++]; | 355 int count = uc.ints[intPtr++]; |
| 356 for (int i = 0; i < count; i++) { | 356 for (int i = 0; i < count; i++) { |
| 357 int next = uc.ints[intPtr++]; | 357 int next = uc.ints[intPtr++]; |
| 358 value = value << 32 | next; | 358 value = value << 32 | next; |
| 359 } | 359 } |
| 360 _push(AstFactory.integer(value)); | 360 _push(AstTestFactory.integer(value)); |
| 361 break; | 361 break; |
| 362 case UnlinkedExprOperation.pushDouble: | 362 case UnlinkedExprOperation.pushDouble: |
| 363 double value = uc.doubles[doublePtr++]; | 363 double value = uc.doubles[doublePtr++]; |
| 364 _push(AstFactory.doubleLiteral(value)); | 364 _push(AstTestFactory.doubleLiteral(value)); |
| 365 break; | 365 break; |
| 366 case UnlinkedExprOperation.makeSymbol: | 366 case UnlinkedExprOperation.makeSymbol: |
| 367 String component = uc.strings[stringPtr++]; | 367 String component = uc.strings[stringPtr++]; |
| 368 _push(AstFactory.symbolLiteral([component])); | 368 _push(AstTestFactory.symbolLiteral([component])); |
| 369 break; | 369 break; |
| 370 // String | 370 // String |
| 371 case UnlinkedExprOperation.pushString: | 371 case UnlinkedExprOperation.pushString: |
| 372 String value = uc.strings[stringPtr++]; | 372 String value = uc.strings[stringPtr++]; |
| 373 _push(AstFactory.string2(value)); | 373 _push(AstTestFactory.string2(value)); |
| 374 break; | 374 break; |
| 375 case UnlinkedExprOperation.concatenate: | 375 case UnlinkedExprOperation.concatenate: |
| 376 int count = uc.ints[intPtr++]; | 376 int count = uc.ints[intPtr++]; |
| 377 List<InterpolationElement> elements = <InterpolationElement>[]; | 377 List<InterpolationElement> elements = <InterpolationElement>[]; |
| 378 for (int i = 0; i < count; i++) { | 378 for (int i = 0; i < count; i++) { |
| 379 Expression expr = _pop(); | 379 Expression expr = _pop(); |
| 380 InterpolationElement element = _newInterpolationElement(expr); | 380 InterpolationElement element = _newInterpolationElement(expr); |
| 381 elements.insert(0, element); | 381 elements.insert(0, element); |
| 382 } | 382 } |
| 383 _push(AstFactory.string(elements)); | 383 _push(AstTestFactory.string(elements)); |
| 384 break; | 384 break; |
| 385 // binary | 385 // binary |
| 386 case UnlinkedExprOperation.equal: | 386 case UnlinkedExprOperation.equal: |
| 387 _pushBinary(TokenType.EQ_EQ); | 387 _pushBinary(TokenType.EQ_EQ); |
| 388 break; | 388 break; |
| 389 case UnlinkedExprOperation.notEqual: | 389 case UnlinkedExprOperation.notEqual: |
| 390 _pushBinary(TokenType.BANG_EQ); | 390 _pushBinary(TokenType.BANG_EQ); |
| 391 break; | 391 break; |
| 392 case UnlinkedExprOperation.and: | 392 case UnlinkedExprOperation.and: |
| 393 _pushBinary(TokenType.AMPERSAND_AMPERSAND); | 393 _pushBinary(TokenType.AMPERSAND_AMPERSAND); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 _pushPrefix(TokenType.MINUS); | 448 _pushPrefix(TokenType.MINUS); |
| 449 break; | 449 break; |
| 450 case UnlinkedExprOperation.not: | 450 case UnlinkedExprOperation.not: |
| 451 _pushPrefix(TokenType.BANG); | 451 _pushPrefix(TokenType.BANG); |
| 452 break; | 452 break; |
| 453 // conditional | 453 // conditional |
| 454 case UnlinkedExprOperation.conditional: | 454 case UnlinkedExprOperation.conditional: |
| 455 Expression elseExpr = _pop(); | 455 Expression elseExpr = _pop(); |
| 456 Expression thenExpr = _pop(); | 456 Expression thenExpr = _pop(); |
| 457 Expression condition = _pop(); | 457 Expression condition = _pop(); |
| 458 _push( | 458 _push(AstTestFactory.conditionalExpression( |
| 459 AstFactory.conditionalExpression(condition, thenExpr, elseExpr)); | 459 condition, thenExpr, elseExpr)); |
| 460 break; | 460 break; |
| 461 // invokeMethodRef | 461 // invokeMethodRef |
| 462 case UnlinkedExprOperation.invokeMethodRef: | 462 case UnlinkedExprOperation.invokeMethodRef: |
| 463 _pushInvokeMethodRef(); | 463 _pushInvokeMethodRef(); |
| 464 break; | 464 break; |
| 465 // containers | 465 // containers |
| 466 case UnlinkedExprOperation.makeUntypedList: | 466 case UnlinkedExprOperation.makeUntypedList: |
| 467 _pushList(null); | 467 _pushList(null); |
| 468 break; | 468 break; |
| 469 case UnlinkedExprOperation.makeTypedList: | 469 case UnlinkedExprOperation.makeTypedList: |
| 470 TypeName itemType = _newTypeName(); | 470 TypeName itemType = _newTypeName(); |
| 471 _pushList(AstFactory.typeArgumentList(<TypeName>[itemType])); | 471 _pushList(AstTestFactory.typeArgumentList(<TypeName>[itemType])); |
| 472 break; | 472 break; |
| 473 case UnlinkedExprOperation.makeUntypedMap: | 473 case UnlinkedExprOperation.makeUntypedMap: |
| 474 _pushMap(null); | 474 _pushMap(null); |
| 475 break; | 475 break; |
| 476 case UnlinkedExprOperation.makeTypedMap: | 476 case UnlinkedExprOperation.makeTypedMap: |
| 477 TypeName keyType = _newTypeName(); | 477 TypeName keyType = _newTypeName(); |
| 478 TypeName valueType = _newTypeName(); | 478 TypeName valueType = _newTypeName(); |
| 479 _pushMap(AstFactory.typeArgumentList(<TypeName>[keyType, valueType])); | 479 _pushMap( |
| 480 AstTestFactory.typeArgumentList(<TypeName>[keyType, valueType])); |
| 480 break; | 481 break; |
| 481 case UnlinkedExprOperation.pushReference: | 482 case UnlinkedExprOperation.pushReference: |
| 482 _pushReference(); | 483 _pushReference(); |
| 483 break; | 484 break; |
| 484 case UnlinkedExprOperation.extractProperty: | 485 case UnlinkedExprOperation.extractProperty: |
| 485 _pushExtractProperty(); | 486 _pushExtractProperty(); |
| 486 break; | 487 break; |
| 487 case UnlinkedExprOperation.invokeConstructor: | 488 case UnlinkedExprOperation.invokeConstructor: |
| 488 _pushInstanceCreation(); | 489 _pushInstanceCreation(); |
| 489 break; | 490 break; |
| 490 case UnlinkedExprOperation.pushParameter: | 491 case UnlinkedExprOperation.pushParameter: |
| 491 String name = uc.strings[stringPtr++]; | 492 String name = uc.strings[stringPtr++]; |
| 492 SimpleIdentifier identifier = AstFactory.identifier3(name); | 493 SimpleIdentifier identifier = AstTestFactory.identifier3(name); |
| 493 identifier.staticElement = _enclosingConstructor.parameters | 494 identifier.staticElement = _enclosingConstructor.parameters |
| 494 .firstWhere((parameter) => parameter.name == name, | 495 .firstWhere((parameter) => parameter.name == name, |
| 495 orElse: () => throw new StateError( | 496 orElse: () => throw new StateError( |
| 496 'Unable to resolve constructor parameter: $name')); | 497 'Unable to resolve constructor parameter: $name')); |
| 497 _push(identifier); | 498 _push(identifier); |
| 498 break; | 499 break; |
| 499 case UnlinkedExprOperation.ifNull: | 500 case UnlinkedExprOperation.ifNull: |
| 500 _pushBinary(TokenType.QUESTION_QUESTION); | 501 _pushBinary(TokenType.QUESTION_QUESTION); |
| 501 break; | 502 break; |
| 502 case UnlinkedExprOperation.assignToRef: | 503 case UnlinkedExprOperation.assignToRef: |
| (...skipping 18 matching lines...) Expand all Loading... |
| 521 List<Expression> arguments; | 522 List<Expression> arguments; |
| 522 { | 523 { |
| 523 int numNamedArgs = uc.ints[intPtr++]; | 524 int numNamedArgs = uc.ints[intPtr++]; |
| 524 int numPositionalArgs = uc.ints[intPtr++]; | 525 int numPositionalArgs = uc.ints[intPtr++]; |
| 525 int numArgs = numNamedArgs + numPositionalArgs; | 526 int numArgs = numNamedArgs + numPositionalArgs; |
| 526 arguments = _removeTopItems(numArgs); | 527 arguments = _removeTopItems(numArgs); |
| 527 // add names to the named arguments | 528 // add names to the named arguments |
| 528 for (int i = 0; i < numNamedArgs; i++) { | 529 for (int i = 0; i < numNamedArgs; i++) { |
| 529 String name = uc.strings[stringPtr++]; | 530 String name = uc.strings[stringPtr++]; |
| 530 int index = numPositionalArgs + i; | 531 int index = numPositionalArgs + i; |
| 531 arguments[index] = AstFactory.namedExpression2(name, arguments[index]); | 532 arguments[index] = |
| 533 AstTestFactory.namedExpression2(name, arguments[index]); |
| 532 } | 534 } |
| 533 } | 535 } |
| 534 return arguments; | 536 return arguments; |
| 535 } | 537 } |
| 536 | 538 |
| 537 /** | 539 /** |
| 538 * Build the identifier sequence (a single or prefixed identifier, or a | 540 * Build the identifier sequence (a single or prefixed identifier, or a |
| 539 * property access) corresponding to the given reference [info]. | 541 * property access) corresponding to the given reference [info]. |
| 540 */ | 542 */ |
| 541 Expression _buildIdentifierSequence(_ReferenceInfo info) { | 543 Expression _buildIdentifierSequence(_ReferenceInfo info) { |
| 542 Expression enclosing; | 544 Expression enclosing; |
| 543 if (info.enclosing != null) { | 545 if (info.enclosing != null) { |
| 544 enclosing = _buildIdentifierSequence(info.enclosing); | 546 enclosing = _buildIdentifierSequence(info.enclosing); |
| 545 } | 547 } |
| 546 Element element = info.element; | 548 Element element = info.element; |
| 547 if (element == null && info.name == 'length') { | 549 if (element == null && info.name == 'length') { |
| 548 element = _getStringLengthElement(); | 550 element = _getStringLengthElement(); |
| 549 } | 551 } |
| 550 if (enclosing == null) { | 552 if (enclosing == null) { |
| 551 return AstFactory.identifier3(info.name)..staticElement = element; | 553 return AstTestFactory.identifier3(info.name)..staticElement = element; |
| 552 } | 554 } |
| 553 if (enclosing is SimpleIdentifier) { | 555 if (enclosing is SimpleIdentifier) { |
| 554 SimpleIdentifier identifier = AstFactory.identifier3(info.name) | 556 SimpleIdentifier identifier = AstTestFactory.identifier3(info.name) |
| 555 ..staticElement = element; | 557 ..staticElement = element; |
| 556 return AstFactory.identifier(enclosing, identifier); | 558 return AstTestFactory.identifier(enclosing, identifier); |
| 557 } | 559 } |
| 558 SimpleIdentifier property = AstFactory.identifier3(info.name) | 560 SimpleIdentifier property = AstTestFactory.identifier3(info.name) |
| 559 ..staticElement = element; | 561 ..staticElement = element; |
| 560 return AstFactory.propertyAccess(enclosing, property); | 562 return AstTestFactory.propertyAccess(enclosing, property); |
| 561 } | 563 } |
| 562 | 564 |
| 563 TypeName _buildTypeAst(DartType type) { | 565 TypeName _buildTypeAst(DartType type) { |
| 564 List<TypeName> argumentNodes; | 566 List<TypeName> argumentNodes; |
| 565 if (type is ParameterizedType) { | 567 if (type is ParameterizedType) { |
| 566 if (!resynthesizer.libraryResynthesizer.typesWithImplicitTypeArguments | 568 if (!resynthesizer.libraryResynthesizer.typesWithImplicitTypeArguments |
| 567 .contains(type)) { | 569 .contains(type)) { |
| 568 List<DartType> typeArguments = type.typeArguments; | 570 List<DartType> typeArguments = type.typeArguments; |
| 569 argumentNodes = typeArguments.every((a) => a.isDynamic) | 571 argumentNodes = typeArguments.every((a) => a.isDynamic) |
| 570 ? null | 572 ? null |
| 571 : typeArguments.map(_buildTypeAst).toList(); | 573 : typeArguments.map(_buildTypeAst).toList(); |
| 572 } | 574 } |
| 573 } | 575 } |
| 574 TypeName node = AstFactory.typeName4(type.name, argumentNodes); | 576 TypeName node = AstTestFactory.typeName4(type.name, argumentNodes); |
| 575 node.type = type; | 577 node.type = type; |
| 576 (node.name as SimpleIdentifier).staticElement = type.element; | 578 (node.name as SimpleIdentifier).staticElement = type.element; |
| 577 return node; | 579 return node; |
| 578 } | 580 } |
| 579 | 581 |
| 580 PropertyAccessorElement _getStringLengthElement() => | 582 PropertyAccessorElement _getStringLengthElement() => |
| 581 resynthesizer.typeProvider.stringType.getGetter('length'); | 583 resynthesizer.typeProvider.stringType.getGetter('length'); |
| 582 | 584 |
| 583 InterpolationElement _newInterpolationElement(Expression expr) { | 585 InterpolationElement _newInterpolationElement(Expression expr) { |
| 584 if (expr is SimpleStringLiteral) { | 586 if (expr is SimpleStringLiteral) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 604 | 606 |
| 605 Expression _pop() => stack.removeLast(); | 607 Expression _pop() => stack.removeLast(); |
| 606 | 608 |
| 607 void _push(Expression expr) { | 609 void _push(Expression expr) { |
| 608 stack.add(expr); | 610 stack.add(expr); |
| 609 } | 611 } |
| 610 | 612 |
| 611 void _pushBinary(TokenType operator) { | 613 void _pushBinary(TokenType operator) { |
| 612 Expression right = _pop(); | 614 Expression right = _pop(); |
| 613 Expression left = _pop(); | 615 Expression left = _pop(); |
| 614 _push(AstFactory.binaryExpression(left, operator, right)); | 616 _push(AstTestFactory.binaryExpression(left, operator, right)); |
| 615 } | 617 } |
| 616 | 618 |
| 617 void _pushExtractProperty() { | 619 void _pushExtractProperty() { |
| 618 Expression target = _pop(); | 620 Expression target = _pop(); |
| 619 String name = uc.strings[stringPtr++]; | 621 String name = uc.strings[stringPtr++]; |
| 620 SimpleIdentifier propertyNode = AstFactory.identifier3(name); | 622 SimpleIdentifier propertyNode = AstTestFactory.identifier3(name); |
| 621 // Only String.length property access can be potentially resolved. | 623 // Only String.length property access can be potentially resolved. |
| 622 if (name == 'length') { | 624 if (name == 'length') { |
| 623 propertyNode.staticElement = _getStringLengthElement(); | 625 propertyNode.staticElement = _getStringLengthElement(); |
| 624 } | 626 } |
| 625 _push(AstFactory.propertyAccess(target, propertyNode)); | 627 _push(AstTestFactory.propertyAccess(target, propertyNode)); |
| 626 } | 628 } |
| 627 | 629 |
| 628 void _pushInstanceCreation() { | 630 void _pushInstanceCreation() { |
| 629 EntityRef ref = uc.references[refPtr++]; | 631 EntityRef ref = uc.references[refPtr++]; |
| 630 _ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference); | 632 _ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference); |
| 631 // prepare ConstructorElement | 633 // prepare ConstructorElement |
| 632 TypeName typeNode; | 634 TypeName typeNode; |
| 633 String constructorName; | 635 String constructorName; |
| 634 ConstructorElement constructorElement; | 636 ConstructorElement constructorElement; |
| 635 if (info.element != null) { | 637 if (info.element != null) { |
| 636 if (info.element is ConstructorElement) { | 638 if (info.element is ConstructorElement) { |
| 637 constructorName = info.name; | 639 constructorName = info.name; |
| 638 } else if (info.element is ClassElement) { | 640 } else if (info.element is ClassElement) { |
| 639 constructorName = null; | 641 constructorName = null; |
| 640 } else { | 642 } else { |
| 641 throw new StateError('Unsupported element for invokeConstructor ' | 643 throw new StateError('Unsupported element for invokeConstructor ' |
| 642 '${info.element?.runtimeType}'); | 644 '${info.element?.runtimeType}'); |
| 643 } | 645 } |
| 644 InterfaceType definingType = resynthesizer._createConstructorDefiningType( | 646 InterfaceType definingType = resynthesizer._createConstructorDefiningType( |
| 645 context?.typeParameterContext, info, ref.typeArguments); | 647 context?.typeParameterContext, info, ref.typeArguments); |
| 646 constructorElement = | 648 constructorElement = |
| 647 resynthesizer._getConstructorForInfo(definingType, info); | 649 resynthesizer._getConstructorForInfo(definingType, info); |
| 648 typeNode = _buildTypeAst(definingType); | 650 typeNode = _buildTypeAst(definingType); |
| 649 } else { | 651 } else { |
| 650 if (info.enclosing != null) { | 652 if (info.enclosing != null) { |
| 651 if (info.enclosing.enclosing != null) { | 653 if (info.enclosing.enclosing != null) { |
| 652 PrefixedIdentifier typeName = AstFactory.identifier5( | 654 PrefixedIdentifier typeName = AstTestFactory.identifier5( |
| 653 info.enclosing.enclosing.name, info.enclosing.name); | 655 info.enclosing.enclosing.name, info.enclosing.name); |
| 654 typeName.prefix.staticElement = info.enclosing.enclosing.element; | 656 typeName.prefix.staticElement = info.enclosing.enclosing.element; |
| 655 typeName.identifier.staticElement = info.enclosing.element; | 657 typeName.identifier.staticElement = info.enclosing.element; |
| 656 typeName.identifier.staticType = info.enclosing.type; | 658 typeName.identifier.staticType = info.enclosing.type; |
| 657 typeNode = AstFactory.typeName3(typeName); | 659 typeNode = AstTestFactory.typeName3(typeName); |
| 658 typeNode.type = info.enclosing.type; | 660 typeNode.type = info.enclosing.type; |
| 659 constructorName = info.name; | 661 constructorName = info.name; |
| 660 } else if (info.enclosing.element != null) { | 662 } else if (info.enclosing.element != null) { |
| 661 SimpleIdentifier typeName = | 663 SimpleIdentifier typeName = |
| 662 AstFactory.identifier3(info.enclosing.name); | 664 AstTestFactory.identifier3(info.enclosing.name); |
| 663 typeName.staticElement = info.enclosing.element; | 665 typeName.staticElement = info.enclosing.element; |
| 664 typeName.staticType = info.enclosing.type; | 666 typeName.staticType = info.enclosing.type; |
| 665 typeNode = AstFactory.typeName3(typeName); | 667 typeNode = AstTestFactory.typeName3(typeName); |
| 666 typeNode.type = info.enclosing.type; | 668 typeNode.type = info.enclosing.type; |
| 667 constructorName = info.name; | 669 constructorName = info.name; |
| 668 } else { | 670 } else { |
| 669 typeNode = AstFactory.typeName3( | 671 typeNode = AstTestFactory.typeName3( |
| 670 AstFactory.identifier5(info.enclosing.name, info.name)); | 672 AstTestFactory.identifier5(info.enclosing.name, info.name)); |
| 671 constructorName = null; | 673 constructorName = null; |
| 672 } | 674 } |
| 673 } else { | 675 } else { |
| 674 typeNode = AstFactory.typeName4(info.name); | 676 typeNode = AstTestFactory.typeName4(info.name); |
| 675 } | 677 } |
| 676 } | 678 } |
| 677 // prepare arguments | 679 // prepare arguments |
| 678 List<Expression> arguments = _buildArguments(); | 680 List<Expression> arguments = _buildArguments(); |
| 679 // create ConstructorName | 681 // create ConstructorName |
| 680 ConstructorName constructorNode; | 682 ConstructorName constructorNode; |
| 681 if (constructorName != null) { | 683 if (constructorName != null) { |
| 682 constructorNode = AstFactory.constructorName(typeNode, constructorName); | 684 constructorNode = |
| 685 AstTestFactory.constructorName(typeNode, constructorName); |
| 683 constructorNode.name.staticElement = constructorElement; | 686 constructorNode.name.staticElement = constructorElement; |
| 684 } else { | 687 } else { |
| 685 constructorNode = AstFactory.constructorName(typeNode, null); | 688 constructorNode = AstTestFactory.constructorName(typeNode, null); |
| 686 } | 689 } |
| 687 constructorNode.staticElement = constructorElement; | 690 constructorNode.staticElement = constructorElement; |
| 688 // create InstanceCreationExpression | 691 // create InstanceCreationExpression |
| 689 InstanceCreationExpression instanceCreation = AstFactory | 692 InstanceCreationExpression instanceCreation = AstTestFactory |
| 690 .instanceCreationExpression(Keyword.CONST, constructorNode, arguments); | 693 .instanceCreationExpression(Keyword.CONST, constructorNode, arguments); |
| 691 instanceCreation.staticElement = constructorElement; | 694 instanceCreation.staticElement = constructorElement; |
| 692 _push(instanceCreation); | 695 _push(instanceCreation); |
| 693 } | 696 } |
| 694 | 697 |
| 695 void _pushInvokeMethodRef() { | 698 void _pushInvokeMethodRef() { |
| 696 List<Expression> arguments = _buildArguments(); | 699 List<Expression> arguments = _buildArguments(); |
| 697 EntityRef ref = uc.references[refPtr++]; | 700 EntityRef ref = uc.references[refPtr++]; |
| 698 _ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference); | 701 _ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference); |
| 699 Expression node = _buildIdentifierSequence(info); | 702 Expression node = _buildIdentifierSequence(info); |
| 700 TypeArgumentList typeArguments; | 703 TypeArgumentList typeArguments; |
| 701 int numTypeArguments = uc.ints[intPtr++]; | 704 int numTypeArguments = uc.ints[intPtr++]; |
| 702 if (numTypeArguments > 0) { | 705 if (numTypeArguments > 0) { |
| 703 List<TypeName> typeNames = new List<TypeName>(numTypeArguments); | 706 List<TypeName> typeNames = new List<TypeName>(numTypeArguments); |
| 704 for (int i = 0; i < numTypeArguments; i++) { | 707 for (int i = 0; i < numTypeArguments; i++) { |
| 705 typeNames[i] = _newTypeName(); | 708 typeNames[i] = _newTypeName(); |
| 706 } | 709 } |
| 707 typeArguments = AstFactory.typeArgumentList(typeNames); | 710 typeArguments = AstTestFactory.typeArgumentList(typeNames); |
| 708 } | 711 } |
| 709 if (node is SimpleIdentifier) { | 712 if (node is SimpleIdentifier) { |
| 710 _push(new MethodInvocation( | 713 _push(new MethodInvocation( |
| 711 null, | 714 null, |
| 712 TokenFactory.tokenFromType(TokenType.PERIOD), | 715 TokenFactory.tokenFromType(TokenType.PERIOD), |
| 713 node, | 716 node, |
| 714 typeArguments, | 717 typeArguments, |
| 715 AstFactory.argumentList(arguments))); | 718 AstTestFactory.argumentList(arguments))); |
| 716 } else { | 719 } else { |
| 717 throw new UnimplementedError('For ${node?.runtimeType}: $node'); | 720 throw new UnimplementedError('For ${node?.runtimeType}: $node'); |
| 718 } | 721 } |
| 719 } | 722 } |
| 720 | 723 |
| 721 void _pushList(TypeArgumentList typeArguments) { | 724 void _pushList(TypeArgumentList typeArguments) { |
| 722 int count = uc.ints[intPtr++]; | 725 int count = uc.ints[intPtr++]; |
| 723 List<Expression> elements = <Expression>[]; | 726 List<Expression> elements = <Expression>[]; |
| 724 for (int i = 0; i < count; i++) { | 727 for (int i = 0; i < count; i++) { |
| 725 elements.insert(0, _pop()); | 728 elements.insert(0, _pop()); |
| 726 } | 729 } |
| 727 _push(AstFactory.listLiteral2(Keyword.CONST, typeArguments, elements)); | 730 _push(AstTestFactory.listLiteral2(Keyword.CONST, typeArguments, elements)); |
| 728 } | 731 } |
| 729 | 732 |
| 730 void _pushMap(TypeArgumentList typeArguments) { | 733 void _pushMap(TypeArgumentList typeArguments) { |
| 731 int count = uc.ints[intPtr++]; | 734 int count = uc.ints[intPtr++]; |
| 732 List<MapLiteralEntry> entries = <MapLiteralEntry>[]; | 735 List<MapLiteralEntry> entries = <MapLiteralEntry>[]; |
| 733 for (int i = 0; i < count; i++) { | 736 for (int i = 0; i < count; i++) { |
| 734 Expression value = _pop(); | 737 Expression value = _pop(); |
| 735 Expression key = _pop(); | 738 Expression key = _pop(); |
| 736 entries.insert(0, AstFactory.mapLiteralEntry2(key, value)); | 739 entries.insert(0, AstTestFactory.mapLiteralEntry2(key, value)); |
| 737 } | 740 } |
| 738 _push(AstFactory.mapLiteral(Keyword.CONST, typeArguments, entries)); | 741 _push(AstTestFactory.mapLiteral(Keyword.CONST, typeArguments, entries)); |
| 739 } | 742 } |
| 740 | 743 |
| 741 void _pushPrefix(TokenType operator) { | 744 void _pushPrefix(TokenType operator) { |
| 742 Expression operand = _pop(); | 745 Expression operand = _pop(); |
| 743 _push(AstFactory.prefixExpression(operator, operand)); | 746 _push(AstTestFactory.prefixExpression(operator, operand)); |
| 744 } | 747 } |
| 745 | 748 |
| 746 void _pushReference() { | 749 void _pushReference() { |
| 747 EntityRef ref = uc.references[refPtr++]; | 750 EntityRef ref = uc.references[refPtr++]; |
| 748 _ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference); | 751 _ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference); |
| 749 Expression node = _buildIdentifierSequence(info); | 752 Expression node = _buildIdentifierSequence(info); |
| 750 _push(node); | 753 _push(node); |
| 751 } | 754 } |
| 752 | 755 |
| 753 List<Expression> _removeTopItems(int count) { | 756 List<Expression> _removeTopItems(int count) { |
| (...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1510 TypeProvider get typeProvider => summaryResynthesizer.typeProvider; | 1513 TypeProvider get typeProvider => summaryResynthesizer.typeProvider; |
| 1511 | 1514 |
| 1512 /** | 1515 /** |
| 1513 * Build [ElementAnnotationImpl] for the given [UnlinkedExpr]. | 1516 * Build [ElementAnnotationImpl] for the given [UnlinkedExpr]. |
| 1514 */ | 1517 */ |
| 1515 ElementAnnotationImpl buildAnnotation(ElementImpl context, UnlinkedExpr uc) { | 1518 ElementAnnotationImpl buildAnnotation(ElementImpl context, UnlinkedExpr uc) { |
| 1516 ElementAnnotationImpl elementAnnotation = new ElementAnnotationImpl(unit); | 1519 ElementAnnotationImpl elementAnnotation = new ElementAnnotationImpl(unit); |
| 1517 Expression constExpr = _buildConstExpression(context, uc); | 1520 Expression constExpr = _buildConstExpression(context, uc); |
| 1518 if (constExpr is Identifier) { | 1521 if (constExpr is Identifier) { |
| 1519 elementAnnotation.element = constExpr.staticElement; | 1522 elementAnnotation.element = constExpr.staticElement; |
| 1520 elementAnnotation.annotationAst = AstFactory.annotation(constExpr); | 1523 elementAnnotation.annotationAst = AstTestFactory.annotation(constExpr); |
| 1521 } else if (constExpr is InstanceCreationExpression) { | 1524 } else if (constExpr is InstanceCreationExpression) { |
| 1522 elementAnnotation.element = constExpr.staticElement; | 1525 elementAnnotation.element = constExpr.staticElement; |
| 1523 Identifier typeName = constExpr.constructorName.type.name; | 1526 Identifier typeName = constExpr.constructorName.type.name; |
| 1524 SimpleIdentifier constructorName = constExpr.constructorName.name; | 1527 SimpleIdentifier constructorName = constExpr.constructorName.name; |
| 1525 if (typeName is SimpleIdentifier && constructorName != null) { | 1528 if (typeName is SimpleIdentifier && constructorName != null) { |
| 1526 // E.g. `@cls.ctor()`. Since `cls.ctor` would have been parsed as | 1529 // E.g. `@cls.ctor()`. Since `cls.ctor` would have been parsed as |
| 1527 // a PrefixedIdentifier, we need to resynthesize it as one. | 1530 // a PrefixedIdentifier, we need to resynthesize it as one. |
| 1528 typeName = AstFactory.identifier(typeName, constructorName); | 1531 typeName = AstTestFactory.identifier(typeName, constructorName); |
| 1529 constructorName = null; | 1532 constructorName = null; |
| 1530 } | 1533 } |
| 1531 elementAnnotation.annotationAst = AstFactory.annotation2( | 1534 elementAnnotation.annotationAst = AstTestFactory.annotation2( |
| 1532 typeName, constructorName, constExpr.argumentList) | 1535 typeName, constructorName, constExpr.argumentList) |
| 1533 ..element = constExpr.staticElement; | 1536 ..element = constExpr.staticElement; |
| 1534 } else { | 1537 } else { |
| 1535 throw new StateError( | 1538 throw new StateError( |
| 1536 'Unexpected annotation type: ${constExpr.runtimeType}'); | 1539 'Unexpected annotation type: ${constExpr.runtimeType}'); |
| 1537 } | 1540 } |
| 1538 return elementAnnotation; | 1541 return elementAnnotation; |
| 1539 } | 1542 } |
| 1540 | 1543 |
| 1541 /** | 1544 /** |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1880 static String _getElementIdentifier(String name, ReferenceKind kind) { | 1883 static String _getElementIdentifier(String name, ReferenceKind kind) { |
| 1881 if (kind == ReferenceKind.topLevelPropertyAccessor || | 1884 if (kind == ReferenceKind.topLevelPropertyAccessor || |
| 1882 kind == ReferenceKind.propertyAccessor) { | 1885 kind == ReferenceKind.propertyAccessor) { |
| 1883 if (!name.endsWith('=')) { | 1886 if (!name.endsWith('=')) { |
| 1884 return name + '?'; | 1887 return name + '?'; |
| 1885 } | 1888 } |
| 1886 } | 1889 } |
| 1887 return name; | 1890 return name; |
| 1888 } | 1891 } |
| 1889 } | 1892 } |
| OLD | NEW |