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

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

Issue 1681353002: Refactor code that populates the references table. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 for (MethodElement method in cls.methods) { 424 for (MethodElement method in cls.methods) {
425 if (method.isStatic && method.isPublic) { 425 if (method.isStatic && method.isPublic) {
426 // TODO(paulberry): should numTypeParameters include class params? 426 // TODO(paulberry): should numTypeParameters include class params?
427 bs.add(new UnlinkedPublicNameBuilder( 427 bs.add(new UnlinkedPublicNameBuilder(
428 name: method.name, 428 name: method.name,
429 kind: ReferenceKind.method, 429 kind: ReferenceKind.method,
430 numTypeParameters: method.typeParameters.length)); 430 numTypeParameters: method.typeParameters.length));
431 } 431 }
432 } 432 }
433 for (ConstructorElement constructor in cls.constructors) { 433 for (ConstructorElement constructor in cls.constructors) {
434 if (constructor.isPublic && 434 if (constructor.isPublic && constructor.name.isNotEmpty) {
435 constructor.name.isNotEmpty) {
436 // TODO(paulberry): should numTypeParameters include class params? 435 // TODO(paulberry): should numTypeParameters include class params?
437 bs.add(new UnlinkedPublicNameBuilder( 436 bs.add(new UnlinkedPublicNameBuilder(
438 name: constructor.name, 437 name: constructor.name,
439 kind: ReferenceKind.constructor, 438 kind: ReferenceKind.constructor,
440 numTypeParameters: 0)); 439 numTypeParameters: 0));
441 } 440 }
442 } 441 }
443 return bs; 442 return bs;
444 } 443 }
445 return null; 444 return null;
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 b.defaultValue = serializeConstExpr(initializer); 659 b.defaultValue = serializeConstExpr(initializer);
661 } 660 }
662 } 661 }
663 return b; 662 return b;
664 } 663 }
665 664
666 /** 665 /**
667 * Serialize the given [prefix] into an index into the references table. 666 * Serialize the given [prefix] into an index into the references table.
668 */ 667 */
669 int serializePrefix(PrefixElement element) { 668 int serializePrefix(PrefixElement element) {
670 return referenceMap.putIfAbsent(element, () { 669 return referenceMap.putIfAbsent(element,
671 assert(unlinkedReferences.length == linkedReferences.length); 670 () => serializeUnlinkedReference(element.name, ReferenceKind.prefix));
672 int index = unlinkedReferences.length;
673 unlinkedReferences.add(new UnlinkedReferenceBuilder(name: element.name));
674 linkedReferences
675 .add(new LinkedReferenceBuilder(kind: ReferenceKind.prefix));
676 return index;
677 });
678 } 671 }
679 672
680 /** 673 /**
681 * Compute the reference index which should be stored in a [EntityRef]. 674 * Compute the reference index which should be stored in a [EntityRef].
682 * 675 *
683 * If [linked] is true, and a new reference has to be created, the reference 676 * If [linked] is true, and a new reference has to be created, the reference
684 * will only be stored in [linkedReferences]. 677 * will only be stored in [linkedReferences].
685 */ 678 */
686 int serializeReferenceForType(DartType type, bool linked) { 679 int serializeReferenceForType(DartType type, bool linked) {
687 Element element = type.element; 680 Element element = type.element;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 serializeTypeRef(typeArguments[i], context, linked: linked)); 782 serializeTypeRef(typeArguments[i], context, linked: linked));
790 } 783 }
791 b.typeArguments = serializedArguments; 784 b.typeArguments = serializedArguments;
792 } 785 }
793 } 786 }
794 } 787 }
795 return b; 788 return b;
796 } 789 }
797 790
798 /** 791 /**
792 * Create a new entry in the references table ([UnlinkedLibrary.references]
793 * and [LinkedLibrary.references]) representing an entity having the given
794 * [name] and [kind]. If [unit] is given, it is the index of the compilation
795 * unit containing the entity being referred to. If [prefixReference] is
796 * given, it indicates the entry in the references table for the prefix.
797 */
798 int serializeUnlinkedReference(String name, ReferenceKind kind,
799 {int unit: 0, int prefixReference: 0}) {
800 assert(unlinkedReferences.length == linkedReferences.length);
801 int index = unlinkedReferences.length;
802 unlinkedReferences.add(new UnlinkedReferenceBuilder(
803 name: name, prefixReference: prefixReference));
804 linkedReferences.add(new LinkedReferenceBuilder(kind: kind, unit: unit));
805 return index;
806 }
807
808 /**
799 * Return the index of the entry in the references table 809 * Return the index of the entry in the references table
800 * ([UnlinkedLibrary.references] and [LinkedLibrary.references]) used for 810 * ([UnlinkedLibrary.references] and [LinkedLibrary.references]) used for
801 * unresolved references. A new entry is added to the table if necessary to 811 * unresolved references. A new entry is added to the table if necessary to
802 * satisfy the request. 812 * satisfy the request.
803 */ 813 */
804 int serializeUnresolvedReference() { 814 int serializeUnresolvedReference() {
805 // TODO(paulberry): in order for relinking to work, we need to record the 815 // TODO(paulberry): in order for relinking to work, we need to record the
806 // name and prefix of the unresolved symbol. This is not (yet) encoded in 816 // name and prefix of the unresolved symbol. This is not (yet) encoded in
807 // the element model. For the moment we use a name that can't possibly 817 // the element model. For the moment we use a name that can't possibly
808 // ever exist. 818 // ever exist.
809 if (unresolvedReferenceIndex == null) { 819 if (unresolvedReferenceIndex == null) {
810 assert(unlinkedReferences.length == linkedReferences.length); 820 return serializeUnlinkedReference(
811 unresolvedReferenceIndex = unlinkedReferences.length; 821 '*unresolved*', ReferenceKind.unresolved);
812 unlinkedReferences
813 .add(new UnlinkedReferenceBuilder(name: '*unresolved*'));
814 linkedReferences
815 .add(new LinkedReferenceBuilder(kind: ReferenceKind.unresolved));
816 } 822 }
817 return unresolvedReferenceIndex; 823 return unresolvedReferenceIndex;
818 } 824 }
819 825
820 /** 826 /**
821 * Serialize the given [variable], creating an [UnlinkedVariable]. 827 * Serialize the given [variable], creating an [UnlinkedVariable].
822 */ 828 */
823 UnlinkedVariableBuilder serializeVariable(PropertyInducingElement variable) { 829 UnlinkedVariableBuilder serializeVariable(PropertyInducingElement variable) {
824 UnlinkedVariableBuilder b = new UnlinkedVariableBuilder(); 830 UnlinkedVariableBuilder b = new UnlinkedVariableBuilder();
825 b.name = variable.name; 831 b.name = variable.name;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 int unit; 902 int unit;
897 if (dependentLibrary == null) { 903 if (dependentLibrary == null) {
898 unit = 0; 904 unit = 0;
899 dependentLibrary = librarySerializer.libraryElement; 905 dependentLibrary = librarySerializer.libraryElement;
900 } else { 906 } else {
901 CompilationUnitElement unitElement = 907 CompilationUnitElement unitElement =
902 element.getAncestor((Element e) => e is CompilationUnitElement); 908 element.getAncestor((Element e) => e is CompilationUnitElement);
903 unit = dependentLibrary.units.indexOf(unitElement); 909 unit = dependentLibrary.units.indexOf(unitElement);
904 assert(unit != -1); 910 assert(unit != -1);
905 } 911 }
906 LinkedReferenceBuilder linkedReference = new LinkedReferenceBuilder( 912 ReferenceKind kind = _getReferenceKind(element);
907 dependency: librarySerializer.serializeDependency(dependentLibrary),
908 kind: _getReferenceKind(element),
909 unit: unit);
910 if (element is TypeParameterizedElement) {
911 linkedReference.numTypeParameters = element.typeParameters.length;
912 }
913 String name = element == null ? 'void' : element.name; 913 String name = element == null ? 'void' : element.name;
914 int index;
915 LinkedReferenceBuilder linkedReference;
914 if (linked) { 916 if (linked) {
915 linkedReference.name = name; 917 linkedReference =
918 new LinkedReferenceBuilder(kind: kind, unit: unit, name: name);
916 Element enclosing = element?.enclosingElement; 919 Element enclosing = element?.enclosingElement;
917 if (enclosing is ClassElement) { 920 if (enclosing is ClassElement) {
918 linkedReference.containingReference = 921 linkedReference.containingReference =
919 _getElementReferenceId(enclosing, linked: linked); 922 _getElementReferenceId(enclosing, linked: linked);
920 linkedReference.numTypeParameters += enclosing.typeParameters.length; 923 linkedReference.numTypeParameters = enclosing.typeParameters.length;
921 } 924 }
925 index = linkedReferences.length;
926 linkedReferences.add(linkedReference);
922 } else { 927 } else {
923 assert(unlinkedReferences.length == linkedReferences.length); 928 assert(unlinkedReferences.length == linkedReferences.length);
924 int prefixReference = 0; 929 int prefixReference = 0;
925 Element enclosing = element?.enclosingElement; 930 Element enclosing = element?.enclosingElement;
926 if (enclosing == null || enclosing is CompilationUnitElement) { 931 if (enclosing == null || enclosing is CompilationUnitElement) {
927 // Figure out a prefix that may be used to refer to the given element. 932 // Figure out a prefix that may be used to refer to the given element.
928 // TODO(paulberry): to avoid subtle relinking inconsistencies we 933 // TODO(paulberry): to avoid subtle relinking inconsistencies we
929 // should use the actual prefix from the AST (a given type may be 934 // should use the actual prefix from the AST (a given type may be
930 // reachable via multiple prefixes), but sadly, this information is 935 // reachable via multiple prefixes), but sadly, this information is
931 // not recorded in the element model. 936 // not recorded in the element model.
932 PrefixElement prefix = librarySerializer.prefixMap[element]; 937 PrefixElement prefix = librarySerializer.prefixMap[element];
933 if (prefix != null) { 938 if (prefix != null) {
934 prefixReference = serializePrefix(prefix); 939 prefixReference = serializePrefix(prefix);
935 } 940 }
936 } else { 941 } else {
937 prefixReference = _getElementReferenceId(enclosing, linked: linked); 942 prefixReference = _getElementReferenceId(enclosing, linked: linked);
938 } 943 }
939 unlinkedReferences.add(new UnlinkedReferenceBuilder( 944 index = serializeUnlinkedReference(name, kind,
940 name: name, prefixReference: prefixReference)); 945 prefixReference: prefixReference, unit: unit);
946 linkedReference = linkedReferences[index];
941 } 947 }
942 int index = linkedReferences.length; 948 linkedReference.dependency =
943 linkedReferences.add(linkedReference); 949 librarySerializer.serializeDependency(dependentLibrary);
950 if (element is TypeParameterizedElement) {
951 linkedReference.numTypeParameters += element.typeParameters.length;
952 }
944 return index; 953 return index;
945 }); 954 });
946 } 955 }
947 956
948 int _getLengthPropertyReference(int prefix) { 957 int _getLengthPropertyReference(int prefix) {
949 assert(unlinkedReferences.length == linkedReferences.length); 958 return serializeUnlinkedReference('length', ReferenceKind.length,
950 int index = linkedReferences.length; 959 prefixReference: prefix);
951 unlinkedReferences.add(
952 new UnlinkedReferenceBuilder(name: 'length', prefixReference: prefix));
953 LinkedReferenceBuilder linkedReference =
954 new LinkedReferenceBuilder(kind: ReferenceKind.length);
955 linkedReferences.add(linkedReference);
956 return index;
957 } 960 }
958 } 961 }
959 962
960 /** 963 /**
961 * Instances of this class keep track of intermediate state during 964 * Instances of this class keep track of intermediate state during
962 * serialization of a single constant [Expression]. 965 * serialization of a single constant [Expression].
963 */ 966 */
964 class _ConstExprSerializer extends AbstractConstExprSerializer { 967 class _ConstExprSerializer extends AbstractConstExprSerializer {
965 final _CompilationUnitSerializer serializer; 968 final _CompilationUnitSerializer serializer;
966 969
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 } 1006 }
1004 } 1007 }
1005 1008
1006 @override 1009 @override
1007 EntityRefBuilder serializeConstructorName( 1010 EntityRefBuilder serializeConstructorName(
1008 TypeName type, SimpleIdentifier name) { 1011 TypeName type, SimpleIdentifier name) {
1009 EntityRefBuilder typeRef = serializer.serializeTypeRef(type.type, null); 1012 EntityRefBuilder typeRef = serializer.serializeTypeRef(type.type, null);
1010 if (name == null) { 1013 if (name == null) {
1011 return typeRef; 1014 return typeRef;
1012 } else { 1015 } else {
1013 int typeId = typeRef.reference; 1016 LinkedReference typeLinkedRef =
1014 LinkedReference typeLinkedRef = serializer.linkedReferences[typeId]; 1017 serializer.linkedReferences[typeRef.reference];
1015 serializer.unlinkedReferences.add(new UnlinkedReferenceBuilder( 1018 int refId = serializer.serializeUnlinkedReference(
1016 name: name.name, prefixReference: typeId)); 1019 name.name, ReferenceKind.constructor,
1017 int refId = serializer.linkedReferences.length; 1020 prefixReference: typeRef.reference, unit: typeLinkedRef.unit);
1018 serializer.linkedReferences.add(new LinkedReferenceBuilder(
1019 kind: ReferenceKind.constructor, unit: typeLinkedRef.unit));
1020 return new EntityRefBuilder( 1021 return new EntityRefBuilder(
1021 reference: refId, typeArguments: typeRef.typeArguments); 1022 reference: refId, typeArguments: typeRef.typeArguments);
1022 } 1023 }
1023 } 1024 }
1024 1025
1025 EntityRefBuilder serializeIdentifier(Identifier identifier) { 1026 EntityRefBuilder serializeIdentifier(Identifier identifier) {
1026 Element element = identifier.staticElement; 1027 Element element = identifier.staticElement;
1027 assert(element != null); 1028 assert(element != null);
1028 // The only supported instance property accessor - `length`. 1029 // The only supported instance property accessor - `length`.
1029 if (identifier is PrefixedIdentifier && 1030 if (identifier is PrefixedIdentifier &&
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1253 exportNames.add(new LinkedExportNameBuilder( 1254 exportNames.add(new LinkedExportNameBuilder(
1254 name: name, 1255 name: name,
1255 dependency: serializeDependency(dependentLibrary), 1256 dependency: serializeDependency(dependentLibrary),
1256 unit: unit, 1257 unit: unit,
1257 kind: kind)); 1258 kind: kind));
1258 } 1259 }
1259 pb.exportNames = exportNames; 1260 pb.exportNames = exportNames;
1260 return pb; 1261 return pb;
1261 } 1262 }
1262 } 1263 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698