Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: pkg/compiler/lib/src/serialization/modelz.dart

Issue 1192103002: Support serialization of the compiler backbone. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Handle (bypass) external const constructors. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 /// Implementation of the element model used for deserialiation.
6 ///
7 /// These classes are created by [ElementDeserializer] triggered by the
8 /// [Deserializer].
9
10 library dart2js.serialization.modelz;
11
12 import 'serialization.dart';
13 import 'keys.dart';
14 import '../constants/expressions.dart';
15 import '../dart2jslib.dart'
16 show Backend,
17 Compiler,
18 DiagnosticListener,
19 Script,
20 SourceSpan;
21 import '../dart_types.dart';
22 import '../elements/elements.dart';
23 import '../elements/modelx.dart' show FunctionSignatureX;
24 import '../elements/common.dart';
25 import '../elements/visitor.dart';
26 import '../ordered_typeset.dart';
27 import '../resolution/resolution.dart';
28 import '../resolution/class_members.dart' as class_members;
29 import '../resolution/enum_creator.dart' show AstBuilder;
30 import '../scanner/scannerlib.dart' show Token, SEMICOLON_INFO;
31 import '../serialization/constant_serialization.dart';
32 import '../io/source_file.dart';
33 import '../tree/tree.dart';
34 import '../util/util.dart' show Link, LinkBuilder;
35
36 /// Compute a [Link] from an [Iterable].
37 Link toLink(Iterable iterable) {
38 LinkBuilder builder = new LinkBuilder();
39 for (var element in iterable) {
40 builder.addLast(element);
41 }
42 return builder.toLink();
43 }
44
45 abstract class ElementZ extends Element with ElementCommon {
46 @override
47 bool get isFactoryConstructor => false;
48
49 String toString() {
50 if (enclosingElement == null || isTopLevel) return 'Z$kind($name)';
51 return 'Z$kind(${enclosingElement.name}#$name)';
52 }
53
54 _unsupported(text) => throw new UnsupportedError('${this}.$text');
55
56 @override
57 AnalyzableElement get analyzableElement {
58 Element element = this;
59 if (element is AnalyzableElement) {
60 return element;
61 } else if (enclosingElement != null) {
62 return enclosingElement.analyzableElement;
63 }
64 return null;
65 }
66
67 @override
68 FunctionElement asFunctionElement() => null;
69
70 @override
71 Scope buildScope() => _unsupported('analyzableElement');
72
73 @override
74 CompilationUnitElement get compilationUnit {
75 return _unsupported('compilationUnit');
76 }
77
78 @override
79 ClassElement get contextClass => _unsupported('contextClass');
80
81 @override
82 void diagnose(Element context, DiagnosticListener listener) {
83 _unsupported('diagnose');
84 }
85
86 @override
87 ClassElement get enclosingClass => null;
88
89 @override
90 Element get enclosingClassOrCompilationUnit {
91 return _unsupported('enclosingClassOrCompilationUnit');
92 }
93
94 @override
95 String get fixedBackendName => _unsupported('fixedBackendName');
96
97 @override
98 bool get hasFixedBackendName => _unsupported('hasFixedBackendName');
99
100 @override
101 LibraryElement get implementationLibrary => library;
102
103 @override
104 bool get isAbstract => false;
105
106 @override
107 bool get isAssignable => _unsupported('isAssignable');
108
109 @override
110 bool get isClassMember => false;
111
112 @override
113 bool get isClosure => _unsupported('isClosure');
114
115 @override
116 bool get isConst => _unsupported('isConst');
117
118 @override
119 bool get isDeferredLoaderGetter => false;
120
121 @override
122 bool get isFinal => _unsupported('isFinal');
123
124 @override
125 bool get isInstanceMember => false;
126
127 @override
128 bool get isLocal => false;
129
130 @override
131 bool get isMixinApplication => false;
132
133 @override
134 bool get isNative => false;
135
136 @override
137 bool get isOperator => false;
138
139 @override
140 bool get isStatic => false;
141
142 // TODO(johnniwinther): Find a more precise semantics for this.
143 @override
144 bool get isSynthesized => true;
145
146 @override
147 bool get isTopLevel => false;
148
149 // TODO(johnniwinther): Support metadata.
150 @override
151 Link<MetadataAnnotation> get metadata => const Link<MetadataAnnotation>();
152
153 @override
154 Element get outermostEnclosingMemberOrTopLevel {
155 return _unsupported('outermostEnclosingMemberOrTopLevel');
156 }
157
158 @override
159 Token get position => _unsupported('position');
160 }
161
162 abstract class DeserializedElementZ extends ElementZ {
163 ObjectDecoder _decoder;
164
165 DeserializedElementZ(this._decoder);
166
167 @override
168 String get name => _decoder.getString(Key.NAME);
169
170 @override
171 SourceSpan get sourcePosition {
172 // TODO(johnniwinther): Should this be cached?
173 int offset = _decoder.getInt(Key.OFFSET, isOptional: true);
174 if (offset == null) return null;
175 Uri uri = _decoder.getUri(Key.URI, isOptional: true);
176 if (uri == null) {
177 uri = compilationUnit.script.readableUri;
178 }
179 int length = _decoder.getInt(Key.LENGTH, isOptional: true);
180 if (length == null) {
181 length = name.length;
182 }
183 return new SourceSpan(uri, offset, offset + length);
184 }
185 }
186
187 /// Deserializer for a collection of member elements serialized as a map from
188 /// names to element declarations.
189 ///
190 /// The serialized data contains the declared getters and setters but lookup
191 /// into the map returns an [AbstractFieldElement] for pairs of corresponding
192 /// getters and setters.
193 ///
194 /// The underlying map encoding allows for lazy computation of the members upon
195 /// query.
196 class MappedContainer {
197 Map<String, Element> _lookupCache = {};
198
199 Element lookup(String name, MapDecoder members) {
200 if (_lookupCache.containsKey(name)) {
201 Element element = _lookupCache[name];
202 if (element != null) {
203 return element;
204 }
205 }
206 if (members == null) {
207 return null;
208 }
209 bool hasId = members.containsKey(name);
210 String setterName = '$name,=';
211 bool hasSetterId = members.containsKey(setterName);
212 Element element;
213 Element setterElement;
214 if (!hasId && !hasSetterId) {
215 _lookupCache[name] = null;
216 return null;
217 }
218 bool isAccessor = false;
219 if (hasId) {
220 element = members.getElement(name);
221 isAccessor = element.isGetter;
222 }
223 if (hasSetterId) {
224 setterElement = members.getElement(setterName);
225 isAccessor = true;
226 }
227 if (isAccessor) {
228 element = new AbstractFieldElementZ(name, element, setterElement);
229 }
230 _lookupCache[name] = element;
231 return element;
232 }
233 }
234
235 /// Deserializer for a collection of member elements serialized as a list of
236 /// element declarations.
237 ///
238 /// The serialized data contains the declared getters and setters but lookup
239 /// into the map returns an [AbstractFieldElement] for pairs of corresponding
240 /// getters and setters.
241 ///
242 /// The underlying list encoding requires the complete lookup map to be computed
243 /// before query.
244 class ListedContainer {
245 final Map<String, Element> _lookupMap = <String, Element>{};
246
247 ListedContainer(List<Element> elements) {
248 Set<String> accessorNames = new Set<String>();
249 Map<String, Element> getters = <String, Element>{};
250 Map<String, Element> setters = <String, Element>{};
251 for (Element element in elements) {
252 String name = element.name;
253 if (element.isGetter) {
254 accessorNames.add(name);
255 getters[name] = element;
256 // Inserting [element] here to ensure insert order of [name].
257 _lookupMap[name] = element;
258 } else if (element.isSetter) {
259 accessorNames.add(name);
260 setters[name] = element;
261 // Inserting [element] here to ensure insert order of [name].
262 _lookupMap[name] = element;
263 } else {
264 _lookupMap[name] = element;
265 }
266 }
267 for (String name in accessorNames) {
268 _lookupMap[name] =
269 new AbstractFieldElementZ(name, getters[name], setters[name]);
270 }
271 }
272
273 Element lookup(String name) => _lookupMap[name];
274
275 void forEach(f(Element element)) => _lookupMap.values.forEach(f);
276
277 Iterable<Element> get values => _lookupMap.values;
278 }
279
280
281 abstract class AnalyzableElementMixin implements AnalyzableElement, ElementZ {
282 @override
283 bool get hasTreeElements => _unsupported('hasTreeElements');
284
285 @override
286 TreeElements get treeElements => _unsupported('treeElements');
287 }
288
289
290 abstract class AstElementMixin implements AstElement, ElementZ {
291 @override
292 bool get hasNode => _unsupported('hasNode');
293
294 @override
295 bool get hasResolvedAst => _unsupported('hasResolvedAst');
296
297 @override
298 get node => _unsupported('node');
299
300 @override
301 ResolvedAst get resolvedAst => _unsupported('resolvedAst');
302 }
303
304 abstract class ContainerMixin
305 implements DeserializedElementZ, ScopeContainerElement {
306 MappedContainer _membersMap = new MappedContainer();
307
308 @override
309 Element localLookup(String name) {
310 return _membersMap.lookup(
311 name, _decoder.getMap(Key.MEMBERS, isOptional: true));
312 }
313
314 @override
315 void forEachLocalMember(f(Element element)) {
316 MapDecoder members =
317 _decoder.getMap(Key.MEMBERS, isOptional: true);
318 if (members == null) return;
319 members.forEachKey((String key) {
320 Element member = members.getElement(key);
321 if (member != null) {
322 f(member);
323 }
324 });
325 }
326 }
327
328 class AbstractFieldElementZ extends ElementZ implements AbstractFieldElement {
329 final String name;
330 final FunctionElement getter;
331 final FunctionElement setter;
332
333 AbstractFieldElementZ(this.name, this.getter, this.setter);
334
335 @override
336 ElementKind get kind => ElementKind.ABSTRACT_FIELD;
337
338 @override
339 accept(ElementVisitor visitor, arg) {
340 return visitor.visitAbstractFieldElement(this, arg);
341 }
342
343 @override
344 LibraryElement get library {
345 return getter != null ? getter.library : setter.library;
346 }
347
348 @override
349 Element get enclosingElement {
350 return getter != null ? getter.enclosingElement : setter.enclosingElement;
351 }
352
353 @override
354 SourceSpan get sourcePosition {
355 return getter != null ? getter.sourcePosition : setter.sourcePosition;
356 }
357 }
358
359 class LibraryElementZ extends DeserializedElementZ
360 with AnalyzableElementMixin,
361 ContainerMixin,
362 LibraryElementCommon
363 implements LibraryElement {
364 Uri _canonicalUri;
365 CompilationUnitElement _entryCompilationUnit;
366 Link<CompilationUnitElement> _compilationUnits;
367 Link<Element> _exports;
368 ListedContainer _exportsMap;
369 ListedContainer _importsMap;
370 Map<LibraryTag, LibraryElement> _libraryDependencies;
371
372 LibraryElementZ(ObjectDecoder decoder)
373 : super(decoder);
374
375 @override
376 ElementKind get kind => ElementKind.LIBRARY;
377
378 @override
379 Element get enclosingElement => null;
380
381 @override
382 String get name => entryCompilationUnit.name;
383
384 @override
385 accept(ElementVisitor visitor, arg) {
386 return visitor.visitLibraryElement(this, arg);
387 }
388
389 @override
390 LibraryElement get library => this;
391
392 @override
393 Uri get canonicalUri {
394 if (_canonicalUri == null) {
395 _canonicalUri = _decoder.getUri(Key.CANONICAL_URI);
396 }
397 return _canonicalUri;
398 }
399
400 @override
401 CompilationUnitElement get entryCompilationUnit {
402 if (_entryCompilationUnit == null) {
403 _entryCompilationUnit = _decoder.getElement(Key.COMPILATION_UNIT);
404 }
405 return _entryCompilationUnit;
406 }
407
408 @override
409 Link<CompilationUnitElement> get compilationUnits {
410 if (_compilationUnits == null) {
411 _compilationUnits =
412 toLink(_decoder.getElements(Key.COMPILATION_UNITS));
413 }
414 return _compilationUnits;
415 }
416
417 @override
418 bool hasLibraryName() {
419 return getLibraryName() != '';
420 }
421
422 @override
423 String getLibraryName() {
424 return _decoder.getString(Key.LIBRARY_NAME);
425 }
426
427 @override
428 bool get exportsHandled => true;
429
430 void _ensureExports() {
431 if (_exports == null) {
432 _exportsMap = new ListedContainer(_decoder.getElements(Key.EXPORTS));
433 _exports = toLink(_exportsMap.values);
434 }
435 }
436
437 Link<Element> get exports {
438 _ensureExports();
439 return _exports;
440 }
441
442 @override
443 void forEachExport(f(Element element)) {
444 exports.forEach(f);
445 }
446
447 @override
448 Element find(String elementName) {
449 Element element = localLookup(elementName);
450 if (element == null) {
451 _ensureImports();
452 element = _importsMap.lookup(elementName);
453 }
454 return element;
455 }
456
457 @override
458 Element findLocal(String elementName) {
459 return localLookup(elementName);
460 }
461
462 void _ensureLibraryDependencies() {
463 if (_libraryDependencies == null) {
464 _libraryDependencies = <LibraryTag, LibraryElement>{};
465 ListDecoder tags = _decoder.getList(Key.TAGS);
466 AstBuilder builder = new AstBuilder(0);
467 for (int i = 0; i < tags.length; i++) {
468 ObjectDecoder dependency = tags.getObject(i);
469 String kind = dependency.getString(Key.KIND);
470 LibraryElement library = dependency.getElement(Key.LIBRARY);
471 // TODO(johnniwinther): Add `ImportElement` and `ExportElement` to the
472 // element model to avoid hacking up nodes.
473 if (kind == 'import') {
474 Import tag = new Import(
475 builder.keywordToken('import'),
476 builder.literalString(library.canonicalUri.toString())
477 ..getEndToken().next = builder.symbolToken(SEMICOLON_INFO),
478 null, // prefix
479 null, // combinators
480 null, // metadata
481 isDeferred: false);
482 _libraryDependencies[tag] = library;
483 } else if (kind == 'export') {
484 Export tag = new Export(
485 builder.keywordToken('export'),
486 builder.literalString(library.canonicalUri.toString())
487 ..getEndToken().next = builder.symbolToken(SEMICOLON_INFO),
488 null, // combinators
489 null); // metadata
490 _libraryDependencies[tag] = library;
491 }
492 }
493 }
494 }
495
496 @override
497 Iterable<LibraryTag> get tags {
498 _ensureLibraryDependencies();
499 return _libraryDependencies.keys;
500 }
501
502 LibraryElement getLibraryFromTag(LibraryDependency tag) {
503 _ensureLibraryDependencies();
504 return _libraryDependencies[tag];
505 }
506
507 @override
508 bool get canUseNative => false;
509
510 @override
511 Element findExported(String elementName) => _unsupported('findExported');
512
513 void _ensureImports() {
514 if (_importsMap == null) {
515 _importsMap = new ListedContainer(_decoder.getElements(Key.IMPORTS));
516 }
517 }
518
519 @override
520 void forEachImport(f(Element element)) {
521 _ensureImports();
522 _importsMap.forEach(f);
523 }
524
525 @override
526 Link<Import> getImportsFor(Element element) => _unsupported('getImportsFor');
527
528 @override
529 LibraryName get libraryTag => _unsupported('libraryTag');
530
531 String toString() {
532 return 'Zlibrary(${canonicalUri})';
533 }
534 }
535
536 class ScriptZ implements Script {
537 final Uri resourceUri;
538
539 ScriptZ(this.resourceUri);
540
541 @override
542 Script copyWithFile(SourceFile file) {
543 throw new UnsupportedError('ScriptZ.copyWithFile');
544 }
545
546 @override
547 SourceFile get file => throw new UnsupportedError('ScriptZ.file');
548
549 @override
550 bool get isSynthesized => throw new UnsupportedError('ScriptZ.isSynthesized');
551
552 @override
553 String get name => resourceUri.toString();
554
555 // TODO(johnniwinther): Support the distinction between [readableUri] and
556 // [resourceUri]; needed for platform libraries.
557 @override
558 Uri get readableUri => resourceUri;
559
560 @override
561 String get text => throw new UnsupportedError('ScriptZ.text');
562 }
563
564 class CompilationUnitElementZ extends DeserializedElementZ
565 with LibraryMemberMixin,
566 CompilationUnitElementCommon
567 implements CompilationUnitElement {
568 List<Element> _members;
569 Script _script;
570
571 CompilationUnitElementZ(ObjectDecoder decoder)
572 : super(decoder);
573
574 @override
575 ElementKind get kind => ElementKind.COMPILATION_UNIT;
576
577 @override
578 CompilationUnitElement get compilationUnit => this;
579
580 @override
581 accept(ElementVisitor visitor, arg) {
582 return visitor.visitCompilationUnitElement(this, arg);
583 }
584
585 @override
586 void forEachLocalMember(f(Element element)) {
587 if (_members == null) {
588 _members =
589 _decoder.getElements(Key.ELEMENTS, isOptional: true);
590 }
591 _members.forEach(f);
592 }
593
594 @override
595 Script get script {
596 if (_script == null) {
597 Uri resolvedUri = _decoder.getUri(Key.URI);
598 _script = new ScriptZ(resolvedUri);
599 }
600 return _script;
601 }
602
603 @override
604 String get name => script.name;
605 }
606
607
608 abstract class LibraryMemberMixin implements DeserializedElementZ {
609 LibraryElement _library;
610 CompilationUnitElement _compilationUnit;
611
612 @override
613 LibraryElement get library {
614 if (_library == null) {
615 _library = _decoder.getElement(Key.LIBRARY);
616 }
617 return _library;
618 }
619
620 @override
621 CompilationUnitElement get compilationUnit {
622 if (_compilationUnit == null) {
623 _compilationUnit = _decoder.getElement(Key.COMPILATION_UNIT);
624 }
625 return _compilationUnit;
626 }
627
628 @override
629 Element get enclosingElement => compilationUnit;
630
631 @override
632 ClassElement get enclosingClass => null;
633
634 @override
635 bool get isTopLevel => true;
636
637 @override
638 bool get isStatic => false;
639 }
640
641 abstract class ClassMemberMixin implements DeserializedElementZ {
642 ClassElement _class;
643
644 @override
645 Element get enclosingElement => enclosingClass;
646
647 @override
648 ClassElement get enclosingClass {
649 if (_class == null) {
650 _class = _decoder.getElement(Key.CLASS);
651 }
652 return _class;
653 }
654
655 @override
656 bool get isClassMember => true;
657
658 @override
659 LibraryElement get library => enclosingClass.library;
660
661 @override
662 CompilationUnitElement get compilationUnit => enclosingClass.compilationUnit;
663 }
664
665 abstract class InstanceMemberMixin implements DeserializedElementZ {
666 @override
667 bool get isTopLevel => false;
668
669 @override
670 bool get isStatic => false;
671
672 @override
673 bool get isInstanceMember => true;
674 }
675
676 abstract class StaticMemberMixin implements DeserializedElementZ {
677 @override
678 bool get isTopLevel => false;
679
680 @override
681 bool get isStatic => true;
682 }
683
684 abstract class TypedElementMixin
685 implements DeserializedElementZ, TypedElement {
686 DartType _type;
687
688 @override
689 DartType get type {
690 if (_type == null) {
691 _type = _decoder.getType(Key.TYPE);
692 }
693 return _type;
694 }
695
696 @override
697 DartType computeType(Compiler compiler) => type;
698 }
699
700 abstract class ParametersMixin
701 implements DeserializedElementZ, FunctionTypedElement {
702 FunctionSignature _functionSignature;
703 List<ParameterElement> _parameters;
704
705 bool get hasFunctionSignature => true;
706
707 @override
708 FunctionSignature get functionSignature {
709 if (_functionSignature == null) {
710 List<Element> requiredParameters = [];
711 List<Element> optionalParameters = [];
712 List orderedOptionalParameters = [];
713 int requiredParameterCount = 0;
714 int optionalParameterCount = 0;
715 bool optionalParametersAreNamed = false;
716 List<DartType> parameterTypes = <DartType>[];
717 List<DartType> optionalParameterTypes = <DartType>[];
718 List<String> namedParameters = <String>[];
719 List<DartType> namedParameterTypes = <DartType>[];
720 for (ParameterElement parameter in parameters) {
721 if (parameter.isOptional) {
722 optionalParameterCount++;
723 requiredParameters.add(parameter);
724 orderedOptionalParameters.add(parameter);
725 if (parameter.isNamed) {
726 optionalParametersAreNamed = true;
727 namedParameters.add(parameter.name);
728 namedParameterTypes.add(parameter.type);
729 } else {
730 optionalParameterTypes.add(parameter.type);
731 }
732 } else {
733 requiredParameterCount++;
734 optionalParameters.add(parameter);
735 parameterTypes.add(parameter.type);
736 }
737 }
738 if (optionalParametersAreNamed) {
739 orderedOptionalParameters.sort((Element a, Element b) {
740 return a.name.compareTo(b.name);
741 });
742 }
743
744 FunctionType type = new FunctionType(
745 this,
746 _decoder.getType(Key.RETURN_TYPE),
747 parameterTypes,
748 optionalParameterTypes,
749 namedParameters,
750 namedParameterTypes);
751 _functionSignature = new FunctionSignatureX(
752 requiredParameters: requiredParameters,
753 requiredParameterCount: requiredParameterCount,
754 optionalParameters: optionalParameters,
755 optionalParameterCount: optionalParameterCount,
756 optionalParametersAreNamed: optionalParametersAreNamed,
757 orderedOptionalParameters: orderedOptionalParameters,
758 type: type);
759 }
760 return _functionSignature;
761 }
762
763 List<ParameterElement> get parameters {
764 if (_parameters == null) {
765 _parameters = _decoder.getElements(Key.PARAMETERS, isOptional: true);
766 }
767 return _parameters;
768 }
769 }
770
771 abstract class FunctionTypedElementMixin
772 implements FunctionElement, DeserializedElementZ {
773 @override
774 AsyncMarker get asyncMarker => _unsupported('');
775
776 @override
777 bool get isExternal => _unsupported('');
778
779 @override
780 FunctionElement asFunctionElement() => this;
781 }
782
783 class ClassElementZ extends DeserializedElementZ
784 with AnalyzableElementMixin,
785 AstElementMixin,
786 ClassElementCommon,
787 class_members.ClassMemberMixin,
788 ContainerMixin,
789 LibraryMemberMixin,
790 TypeDeclarationMixin<InterfaceType>
791 implements ClassElement {
792 bool _isObject;
793 DartType _supertype;
794 OrderedTypeSet _allSupertypesAndSelf;
795 Link<DartType> _interfaces;
796
797 ClassElementZ(ObjectDecoder decoder)
798 : super(decoder);
799
800 InterfaceType _createType(List<DartType> typeArguments) {
801 return new InterfaceType(this, typeArguments);
802 }
803
804 @override
805 ElementKind get kind => ElementKind.CLASS;
806
807 @override
808 accept(ElementVisitor visitor, arg) {
809 return visitor.visitClassElement(this, arg);
810 }
811
812 @override
813 DartType get supertype {
814 if (_isObject == null) {
815 _supertype = _decoder.getType(Key.SUPERTYPE, isOptional: true);
816 _isObject = _supertype == null;
817 }
818 return _supertype;
819 }
820
821 @override
822 bool get isAbstract => _decoder.getBool(Key.IS_ABSTRACT);
823
824 @override
825 bool get isObject {
826 return supertype == null;
827 }
828
829 @override
830 void addBackendMember(Element element) => _unsupported('addBackendMember');
831
832 @override
833 OrderedTypeSet get allSupertypesAndSelf {
834 if (_allSupertypesAndSelf == null) {
835 ObjectDecoder supertypesDeserializer =
836 _decoder.getObject(Key.SUPERTYPES);
837 List<int> offsets = supertypesDeserializer.getInts(Key.OFFSETS);
838 List<Link<DartType>> levels = new List<Link<DartType>>(offsets.length);
839 LinkBuilder<DartType> typesBuilder = new LinkBuilder<DartType>();
840 int offset = 0;
841 int depth = offsets.length - 1;
842 for (DartType type in supertypesDeserializer.getTypes(Key.TYPES)) {
843 Link<DartType> link = typesBuilder.addLast(type);
844 if (offsets[depth] == offset) {
845 levels[depth] = link;
846 depth--;
847 }
848 offset++;
849 }
850 LinkBuilder<DartType> supertypesBuilder = new LinkBuilder<DartType>();
851 for (DartType supertype in
852 supertypesDeserializer.getTypes(Key.SUPERTYPES, isOptional: true)) {
853 supertypesBuilder.addLast(supertype);
854 }
855 Link<DartType> types = typesBuilder.toLink();
856 Link<DartType> supertypes = supertypesBuilder.toLink();
857 _allSupertypesAndSelf = new OrderedTypeSet.internal(
858 levels, types, supertypes);
859 }
860 return _allSupertypesAndSelf;
861 }
862
863 @override
864 void forEachBackendMember(void f(Element member)) {
865 _unsupported('forEachBackendMember');
866 }
867
868 @override
869 bool get hasBackendMembers => _unsupported('hasBackendMembers');
870
871 @override
872 bool get hasConstructor => _unsupported('hasConstructor');
873
874 @override
875 bool hasFieldShadowedBy(Element fieldMember) => _unsupported('');
876
877 @override
878 bool get hasIncompleteHierarchy => _unsupported('hasIncompleteHierarchy');
879
880 @override
881 bool get hasLocalScopeMembers => _unsupported('hasLocalScopeMembers');
882
883 @override
884 bool implementsFunction(Compiler compiler) {
885 return _unsupported('implementsFunction');
886 }
887
888 @override
889 Link<DartType> get interfaces {
890 if (_interfaces == null) {
891 _interfaces = toLink(
892 _decoder.getTypes(Key.INTERFACES, isOptional: true));
893 }
894 return _interfaces;
895 }
896
897 @override
898 bool get isEnumClass => false;
899
900 @override
901 bool get isProxy => _unsupported('isProxy');
902
903 @override
904 bool get isUnnamedMixinApplication {
905 return _unsupported('isUnnamedMixinApplication');
906 }
907
908 @override
909 Element lookupBackendMember(String memberName) {
910 return _unsupported('lookupBackendMember');
911 }
912
913 @override
914 ConstructorElement lookupDefaultConstructor() {
915 ConstructorElement constructor = lookupConstructor("");
916 if (constructor != null && constructor.parameters.isEmpty) {
917 return constructor;
918 }
919 return null;
920 }
921
922 @override
923 String get nativeTagInfo => _unsupported('nativeTagInfo');
924
925 @override
926 void reverseBackendMembers() => _unsupported('reverseBackendMembers');
927
928 @override
929 ClassElement get superclass => supertype != null ? supertype.element : null;
930 }
931
932 abstract class ConstructorElementZ extends DeserializedElementZ
933 with AnalyzableElementMixin,
934 AstElementMixin,
935 ClassMemberMixin,
936 FunctionTypedElementMixin,
937 ParametersMixin,
938 TypedElementMixin,
939 MemberElementMixin
940 implements ConstructorElement {
941 ConstantConstructor _constantConstructor;
942
943 ConstructorElementZ(ObjectDecoder decoder)
944 : super(decoder);
945
946 accept(ElementVisitor visitor, arg) {
947 return visitor.visitConstructorElement(this, arg);
948 }
949
950 @override
951 bool get isConst => _decoder.getBool(Key.IS_CONST);
952
953 @override
954 bool get isExternal => _decoder.getBool(Key.IS_EXTERNAL);
955
956 bool get isFromEnvironmentConstructor {
957 return name == 'fromEnvironment' &&
958 library.isDartCore &&
959 (enclosingClass.name == 'bool' ||
960 enclosingClass.name == 'int' ||
961 enclosingClass.name == 'String');
962 }
963
964 ConstantConstructor get constantConstructor {
965 if (isConst && _constantConstructor == null) {
966 ObjectDecoder data =
967 _decoder.getObject(Key.CONSTRUCTOR, isOptional: true);
968 if (data == null) {
969 assert(isFromEnvironmentConstructor || isExternal);
970 return null;
971 }
972 _constantConstructor = ConstantConstructorDeserializer.deserialize(data);
973 }
974 return _constantConstructor;
975 }
976
977 @override
978 AsyncMarker get asyncMarker => _unsupported('asyncMarker');
979
980 @override
981 InterfaceType computeEffectiveTargetType(InterfaceType newType) {
982 return _unsupported('computeEffectiveTargetType');
983 }
984
985 @override
986 ConstructorElement get definingConstructor {
987 return _unsupported('definingConstructor');
988 }
989
990 @override
991 ConstructorElement get effectiveTarget {
992 return _unsupported('effectiveTarget');
993 }
994
995 @override
996 ConstructorElement get immediateRedirectionTarget {
997 return _unsupported('immediateRedirectionTarget');
998 }
999
1000 @override
1001 bool get isRedirectingFactory => _unsupported('isRedirectingFactory');
1002
1003 @override
1004 bool get isRedirectingGenerative => _unsupported('isRedirectingGenerative');
1005
1006 @override
1007 bool get isCyclicRedirection => _unsupported('isCyclicRedirection');
1008
1009 @override
1010 PrefixElement get redirectionDeferredPrefix {
1011 return _unsupported('redirectionDeferredPrefix');
1012 }
1013 }
1014
1015 class GenerativeConstructorElementZ extends ConstructorElementZ {
1016 GenerativeConstructorElementZ(ObjectDecoder decoder)
1017 : super(decoder);
1018
1019 @override
1020 ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR;
1021 }
1022
1023 class FactoryConstructorElementZ extends ConstructorElementZ {
1024
1025 FactoryConstructorElementZ(ObjectDecoder decoder)
1026 : super(decoder);
1027
1028 @override
1029 ElementKind get kind => ElementKind.FUNCTION;
1030
1031 @override
1032 bool get isFactoryConstructor => true;
1033 }
1034
1035 abstract class MemberElementMixin
1036 implements DeserializedElementZ, MemberElement {
1037
1038 @override
1039 MemberElement get memberContext => this;
1040
1041 @override
1042 Name get memberName => new Name(name, library);
1043
1044 @override
1045 List<FunctionElement> get nestedClosures => const <FunctionElement>[];
1046
1047 }
1048
1049 abstract class FieldElementZ extends DeserializedElementZ
1050 with AnalyzableElementMixin,
1051 AstElementMixin,
1052 TypedElementMixin,
1053 MemberElementMixin
1054 implements FieldElement {
1055 ConstantExpression _constant;
1056
1057 FieldElementZ(ObjectDecoder decoder)
1058 : super(decoder);
1059
1060 @override
1061 ElementKind get kind => ElementKind.FIELD;
1062
1063 @override
1064 accept(ElementVisitor visitor, arg) {
1065 return visitor.visitFieldElement(this, arg);
1066 }
1067
1068 @override
1069 bool get isFinal => _decoder.getBool(Key.IS_FINAL);
1070
1071 @override
1072 bool get isConst => _decoder.getBool(Key.IS_CONST);
1073
1074 @override
1075 ConstantExpression get constant {
1076 if (isConst && _constant == null) {
1077 _constant = _decoder.getConstant(Key.CONSTANT);
1078 }
1079 return _constant;
1080 }
1081
1082 @override
1083 Expression get initializer => _unsupported('initializer');
1084 }
1085
1086
1087 class TopLevelFieldElementZ extends FieldElementZ with LibraryMemberMixin {
1088 TopLevelFieldElementZ(ObjectDecoder decoder)
1089 : super(decoder);
1090 }
1091
1092 class StaticFieldElementZ extends FieldElementZ
1093 with ClassMemberMixin, StaticMemberMixin {
1094 StaticFieldElementZ(ObjectDecoder decoder)
1095 : super(decoder);
1096 }
1097
1098 class InstanceFieldElementZ extends FieldElementZ
1099 with ClassMemberMixin, InstanceMemberMixin {
1100 InstanceFieldElementZ(ObjectDecoder decoder)
1101 : super(decoder);
1102 }
1103
1104 abstract class FunctionElementZ extends DeserializedElementZ
1105 with AnalyzableElementMixin,
1106 AstElementMixin,
1107 ParametersMixin,
1108 FunctionTypedElementMixin,
1109 TypedElementMixin,
1110 MemberElementMixin
1111 implements MethodElement {
1112 FunctionElementZ(ObjectDecoder decoder)
1113 : super(decoder);
1114
1115 @override
1116 ElementKind get kind => ElementKind.FUNCTION;
1117
1118 @override
1119 accept(ElementVisitor visitor, arg) {
1120 return visitor.visitFunctionElement(this, arg);
1121 }
1122
1123 @override
1124 bool get isOperator => _decoder.getBool(Key.IS_OPERATOR);
1125 }
1126
1127 class TopLevelFunctionElementZ extends FunctionElementZ
1128 with LibraryMemberMixin {
1129 TopLevelFunctionElementZ(ObjectDecoder decoder)
1130 : super(decoder);
1131 }
1132
1133 class StaticFunctionElementZ extends FunctionElementZ
1134 with ClassMemberMixin, StaticMemberMixin {
1135 StaticFunctionElementZ(ObjectDecoder decoder)
1136 : super(decoder);
1137 }
1138
1139 class InstanceFunctionElementZ extends FunctionElementZ
1140 with ClassMemberMixin, InstanceMemberMixin {
1141 InstanceFunctionElementZ(ObjectDecoder decoder)
1142 : super(decoder);
1143 }
1144
1145 abstract class GetterElementZ extends DeserializedElementZ
1146 with AnalyzableElementMixin,
1147 AstElementMixin,
1148 FunctionTypedElementMixin,
1149 ParametersMixin,
1150 TypedElementMixin,
1151 MemberElementMixin
1152 implements FunctionElement {
1153
1154 GetterElementZ(ObjectDecoder decoder)
1155 : super(decoder);
1156
1157 @override
1158 ElementKind get kind => ElementKind.GETTER;
1159
1160 @override
1161 accept(ElementVisitor visitor, arg) {
1162 return visitor.visitFunctionElement(this, arg);
1163 }
1164 }
1165
1166 class TopLevelGetterElementZ extends GetterElementZ with LibraryMemberMixin {
1167 TopLevelGetterElementZ(ObjectDecoder decoder)
1168 : super(decoder);
1169 }
1170
1171 class StaticGetterElementZ extends GetterElementZ
1172 with ClassMemberMixin, StaticMemberMixin {
1173 StaticGetterElementZ(ObjectDecoder decoder)
1174 : super(decoder);
1175 }
1176
1177 class InstanceGetterElementZ extends GetterElementZ
1178 with ClassMemberMixin, InstanceMemberMixin {
1179 InstanceGetterElementZ(ObjectDecoder decoder)
1180 : super(decoder);
1181 }
1182
1183 abstract class SetterElementZ extends DeserializedElementZ
1184 with AnalyzableElementMixin,
1185 AstElementMixin,
1186 FunctionTypedElementMixin,
1187 ParametersMixin,
1188 TypedElementMixin,
1189 MemberElementMixin
1190 implements FunctionElement {
1191
1192 SetterElementZ(ObjectDecoder decoder)
1193 : super(decoder);
1194
1195 @override
1196 ElementKind get kind => ElementKind.SETTER;
1197
1198 @override
1199 accept(ElementVisitor visitor, arg) {
1200 return visitor.visitFunctionElement(this, arg);
1201 }
1202 }
1203
1204 class TopLevelSetterElementZ extends SetterElementZ with LibraryMemberMixin {
1205 TopLevelSetterElementZ(ObjectDecoder decoder)
1206 : super(decoder);
1207 }
1208
1209 class StaticSetterElementZ extends SetterElementZ
1210 with ClassMemberMixin, StaticMemberMixin {
1211 StaticSetterElementZ(ObjectDecoder decoder)
1212 : super(decoder);
1213 }
1214
1215 class InstanceSetterElementZ extends SetterElementZ
1216 with ClassMemberMixin, InstanceMemberMixin {
1217 InstanceSetterElementZ(ObjectDecoder decoder)
1218 : super(decoder);
1219 }
1220
1221 abstract class TypeDeclarationMixin<T extends GenericType>
1222 implements DeserializedElementZ, TypeDeclarationElement {
1223 List<DartType> _typeVariables;
1224 T _rawType;
1225 T _thisType;
1226
1227 void _ensureTypes() {
1228 if (_typeVariables == null) {
1229 _typeVariables = _decoder.getTypes(
1230 Key.TYPE_VARIABLES, isOptional: true);
1231 _rawType = _createType(new List<DartType>.filled(
1232 _typeVariables.length, const DynamicType()));
1233 _thisType = _createType(_typeVariables);
1234 }
1235 }
1236
1237 T _createType(List<DartType> typeArguments);
1238
1239 @override
1240 List<DartType> get typeVariables {
1241 _ensureTypes();
1242 return _typeVariables;
1243 }
1244
1245 @override
1246 T get rawType {
1247 _ensureTypes();
1248 return _rawType;
1249 }
1250
1251 @override
1252 T get thisType {
1253 _ensureTypes();
1254 return _thisType;
1255 }
1256
1257 @override
1258 T computeType(Compiler compiler) => thisType;
1259
1260 @override
1261 bool get isResolved => true;
1262
1263 @override
1264 void ensureResolved(Compiler compiler) {}
1265 }
1266
1267 class TypedefElementZ extends DeserializedElementZ
1268 with AnalyzableElementMixin,
1269 AstElementMixin,
1270 LibraryMemberMixin,
1271 ParametersMixin,
1272 TypeDeclarationMixin<TypedefType>
1273 implements TypedefElement {
1274 DartType _alias;
1275
1276 TypedefElementZ(ObjectDecoder decoder)
1277 : super(decoder);
1278
1279 TypedefType _createType(List<DartType> typeArguments) {
1280 return new TypedefType(this, typeArguments);
1281 }
1282
1283 @override
1284 ElementKind get kind => ElementKind.TYPEDEF;
1285
1286 @override
1287 accept(ElementVisitor visitor, arg) {
1288 return visitor.visitTypedefElement(this, arg);
1289 }
1290
1291 @override
1292 DartType get alias {
1293 if (_alias == null) {
1294 _alias = _decoder.getType(Key.ALIAS);
1295 }
1296 return _alias;
1297 }
1298
1299 @override
1300 void checkCyclicReference(Compiler compiler) {}
1301 }
1302
1303 class TypeVariableElementZ extends DeserializedElementZ
1304 with AnalyzableElementMixin,
1305 AstElementMixin,
1306 TypedElementMixin
1307 implements TypeVariableElement {
1308 TypeDeclarationElement _typeDeclaration;
1309 TypeVariableType _type;
1310 DartType _bound;
1311
1312 TypeVariableElementZ(ObjectDecoder decoder)
1313 : super(decoder);
1314
1315 @override
1316 ElementKind get kind => ElementKind.TYPE_VARIABLE;
1317
1318 @override
1319 accept(ElementVisitor visitor, arg) {
1320 return visitor.visitTypeVariableElement(this, arg);
1321 }
1322
1323 @override
1324 CompilationUnitElement get compilationUnit {
1325 return typeDeclaration.compilationUnit;
1326 }
1327
1328 @override
1329 Element get enclosingElement => typeDeclaration;
1330
1331 @override
1332 Element get enclosingClass => typeDeclaration;
1333
1334 @override
1335 int get index => _decoder.getInt(Key.INDEX);
1336
1337 @override
1338 TypeDeclarationElement get typeDeclaration {
1339 if (_typeDeclaration == null) {
1340 _typeDeclaration =
1341 _decoder.getElement(Key.TYPE_DECLARATION);
1342 }
1343 return _typeDeclaration;
1344 }
1345
1346 DartType get bound {
1347 if (_bound == null) {
1348 _bound = _decoder.getType(Key.BOUND);
1349 }
1350 return _bound;
1351 }
1352
1353 @override
1354 LibraryElement get library => typeDeclaration.library;
1355 }
1356
1357 class ParameterElementZ extends DeserializedElementZ
1358 with AnalyzableElementMixin,
1359 AstElementMixin,
1360 TypedElementMixin
1361 implements ParameterElement {
1362 FunctionElement _functionDeclaration;
1363 ConstantExpression _constant;
1364 DartType _type;
1365
1366 ParameterElementZ(ObjectDecoder decoder) : super(decoder);
1367
1368 @override
1369 accept(ElementVisitor visitor, arg) {
1370 return visitor.visitParameterElement(this, arg);
1371 }
1372
1373 @override
1374 ConstantExpression get constant {
1375 if (isOptional) {
1376 if (_constant == null) {
1377 _constant = _decoder.getConstant(Key.CONSTANT);
1378 }
1379 return _constant;
1380 }
1381 return null;
1382 }
1383
1384 @override
1385 CompilationUnitElement get compilationUnit {
1386 return functionDeclaration.compilationUnit;
1387 }
1388
1389 @override
1390 ExecutableElement get executableContext => functionDeclaration;
1391
1392 @override
1393 Element get enclosingElement => functionDeclaration;
1394
1395 @override
1396 FunctionElement get functionDeclaration {
1397 if (_functionDeclaration == null) {
1398 _functionDeclaration = _decoder.getElement(Key.FUNCTION);
1399 }
1400 return _functionDeclaration;
1401 }
1402
1403 @override
1404 FunctionSignature get functionSignature => _unsupported('functionSignature');
1405
1406 @override
1407 Expression get initializer => _unsupported('initializer');
1408
1409 @override
1410 bool get isNamed => _decoder.getBool(Key.IS_NAMED);
1411
1412 @override
1413 bool get isOptional => _decoder.getBool(Key.IS_OPTIONAL);
1414
1415 @override
1416 ElementKind get kind => ElementKind.PARAMETER;
1417
1418 @override
1419 LibraryElement get library => executableContext.library;
1420
1421 @override
1422 MemberElement get memberContext => executableContext.memberContext;
1423 }
1424
1425
1426 class InitializingFormalElementZ extends ParameterElementZ
1427 implements InitializingFormalElement {
1428 FieldElement _fieldElement;
1429
1430 InitializingFormalElementZ(ObjectDecoder decoder)
1431 : super(decoder);
1432
1433 @override
1434 FieldElement get fieldElement {
1435 if (_fieldElement == null) {
1436 _fieldElement = _decoder.getElement(Key.FIELD);
1437 }
1438 return _fieldElement;
1439 }
1440
1441 @override
1442 accept(ElementVisitor visitor, arg) {
1443 return visitor.visitFieldParameterElement(this, arg);
1444 }
1445
1446 @override
1447 ElementKind get kind => ElementKind.INITIALIZING_FORMAL;
1448
1449 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/serialization/keys.dart ('k') | pkg/compiler/lib/src/serialization/serialization.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698