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? |
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 |