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 /// Implementation of the element model used for deserialiation. | 5 /// Implementation of the element model used for deserialiation. |
| 6 /// | 6 /// |
| 7 /// These classes are created by [ElementDeserializer] triggered by the | 7 /// These classes are created by [ElementDeserializer] triggered by the |
| 8 /// [Deserializer]. | 8 /// [Deserializer]. |
| 9 | 9 |
| 10 library dart2js.serialization.modelz; | 10 library dart2js.serialization.modelz; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 } else if (enclosingElement != null) { | 57 } else if (enclosingElement != null) { |
| 58 return enclosingElement.analyzableElement; | 58 return enclosingElement.analyzableElement; |
| 59 } | 59 } |
| 60 return null; | 60 return null; |
| 61 } | 61 } |
| 62 | 62 |
| 63 @override | 63 @override |
| 64 FunctionElement asFunctionElement() => null; | 64 FunctionElement asFunctionElement() => null; |
| 65 | 65 |
| 66 @override | 66 @override |
| 67 Scope buildScope() => _unsupported('analyzableElement'); | 67 Scope buildScope() => _unsupported('buildScope'); |
| 68 | 68 |
| 69 @override | 69 @override |
| 70 ClassElement get enclosingClass => null; | 70 ClassElement get enclosingClass => null; |
| 71 | 71 |
| 72 @override | 72 @override |
| 73 Element get enclosingClassOrCompilationUnit { | |
| 74 return _unsupported('enclosingClassOrCompilationUnit'); | |
| 75 } | |
| 76 | |
| 77 @override | |
| 78 LibraryElement get implementationLibrary => library; | 73 LibraryElement get implementationLibrary => library; |
| 79 | 74 |
| 80 @override | 75 @override |
| 81 bool get isAbstract => false; | 76 bool get isAbstract => false; |
| 82 | 77 |
| 83 @override | 78 @override |
| 84 bool get isClassMember => false; | 79 bool get isClassMember => false; |
| 85 | 80 |
| 86 @override | 81 @override |
| 87 bool get isClosure => false; | 82 bool get isClosure => false; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 103 | 98 |
| 104 @override | 99 @override |
| 105 bool get isMixinApplication => false; | 100 bool get isMixinApplication => false; |
| 106 | 101 |
| 107 @override | 102 @override |
| 108 bool get isOperator => false; | 103 bool get isOperator => false; |
| 109 | 104 |
| 110 @override | 105 @override |
| 111 bool get isStatic => false; | 106 bool get isStatic => false; |
| 112 | 107 |
| 113 // TODO(johnniwinther): Find a more precise semantics for this. | |
| 114 @override | 108 @override |
| 115 bool get isSynthesized => true; | 109 bool get isSynthesized => false; |
| 116 | 110 |
| 117 @override | 111 @override |
| 118 bool get isTopLevel => false; | 112 bool get isTopLevel => false; |
| 119 | 113 |
| 120 // TODO(johnniwinther): Support metadata. | 114 // TODO(johnniwinther): Support metadata. |
| 121 @override | 115 @override |
| 122 Iterable<MetadataAnnotation> get metadata => const <MetadataAnnotation>[]; | 116 Iterable<MetadataAnnotation> get metadata => const <MetadataAnnotation>[]; |
| 123 | 117 |
| 124 @override | 118 @override |
| 125 Token get position => _unsupported('position'); | 119 Token get position => _unsupported('position'); |
| 126 } | 120 } |
| 127 | 121 |
| 128 abstract class DeserializedElementZ extends ElementZ { | 122 abstract class DeserializedElementZ extends ElementZ { |
| 129 ObjectDecoder _decoder; | 123 ObjectDecoder _decoder; |
| 130 | 124 |
| 131 DeserializedElementZ(this._decoder); | 125 DeserializedElementZ(this._decoder); |
| 132 | 126 |
| 133 @override | 127 @override |
| 134 String get name => _decoder.getString(Key.NAME); | 128 String get name => _decoder.getString(Key.NAME); |
| 135 | 129 |
| 130 // TODO(johnniwinther): Should this be cached? | |
| 131 @override | |
| 132 int get sourceOffset => _decoder.getInt(Key.OFFSET, isOptional: true); | |
| 133 | |
| 136 @override | 134 @override |
| 137 SourceSpan get sourcePosition { | 135 SourceSpan get sourcePosition { |
| 138 // TODO(johnniwinther): Should this be cached? | 136 // TODO(johnniwinther): Should this be cached? |
| 139 int offset = _decoder.getInt(Key.OFFSET, isOptional: true); | 137 int offset = sourceOffset; |
| 140 if (offset == null) return null; | 138 if (offset == null) return null; |
| 141 Uri uri = _decoder.getUri(Key.URI, isOptional: true); | 139 Uri uri = _decoder.getUri(Key.URI, isOptional: true); |
| 142 if (uri == null) { | 140 if (uri == null) { |
| 143 uri = compilationUnit.script.readableUri; | 141 uri = compilationUnit.script.readableUri; |
| 144 } | 142 } |
| 145 int length = _decoder.getInt(Key.LENGTH, isOptional: true); | 143 int length = _decoder.getInt(Key.LENGTH, isOptional: true); |
| 146 if (length == null) { | 144 if (length == null) { |
| 147 length = name.length; | 145 length = name.length; |
| 148 } | 146 } |
| 149 return new SourceSpan(uri, offset, offset + length); | 147 return new SourceSpan(uri, offset, offset + length); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 321 | 319 |
| 322 @override | 320 @override |
| 323 CompilationUnitElement get compilationUnit { | 321 CompilationUnitElement get compilationUnit { |
| 324 return _canonicalElement.compilationUnit; | 322 return _canonicalElement.compilationUnit; |
| 325 } | 323 } |
| 326 | 324 |
| 327 @override | 325 @override |
| 328 Element get enclosingElement => _canonicalElement.enclosingElement; | 326 Element get enclosingElement => _canonicalElement.enclosingElement; |
| 329 | 327 |
| 330 @override | 328 @override |
| 329 int get sourceOffset => _canonicalElement.sourceOffset; | |
| 330 | |
| 331 @override | |
| 331 SourceSpan get sourcePosition => _canonicalElement.sourcePosition; | 332 SourceSpan get sourcePosition => _canonicalElement.sourcePosition; |
| 332 | 333 |
| 333 @override | 334 @override |
| 334 ClassElement get enclosingClass => _canonicalElement.enclosingClass; | 335 ClassElement get enclosingClass => _canonicalElement.enclosingClass; |
| 335 } | 336 } |
| 336 | 337 |
| 337 class LibraryElementZ extends DeserializedElementZ | 338 class LibraryElementZ extends DeserializedElementZ |
| 338 with AnalyzableElementMixin, ContainerMixin, LibraryElementCommon | 339 with AnalyzableElementMixin, ContainerMixin, LibraryElementCommon |
| 339 implements LibraryElement { | 340 implements LibraryElement { |
| 340 Uri _canonicalUri; | 341 Uri _canonicalUri; |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 761 | 762 |
| 762 abstract class ClassElementMixin implements ElementZ, ClassElement { | 763 abstract class ClassElementMixin implements ElementZ, ClassElement { |
| 763 InterfaceType _createType(List<DartType> typeArguments) { | 764 InterfaceType _createType(List<DartType> typeArguments) { |
| 764 return new InterfaceType(this, typeArguments); | 765 return new InterfaceType(this, typeArguments); |
| 765 } | 766 } |
| 766 | 767 |
| 767 @override | 768 @override |
| 768 ElementKind get kind => ElementKind.CLASS; | 769 ElementKind get kind => ElementKind.CLASS; |
| 769 | 770 |
| 770 @override | 771 @override |
| 771 void addBackendMember(Element element) => _unsupported('addBackendMember'); | |
| 772 | |
| 773 @override | |
| 774 void forEachBackendMember(void f(Element member)) { | |
| 775 _unsupported('forEachBackendMember'); | |
| 776 } | |
| 777 | |
| 778 @override | |
| 779 bool get hasBackendMembers => _unsupported('hasBackendMembers'); | |
| 780 | |
| 781 @override | |
| 782 bool get hasConstructor => _unsupported('hasConstructor'); | 772 bool get hasConstructor => _unsupported('hasConstructor'); |
| 783 | 773 |
| 784 @override | 774 @override |
| 785 bool hasFieldShadowedBy(Element fieldMember) => _unsupported(''); | |
| 786 | |
| 787 @override | |
| 788 bool get hasIncompleteHierarchy => _unsupported('hasIncompleteHierarchy'); | 775 bool get hasIncompleteHierarchy => _unsupported('hasIncompleteHierarchy'); |
| 789 | 776 |
| 790 @override | 777 @override |
| 791 bool get hasLocalScopeMembers => _unsupported('hasLocalScopeMembers'); | 778 bool get hasLocalScopeMembers => _unsupported('hasLocalScopeMembers'); |
| 792 | 779 |
| 793 @override | 780 @override |
| 794 bool get isEnumClass => false; | 781 bool get isEnumClass => false; |
| 795 | 782 |
| 796 @override | 783 @override |
| 797 Element lookupBackendMember(String memberName) { | |
| 798 return _unsupported('lookupBackendMember'); | |
| 799 } | |
| 800 | |
| 801 @override | |
| 802 ConstructorElement lookupDefaultConstructor() { | 784 ConstructorElement lookupDefaultConstructor() { |
| 803 ConstructorElement constructor = lookupConstructor(""); | 785 ConstructorElement constructor = lookupConstructor(""); |
| 804 if (constructor != null && constructor.parameters.isEmpty) { | 786 if (constructor != null && constructor.parameters.isEmpty) { |
| 805 return constructor; | 787 return constructor; |
| 806 } | 788 } |
| 807 return null; | 789 return null; |
| 808 } | 790 } |
| 809 | 791 |
| 810 @override | 792 @override |
| 811 void reverseBackendMembers() => _unsupported('reverseBackendMembers'); | |
| 812 | |
| 813 @override | |
| 814 ClassElement get superclass => supertype != null ? supertype.element : null; | 793 ClassElement get superclass => supertype != null ? supertype.element : null; |
| 815 | 794 |
| 816 @override | 795 @override |
| 817 void ensureResolved(Resolution resolution) { | 796 void ensureResolved(Resolution resolution) { |
| 818 resolution.registerClass(this); | 797 resolution.registerClass(this); |
| 819 } | 798 } |
| 820 } | 799 } |
| 821 | 800 |
| 822 class ClassElementZ extends DeserializedElementZ | 801 class ClassElementZ extends DeserializedElementZ |
| 823 with | 802 with |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1028 @override | 1007 @override |
| 1029 bool get isProxy => false; | 1008 bool get isProxy => false; |
| 1030 | 1009 |
| 1031 @override | 1010 @override |
| 1032 LibraryElement get library => enclosingElement.library; | 1011 LibraryElement get library => enclosingElement.library; |
| 1033 | 1012 |
| 1034 @override | 1013 @override |
| 1035 InterfaceType get mixinType => interfaces.head; | 1014 InterfaceType get mixinType => interfaces.head; |
| 1036 | 1015 |
| 1037 @override | 1016 @override |
| 1017 int get sourceOffset => _subclass.sourceOffset; | |
| 1018 | |
| 1019 @override | |
| 1038 SourceSpan get sourcePosition => _subclass.sourcePosition; | 1020 SourceSpan get sourcePosition => _subclass.sourcePosition; |
| 1039 } | 1021 } |
| 1040 | 1022 |
| 1041 class EnumClassElementZ extends ClassElementZ implements EnumClassElement { | 1023 class EnumClassElementZ extends ClassElementZ implements EnumClassElement { |
| 1042 List<FieldElement> _enumValues; | 1024 List<FieldElement> _enumValues; |
| 1043 | 1025 |
| 1044 EnumClassElementZ(ObjectDecoder decoder) : super(decoder); | 1026 EnumClassElementZ(ObjectDecoder decoder) : super(decoder); |
| 1045 | 1027 |
| 1046 @override | 1028 @override |
| 1047 bool get isEnumClass => true; | 1029 bool get isEnumClass => true; |
| 1048 | 1030 |
| 1049 @override | 1031 @override |
| 1050 List<FieldElement> get enumValues { | 1032 List<FieldElement> get enumValues { |
| 1051 if (_enumValues == null) { | 1033 if (_enumValues == null) { |
| 1052 _enumValues = _decoder.getElements(Key.FIELDS); | 1034 _enumValues = _decoder.getElements(Key.FIELDS); |
| 1053 } | 1035 } |
| 1054 return _enumValues; | 1036 return _enumValues; |
| 1055 } | 1037 } |
| 1056 } | 1038 } |
| 1057 | 1039 |
| 1058 abstract class ConstructorElementZ extends DeserializedElementZ | 1040 abstract class ConstructorElementZ extends DeserializedElementZ |
| 1059 with | 1041 with |
| 1060 AnalyzableElementMixin, | 1042 AnalyzableElementMixin, |
| 1061 AstElementMixin, | 1043 AstElementMixin, |
| 1062 ClassMemberMixin, | 1044 ClassMemberMixin, |
| 1063 FunctionTypedElementMixin, | 1045 FunctionTypedElementMixin, |
| 1064 ParametersMixin, | 1046 ParametersMixin, |
| 1065 TypedElementMixin, | 1047 TypedElementMixin, |
| 1066 MemberElementMixin | 1048 MemberElementMixin |
| 1067 implements ConstructorElement { | 1049 implements |
| 1050 ConstructorElement, | |
| 1051 // TODO(johnniwinther): Sort out whether a constructor is a method. | |
| 1052 MethodElement { | |
| 1068 ConstantConstructor _constantConstructor; | 1053 ConstantConstructor _constantConstructor; |
| 1069 ConstructorElement _effectiveTarget; | 1054 ConstructorElement _effectiveTarget; |
| 1070 | 1055 |
| 1071 ConstructorElementZ(ObjectDecoder decoder) : super(decoder); | 1056 ConstructorElementZ(ObjectDecoder decoder) : super(decoder); |
| 1072 | 1057 |
| 1073 accept(ElementVisitor visitor, arg) { | 1058 accept(ElementVisitor visitor, arg) { |
| 1074 return visitor.visitConstructorElement(this, arg); | 1059 return visitor.visitConstructorElement(this, arg); |
| 1075 } | 1060 } |
| 1076 | 1061 |
| 1077 @override | 1062 @override |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1122 if (_effectiveTarget == null) { | 1107 if (_effectiveTarget == null) { |
| 1123 _effectiveTarget = this; | 1108 _effectiveTarget = this; |
| 1124 } | 1109 } |
| 1125 } | 1110 } |
| 1126 return _effectiveTarget; | 1111 return _effectiveTarget; |
| 1127 } | 1112 } |
| 1128 | 1113 |
| 1129 @override | 1114 @override |
| 1130 ConstructorElement get immediateRedirectionTarget => null; | 1115 ConstructorElement get immediateRedirectionTarget => null; |
| 1131 | 1116 |
| 1117 // TODO(johnniwinther): Should serialization support erroneous element | |
| 1118 // relations? | |
|
Siggi Cherem (dart-lang)
2016/04/28 17:23:15
it might not be worth while. We can fail early and
Johnni Winther
2016/04/29 09:31:37
They will be needed for warnings such as a call to
| |
| 1132 @override | 1119 @override |
| 1133 bool get isEffectiveTargetMalformed { | 1120 bool get isEffectiveTargetMalformed => false; |
| 1134 return _unsupported('isEffectiveTargetMalformed'); | |
| 1135 } | |
| 1136 | 1121 |
| 1137 @override | 1122 @override |
| 1138 bool get isCyclicRedirection => _unsupported('isCyclicRedirection'); | 1123 bool get isCyclicRedirection => false; |
| 1139 | 1124 |
| 1140 @override | 1125 @override |
| 1141 bool get isRedirectingFactory => false; | 1126 bool get isRedirectingFactory => false; |
| 1142 | 1127 |
| 1143 @override | 1128 @override |
| 1144 bool get isRedirectingGenerative => false; | 1129 bool get isRedirectingGenerative => false; |
| 1145 | 1130 |
| 1146 @override | 1131 @override |
| 1147 PrefixElement get redirectionDeferredPrefix => null; | 1132 PrefixElement get redirectionDeferredPrefix => null; |
| 1148 | 1133 |
| 1149 @override | 1134 @override |
| 1150 InterfaceType computeEffectiveTargetType(InterfaceType newType) => newType; | 1135 InterfaceType computeEffectiveTargetType(InterfaceType newType) => newType; |
| 1151 } | 1136 } |
| 1152 | 1137 |
| 1153 class GenerativeConstructorElementZ extends ConstructorElementZ { | 1138 class GenerativeConstructorElementZ extends ConstructorElementZ { |
| 1154 GenerativeConstructorElementZ(ObjectDecoder decoder) : super(decoder); | 1139 GenerativeConstructorElementZ(ObjectDecoder decoder) : super(decoder); |
| 1155 | 1140 |
| 1156 @override | 1141 @override |
| 1157 ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR; | 1142 ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR; |
| 1158 | 1143 |
| 1159 @override | 1144 @override |
| 1160 bool get isRedirectingGenerative => _decoder.getBool(Key.IS_REDIRECTING); | 1145 bool get isRedirectingGenerative => _decoder.getBool(Key.IS_REDIRECTING); |
| 1146 | |
| 1147 @override | |
| 1148 bool get isSynthesized => definingConstructor != null; | |
| 1161 } | 1149 } |
| 1162 | 1150 |
| 1163 class FactoryConstructorElementZ extends ConstructorElementZ { | 1151 class FactoryConstructorElementZ extends ConstructorElementZ { |
| 1164 FactoryConstructorElementZ(ObjectDecoder decoder) : super(decoder); | 1152 FactoryConstructorElementZ(ObjectDecoder decoder) : super(decoder); |
| 1165 | 1153 |
| 1166 @override | 1154 @override |
| 1167 ElementKind get kind => ElementKind.FACTORY_CONSTRUCTOR; | 1155 ElementKind get kind => ElementKind.FACTORY_CONSTRUCTOR; |
| 1168 } | 1156 } |
| 1169 | 1157 |
| 1170 class RedirectingFactoryConstructorElementZ extends ConstructorElementZ { | 1158 class RedirectingFactoryConstructorElementZ extends ConstructorElementZ { |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1291 @override | 1279 @override |
| 1292 bool get isFromEnvironmentConstructor => false; | 1280 bool get isFromEnvironmentConstructor => false; |
| 1293 | 1281 |
| 1294 @override | 1282 @override |
| 1295 bool get isRedirectingFactory => false; | 1283 bool get isRedirectingFactory => false; |
| 1296 | 1284 |
| 1297 @override | 1285 @override |
| 1298 bool get isRedirectingGenerative => false; | 1286 bool get isRedirectingGenerative => false; |
| 1299 | 1287 |
| 1300 @override | 1288 @override |
| 1289 bool get isSynthesized => true; | |
| 1290 | |
| 1291 @override | |
| 1301 ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR; | 1292 ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR; |
| 1302 | 1293 |
| 1303 @override | 1294 @override |
| 1304 LibraryElement get library => enclosingClass.library; | 1295 LibraryElement get library => enclosingClass.library; |
| 1305 | 1296 |
| 1306 @override | 1297 @override |
| 1307 MemberElement get memberContext => this; | 1298 MemberElement get memberContext => this; |
| 1308 | 1299 |
| 1309 @override | 1300 @override |
| 1310 Name get memberName => definingConstructor.memberName; | 1301 Name get memberName => definingConstructor.memberName; |
| 1311 | 1302 |
| 1312 @override | 1303 @override |
| 1313 String get name => definingConstructor.name; | 1304 String get name => definingConstructor.name; |
| 1314 | 1305 |
| 1315 @override | 1306 @override |
| 1316 List<FunctionElement> get nestedClosures => const <FunctionElement>[]; | 1307 List<FunctionElement> get nestedClosures => const <FunctionElement>[]; |
| 1317 | 1308 |
| 1318 @override | 1309 @override |
| 1319 List<ParameterElement> get parameters { | 1310 List<ParameterElement> get parameters { |
| 1320 // TODO(johnniwinther): We need to create synthetic parameters that | 1311 // TODO(johnniwinther): We need to create synthetic parameters that |
| 1321 // substitute type variables. | 1312 // substitute type variables. |
| 1322 return definingConstructor.parameters; | 1313 return definingConstructor.parameters; |
| 1323 } | 1314 } |
| 1324 | 1315 |
| 1325 // TODO: implement redirectionDeferredPrefix | 1316 // TODO: implement redirectionDeferredPrefix |
| 1326 @override | 1317 @override |
| 1327 PrefixElement get redirectionDeferredPrefix => null; | 1318 PrefixElement get redirectionDeferredPrefix => null; |
| 1328 | 1319 |
| 1329 @override | 1320 @override |
| 1321 int get sourceOffset => enclosingClass.sourceOffset; | |
| 1322 | |
| 1323 @override | |
| 1330 SourceSpan get sourcePosition => enclosingClass.sourcePosition; | 1324 SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
| 1331 | 1325 |
| 1332 @override | 1326 @override |
| 1333 FunctionType get type { | 1327 FunctionType get type { |
| 1334 // TODO(johnniwinther): Ensure that the function type substitutes type | 1328 // TODO(johnniwinther): Ensure that the function type substitutes type |
| 1335 // variables correctly. | 1329 // variables correctly. |
| 1336 return definingConstructor.type; | 1330 return definingConstructor.type; |
| 1337 } | 1331 } |
| 1338 } | 1332 } |
| 1339 | 1333 |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1799 DartType get bound { | 1793 DartType get bound { |
| 1800 assert(invariant(this, _bound != null, | 1794 assert(invariant(this, _bound != null, |
| 1801 message: "Type variable bound has not been set on $this.")); | 1795 message: "Type variable bound has not been set on $this.")); |
| 1802 return _bound; | 1796 return _bound; |
| 1803 } | 1797 } |
| 1804 | 1798 |
| 1805 @override | 1799 @override |
| 1806 LibraryElement get library => typeDeclaration.library; | 1800 LibraryElement get library => typeDeclaration.library; |
| 1807 | 1801 |
| 1808 @override | 1802 @override |
| 1803 int get sourceOffset => typeDeclaration.sourceOffset; | |
| 1804 | |
| 1805 @override | |
| 1809 SourceSpan get sourcePosition => typeDeclaration.sourcePosition; | 1806 SourceSpan get sourcePosition => typeDeclaration.sourcePosition; |
| 1810 } | 1807 } |
| 1811 | 1808 |
| 1812 abstract class ParameterElementZ extends DeserializedElementZ | 1809 abstract class ParameterElementZ extends DeserializedElementZ |
| 1813 with AnalyzableElementMixin, AstElementMixin, TypedElementMixin | 1810 with AnalyzableElementMixin, AstElementMixin, TypedElementMixin |
| 1814 implements ParameterElement { | 1811 implements ParameterElement { |
| 1815 FunctionElement _functionDeclaration; | 1812 FunctionElement _functionDeclaration; |
| 1816 ConstantExpression _constant; | 1813 ConstantExpression _constant; |
| 1817 DartType _type; | 1814 DartType _type; |
| 1818 | 1815 |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2083 } | 2080 } |
| 2084 | 2081 |
| 2085 @override | 2082 @override |
| 2086 ElementKind get kind => ElementKind.PREFIX; | 2083 ElementKind get kind => ElementKind.PREFIX; |
| 2087 | 2084 |
| 2088 @override | 2085 @override |
| 2089 Element lookupLocalMember(String memberName) { | 2086 Element lookupLocalMember(String memberName) { |
| 2090 return _unsupported('lookupLocalMember'); | 2087 return _unsupported('lookupLocalMember'); |
| 2091 } | 2088 } |
| 2092 } | 2089 } |
| OLD | NEW |