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

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: Updated cf. comments 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> _lookupMap = {};
floitsch 2015/07/03 17:06:25 This is just a cache. right? Either add a comment
Johnni Winther 2015/07/06 08:33:22 Done.
198
199 Element lookup(String name, MapDecoder members) {
200 if (_lookupMap.containsKey(name)) {
201 Element element = _lookupMap[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 _lookupMap[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 _lookupMap[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 _lookupMap[name] = element;
floitsch 2015/07/03 17:06:25 The _lookupMap[name] will be overwritten below in
Johnni Winther 2015/07/06 08:33:22 Added a comment; [element] is inserted here to ens
257 } else if (element.isSetter) {
258 accessorNames.add(name);
259 setters[name] = element;
260 _lookupMap[name] = element;
261 } else {
262 _lookupMap[name] = element;
263 }
264 }
265 for (String name in accessorNames) {
266 _lookupMap[name] =
267 new AbstractFieldElementZ(name, getters[name], setters[name]);
268 }
269 }
270
271 Element lookup(String name) => _lookupMap[name];
272
273 void forEach(f(Element element)) => _lookupMap.values.forEach(f);
274
275 Iterable<Element> get values => _lookupMap.values;
276 }
277
278
279 abstract class AnalyzableElementMixin implements AnalyzableElement, ElementZ {
280 @override
281 bool get hasTreeElements => _unsupported('hasTreeElements');
282
283 @override
284 TreeElements get treeElements => _unsupported('treeElements');
285 }
286
287
288 abstract class AstElementMixin implements AstElement, ElementZ {
289 @override
290 bool get hasNode => _unsupported('hasNode');
291
292 @override
293 bool get hasResolvedAst => _unsupported('hasResolvedAst');
294
295 @override
296 get node => _unsupported('node');
297
298 @override
299 ResolvedAst get resolvedAst => _unsupported('resolvedAst');
300 }
301
302 abstract class ContainerMixin
303 implements DeserializedElementZ, ScopeContainerElement {
304 MappedContainer _membersMap = new MappedContainer();
305
306 @override
307 Element localLookup(String name) {
308 return _membersMap.lookup(
309 name, _decoder.getMap(Key.MEMBERS, isOptional: true));
310 }
311
312 @override
313 void forEachLocalMember(f(Element element)) {
314 MapDecoder members =
315 _decoder.getMap(Key.MEMBERS, isOptional: true);
316 if (members == null) return;
317 members.forEachKey((String key) {
318 Element member = members.getElement(key);
319 if (member != null) {
320 f(member);
321 }
322 });
323 }
324 }
325
326 class AbstractFieldElementZ extends ElementZ implements AbstractFieldElement {
327 final String name;
328 final FunctionElement getter;
329 final FunctionElement setter;
330
331 AbstractFieldElementZ(this.name, this.getter, this.setter);
332
333 @override
334 ElementKind get kind => ElementKind.ABSTRACT_FIELD;
335
336 @override
337 accept(ElementVisitor visitor, arg) {
338 return visitor.visitAbstractFieldElement(this, arg);
339 }
340
341 @override
342 LibraryElement get library {
343 return getter != null ? getter.library : setter.library;
344 }
345
346 @override
347 Element get enclosingElement {
348 return getter != null ? getter.enclosingElement : setter.enclosingElement;
349 }
350
351 @override
352 SourceSpan get sourcePosition {
353 return getter != null ? getter.sourcePosition : setter.sourcePosition;
354 }
355 }
356
357 class LibraryElementZ extends DeserializedElementZ
358 with AnalyzableElementMixin,
359 ContainerMixin,
360 LibraryElementCommon
361 implements LibraryElement {
362 Uri _canonicalUri;
363 CompilationUnitElement _entryCompilationUnit;
364 Link<CompilationUnitElement> _compilationUnits;
365 Link<Element> _exports;
366 ListedContainer _exportsMap;
367 ListedContainer _importsMap;
368 Map<LibraryTag, LibraryElement> _libraryDependencies;
369
370 LibraryElementZ(ObjectDecoder decoder)
371 : super(decoder);
372
373 @override
374 ElementKind get kind => ElementKind.LIBRARY;
375
376 @override
377 Element get enclosingElement => null;
378
379 @override
380 String get name => entryCompilationUnit.name;
381
382 @override
383 accept(ElementVisitor visitor, arg) {
384 return visitor.visitLibraryElement(this, arg);
385 }
386
387 @override
388 LibraryElement get library => this;
389
390 @override
391 Uri get canonicalUri {
392 if (_canonicalUri == null) {
393 _canonicalUri = _decoder.getUri(Key.CANONICAL_URI);
394 }
395 return _canonicalUri;
396 }
397
398 @override
399 CompilationUnitElement get entryCompilationUnit {
400 if (_entryCompilationUnit == null) {
401 _entryCompilationUnit = _decoder.getElement(Key.COMPILATION_UNIT);
402 }
403 return _entryCompilationUnit;
404 }
405
406 @override
407 Link<CompilationUnitElement> get compilationUnits {
408 if (_compilationUnits == null) {
409 _compilationUnits =
410 toLink(_decoder.getElements(Key.COMPILATION_UNITS));
411 }
412 return _compilationUnits;
413 }
414
415 @override
416 bool hasLibraryName() {
417 return getLibraryName() != '';
418 }
419
420 @override
421 String getLibraryName() {
422 return _decoder.getString(Key.LIBRARY_NAME);
423 }
424
425 @override
426 bool get exportsHandled => true;
427
428 void _ensureExports() {
429 if (_exports == null) {
430 _exportsMap = new ListedContainer(_decoder.getElements(Key.EXPORTS));
431 _exports = toLink(_exportsMap.values);
432 }
433 }
434
435 Link<Element> get exports {
436 _ensureExports();
437 return _exports;
438 }
439
440 @override
441 void forEachExport(f(Element element)) {
442 exports.forEach(f);
443 }
444
445 @override
446 Element find(String elementName) {
447 Element element = localLookup(elementName);
448 if (element == null) {
449 _ensureImports();
450 element = _importsMap.lookup(elementName);
451 }
452 return element;
453 }
454
455 @override
456 Element findLocal(String elementName) {
457 return localLookup(elementName);
458 }
459
460 void _ensureLibraryDependencies() {
461 if (_libraryDependencies == null) {
462 _libraryDependencies = <LibraryTag, LibraryElement>{};
463 ListDecoder tags = _decoder.getList(Key.TAGS);
464 AstBuilder builder = new AstBuilder(0);
465 for (int i = 0; i < tags.length; i++) {
466 ObjectDecoder dependency = tags.getObject(i);
467 String kind = dependency.getString(Key.KIND);
468 LibraryElement library = dependency.getElement(Key.LIBRARY);
469 // TODO(johnniwinther): Add `ImportElement` and `ExportElement` to the
470 // element model to avoid hacking up nodes.
471 if (kind == 'import') {
472 Import tag = new Import(
473 builder.keywordToken('import'),
474 builder.literalString(library.canonicalUri.toString())
475 ..getEndToken().next = builder.symbolToken(SEMICOLON_INFO),
476 null, // prefix
477 null, // combinators
478 null, // metadata
479 isDeferred: false);
480 _libraryDependencies[tag] = library;
481 } else if (kind == 'export') {
482 Export tag = new Export(
483 builder.keywordToken('export'),
484 builder.literalString(library.canonicalUri.toString())
485 ..getEndToken().next = builder.symbolToken(SEMICOLON_INFO),
486 null, // combinators
487 null); // metadata
488 _libraryDependencies[tag] = library;
489 }
490 }
491 }
492 }
493
494 @override
495 Iterable<LibraryTag> get tags {
496 _ensureLibraryDependencies();
497 return _libraryDependencies.keys;
498 }
499
500 LibraryElement getLibraryFromTag(LibraryDependency tag) {
501 _ensureLibraryDependencies();
502 return _libraryDependencies[tag];
503 }
504
505 @override
506 bool get canUseNative => false;
507
508 @override
509 Element findExported(String elementName) => _unsupported('findExported');
510
511 void _ensureImports() {
512 if (_importsMap == null) {
513 _importsMap = new ListedContainer(_decoder.getElements(Key.IMPORTS));
514 }
515 }
516
517 @override
518 void forEachImport(f(Element element)) {
519 _ensureImports();
520 _importsMap.forEach(f);
521 }
522
523 @override
524 Link<Import> getImportsFor(Element element) => _unsupported('getImportsFor');
525
526 @override
527 LibraryName get libraryTag => _unsupported('libraryTag');
528
529 String toString() {
530 return 'Zlibrary(${canonicalUri})';
531 }
532 }
533
534 class ScriptZ implements Script {
535 final Uri resourceUri;
536
537 ScriptZ(this.resourceUri);
538
539 @override
540 Script copyWithFile(SourceFile file) {
541 throw new UnsupportedError('ScriptZ.copyWithFile');
542 }
543
544 @override
545 SourceFile get file => throw new UnsupportedError('ScriptZ.file');
546
547 @override
548 bool get isSynthesized => throw new UnsupportedError('ScriptZ.isSynthesized');
549
550 @override
551 String get name => resourceUri.toString();
552
553 // TODO(johnniwinther): Support the distinction between [readableUri] and
554 // [resourceUri]; needed for platform libraries.
555 @override
556 Uri get readableUri => resourceUri;
557
558 @override
559 String get text => throw new UnsupportedError('ScriptZ.text');
560 }
561
562 class CompilationUnitElementZ extends DeserializedElementZ
563 with LibraryMemberMixin,
564 CompilationUnitElementCommon
565 implements CompilationUnitElement {
566 List<Element> _members;
567 Script _script;
568
569 CompilationUnitElementZ(ObjectDecoder decoder)
570 : super(decoder);
571
572 @override
573 ElementKind get kind => ElementKind.COMPILATION_UNIT;
574
575 @override
576 CompilationUnitElement get compilationUnit => this;
577
578 @override
579 accept(ElementVisitor visitor, arg) {
580 return visitor.visitCompilationUnitElement(this, arg);
581 }
582
583 @override
584 void forEachLocalMember(f(Element element)) {
585 if (_members == null) {
586 _members =
587 _decoder.getElements(Key.ELEMENTS, isOptional: true);
588 }
589 _members.forEach(f);
590 }
591
592 @override
593 Script get script {
594 if (_script == null) {
595 Uri resolvedUri = _decoder.getUri(Key.URI);
596 _script = new ScriptZ(resolvedUri);
597 }
598 return _script;
599 }
600
601 @override
602 String get name => script.name;
603 }
604
605
606 abstract class LibraryMemberMixin implements DeserializedElementZ {
607 LibraryElement _library;
608 CompilationUnitElement _compilationUnit;
609
610 @override
611 LibraryElement get library {
612 if (_library == null) {
613 _library = _decoder.getElement(Key.LIBRARY);
614 }
615 return _library;
616 }
617
618 @override
619 CompilationUnitElement get compilationUnit {
620 if (_compilationUnit == null) {
621 _compilationUnit = _decoder.getElement(Key.COMPILATION_UNIT);
622 }
623 return _compilationUnit;
624 }
625
626 @override
627 Element get enclosingElement => compilationUnit;
628
629 @override
630 ClassElement get enclosingClass => null;
631
632 @override
633 bool get isTopLevel => true;
634
635 @override
636 bool get isStatic => false;
637 }
638
639 abstract class ClassMemberMixin implements DeserializedElementZ {
640 ClassElement _class;
641
642 @override
643 Element get enclosingElement => enclosingClass;
644
645 @override
646 ClassElement get enclosingClass {
647 if (_class == null) {
648 _class = _decoder.getElement(Key.CLASS);
649 }
650 return _class;
651 }
652
653 @override
654 bool get isClassMember => true;
655
656 @override
657 LibraryElement get library => enclosingClass.library;
658
659 @override
660 CompilationUnitElement get compilationUnit => enclosingClass.compilationUnit;
661 }
662
663 abstract class InstanceMemberMixin implements DeserializedElementZ {
664 @override
665 bool get isTopLevel => false;
666
667 @override
668 bool get isStatic => false;
669
670 @override
671 bool get isInstanceMember => true;
672 }
673
674 abstract class StaticMemberMixin implements DeserializedElementZ {
675 @override
676 bool get isTopLevel => false;
677
678 @override
679 bool get isStatic => true;
680 }
681
682 abstract class TypedElementMixin
683 implements DeserializedElementZ, TypedElement {
684 DartType _type;
685
686 @override
687 DartType get type {
688 if (_type == null) {
689 _type = _decoder.getType(Key.TYPE);
690 }
691 return _type;
692 }
693
694 @override
695 DartType computeType(Compiler compiler) => type;
696 }
697
698 abstract class ParametersMixin
699 implements DeserializedElementZ, FunctionTypedElement {
700 FunctionSignature _functionSignature;
701 List<ParameterElement> _parameters;
702
703 bool get hasFunctionSignature => true;
704
705 @override
706 FunctionSignature get functionSignature {
707 if (_functionSignature == null) {
708 List<Element> requiredParameters = [];
709 List<Element> optionalParameters = [];
710 List orderedOptionalParameters = [];
711 int requiredParameterCount = 0;
712 int optionalParameterCount = 0;
713 bool optionalParametersAreNamed = false;
714 List<DartType> parameterTypes = <DartType>[];
715 List<DartType> optionalParameterTypes = <DartType>[];
716 List<String> namedParameters = <String>[];
717 List<DartType> namedParameterTypes = <DartType>[];
718 for (ParameterElement parameter in parameters) {
719 if (parameter.isOptional) {
720 optionalParameterCount++;
721 requiredParameters.add(parameter);
722 orderedOptionalParameters.add(parameter);
723 if (parameter.isNamed) {
724 optionalParametersAreNamed = true;
725 namedParameters.add(parameter.name);
726 namedParameterTypes.add(parameter.type);
727 } else {
728 optionalParameterTypes.add(parameter.type);
729 }
730 } else {
731 requiredParameterCount++;
732 optionalParameters.add(parameter);
733 parameterTypes.add(parameter.type);
734 }
735 }
736 if (optionalParametersAreNamed) {
737 orderedOptionalParameters.sort((Element a, Element b) {
738 return a.name.compareTo(b.name);
739 });
740 }
741
742 FunctionType type = new FunctionType(
743 this,
744 _decoder.getType(Key.RETURN_TYPE),
745 parameterTypes,
746 optionalParameterTypes,
747 namedParameters,
748 namedParameterTypes);
749 _functionSignature = new FunctionSignatureX(
750 requiredParameters: requiredParameters,
751 requiredParameterCount: requiredParameterCount,
752 optionalParameters: optionalParameters,
753 optionalParameterCount: optionalParameterCount,
754 optionalParametersAreNamed: optionalParametersAreNamed,
755 orderedOptionalParameters: orderedOptionalParameters,
756 type: type);
757 }
758 return _functionSignature;
759 }
760
761 List<ParameterElement> get parameters {
762 if (_parameters == null) {
763 _parameters = _decoder.getElements(Key.PARAMETERS, isOptional: true);
764 }
765 return _parameters;
766 }
767 }
768
769 abstract class FunctionTypedElementMixin
770 implements FunctionElement, DeserializedElementZ {
771 @override
772 AsyncMarker get asyncMarker => _unsupported('');
773
774 @override
775 bool get isExternal => _unsupported('');
776
777 @override
778 FunctionElement asFunctionElement() => this;
779 }
780
781 class ClassElementZ extends DeserializedElementZ
782 with AnalyzableElementMixin,
783 AstElementMixin,
784 ClassElementCommon,
785 class_members.ClassMemberMixin,
786 ContainerMixin,
787 LibraryMemberMixin,
788 TypeDeclarationMixin<InterfaceType>
789 implements ClassElement {
790 bool _isObject;
791 DartType _supertype;
792 OrderedTypeSet _allSupertypesAndSelf;
793 Link<DartType> _interfaces;
794
795 ClassElementZ(ObjectDecoder decoder)
796 : super(decoder);
797
798 InterfaceType _createType(List<DartType> typeArguments) {
799 return new InterfaceType(this, typeArguments);
800 }
801
802 @override
803 ElementKind get kind => ElementKind.CLASS;
804
805 @override
806 accept(ElementVisitor visitor, arg) {
807 return visitor.visitClassElement(this, arg);
808 }
809
810 @override
811 DartType get supertype {
812 if (_isObject == null) {
813 _supertype = _decoder.getType(Key.SUPERTYPE, isOptional: true);
814 _isObject = _supertype == null;
815 }
816 return _supertype;
817 }
818
819 @override
820 bool get isAbstract => _decoder.getBool(Key.IS_ABSTRACT);
821
822 @override
823 bool get isObject {
824 return supertype == null;
825 }
826
827 @override
828 void addBackendMember(Element element) => _unsupported('addBackendMember');
829
830 @override
831 OrderedTypeSet get allSupertypesAndSelf {
832 if (_allSupertypesAndSelf == null) {
833 ObjectDecoder supertypesDeserializer =
834 _decoder.getObject(Key.SUPERTYPES);
835 List<int> offsets = supertypesDeserializer.getInts(Key.OFFSETS);
836 List<Link<DartType>> levels = new List<Link<DartType>>(offsets.length);
837 LinkBuilder<DartType> typesBuilder = new LinkBuilder<DartType>();
838 int offset = 0;
839 int depth = offsets.length - 1;
840 for (DartType type in supertypesDeserializer.getTypes(Key.TYPES)) {
841 Link<DartType> link = typesBuilder.addLast(type);
842 if (offsets[depth] == offset) {
843 levels[depth] = link;
844 depth--;
845 }
846 offset++;
847 }
848 LinkBuilder<DartType> supertypesBuilder = new LinkBuilder<DartType>();
849 for (DartType supertype in
850 supertypesDeserializer.getTypes(Key.SUPERTYPES, isOptional: true)) {
851 supertypesBuilder.addLast(supertype);
852 }
853 Link<DartType> types = typesBuilder.toLink();
854 Link<DartType> supertypes = supertypesBuilder.toLink();
855 _allSupertypesAndSelf = new OrderedTypeSet.internal(
856 levels, types, supertypes);
857 }
858 return _allSupertypesAndSelf;
859 }
860
861 @override
862 void forEachBackendMember(void f(Element member)) {
863 _unsupported('forEachBackendMember');
864 }
865
866 @override
867 bool get hasBackendMembers => _unsupported('hasBackendMembers');
868
869 @override
870 bool get hasConstructor => _unsupported('hasConstructor');
871
872 @override
873 bool hasFieldShadowedBy(Element fieldMember) => _unsupported('');
874
875 @override
876 bool get hasIncompleteHierarchy => _unsupported('hasIncompleteHierarchy');
877
878 @override
879 bool get hasLocalScopeMembers => _unsupported('hasLocalScopeMembers');
880
881 @override
882 bool implementsFunction(Compiler compiler) {
883 return _unsupported('implementsFunction');
884 }
885
886 @override
887 Link<DartType> get interfaces {
888 if (_interfaces == null) {
889 _interfaces = toLink(
890 _decoder.getTypes(Key.INTERFACES, isOptional: true));
891 }
892 return _interfaces;
893 }
894
895 @override
896 bool get isEnumClass => false;
897
898 @override
899 bool get isProxy => _unsupported('isProxy');
900
901 @override
902 bool get isUnnamedMixinApplication {
903 return _unsupported('isUnnamedMixinApplication');
904 }
905
906 @override
907 Element lookupBackendMember(String memberName) {
908 return _unsupported('lookupBackendMember');
909 }
910
911 @override
912 ConstructorElement lookupDefaultConstructor() {
913 ConstructorElement constructor = lookupConstructor("");
914 if (constructor != null && constructor.parameters.isEmpty) {
915 return constructor;
916 }
917 return null;
918 }
919
920 @override
921 String get nativeTagInfo => _unsupported('nativeTagInfo');
922
923 @override
924 void reverseBackendMembers() => _unsupported('reverseBackendMembers');
925
926 @override
927 ClassElement get superclass => supertype != null ? supertype.element : null;
928 }
929
930 abstract class ConstructorElementZ extends DeserializedElementZ
931 with AnalyzableElementMixin,
932 AstElementMixin,
933 ClassMemberMixin,
934 FunctionTypedElementMixin,
935 ParametersMixin,
936 TypedElementMixin,
937 MemberElementMixin
938 implements ConstructorElement {
939 ConstantConstructor _constantConstructor;
940
941 ConstructorElementZ(ObjectDecoder decoder)
942 : super(decoder);
943
944 accept(ElementVisitor visitor, arg) {
945 return visitor.visitConstructorElement(this, arg);
946 }
947
948 @override
949 bool get isConst => _decoder.getBool(Key.IS_CONST);
950
951 bool get isFromEnvironmentConstructor {
952 return name == 'fromEnvironment' &&
953 library.isDartCore &&
954 (enclosingClass.name == 'bool' ||
955 enclosingClass.name == 'int' ||
956 enclosingClass.name == 'String');
957 }
958
959 ConstantConstructor get constantConstructor {
960 if (isConst && _constantConstructor == null) {
961 ObjectDecoder data =
962 _decoder.getObject(Key.CONSTRUCTOR, isOptional: true);
963 if (data == null) {
964 assert(isFromEnvironmentConstructor);
965 return null;
966 }
967 _constantConstructor = ConstantConstructorDeserializer.deserialize(data);
968 }
969 return _constantConstructor;
970 }
971
972 @override
973 AsyncMarker get asyncMarker => _unsupported('asyncMarker');
974
975 @override
976 InterfaceType computeEffectiveTargetType(InterfaceType newType) {
977 return _unsupported('computeEffectiveTargetType');
978 }
979
980 @override
981 ConstructorElement get definingConstructor {
982 return _unsupported('definingConstructor');
983 }
984
985 @override
986 ConstructorElement get effectiveTarget {
987 return _unsupported('effectiveTarget');
988 }
989
990 @override
991 ConstructorElement get immediateRedirectionTarget {
992 return _unsupported('immediateRedirectionTarget');
993 }
994
995 @override
996 bool get isExternal => _unsupported('isExternal');
997
998 @override
999 bool get isRedirectingFactory => _unsupported('isRedirectingFactory');
1000
1001 @override
1002 bool get isRedirectingGenerative => _unsupported('isRedirectingGenerative');
1003
1004 @override
1005 bool get isCyclicRedirection => _unsupported('isCyclicRedirection');
1006
1007 @override
1008 PrefixElement get redirectionDeferredPrefix {
1009 return _unsupported('redirectionDeferredPrefix');
1010 }
1011 }
1012
1013 class GenerativeConstructorElementZ extends ConstructorElementZ {
1014 GenerativeConstructorElementZ(ObjectDecoder decoder)
1015 : super(decoder);
1016
1017 @override
1018 ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR;
1019 }
1020
1021 class FactoryConstructorElementZ extends ConstructorElementZ {
1022
1023 FactoryConstructorElementZ(ObjectDecoder decoder)
1024 : super(decoder);
1025
1026 @override
1027 ElementKind get kind => ElementKind.FUNCTION;
1028
1029 @override
1030 bool get isFactoryConstructor => true;
1031 }
1032
1033 abstract class MemberElementMixin
1034 implements DeserializedElementZ, MemberElement {
1035
1036 @override
1037 MemberElement get memberContext => this;
1038
1039 @override
1040 Name get memberName => new Name(name, library);
1041
1042 @override
1043 List<FunctionElement> get nestedClosures => const <FunctionElement>[];
1044
1045 }
1046
1047 abstract class FieldElementZ extends DeserializedElementZ
1048 with AnalyzableElementMixin,
1049 AstElementMixin,
1050 TypedElementMixin,
1051 MemberElementMixin
1052 implements FieldElement {
1053 ConstantExpression _constant;
1054
1055 FieldElementZ(ObjectDecoder decoder)
1056 : super(decoder);
1057
1058 @override
1059 ElementKind get kind => ElementKind.FIELD;
1060
1061 @override
1062 accept(ElementVisitor visitor, arg) {
1063 return visitor.visitFieldElement(this, arg);
1064 }
1065
1066 @override
1067 bool get isFinal => _decoder.getBool(Key.IS_FINAL);
1068
1069 @override
1070 bool get isConst => _decoder.getBool(Key.IS_CONST);
1071
1072 @override
1073 ConstantExpression get constant {
1074 if (isConst && _constant == null) {
1075 _constant = _decoder.getConstant(Key.CONSTANT);
1076 }
1077 return _constant;
1078 }
1079
1080 @override
1081 Expression get initializer => _unsupported('initializer');
1082 }
1083
1084
1085 class TopLevelFieldElementZ extends FieldElementZ with LibraryMemberMixin {
1086 TopLevelFieldElementZ(ObjectDecoder decoder)
1087 : super(decoder);
1088 }
1089
1090 class StaticFieldElementZ extends FieldElementZ
1091 with ClassMemberMixin, StaticMemberMixin {
1092 StaticFieldElementZ(ObjectDecoder decoder)
1093 : super(decoder);
1094 }
1095
1096 class InstanceFieldElementZ extends FieldElementZ
1097 with ClassMemberMixin, InstanceMemberMixin {
1098 InstanceFieldElementZ(ObjectDecoder decoder)
1099 : super(decoder);
1100 }
1101
1102 abstract class FunctionElementZ extends DeserializedElementZ
1103 with AnalyzableElementMixin,
1104 AstElementMixin,
1105 ParametersMixin,
1106 FunctionTypedElementMixin,
1107 TypedElementMixin,
1108 MemberElementMixin
1109 implements MethodElement {
1110 FunctionElementZ(ObjectDecoder decoder)
1111 : super(decoder);
1112
1113 @override
1114 ElementKind get kind => ElementKind.FUNCTION;
1115
1116 @override
1117 accept(ElementVisitor visitor, arg) {
1118 return visitor.visitFunctionElement(this, arg);
1119 }
1120
1121 @override
1122 bool get isOperator => _decoder.getBool(Key.IS_OPERATOR);
1123 }
1124
1125 class TopLevelFunctionElementZ extends FunctionElementZ
1126 with LibraryMemberMixin {
1127 TopLevelFunctionElementZ(ObjectDecoder decoder)
1128 : super(decoder);
1129 }
1130
1131 class StaticFunctionElementZ extends FunctionElementZ
1132 with ClassMemberMixin, StaticMemberMixin {
1133 StaticFunctionElementZ(ObjectDecoder decoder)
1134 : super(decoder);
1135 }
1136
1137 class InstanceFunctionElementZ extends FunctionElementZ
1138 with ClassMemberMixin, InstanceMemberMixin {
1139 InstanceFunctionElementZ(ObjectDecoder decoder)
1140 : super(decoder);
1141 }
1142
1143 abstract class GetterElementZ extends DeserializedElementZ
1144 with AnalyzableElementMixin,
1145 AstElementMixin,
1146 FunctionTypedElementMixin,
1147 ParametersMixin,
1148 TypedElementMixin,
1149 MemberElementMixin
1150 implements FunctionElement {
1151
1152 GetterElementZ(ObjectDecoder decoder)
1153 : super(decoder);
1154
1155 @override
1156 ElementKind get kind => ElementKind.GETTER;
1157
1158 @override
1159 accept(ElementVisitor visitor, arg) {
1160 return visitor.visitFunctionElement(this, arg);
1161 }
1162 }
1163
1164 class TopLevelGetterElementZ extends GetterElementZ with LibraryMemberMixin {
1165 TopLevelGetterElementZ(ObjectDecoder decoder)
1166 : super(decoder);
1167 }
1168
1169 class StaticGetterElementZ extends GetterElementZ
1170 with ClassMemberMixin, StaticMemberMixin {
1171 StaticGetterElementZ(ObjectDecoder decoder)
1172 : super(decoder);
1173 }
1174
1175 class InstanceGetterElementZ extends GetterElementZ
1176 with ClassMemberMixin, InstanceMemberMixin {
1177 InstanceGetterElementZ(ObjectDecoder decoder)
1178 : super(decoder);
1179 }
1180
1181 abstract class SetterElementZ extends DeserializedElementZ
1182 with AnalyzableElementMixin,
1183 AstElementMixin,
1184 FunctionTypedElementMixin,
1185 ParametersMixin,
1186 TypedElementMixin,
1187 MemberElementMixin
1188 implements FunctionElement {
1189
1190 SetterElementZ(ObjectDecoder decoder)
1191 : super(decoder);
1192
1193 @override
1194 ElementKind get kind => ElementKind.SETTER;
1195
1196 @override
1197 accept(ElementVisitor visitor, arg) {
1198 return visitor.visitFunctionElement(this, arg);
1199 }
1200 }
1201
1202 class TopLevelSetterElementZ extends SetterElementZ with LibraryMemberMixin {
1203 TopLevelSetterElementZ(ObjectDecoder decoder)
1204 : super(decoder);
1205 }
1206
1207 class StaticSetterElementZ extends SetterElementZ
1208 with ClassMemberMixin, StaticMemberMixin {
1209 StaticSetterElementZ(ObjectDecoder decoder)
1210 : super(decoder);
1211 }
1212
1213 class InstanceSetterElementZ extends SetterElementZ
1214 with ClassMemberMixin, InstanceMemberMixin {
1215 InstanceSetterElementZ(ObjectDecoder decoder)
1216 : super(decoder);
1217 }
1218
1219 abstract class TypeDeclarationMixin<T extends GenericType>
1220 implements DeserializedElementZ, TypeDeclarationElement {
1221 List<DartType> _typeVariables;
1222 T _rawType;
1223 T _thisType;
1224
1225 void _ensureTypes() {
1226 if (_typeVariables == null) {
1227 _typeVariables = _decoder.getTypes(
1228 Key.TYPE_VARIABLES, isOptional: true);
1229 _rawType = _createType(new List<DartType>.filled(
1230 _typeVariables.length, const DynamicType()));
1231 _thisType = _createType(_typeVariables);
1232 }
1233 }
1234
1235 T _createType(List<DartType> typeArguments);
1236
1237 @override
1238 List<DartType> get typeVariables {
1239 _ensureTypes();
1240 return _typeVariables;
1241 }
1242
1243 @override
1244 T get rawType {
1245 _ensureTypes();
1246 return _rawType;
1247 }
1248
1249 @override
1250 T get thisType {
1251 _ensureTypes();
1252 return _thisType;
1253 }
1254
1255 @override
1256 T computeType(Compiler compiler) => thisType;
1257
1258 @override
1259 bool get isResolved => true;
1260
1261 @override
1262 void ensureResolved(Compiler compiler) {}
1263 }
1264
1265 class TypedefElementZ extends DeserializedElementZ
1266 with AnalyzableElementMixin,
1267 AstElementMixin,
1268 LibraryMemberMixin,
1269 ParametersMixin,
1270 TypeDeclarationMixin<TypedefType>
1271 implements TypedefElement {
1272 DartType _alias;
1273
1274 TypedefElementZ(ObjectDecoder decoder)
1275 : super(decoder);
1276
1277 TypedefType _createType(List<DartType> typeArguments) {
1278 return new TypedefType(this, typeArguments);
1279 }
1280
1281 @override
1282 ElementKind get kind => ElementKind.TYPEDEF;
1283
1284 @override
1285 accept(ElementVisitor visitor, arg) {
1286 return visitor.visitTypedefElement(this, arg);
1287 }
1288
1289 @override
1290 DartType get alias {
1291 if (_alias == null) {
1292 _alias = _decoder.getType(Key.ALIAS);
1293 }
1294 return _alias;
1295 }
1296
1297 @override
1298 void checkCyclicReference(Compiler compiler) {}
1299 }
1300
1301 class TypeVariableElementZ extends DeserializedElementZ
1302 with AnalyzableElementMixin,
1303 AstElementMixin,
1304 TypedElementMixin
1305 implements TypeVariableElement {
1306 TypeDeclarationElement _typeDeclaration;
1307 TypeVariableType _type;
1308 DartType _bound;
1309
1310 TypeVariableElementZ(ObjectDecoder decoder)
1311 : super(decoder);
1312
1313 @override
1314 ElementKind get kind => ElementKind.TYPE_VARIABLE;
1315
1316 @override
1317 accept(ElementVisitor visitor, arg) {
1318 return visitor.visitTypeVariableElement(this, arg);
1319 }
1320
1321 @override
1322 CompilationUnitElement get compilationUnit {
1323 return typeDeclaration.compilationUnit;
1324 }
1325
1326 @override
1327 Element get enclosingElement => typeDeclaration;
1328
1329 @override
1330 Element get enclosingClass => typeDeclaration;
1331
1332 @override
1333 int get index => _decoder.getInt(Key.INDEX);
1334
1335 @override
1336 TypeDeclarationElement get typeDeclaration {
1337 if (_typeDeclaration == null) {
1338 _typeDeclaration =
1339 _decoder.getElement(Key.TYPE_DECLARATION);
1340 }
1341 return _typeDeclaration;
1342 }
1343
1344 DartType get bound {
1345 if (_bound == null) {
1346 _bound = _decoder.getType(Key.BOUND);
1347 }
1348 return _bound;
1349 }
1350
1351 @override
1352 LibraryElement get library => typeDeclaration.library;
1353 }
1354
1355 class ParameterElementZ extends DeserializedElementZ
1356 with AnalyzableElementMixin,
1357 AstElementMixin,
1358 TypedElementMixin
1359 implements ParameterElement {
1360 FunctionElement _functionDeclaration;
1361 ConstantExpression _constant;
1362 DartType _type;
1363
1364 ParameterElementZ(ObjectDecoder decoder) : super(decoder);
1365
1366 @override
1367 accept(ElementVisitor visitor, arg) {
1368 return visitor.visitParameterElement(this, arg);
1369 }
1370
1371 @override
1372 ConstantExpression get constant {
1373 if (isOptional) {
1374 if (_constant == null) {
1375 _constant = _decoder.getConstant(Key.CONSTANT);
1376 }
1377 return _constant;
1378 }
1379 return null;
1380 }
1381
1382 @override
1383 CompilationUnitElement get compilationUnit {
1384 return functionDeclaration.compilationUnit;
1385 }
1386
1387 @override
1388 ExecutableElement get executableContext => functionDeclaration;
1389
1390 @override
1391 Element get enclosingElement => functionDeclaration;
1392
1393 @override
1394 FunctionElement get functionDeclaration {
1395 if (_functionDeclaration == null) {
1396 _functionDeclaration = _decoder.getElement(Key.FUNCTION);
1397 }
1398 return _functionDeclaration;
1399 }
1400
1401 @override
1402 FunctionSignature get functionSignature => _unsupported('functionSignature');
1403
1404 @override
1405 Expression get initializer => _unsupported('initializer');
1406
1407 @override
1408 bool get isNamed => _decoder.getBool(Key.IS_NAMED);
1409
1410 @override
1411 bool get isOptional => _decoder.getBool(Key.IS_OPTIONAL);
1412
1413 @override
1414 ElementKind get kind => ElementKind.PARAMETER;
1415
1416 @override
1417 LibraryElement get library => executableContext.library;
1418
1419 @override
1420 MemberElement get memberContext => executableContext.memberContext;
1421 }
1422
1423
1424 class InitializingFormalElementZ extends ParameterElementZ
1425 implements InitializingFormalElement {
1426 FieldElement _fieldElement;
1427
1428 InitializingFormalElementZ(ObjectDecoder decoder)
1429 : super(decoder);
1430
1431 @override
1432 FieldElement get fieldElement {
1433 if (_fieldElement == null) {
1434 _fieldElement = _decoder.getElement(Key.FIELD);
1435 }
1436 return _fieldElement;
1437 }
1438
1439 @override
1440 accept(ElementVisitor visitor, arg) {
1441 return visitor.visitFieldParameterElement(this, arg);
1442 }
1443
1444 @override
1445 ElementKind get kind => ElementKind.INITIALIZING_FORMAL;
1446
1447 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698