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

Side by Side Diff: pkg/analyzer/lib/src/summary/summarize_elements.dart

Issue 1642483002: Improve 'length' instance property reference encoding. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Improve using 'UnlinkedConstOperation.length'. Created 4 years, 11 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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/summary/summarize_const_expr.dart ('k') | pkg/analyzer/test/src/summary/summary_common.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698