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

Unified Diff: pkg/analyzer/lib/src/summary/prelink.dart

Issue 1633863002: Support for constructor references in constant serializer and prelinker. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Record default constructor references as class references 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
« no previous file with comments | « pkg/analyzer/lib/src/summary/format.dart ('k') | pkg/analyzer/lib/src/summary/summarize_ast.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/summary/prelink.dart
diff --git a/pkg/analyzer/lib/src/summary/prelink.dart b/pkg/analyzer/lib/src/summary/prelink.dart
index 75774f25899e5b93ecc455776586e87ce8843cf5..66183608a0ad515fb592d039ab1ca8b48cc80a82 100644
--- a/pkg/analyzer/lib/src/summary/prelink.dart
+++ b/pkg/analyzer/lib/src/summary/prelink.dart
@@ -32,7 +32,7 @@ typedef UnlinkedPublicNamespace GetImportCallback(String relativeUri);
/**
* Type of the callback used by the prelinker to obtain unlinked summaries of
- * part files of the library to be prelinked. [relaviteUri] should be
+ * part files of the library to be prelinked. [relativeUri] should be
* interpreted relative to the defining compilation unit of the library being
* prelinked.
*
@@ -41,6 +41,16 @@ typedef UnlinkedPublicNamespace GetImportCallback(String relativeUri);
typedef UnlinkedUnit GetPartCallback(String relativeUri);
/**
+ * A [_Meaning] representing a class.
+ */
+class _ClassMeaning extends _Meaning {
+ final Map<String, _Meaning> namespace;
+
+ _ClassMeaning(int unit, int dependency, int numTypeParameters, this.namespace)
+ : super(unit, ReferenceKind.classOrEnum, dependency, numTypeParameters);
+}
+
+/**
* A [_Meaning] stores all the information necessary to find the declaration
* referred to by a name in a namespace.
*/
@@ -180,10 +190,19 @@ class _Prelinker {
continue;
}
for (UnlinkedPublicName name in importedNamespace.names) {
- aggregated.putIfAbsent(
- name.name,
- () => new _Meaning(
- unitNum, name.kind, dependency, name.numTypeParameters));
+ aggregated.putIfAbsent(name.name, () {
+ if (name.kind == ReferenceKind.classOrEnum) {
+ Map<String, _Meaning> namespace = <String, _Meaning>{};
+ name.executables.forEach((executable) {
+ namespace[executable.name] = new _Meaning(unitNum,
+ executable.kind, dependency, executable.numTypeParameters);
+ });
+ return new _ClassMeaning(
+ unitNum, dependency, name.numTypeParameters, namespace);
+ }
+ return new _Meaning(
+ unitNum, name.kind, dependency, name.numTypeParameters);
+ });
}
}
@@ -237,10 +256,20 @@ class _Prelinker {
*/
void extractPrivateNames(UnlinkedUnit unit, int unitNum) {
for (UnlinkedClass cls in unit.classes) {
- privateNamespace.putIfAbsent(
- cls.name,
- () => new _Meaning(unitNum, ReferenceKind.classOrEnum, 0,
- cls.typeParameters.length));
+ privateNamespace.putIfAbsent(cls.name, () {
+ Map<String, _Meaning> namespace = <String, _Meaning>{};
+ cls.executables.forEach((executable) {
+ namespace[executable.name] = new _Meaning(
+ unitNum,
+ executable.kind == UnlinkedExecutableKind.constructor
+ ? ReferenceKind.constructor
+ : ReferenceKind.staticMethod,
+ 0,
+ executable.typeParameters.length);
+ });
+ return new _ClassMeaning(
+ unitNum, 0, cls.typeParameters.length, namespace);
+ });
}
for (UnlinkedEnum enm in unit.enums) {
privateNamespace.putIfAbsent(enm.name,
@@ -365,19 +394,21 @@ class _Prelinker {
for (int i = 0; i < unit.references.length; i++) {
UnlinkedReference reference = unit.references[i];
Map<String, _Meaning> namespace;
- if (reference.prefixReference != 0) {
+ if (reference.prefixReference == 0) {
+ namespace = privateNamespace;
+ } else {
// Prefix references must always point backward.
assert(reference.prefixReference < i);
namespace = prefixNamespaces[reference.prefixReference];
// Prefix references must always point to proper prefixes.
assert(namespace != null);
- } else {
- namespace = privateNamespace;
}
_Meaning meaning = namespace[reference.name];
if (meaning != null) {
if (meaning is _PrefixMeaning) {
prefixNamespaces[i] = meaning.namespace;
+ } else if (meaning is _ClassMeaning) {
+ prefixNamespaces[i] = meaning.namespace;
}
references.add(meaning.encodeReference());
} else {
« no previous file with comments | « pkg/analyzer/lib/src/summary/format.dart ('k') | pkg/analyzer/lib/src/summary/summarize_ast.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698