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

Unified 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: 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 side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/lib/src/summary/summarize_elements.dart
diff --git a/pkg/analyzer/lib/src/summary/summarize_elements.dart b/pkg/analyzer/lib/src/summary/summarize_elements.dart
index e5e4f04e7816b82c9f1b1393f799ccedacb051fa..24beee1ed26e8fac69652b6b74eeae3ab34da6d0 100644
--- a/pkg/analyzer/lib/src/summary/summarize_elements.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_elements.dart
@@ -799,6 +799,13 @@ class _CompilationUnitSerializer {
if (element is ConstructorElement && element.displayName.isEmpty) {
return _getElementReferenceId(element.enclosingElement, linked: linked);
}
+ if (element is PropertyAccessorElement) {
+ Element enclosing = element.enclosingElement;
+ if (!(enclosing is CompilationUnitElement || element.isStatic)) {
+ throw new StateError(
+ 'Only top-level or static property accessors can be serialized.');
+ }
+ }
LibraryElement dependentLibrary = element?.library;
int unit;
if (dependentLibrary == null) {
@@ -849,6 +856,17 @@ class _CompilationUnitSerializer {
return index;
});
}
+
+ int _getLengthPropertyReference(int prefix) {
+ assert(unlinkedReferences.length == linkedReferences.length);
+ int index = linkedReferences.length;
+ unlinkedReferences.add(
+ new UnlinkedReferenceBuilder(name: 'length', prefixReference: prefix));
+ LinkedReferenceBuilder linkedReference =
+ new LinkedReferenceBuilder(kind: ReferenceKind.length);
+ linkedReferences.add(linkedReference);
+ return index;
+ }
}
/**
@@ -871,6 +889,16 @@ class _ConstExprSerializer extends AbstractConstExprSerializer {
EntityRefBuilder serializeIdentifier(Identifier identifier) {
Element element = identifier.staticElement;
assert(element != null);
+ // The only supported instance property accessor - `length`.
+ if (identifier is PrefixedIdentifier &&
+ element is PropertyAccessorElement &&
+ !element.isStatic) {
+ assert(element.name == 'length');
+ Element prefixElement = identifier.prefix.staticElement;
+ int prefixRef = serializer._getElementReferenceId(prefixElement);
+ int lengthRef = serializer._getLengthPropertyReference(prefixRef);
+ return new EntityRefBuilder(reference: lengthRef);
+ }
return new EntityRefBuilder(
reference: serializer._getElementReferenceId(element));
}
@@ -879,6 +907,16 @@ class _ConstExprSerializer extends AbstractConstExprSerializer {
EntityRefBuilder serializePropertyAccess(PropertyAccess access) {
Element element = access.propertyName.staticElement;
assert(element != null);
+ // The only supported instance property accessor - `length`.
+ Expression target = access.target;
+ if (target is Identifier && element is PropertyAccessorElement &&
+ !element.isStatic) {
+ assert(element.name == 'length');
+ Element prefixElement = target.staticElement;
+ int prefixRef = serializer._getElementReferenceId(prefixElement);
+ int lengthRef = serializer._getLengthPropertyReference(prefixRef);
+ return new EntityRefBuilder(reference: lengthRef);
+ }
return new EntityRefBuilder(
reference: serializer._getElementReferenceId(element));
}

Powered by Google App Engine
This is Rietveld 408576698