| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library serialization.elements; | 5 library serialization.elements; |
| 6 | 6 |
| 7 import 'package:analyzer/dart/element/element.dart'; | 7 import 'package:analyzer/dart/element/element.dart'; |
| 8 import 'package:analyzer/dart/element/type.dart'; | 8 import 'package:analyzer/dart/element/type.dart'; |
| 9 import 'package:analyzer/src/dart/element/element.dart'; | 9 import 'package:analyzer/src/dart/element/element.dart'; |
| 10 import 'package:analyzer/src/dart/element/type.dart'; | 10 import 'package:analyzer/src/dart/element/type.dart'; |
| (...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 .add(() => serializeTypeRef(type, context, linked: true, slot: slot)); | 792 .add(() => serializeTypeRef(type, context, linked: true, slot: slot)); |
| 793 } | 793 } |
| 794 return slot; | 794 return slot; |
| 795 } | 795 } |
| 796 | 796 |
| 797 int _getElementReferenceId(Element element, {bool linked: false}) { | 797 int _getElementReferenceId(Element element, {bool linked: false}) { |
| 798 return referenceMap.putIfAbsent(element, () { | 798 return referenceMap.putIfAbsent(element, () { |
| 799 if (element is ConstructorElement && element.displayName.isEmpty) { | 799 if (element is ConstructorElement && element.displayName.isEmpty) { |
| 800 return _getElementReferenceId(element.enclosingElement, linked: linked); | 800 return _getElementReferenceId(element.enclosingElement, linked: linked); |
| 801 } | 801 } |
| 802 if (element is PropertyAccessorElement) { |
| 803 Element enclosing = element.enclosingElement; |
| 804 if (!(enclosing is CompilationUnitElement || element.isStatic)) { |
| 805 throw new StateError( |
| 806 'Only top-level or static property accessors can be serialized.'); |
| 807 } |
| 808 } |
| 802 LibraryElement dependentLibrary = element?.library; | 809 LibraryElement dependentLibrary = element?.library; |
| 803 int unit; | 810 int unit; |
| 804 if (dependentLibrary == null) { | 811 if (dependentLibrary == null) { |
| 805 assert(element == librarySerializer.typeProvider.dynamicType.element || | 812 assert(element == librarySerializer.typeProvider.dynamicType.element || |
| 806 element == null); | 813 element == null); |
| 807 unit = 0; | 814 unit = 0; |
| 808 dependentLibrary = librarySerializer.libraryElement; | 815 dependentLibrary = librarySerializer.libraryElement; |
| 809 } else { | 816 } else { |
| 810 CompilationUnitElement unitElement = | 817 CompilationUnitElement unitElement = |
| 811 element.getAncestor((Element e) => e is CompilationUnitElement); | 818 element.getAncestor((Element e) => e is CompilationUnitElement); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 842 prefixReference = _getElementReferenceId(enclosing, linked: linked); | 849 prefixReference = _getElementReferenceId(enclosing, linked: linked); |
| 843 } | 850 } |
| 844 unlinkedReferences.add(new UnlinkedReferenceBuilder( | 851 unlinkedReferences.add(new UnlinkedReferenceBuilder( |
| 845 name: name, prefixReference: prefixReference)); | 852 name: name, prefixReference: prefixReference)); |
| 846 } | 853 } |
| 847 int index = linkedReferences.length; | 854 int index = linkedReferences.length; |
| 848 linkedReferences.add(linkedReference); | 855 linkedReferences.add(linkedReference); |
| 849 return index; | 856 return index; |
| 850 }); | 857 }); |
| 851 } | 858 } |
| 859 |
| 860 int _getLengthPropertyReference(int prefix) { |
| 861 assert(unlinkedReferences.length == linkedReferences.length); |
| 862 int index = linkedReferences.length; |
| 863 unlinkedReferences.add( |
| 864 new UnlinkedReferenceBuilder(name: 'length', prefixReference: prefix)); |
| 865 LinkedReferenceBuilder linkedReference = |
| 866 new LinkedReferenceBuilder(kind: ReferenceKind.length); |
| 867 linkedReferences.add(linkedReference); |
| 868 return index; |
| 869 } |
| 852 } | 870 } |
| 853 | 871 |
| 854 /** | 872 /** |
| 855 * Instances of this class keep track of intermediate state during | 873 * Instances of this class keep track of intermediate state during |
| 856 * serialization of a single constant [Expression]. | 874 * serialization of a single constant [Expression]. |
| 857 */ | 875 */ |
| 858 class _ConstExprSerializer extends AbstractConstExprSerializer { | 876 class _ConstExprSerializer extends AbstractConstExprSerializer { |
| 859 final _CompilationUnitSerializer serializer; | 877 final _CompilationUnitSerializer serializer; |
| 860 | 878 |
| 861 _ConstExprSerializer(this.serializer); | 879 _ConstExprSerializer(this.serializer); |
| 862 | 880 |
| 863 @override | 881 @override |
| 864 EntityRefBuilder serializeConstructorName(ConstructorName constructor) { | 882 EntityRefBuilder serializeConstructorName(ConstructorName constructor) { |
| 865 ConstructorElement element = constructor.staticElement; | 883 ConstructorElement element = constructor.staticElement; |
| 866 assert(element != null); | 884 assert(element != null); |
| 867 int referenceId = serializer._getElementReferenceId(element); | 885 int referenceId = serializer._getElementReferenceId(element); |
| 868 return new EntityRefBuilder(reference: referenceId); | 886 return new EntityRefBuilder(reference: referenceId); |
| 869 } | 887 } |
| 870 | 888 |
| 871 EntityRefBuilder serializeIdentifier(Identifier identifier) { | 889 EntityRefBuilder serializeIdentifier(Identifier identifier) { |
| 872 Element element = identifier.staticElement; | 890 Element element = identifier.staticElement; |
| 873 assert(element != null); | 891 assert(element != null); |
| 892 // The only supported instance property accessor - `length`. |
| 893 if (identifier is PrefixedIdentifier && |
| 894 element is PropertyAccessorElement && |
| 895 !element.isStatic) { |
| 896 assert(element.name == 'length'); |
| 897 Element prefixElement = identifier.prefix.staticElement; |
| 898 int prefixRef = serializer._getElementReferenceId(prefixElement); |
| 899 int lengthRef = serializer._getLengthPropertyReference(prefixRef); |
| 900 return new EntityRefBuilder(reference: lengthRef); |
| 901 } |
| 874 return new EntityRefBuilder( | 902 return new EntityRefBuilder( |
| 875 reference: serializer._getElementReferenceId(element)); | 903 reference: serializer._getElementReferenceId(element)); |
| 876 } | 904 } |
| 877 | 905 |
| 878 @override | 906 @override |
| 879 EntityRefBuilder serializePropertyAccess(PropertyAccess access) { | 907 EntityRefBuilder serializePropertyAccess(PropertyAccess access) { |
| 880 Element element = access.propertyName.staticElement; | 908 Element element = access.propertyName.staticElement; |
| 881 assert(element != null); | 909 assert(element != null); |
| 910 // The only supported instance property accessor - `length`. |
| 911 Expression target = access.target; |
| 912 if (target is Identifier && element is PropertyAccessorElement && |
| 913 !element.isStatic) { |
| 914 assert(element.name == 'length'); |
| 915 Element prefixElement = target.staticElement; |
| 916 int prefixRef = serializer._getElementReferenceId(prefixElement); |
| 917 int lengthRef = serializer._getLengthPropertyReference(prefixRef); |
| 918 return new EntityRefBuilder(reference: lengthRef); |
| 919 } |
| 882 return new EntityRefBuilder( | 920 return new EntityRefBuilder( |
| 883 reference: serializer._getElementReferenceId(element)); | 921 reference: serializer._getElementReferenceId(element)); |
| 884 } | 922 } |
| 885 | 923 |
| 886 @override | 924 @override |
| 887 EntityRefBuilder serializeType(TypeName typeName) { | 925 EntityRefBuilder serializeType(TypeName typeName) { |
| 888 DartType type = typeName != null ? typeName.type : DynamicTypeImpl.instance; | 926 DartType type = typeName != null ? typeName.type : DynamicTypeImpl.instance; |
| 889 return serializer.serializeTypeRef(type, null); | 927 return serializer.serializeTypeRef(type, null); |
| 890 } | 928 } |
| 891 } | 929 } |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1073 exportNames.add(new LinkedExportNameBuilder( | 1111 exportNames.add(new LinkedExportNameBuilder( |
| 1074 name: name, | 1112 name: name, |
| 1075 dependency: serializeDependency(dependentLibrary), | 1113 dependency: serializeDependency(dependentLibrary), |
| 1076 unit: unit, | 1114 unit: unit, |
| 1077 kind: kind)); | 1115 kind: kind)); |
| 1078 } | 1116 } |
| 1079 pb.exportNames = exportNames; | 1117 pb.exportNames = exportNames; |
| 1080 return pb; | 1118 return pb; |
| 1081 } | 1119 } |
| 1082 } | 1120 } |
| OLD | NEW |