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

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

Powered by Google App Engine
This is Rietveld 408576698