OLD | NEW |
---|---|
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 analyzer.src.dart.element.element; | 5 library analyzer.src.dart.element.element; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 import 'dart:math' show min; | 8 import 'dart:math' show min; |
9 | 9 |
10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
(...skipping 23 matching lines...) Expand all Loading... | |
34 | 34 |
35 /** | 35 /** |
36 * A concrete implementation of a [ClassElement]. | 36 * A concrete implementation of a [ClassElement]. |
37 */ | 37 */ |
38 abstract class AbstractClassElementImpl extends ElementImpl | 38 abstract class AbstractClassElementImpl extends ElementImpl |
39 implements ClassElement { | 39 implements ClassElement { |
40 /** | 40 /** |
41 * A list containing all of the accessors (getters and setters) contained in | 41 * A list containing all of the accessors (getters and setters) contained in |
42 * this class. | 42 * this class. |
43 */ | 43 */ |
44 List<PropertyAccessorElement> _accessors = PropertyAccessorElement.EMPTY_LIST; | 44 List<PropertyAccessorElement> _accessors; |
45 | 45 |
46 /** | 46 /** |
47 * A list containing all of the fields contained in this class. | 47 * A list containing all of the fields contained in this class. |
48 */ | 48 */ |
49 List<FieldElement> _fields = FieldElement.EMPTY_LIST; | 49 List<FieldElement> _fields; |
50 | 50 |
51 /** | 51 /** |
52 * The type defined by the class. | 52 * The type defined by the class. |
53 */ | 53 */ |
54 @override | 54 @override |
55 InterfaceType type; | 55 InterfaceType type; |
56 | 56 |
57 /** | 57 /** |
58 * Initialize a newly created class element to have the given [name] at the | 58 * Initialize a newly created class element to have the given [name] at the |
59 * given [offset] in the file that contains the declaration of this element. | 59 * given [offset] in the file that contains the declaration of this element. |
60 */ | 60 */ |
61 AbstractClassElementImpl(String name, int offset) : super(name, offset); | 61 AbstractClassElementImpl(String name, int offset) : super(name, offset); |
62 | 62 |
63 /** | 63 /** |
64 * Initialize a newly created class element to have the given [name]. | 64 * Initialize a newly created class element to have the given [name]. |
65 */ | 65 */ |
66 AbstractClassElementImpl.forNode(Identifier name) : super.forNode(name); | 66 AbstractClassElementImpl.forNode(Identifier name) : super.forNode(name); |
67 | 67 |
68 /** | 68 /** |
69 * Initialize using the given serialized information. | 69 * Initialize using the given serialized information. |
70 */ | 70 */ |
71 AbstractClassElementImpl.forSerialized( | 71 AbstractClassElementImpl.forSerialized( |
72 CompilationUnitElementImpl enclosingUnit) | 72 CompilationUnitElementImpl enclosingUnit) |
73 : super.forSerialized(enclosingUnit); | 73 : super.forSerialized(enclosingUnit); |
74 | 74 |
75 @override | 75 @override |
76 List<PropertyAccessorElement> get accessors => _accessors; | 76 List<PropertyAccessorElement> get accessors { |
77 return _accessors ?? const <PropertyAccessorElement>[]; | |
78 } | |
77 | 79 |
78 /** | 80 /** |
79 * Set the accessors contained in this class to the given [accessors]. | 81 * Set the accessors contained in this class to the given [accessors]. |
80 */ | 82 */ |
81 void set accessors(List<PropertyAccessorElement> accessors) { | 83 void set accessors(List<PropertyAccessorElement> accessors) { |
82 for (PropertyAccessorElement accessor in accessors) { | 84 for (PropertyAccessorElement accessor in accessors) { |
83 (accessor as PropertyAccessorElementImpl).enclosingElement = this; | 85 (accessor as PropertyAccessorElementImpl).enclosingElement = this; |
84 } | 86 } |
85 this._accessors = accessors; | 87 this._accessors = accessors; |
86 } | 88 } |
87 | 89 |
88 @override | 90 @override |
89 String get displayName => name; | 91 String get displayName => name; |
90 | 92 |
91 @override | 93 @override |
92 List<FieldElement> get fields => _fields; | 94 List<FieldElement> get fields => _fields ?? const <FieldElement>[]; |
93 | 95 |
94 /** | 96 /** |
95 * Set the fields contained in this class to the given [fields]. | 97 * Set the fields contained in this class to the given [fields]. |
96 */ | 98 */ |
97 void set fields(List<FieldElement> fields) { | 99 void set fields(List<FieldElement> fields) { |
98 for (FieldElement field in fields) { | 100 for (FieldElement field in fields) { |
99 (field as FieldElementImpl).enclosingElement = this; | 101 (field as FieldElementImpl).enclosingElement = this; |
100 } | 102 } |
101 this._fields = fields; | 103 this._fields = fields; |
102 } | 104 } |
(...skipping 17 matching lines...) Expand all Loading... | |
120 } | 122 } |
121 } | 123 } |
122 | 124 |
123 @override | 125 @override |
124 ElementImpl getChild(String identifier) { | 126 ElementImpl getChild(String identifier) { |
125 // | 127 // |
126 // The casts in this method are safe because the set methods would have | 128 // The casts in this method are safe because the set methods would have |
127 // thrown a CCE if any of the elements in the arrays were not of the | 129 // thrown a CCE if any of the elements in the arrays were not of the |
128 // expected types. | 130 // expected types. |
129 // | 131 // |
130 for (PropertyAccessorElement accessor in _accessors) { | 132 for (PropertyAccessorElement accessor in accessors) { |
131 PropertyAccessorElementImpl accessorImpl = accessor; | 133 PropertyAccessorElementImpl accessorImpl = accessor; |
132 if (accessorImpl.identifier == identifier) { | 134 if (accessorImpl.identifier == identifier) { |
133 return accessorImpl; | 135 return accessorImpl; |
134 } | 136 } |
135 } | 137 } |
136 for (FieldElement field in _fields) { | 138 for (FieldElement field in fields) { |
137 FieldElementImpl fieldImpl = field; | 139 FieldElementImpl fieldImpl = field; |
138 if (fieldImpl.identifier == identifier) { | 140 if (fieldImpl.identifier == identifier) { |
139 return fieldImpl; | 141 return fieldImpl; |
140 } | 142 } |
141 } | 143 } |
142 return null; | 144 return null; |
143 } | 145 } |
144 | 146 |
145 @override | 147 @override |
146 FieldElement getField(String name) { | 148 FieldElement getField(String name) { |
147 for (FieldElement fieldElement in _fields) { | 149 for (FieldElement fieldElement in fields) { |
148 if (name == fieldElement.name) { | 150 if (name == fieldElement.name) { |
149 return fieldElement; | 151 return fieldElement; |
150 } | 152 } |
151 } | 153 } |
152 return null; | 154 return null; |
153 } | 155 } |
154 | 156 |
155 @override | 157 @override |
156 PropertyAccessorElement getGetter(String getterName) { | 158 PropertyAccessorElement getGetter(String getterName) { |
157 int length = _accessors.length; | 159 int length = accessors.length; |
158 for (int i = 0; i < length; i++) { | 160 for (int i = 0; i < length; i++) { |
159 PropertyAccessorElement accessor = _accessors[i]; | 161 PropertyAccessorElement accessor = accessors[i]; |
160 if (accessor.isGetter && accessor.name == getterName) { | 162 if (accessor.isGetter && accessor.name == getterName) { |
161 return accessor; | 163 return accessor; |
162 } | 164 } |
163 } | 165 } |
164 return null; | 166 return null; |
165 } | 167 } |
166 | 168 |
167 @override | 169 @override |
168 PropertyAccessorElement getSetter(String setterName) { | 170 PropertyAccessorElement getSetter(String setterName) { |
169 // TODO (jwren) revisit- should we append '=' here or require clients to | 171 // TODO (jwren) revisit- should we append '=' here or require clients to |
170 // include it? | 172 // include it? |
171 // Do we need the check for isSetter below? | 173 // Do we need the check for isSetter below? |
172 if (!StringUtilities.endsWithChar(setterName, 0x3D)) { | 174 if (!StringUtilities.endsWithChar(setterName, 0x3D)) { |
173 setterName += '='; | 175 setterName += '='; |
174 } | 176 } |
175 for (PropertyAccessorElement accessor in _accessors) { | 177 for (PropertyAccessorElement accessor in accessors) { |
176 if (accessor.isSetter && accessor.name == setterName) { | 178 if (accessor.isSetter && accessor.name == setterName) { |
177 return accessor; | 179 return accessor; |
178 } | 180 } |
179 } | 181 } |
180 return null; | 182 return null; |
181 } | 183 } |
182 | 184 |
183 @override | 185 @override |
184 MethodElement lookUpConcreteMethod( | 186 MethodElement lookUpConcreteMethod( |
185 String methodName, LibraryElement library) => | 187 String methodName, LibraryElement library) => |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
219 methodName, library, true, new HashSet<ClassElement>()); | 221 methodName, library, true, new HashSet<ClassElement>()); |
220 | 222 |
221 @override | 223 @override |
222 PropertyAccessorElement lookUpSetter( | 224 PropertyAccessorElement lookUpSetter( |
223 String setterName, LibraryElement library) => | 225 String setterName, LibraryElement library) => |
224 _internalLookUpSetter(setterName, library, true); | 226 _internalLookUpSetter(setterName, library, true); |
225 | 227 |
226 @override | 228 @override |
227 void visitChildren(ElementVisitor visitor) { | 229 void visitChildren(ElementVisitor visitor) { |
228 super.visitChildren(visitor); | 230 super.visitChildren(visitor); |
229 safelyVisitChildren(_accessors, visitor); | 231 safelyVisitChildren(accessors, visitor); |
230 safelyVisitChildren(_fields, visitor); | 232 safelyVisitChildren(fields, visitor); |
231 } | 233 } |
232 | 234 |
233 PropertyAccessorElement _internalLookUpConcreteGetter( | 235 PropertyAccessorElement _internalLookUpConcreteGetter( |
234 String getterName, LibraryElement library, bool includeThisClass) { | 236 String getterName, LibraryElement library, bool includeThisClass) { |
235 PropertyAccessorElement getter = | 237 PropertyAccessorElement getter = |
236 _internalLookUpGetter(getterName, library, includeThisClass); | 238 _internalLookUpGetter(getterName, library, includeThisClass); |
237 while (getter != null && getter.isAbstract) { | 239 while (getter != null && getter.isAbstract) { |
238 Element definingClass = getter.enclosingElement; | 240 Element definingClass = getter.enclosingElement; |
239 if (definingClass is! ClassElement) { | 241 if (definingClass is! ClassElement) { |
240 return null; | 242 return null; |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
496 | 498 |
497 /** | 499 /** |
498 * Set whether this class is abstract. | 500 * Set whether this class is abstract. |
499 */ | 501 */ |
500 void set abstract(bool isAbstract) { | 502 void set abstract(bool isAbstract) { |
501 assert(_unlinkedClass == null); | 503 assert(_unlinkedClass == null); |
502 setModifier(Modifier.ABSTRACT, isAbstract); | 504 setModifier(Modifier.ABSTRACT, isAbstract); |
503 } | 505 } |
504 | 506 |
505 @override | 507 @override |
508 List<PropertyAccessorElement> get accessors { | |
509 if (_unlinkedClass != null && _accessors == null) { | |
510 _resynthesizeFieldsAndPropertyAccessors(); | |
511 } | |
512 return _accessors ?? const <PropertyAccessorElement>[]; | |
513 } | |
514 | |
515 @override | |
516 void set accessors(List<PropertyAccessorElement> accessors) { | |
517 assert(_unlinkedClass == null); | |
518 super.accessors = accessors; | |
519 } | |
520 | |
521 @override | |
506 List<InterfaceType> get allSupertypes { | 522 List<InterfaceType> get allSupertypes { |
507 List<InterfaceType> list = new List<InterfaceType>(); | 523 List<InterfaceType> list = new List<InterfaceType>(); |
508 _collectAllSupertypes(list); | 524 _collectAllSupertypes(list); |
509 return list; | 525 return list; |
510 } | 526 } |
511 | 527 |
512 @override | 528 @override |
513 int get codeLength { | 529 int get codeLength { |
514 if (_unlinkedClass != null) { | 530 if (_unlinkedClass != null) { |
515 return _unlinkedClass.codeRange?.length; | 531 return _unlinkedClass.codeRange?.length; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
622 nearestNonMixinClass = nearestNonMixinClass.supertype.element; | 638 nearestNonMixinClass = nearestNonMixinClass.supertype.element; |
623 } | 639 } |
624 } | 640 } |
625 return !nearestNonMixinClass.constructors.any(isSuperConstructorAccessible); | 641 return !nearestNonMixinClass.constructors.any(isSuperConstructorAccessible); |
626 } | 642 } |
627 | 643 |
628 @override | 644 @override |
629 TypeParameterizedElementMixin get enclosingTypeParameterContext => null; | 645 TypeParameterizedElementMixin get enclosingTypeParameterContext => null; |
630 | 646 |
631 @override | 647 @override |
648 List<FieldElement> get fields { | |
649 if (_unlinkedClass != null && _fields == null) { | |
650 _resynthesizeFieldsAndPropertyAccessors(); | |
651 } | |
652 return _fields ?? const <FieldElement>[]; | |
653 } | |
654 | |
655 @override | |
656 void set fields(List<FieldElement> fields) { | |
657 assert(_unlinkedClass == null); | |
658 super.fields = fields; | |
659 } | |
660 | |
661 @override | |
632 bool get hasNonFinalField { | 662 bool get hasNonFinalField { |
633 List<ClassElement> classesToVisit = new List<ClassElement>(); | 663 List<ClassElement> classesToVisit = new List<ClassElement>(); |
634 HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>(); | 664 HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>(); |
635 classesToVisit.add(this); | 665 classesToVisit.add(this); |
636 while (!classesToVisit.isEmpty) { | 666 while (!classesToVisit.isEmpty) { |
637 ClassElement currentElement = classesToVisit.removeAt(0); | 667 ClassElement currentElement = classesToVisit.removeAt(0); |
638 if (visitedClasses.add(currentElement)) { | 668 if (visitedClasses.add(currentElement)) { |
639 // check fields | 669 // check fields |
640 for (FieldElement field in currentElement.fields) { | 670 for (FieldElement field in currentElement.fields) { |
641 if (!field.isFinal && | 671 if (!field.isFinal && |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
674 setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper); | 704 setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper); |
675 } | 705 } |
676 | 706 |
677 @override | 707 @override |
678 bool get hasStaticMember { | 708 bool get hasStaticMember { |
679 for (MethodElement method in methods) { | 709 for (MethodElement method in methods) { |
680 if (method.isStatic) { | 710 if (method.isStatic) { |
681 return true; | 711 return true; |
682 } | 712 } |
683 } | 713 } |
684 for (PropertyAccessorElement accessor in _accessors) { | 714 for (PropertyAccessorElement accessor in accessors) { |
685 if (accessor.isStatic) { | 715 if (accessor.isStatic) { |
686 return true; | 716 return true; |
687 } | 717 } |
688 } | 718 } |
689 return false; | 719 return false; |
690 } | 720 } |
691 | 721 |
692 @override | 722 @override |
693 List<InterfaceType> get interfaces { | 723 List<InterfaceType> get interfaces { |
694 if (_unlinkedClass != null && _interfaces == null) { | 724 if (_unlinkedClass != null && _interfaces == null) { |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1116 superParameter.type.substitute2(argumentTypes, parameterTypes); | 1146 superParameter.type.substitute2(argumentTypes, parameterTypes); |
1117 implicitParameters[i] = implicitParameter; | 1147 implicitParameters[i] = implicitParameter; |
1118 } | 1148 } |
1119 implicitConstructor.parameters = implicitParameters; | 1149 implicitConstructor.parameters = implicitParameters; |
1120 } | 1150 } |
1121 implicitConstructor.enclosingElement = this; | 1151 implicitConstructor.enclosingElement = this; |
1122 return implicitConstructor; | 1152 return implicitConstructor; |
1123 }).toList(growable: false); | 1153 }).toList(growable: false); |
1124 } | 1154 } |
1125 | 1155 |
1156 /** | |
1157 * Resynthesize explicit fields and property accessors and fill [_fields] and | |
1158 * [_accessors]. | |
1159 */ | |
1160 void _resynthesizeFieldsAndPropertyAccessors() { | |
1161 assert(_fields == null); | |
1162 assert(_accessors == null); | |
1163 // Build explicit fields and implicit property accessors. | |
1164 var explicitFields = <FieldElement>[]; | |
1165 var implicitAccessors = <PropertyAccessorElement>[]; | |
1166 for (UnlinkedVariable v in _unlinkedClass.fields) { | |
1167 FieldElementImpl field = | |
1168 new FieldElementImpl.forSerializedFactory(v, this); | |
1169 explicitFields.add(field); | |
1170 implicitAccessors.add( | |
1171 new PropertyAccessorElementImpl_ImplicitGetter(field) | |
1172 ..enclosingElement = this); | |
1173 if (!field.isConst && !field.isFinal) { | |
1174 implicitAccessors.add( | |
1175 new PropertyAccessorElementImpl_ImplicitSetter(field) | |
1176 ..enclosingElement = this); | |
1177 } | |
1178 } | |
1179 // Build explicit fields and implicit property accessors. | |
Paul Berry
2016/06/03 20:06:48
I think you mean "Build explicit property accessor
| |
1180 var explicitAccessors = <PropertyAccessorElement>[]; | |
1181 var implicitFields = <String, FieldElementImpl>{}; | |
1182 for (UnlinkedExecutable e in _unlinkedClass.executables) { | |
1183 if (e.kind == UnlinkedExecutableKind.getter || | |
1184 e.kind == UnlinkedExecutableKind.setter) { | |
1185 PropertyAccessorElementImpl accessor = | |
1186 new PropertyAccessorElementImpl.forSerialized(e, this); | |
1187 explicitAccessors.add(accessor); | |
1188 // Prepare the field type. | |
1189 DartType fieldType; | |
1190 if (e.kind == UnlinkedExecutableKind.getter) { | |
1191 fieldType = accessor.returnType; | |
1192 } else { | |
1193 fieldType = accessor.parameters[0].type; | |
1194 } | |
1195 // Create or update the implicit field. | |
1196 String fieldName = accessor.displayName; | |
1197 FieldElementImpl field = implicitFields[fieldName]; | |
1198 if (field == null) { | |
1199 field = new FieldElementImpl(fieldName, -1); | |
1200 implicitFields[fieldName] = field; | |
1201 field.enclosingElement = this; | |
1202 field.synthetic = true; | |
1203 field.final2 = e.kind == UnlinkedExecutableKind.getter; | |
1204 field.type = fieldType; | |
1205 } else { | |
1206 field.final2 = false; | |
1207 } | |
1208 accessor.variable = field; | |
1209 if (e.kind == UnlinkedExecutableKind.getter) { | |
1210 field.getter = accessor; | |
1211 } else { | |
1212 field.setter = accessor; | |
1213 } | |
1214 } | |
1215 } | |
1216 // Combine explicit and implicit fields and property accessors. | |
1217 _fields = <FieldElement>[] | |
1218 ..addAll(explicitFields) | |
1219 ..addAll(implicitFields.values); | |
1220 _accessors = <PropertyAccessorElement>[] | |
1221 ..addAll(explicitAccessors) | |
1222 ..addAll(implicitAccessors); | |
1223 } | |
1224 | |
1126 bool _safeIsOrInheritsProxy( | 1225 bool _safeIsOrInheritsProxy( |
1127 ClassElement classElt, HashSet<ClassElement> visitedClassElts) { | 1226 ClassElement classElt, HashSet<ClassElement> visitedClassElts) { |
1128 if (visitedClassElts.contains(classElt)) { | 1227 if (visitedClassElts.contains(classElt)) { |
1129 return false; | 1228 return false; |
1130 } | 1229 } |
1131 visitedClassElts.add(classElt); | 1230 visitedClassElts.add(classElt); |
1132 if (classElt.isProxy) { | 1231 if (classElt.isProxy) { |
1133 return true; | 1232 return true; |
1134 } else if (classElt.supertype != null && | 1233 } else if (classElt.supertype != null && |
1135 _safeIsOrInheritsProxy(classElt.supertype.element, visitedClassElts)) { | 1234 _safeIsOrInheritsProxy(classElt.supertype.element, visitedClassElts)) { |
(...skipping 2695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3831 */ | 3930 */ |
3832 FieldElementImpl.forNode(Identifier name) : super.forNode(name); | 3931 FieldElementImpl.forNode(Identifier name) : super.forNode(name); |
3833 | 3932 |
3834 /** | 3933 /** |
3835 * Initialize using the given serialized information. | 3934 * Initialize using the given serialized information. |
3836 */ | 3935 */ |
3837 FieldElementImpl.forSerialized( | 3936 FieldElementImpl.forSerialized( |
3838 UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement) | 3937 UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement) |
3839 : super.forSerialized(unlinkedVariable, enclosingElement); | 3938 : super.forSerialized(unlinkedVariable, enclosingElement); |
3840 | 3939 |
3940 /** | |
3941 * Initialize using the given serialized information. | |
3942 */ | |
3943 factory FieldElementImpl.forSerializedFactory( | |
3944 UnlinkedVariable unlinkedVariable, ClassElementImpl enclosingClass) { | |
3945 if (unlinkedVariable.initializer?.bodyExpr != null && | |
3946 (unlinkedVariable.isConst || | |
3947 unlinkedVariable.isFinal && !unlinkedVariable.isStatic)) { | |
3948 return new ConstFieldElementImpl.forSerialized( | |
3949 unlinkedVariable, enclosingClass); | |
3950 } else { | |
3951 return new FieldElementImpl.forSerialized( | |
3952 unlinkedVariable, enclosingClass); | |
3953 } | |
3954 } | |
3955 | |
3841 @override | 3956 @override |
3842 ClassElement get enclosingElement => super.enclosingElement as ClassElement; | 3957 ClassElement get enclosingElement => super.enclosingElement as ClassElement; |
3843 | 3958 |
3844 @override | 3959 @override |
3845 bool get isEnumConstant => | 3960 bool get isEnumConstant => |
3846 enclosingElement != null ? enclosingElement.isEnum : false; | 3961 enclosingElement != null ? enclosingElement.isEnum : false; |
3847 | 3962 |
3848 @override | 3963 @override |
3964 bool get isStatic { | |
3965 if (_unlinkedVariable != null) { | |
3966 return _unlinkedVariable.isStatic; | |
3967 } | |
3968 return hasModifier(Modifier.STATIC); | |
3969 } | |
3970 | |
3971 @override | |
3849 ElementKind get kind => ElementKind.FIELD; | 3972 ElementKind get kind => ElementKind.FIELD; |
3850 | 3973 |
3851 /** | 3974 /** |
3852 * Set whether this field is static. | 3975 * Set whether this field is static. |
3853 */ | 3976 */ |
3854 void set static(bool isStatic) { | 3977 void set static(bool isStatic) { |
3978 assert(_unlinkedVariable == null); | |
3855 setModifier(Modifier.STATIC, isStatic); | 3979 setModifier(Modifier.STATIC, isStatic); |
3856 } | 3980 } |
3857 | 3981 |
3858 @override | 3982 @override |
3859 accept(ElementVisitor visitor) => visitor.visitFieldElement(this); | 3983 accept(ElementVisitor visitor) => visitor.visitFieldElement(this); |
3860 | 3984 |
3861 @override | 3985 @override |
3862 AstNode computeNode() { | 3986 AstNode computeNode() { |
3863 if (isEnumConstant) { | 3987 if (isEnumConstant) { |
3864 return getNodeMatching((node) => node is EnumConstantDeclaration); | 3988 return getNodeMatching((node) => node is EnumConstantDeclaration); |
(...skipping 4204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8069 | 8193 |
8070 @override | 8194 @override |
8071 void visitElement(Element element) { | 8195 void visitElement(Element element) { |
8072 int offset = element.nameOffset; | 8196 int offset = element.nameOffset; |
8073 if (offset != -1) { | 8197 if (offset != -1) { |
8074 map[offset] = element; | 8198 map[offset] = element; |
8075 } | 8199 } |
8076 super.visitElement(element); | 8200 super.visitElement(element); |
8077 } | 8201 } |
8078 } | 8202 } |
OLD | NEW |