Chromium Code Reviews| Index: pkg/analyzer/lib/src/summary/resynthesize.dart |
| diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart |
| index d19d189c3a3aa995da3053755aeaa65ff496d593..ccfb97b1a0451db803becfbf88c501597469712d 100644 |
| --- a/pkg/analyzer/lib/src/summary/resynthesize.dart |
| +++ b/pkg/analyzer/lib/src/summary/resynthesize.dart |
| @@ -530,7 +530,7 @@ class _ConstExprBuilder { |
| } |
| } |
| // create TypeName |
| - TypeName typeNode = _buildTypeAst(constructorElement.definingType); |
| + TypeName typeNode = _buildTypeAst(constructorElement._definingType); |
| // create ConstructorName |
| ConstructorName constructorNode; |
| if (constructorName != null) { |
| @@ -584,39 +584,59 @@ class _ConstExprBuilder { |
| /** |
| * The constructor element that has been resynthesized from a summary. The |
| * actual element won't be constructed until it is requested. But properties |
| - * [definingType], [displayName], [enclosingElement] and [name] can be used |
| + * [_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.
|
| * without creating the actual element. |
| */ |
| class _DeferredConstructorElement extends ConstructorElementHandle { |
| - final InterfaceType definingType; |
| + /** |
| + * The type defining this constructor element. If [_isMember] is `false`, |
| + * then the type parameters of [_definingType] are not guaranteed to be |
| + * valid. |
| + */ |
| + final InterfaceType _definingType; |
| + |
| + /** |
| + * The constructor name. |
| + */ |
| final String name; |
| + /** |
| + * Indicates whether the deferred element is a [ConstructorMember] or simply |
| + * a [ConstructorElement]. |
| + */ |
| + final bool _isMember; |
| + |
| factory _DeferredConstructorElement(InterfaceType definingType, String name) { |
| List<String> components = definingType.element.location.components.toList(); |
| components.add(name); |
| ElementLocationImpl location = new ElementLocationImpl.con3(components); |
| - return new _DeferredConstructorElement._(definingType, name, location); |
| + return new _DeferredConstructorElement._( |
| + definingType, name, location, true); |
| } |
| _DeferredConstructorElement._( |
| - this.definingType, this.name, ElementLocation location) |
| + this._definingType, this.name, ElementLocation location, this._isMember) |
| : super(null, location); |
| @override |
| Element get actualElement { |
| ConstructorElement element = enclosingElement.getNamedConstructor(name); |
| - return new ConstructorMember(element, definingType); |
| + if (_isMember && _definingType.typeArguments.isNotEmpty) { |
| + return new ConstructorMember(element, _definingType); |
| + } else { |
| + return element; |
| + } |
| } |
| @override |
| - AnalysisContext get context => definingType.element.context; |
| + AnalysisContext get context => _definingType.element.context; |
| @override |
| String get displayName => name; |
| @override |
| ClassElement get enclosingElement { |
| - return definingType.element; |
| + return _definingType.element; |
| } |
| } |
| @@ -933,7 +953,8 @@ class _LibraryResynthesizer { |
| new _DeferredConstructorElement._( |
| classType, |
| serializedExecutable.redirectedConstructorName, |
| - new ElementLocationImpl.con3(locationComponents)); |
| + new ElementLocationImpl.con3(locationComponents), |
| + false); |
| } |
| } |
| holder.addConstructor(currentConstructor); |