@@ -1612,6 +1612,10 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
16121612 /// A list containing all of the enums contained in this compilation unit.
16131613 List <ClassElement > _enums;
16141614
1615+ /// A list containing all of the extensions contained in this compilation
1616+ /// unit.
1617+ List <ExtensionElement > _extensions;
1618+
16151619 /// A list containing all of the top-level functions contained in this
16161620 /// compilation unit.
16171621 List <FunctionElement > _functions;
@@ -1767,6 +1771,30 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
17671771 this ._enums = enums;
17681772 }
17691773
1774+ @override
1775+ List <ExtensionElement > get extensions {
1776+ if (_extensions != null ) {
1777+ return _extensions;
1778+ }
1779+
1780+ if (linkedNode != null ) {
1781+ // TODO(brianwilkerson) Implement this.
1782+ } else if (_unlinkedUnit != null ) {
1783+ // TODO(brianwilkerson) Implement this.
1784+ }
1785+
1786+ return _extensions ?? const < ExtensionElement > [];
1787+ }
1788+
1789+ /// Set the extensions contained in this compilation unit to the given
1790+ /// [extensions] .
1791+ void set extensions (List <ExtensionElement > extensions) {
1792+ for (ExtensionElement extension in extensions) {
1793+ (extension as ExtensionElementImpl ).enclosingElement = this ;
1794+ }
1795+ this ._extensions = extensions;
1796+ }
1797+
17701798 @override
17711799 List <FunctionElement > get functions {
17721800 if (_functions != null ) return _functions;
@@ -4895,6 +4923,239 @@ class ExportElementImpl extends UriReferencedElementImpl
48954923 }
48964924}
48974925
4926+ /// A concrete implementation of an [ExtensionElement] .
4927+ class ExtensionElementImpl extends ElementImpl implements ExtensionElement {
4928+ /// The unlinked representation of the extension in the summary.
4929+ final /* UnlinkedExtension */ _unlinkedExtension;
4930+
4931+ /// A list containing all of the type parameters declared by this extension.
4932+ List <TypeParameterElement > _typeParameters;
4933+
4934+ /// The type being extended.
4935+ DartType _extendedType;
4936+
4937+ /// A list containing all of the accessors (getters and setters) contained in
4938+ /// this extension.
4939+ List <PropertyAccessorElement > _accessors;
4940+
4941+ /// A list containing all of the methods contained in this extension.
4942+ List <MethodElement > _methods;
4943+
4944+ /// Initialize a newly created extension element to have the given [name] at
4945+ /// the given [offset] in the file that contains the declaration of this
4946+ /// element.
4947+ ExtensionElementImpl (String name, int nameOffset)
4948+ : _unlinkedExtension = null ,
4949+ super (name, nameOffset);
4950+
4951+ /// Initialize a newly created extension element to have the given [name] .
4952+ ExtensionElementImpl .forNode (Identifier name)
4953+ : _unlinkedExtension = null ,
4954+ super .forNode (name);
4955+
4956+ @override
4957+ List <PropertyAccessorElement > get accessors {
4958+ if (_accessors != null ) {
4959+ return _accessors;
4960+ }
4961+
4962+ if (linkedNode != null ) {
4963+ if (linkedNode is ExtensionDeclaration ) {
4964+ // TODO(brianwilkerson) Implement this.
4965+ // _createPropertiesAndAccessors();
4966+ // assert(_accessors != null);
4967+ // return _accessors;
4968+ } else {
4969+ return _accessors = const [];
4970+ }
4971+ } else if (_unlinkedExtension != null ) {
4972+ // TODO(brianwilkerson) Implement this.
4973+ // _resynthesizePropertyAccessors();
4974+ }
4975+
4976+ return _accessors ?? = const < PropertyAccessorElement > [];
4977+ }
4978+
4979+ void set accessors (List <PropertyAccessorElement > accessors) {
4980+ _assertNotResynthesized (_unlinkedExtension);
4981+ for (PropertyAccessorElement accessor in accessors) {
4982+ (accessor as PropertyAccessorElementImpl ).enclosingElement = this ;
4983+ }
4984+ _accessors = accessors;
4985+ }
4986+
4987+ @override
4988+ DartType get extendedType {
4989+ if (_extendedType != null ) {
4990+ return _extendedType;
4991+ }
4992+
4993+ if (linkedNode != null ) {
4994+ // TODO(brianwilkerson) Implement this.
4995+ // var context = enclosingUnit.linkedContext;
4996+ // return _extendedType = context.getExtendedType(linkedNode)?.type;
4997+ } else if (_unlinkedExtension != null ) {
4998+ return _extendedType = enclosingUnit.resynthesizerContext
4999+ .resolveTypeRef (this , _unlinkedExtension.extendedType);
5000+ }
5001+
5002+ return _extendedType;
5003+ }
5004+
5005+ void set extendedType (DartType extendedType) {
5006+ _assertNotResynthesized (_unlinkedExtension);
5007+ _extendedType = extendedType;
5008+ }
5009+
5010+ @override
5011+ ElementKind get kind => ElementKind .EXTENSION ;
5012+
5013+ @override
5014+ List <MethodElement > get methods {
5015+ if (_methods != null ) {
5016+ return _methods;
5017+ }
5018+
5019+ if (linkedNode != null ) {
5020+ // TODO(brianwilkerson) Implement this.
5021+ // var context = enclosingUnit.linkedContext;
5022+ // var containerRef = reference.getChild('@method');
5023+ // return _methods = context
5024+ // .getMethods(linkedNode)
5025+ // .where((node) => node.propertyKeyword == null)
5026+ // .map((node) {
5027+ // var name = node.name.name;
5028+ // var reference = containerRef.getChild(name);
5029+ // if (reference.hasElementFor(node)) {
5030+ // return reference.element as MethodElement;
5031+ // }
5032+ // return MethodElementImpl.forLinkedNode(this, reference, node);
5033+ // }).toList();
5034+ } else if (_unlinkedExtension != null ) {
5035+ // TODO(brianwilkerson) Implement this.
5036+ // var unlinkedExecutables = _unlinkedExtension.executables;
5037+ //
5038+ // var length = unlinkedExecutables.length;
5039+ // if (length == 0) {
5040+ // return _methods = const <MethodElement>[];
5041+ // }
5042+ //
5043+ // var count = 0;
5044+ // for (var i = 0; i < length; i++) {
5045+ // var e = unlinkedExecutables[i];
5046+ // if (e.kind == UnlinkedExecutableKind.functionOrMethod) {
5047+ // count++;
5048+ // }
5049+ // }
5050+ // if (count == 0) {
5051+ // return _methods = const <MethodElement>[];
5052+ // }
5053+ //
5054+ // var methods = new List<MethodElement>(count);
5055+ // var index = 0;
5056+ // for (var i = 0; i < length; i++) {
5057+ // var e = unlinkedExecutables[i];
5058+ // if (e.kind == UnlinkedExecutableKind.functionOrMethod) {
5059+ // methods[index++] = new MethodElementImpl.forSerialized(e, this);
5060+ // }
5061+ // }
5062+ // return _methods = methods;
5063+ }
5064+ return _methods = const < MethodElement > [];
5065+ }
5066+
5067+ /// Set the methods contained in this extension to the given [methods] .
5068+ void set methods (List <MethodElement > methods) {
5069+ _assertNotResynthesized (_unlinkedExtension);
5070+ for (MethodElement method in methods) {
5071+ (method as MethodElementImpl ).enclosingElement = this ;
5072+ }
5073+ _methods = methods;
5074+ }
5075+
5076+ @override
5077+ List <TypeParameterElement > get typeParameters {
5078+ if (_typeParameters != null ) {
5079+ return _typeParameters;
5080+ }
5081+
5082+ if (linkedNode != null ) {
5083+ var typeParameters = linkedContext.getTypeParameters2 (linkedNode);
5084+ if (typeParameters == null ) {
5085+ return _typeParameters = const [];
5086+ }
5087+ var containerRef = reference.getChild ('@typeParameter' );
5088+ return _typeParameters =
5089+ typeParameters.typeParameters.map <TypeParameterElement >((node) {
5090+ var reference = containerRef.getChild (node.name.name);
5091+ if (reference.hasElementFor (node)) {
5092+ return reference.element as TypeParameterElement ;
5093+ }
5094+ return TypeParameterElementImpl .forLinkedNode (this , reference, node);
5095+ }).toList ();
5096+ } else if (_unlinkedExtension != null ) {
5097+ // TODO(brianwilkerson) Implement this.
5098+ // List<UnlinkedTypeParam> unlinkedParams =
5099+ // _unlinkedExtension?.typeParameters;
5100+ // if (unlinkedParams != null) {
5101+ // int numTypeParameters = unlinkedParams.length;
5102+ // _typeParameters = new List<TypeParameterElement>(numTypeParameters);
5103+ // for (int i = 0; i < numTypeParameters; i++) {
5104+ // _typeParameters[i] = new TypeParameterElementImpl.forSerialized(
5105+ // unlinkedParams[i], this);
5106+ // }
5107+ // }
5108+ }
5109+
5110+ return _typeParameters ?? const < TypeParameterElement > [];
5111+ }
5112+
5113+ /// Set the type parameters defined by this extension to the given
5114+ /// [typeParameters] .
5115+ void set typeParameters (List <TypeParameterElement > typeParameters) {
5116+ _assertNotResynthesized (_unlinkedExtension);
5117+ for (TypeParameterElement typeParameter in typeParameters) {
5118+ (typeParameter as TypeParameterElementImpl ).enclosingElement = this ;
5119+ }
5120+ this ._typeParameters = typeParameters;
5121+ }
5122+
5123+ @override
5124+ T accept <T >(ElementVisitor <T > visitor) {
5125+ return visitor.visitExtensionElement (this );
5126+ }
5127+
5128+ @override
5129+ PropertyAccessorElement getGetter (String getterName) {
5130+ int length = accessors.length;
5131+ for (int i = 0 ; i < length; i++ ) {
5132+ PropertyAccessorElement accessor = accessors[i];
5133+ if (accessor.isGetter && accessor.name == getterName) {
5134+ return accessor;
5135+ }
5136+ }
5137+ return null ;
5138+ }
5139+
5140+ @override
5141+ MethodElement getMethod (String methodName) {
5142+ int length = methods.length;
5143+ for (int i = 0 ; i < length; i++ ) {
5144+ MethodElement method = methods[i];
5145+ if (method.name == methodName) {
5146+ return method;
5147+ }
5148+ }
5149+ return null ;
5150+ }
5151+
5152+ @override
5153+ PropertyAccessorElement getSetter (String setterName) {
5154+ return AbstractClassElementImpl .getSetterFromAccessors (
5155+ setterName, accessors);
5156+ }
5157+ }
5158+
48985159/// A concrete implementation of a [FieldElement] .
48995160class FieldElementImpl extends PropertyInducingElementImpl
49005161 implements FieldElement {
0 commit comments