Chromium Code Reviews| 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/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 523 int numArgs = numNamedArgs + numPositionalArgs; | 523 int numArgs = numNamedArgs + numPositionalArgs; |
| 524 arguments = _removeTopItems(numArgs); | 524 arguments = _removeTopItems(numArgs); |
| 525 // add names to the named arguments | 525 // add names to the named arguments |
| 526 for (int i = 0; i < numNamedArgs; i++) { | 526 for (int i = 0; i < numNamedArgs; i++) { |
| 527 String name = uc.strings[stringPtr++]; | 527 String name = uc.strings[stringPtr++]; |
| 528 int index = numPositionalArgs + i; | 528 int index = numPositionalArgs + i; |
| 529 arguments[index] = AstFactory.namedExpression2(name, arguments[index]); | 529 arguments[index] = AstFactory.namedExpression2(name, arguments[index]); |
| 530 } | 530 } |
| 531 } | 531 } |
| 532 // create TypeName | 532 // create TypeName |
| 533 TypeName typeNode = _buildTypeAst(constructorElement.definingType); | 533 TypeName typeNode = _buildTypeAst(constructorElement._definingType); |
| 534 // create ConstructorName | 534 // create ConstructorName |
| 535 ConstructorName constructorNode; | 535 ConstructorName constructorNode; |
| 536 if (constructorName != null) { | 536 if (constructorName != null) { |
| 537 constructorNode = AstFactory.constructorName(typeNode, constructorName); | 537 constructorNode = AstFactory.constructorName(typeNode, constructorName); |
| 538 constructorNode.name.staticElement = constructorElement; | 538 constructorNode.name.staticElement = constructorElement; |
| 539 } else { | 539 } else { |
| 540 constructorNode = AstFactory.constructorName(typeNode, null); | 540 constructorNode = AstFactory.constructorName(typeNode, null); |
| 541 } | 541 } |
| 542 constructorNode.staticElement = constructorElement; | 542 constructorNode.staticElement = constructorElement; |
| 543 // create InstanceCreationExpression | 543 // create InstanceCreationExpression |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 577 int end = stack.length; | 577 int end = stack.length; |
| 578 List<Expression> items = stack.getRange(start, end).toList(); | 578 List<Expression> items = stack.getRange(start, end).toList(); |
| 579 stack.removeRange(start, end); | 579 stack.removeRange(start, end); |
| 580 return items; | 580 return items; |
| 581 } | 581 } |
| 582 } | 582 } |
| 583 | 583 |
| 584 /** | 584 /** |
| 585 * The constructor element that has been resynthesized from a summary. The | 585 * The constructor element that has been resynthesized from a summary. The |
| 586 * actual element won't be constructed until it is requested. But properties | 586 * actual element won't be constructed until it is requested. But properties |
| 587 * [definingType], [displayName], [enclosingElement] and [name] can be used | 587 * [_definingType], [displayName], [enclosingElement] and [name] can be used |
|
scheglov
2016/02/10 20:37:53
Maybe we should exclude "_definingType" from the l
Paul Berry
2016/02/10 20:54:36
Done.
| |
| 588 * without creating the actual element. | 588 * without creating the actual element. |
| 589 */ | 589 */ |
| 590 class _DeferredConstructorElement extends ConstructorElementHandle { | 590 class _DeferredConstructorElement extends ConstructorElementHandle { |
| 591 final InterfaceType definingType; | 591 /** |
| 592 * The type defining this constructor element. If [_isMember] is `false`, | |
| 593 * then the type parameters of [_definingType] are not guaranteed to be | |
| 594 * valid. | |
| 595 */ | |
| 596 final InterfaceType _definingType; | |
| 597 | |
| 598 /** | |
| 599 * The constructor name. | |
| 600 */ | |
| 592 final String name; | 601 final String name; |
| 593 | 602 |
| 603 /** | |
| 604 * Indicates whether the deferred element is a [ConstructorMember] or simply | |
| 605 * a [ConstructorElement]. | |
| 606 */ | |
| 607 final bool _isMember; | |
| 608 | |
| 594 factory _DeferredConstructorElement(InterfaceType definingType, String name) { | 609 factory _DeferredConstructorElement(InterfaceType definingType, String name) { |
| 595 List<String> components = definingType.element.location.components.toList(); | 610 List<String> components = definingType.element.location.components.toList(); |
| 596 components.add(name); | 611 components.add(name); |
| 597 ElementLocationImpl location = new ElementLocationImpl.con3(components); | 612 ElementLocationImpl location = new ElementLocationImpl.con3(components); |
| 598 return new _DeferredConstructorElement._(definingType, name, location); | 613 return new _DeferredConstructorElement._( |
| 614 definingType, name, location, true); | |
| 599 } | 615 } |
| 600 | 616 |
| 601 _DeferredConstructorElement._( | 617 _DeferredConstructorElement._( |
| 602 this.definingType, this.name, ElementLocation location) | 618 this._definingType, this.name, ElementLocation location, this._isMember) |
| 603 : super(null, location); | 619 : super(null, location); |
| 604 | 620 |
| 605 @override | 621 @override |
| 606 Element get actualElement { | 622 Element get actualElement { |
| 607 ConstructorElement element = enclosingElement.getNamedConstructor(name); | 623 ConstructorElement element = enclosingElement.getNamedConstructor(name); |
| 608 return new ConstructorMember(element, definingType); | 624 if (_isMember && _definingType.typeArguments.isNotEmpty) { |
| 625 return new ConstructorMember(element, _definingType); | |
| 626 } else { | |
| 627 return element; | |
| 628 } | |
| 609 } | 629 } |
| 610 | 630 |
| 611 @override | 631 @override |
| 612 AnalysisContext get context => definingType.element.context; | 632 AnalysisContext get context => _definingType.element.context; |
| 613 | 633 |
| 614 @override | 634 @override |
| 615 String get displayName => name; | 635 String get displayName => name; |
| 616 | 636 |
| 617 @override | 637 @override |
| 618 ClassElement get enclosingElement { | 638 ClassElement get enclosingElement { |
| 619 return definingType.element; | 639 return _definingType.element; |
| 620 } | 640 } |
| 621 } | 641 } |
| 622 | 642 |
| 623 /** | 643 /** |
| 624 * An instance of [_LibraryResynthesizer] is responsible for resynthesizing the | 644 * An instance of [_LibraryResynthesizer] is responsible for resynthesizing the |
| 625 * elements in a single library from that library's summary. | 645 * elements in a single library from that library's summary. |
| 626 */ | 646 */ |
| 627 class _LibraryResynthesizer { | 647 class _LibraryResynthesizer { |
| 628 /** | 648 /** |
| 629 * The [SummaryResynthesizer] which is being used to obtain summaries. | 649 * The [SummaryResynthesizer] which is being used to obtain summaries. |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 926 redirectedConstructor.typeArguments); | 946 redirectedConstructor.typeArguments); |
| 927 } else { | 947 } else { |
| 928 List<String> locationComponents = | 948 List<String> locationComponents = |
| 929 currentCompilationUnit.location.components.toList(); | 949 currentCompilationUnit.location.components.toList(); |
| 930 locationComponents.add(classType.name); | 950 locationComponents.add(classType.name); |
| 931 locationComponents.add(serializedExecutable.redirectedConstructorName); | 951 locationComponents.add(serializedExecutable.redirectedConstructorName); |
| 932 currentConstructor.redirectedConstructor = | 952 currentConstructor.redirectedConstructor = |
| 933 new _DeferredConstructorElement._( | 953 new _DeferredConstructorElement._( |
| 934 classType, | 954 classType, |
| 935 serializedExecutable.redirectedConstructorName, | 955 serializedExecutable.redirectedConstructorName, |
| 936 new ElementLocationImpl.con3(locationComponents)); | 956 new ElementLocationImpl.con3(locationComponents), |
| 957 false); | |
| 937 } | 958 } |
| 938 } | 959 } |
| 939 holder.addConstructor(currentConstructor); | 960 holder.addConstructor(currentConstructor); |
| 940 currentConstructor = null; | 961 currentConstructor = null; |
| 941 } | 962 } |
| 942 | 963 |
| 943 /** | 964 /** |
| 944 * Build the documentation for the given [element]. Does nothing if | 965 * Build the documentation for the given [element]. Does nothing if |
| 945 * [serializedDocumentationComment] is `null`. | 966 * [serializedDocumentationComment] is `null`. |
| 946 */ | 967 */ |
| (...skipping 1091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2038 } | 2059 } |
| 2039 : () => this.element; | 2060 : () => this.element; |
| 2040 // TODO(paulberry): Is it a bug that we have to pass `false` for | 2061 // TODO(paulberry): Is it a bug that we have to pass `false` for |
| 2041 // isInstantiated? | 2062 // isInstantiated? |
| 2042 return new DeferredFunctionTypeImpl(computer, null, typeArguments, false); | 2063 return new DeferredFunctionTypeImpl(computer, null, typeArguments, false); |
| 2043 } else { | 2064 } else { |
| 2044 return null; | 2065 return null; |
| 2045 } | 2066 } |
| 2046 } | 2067 } |
| 2047 } | 2068 } |
| OLD | NEW |