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

Unified Diff: reflectable/lib/src/transformer_implementation.dart

Issue 1391013008: Adds limited support for private classes. (Closed) Base URL: https://github.com/dart-lang/reflectable.git@master
Patch Set: Created 5 years, 2 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: reflectable/lib/src/transformer_implementation.dart
diff --git a/reflectable/lib/src/transformer_implementation.dart b/reflectable/lib/src/transformer_implementation.dart
index c04ae96570c5cfaaf7c2b6b4fbd5ef74ce99c758..beb9a8831e70a42d0f57c0bc23bbef3ca1d7e6e2 100644
--- a/reflectable/lib/src/transformer_implementation.dart
+++ b/reflectable/lib/src/transformer_implementation.dart
@@ -364,7 +364,7 @@ class _ReflectorDomain {
final AssetId _generatedLibraryId;
final ClassElement _reflector;
- /// Do not use this, use [classes] which ensures that closures operations
+ /// Do not use this, use [classes] which ensures that closure operations
/// have been performed as requested in [_capabilities]. Exception: In
/// `_computeWorld`, [_classes] is filled in with the set of directly
/// covered classes during creation of this [_ReflectorDomain].
@@ -542,9 +542,10 @@ class _ReflectorDomain {
// Library and class related collections.
Enumerator<ExecutableElement> members = new Enumerator<ExecutableElement>();
- // Fill in [libraries], [members], [fields], [parameters],
- // [instanceGetterNames], and [instanceSetterNames].
- for (LibraryElement library in _libraries) {
+ /// Adds a library domain for [library] to [libraries], relying on checks
+ /// for importability and insertion into [importCollector] to have taken
+ /// place already.
+ void uncheckedAddLibrary(LibraryElement library) {
_LibraryDomain libraryDomain = _createLibraryDomain(library, this);
libraries.add(libraryDomain);
libraryMap[library] = libraryDomain;
@@ -552,6 +553,25 @@ class _ReflectorDomain {
libraryDomain._declaredParameters.forEach(parameters.add);
libraryDomain._declaredVariables.forEach(topLevelVariables.add);
}
+
+ /// Used to add a library domain for [library] to [libraries], checking
+ /// that it is importable and registering it with [importCollector].
+ void addLibrary(LibraryElement library) {
+ if (!_isImportableLibrary(
+ library, _generatedLibraryId, _resolver)) return;
+ importCollector._addLibrary(library);
+ uncheckedAddLibrary(library);
+ }
+
+ // Fill in [libraries], [members], [fields], [parameters],
+ // [instanceGetterNames], and [instanceSetterNames].
+ _libraries.forEach(uncheckedAddLibrary);
+ classes.forEach((ClassElement classElement) {
+ if (!libraries.items.any((_LibraryDomain libraryDomain) =>
+ libraryDomain._libraryElement == classElement.library)) {
+ addLibrary(classElement.library);
+ }
+ });
for (_ClassDomain classDomain in classes.domains) {
// Gather the behavioral interface into [members]. Note that
// this includes implicitly generated getters and setters, but
@@ -868,14 +888,13 @@ class _ReflectorDomain {
int classIndex = classes.indexOf(classElement);
- String result = 'new r.ClassMirrorImpl(r"${classDomain._simpleName}", '
+ return 'new r.ClassMirrorImpl(r"${classDomain._simpleName}", '
'r"${_qualifiedName(classElement)}", $descriptor, $classIndex, '
'${_constConstructionCode(importCollector)}, '
'$declarationsCode, $instanceMembersCode, $staticMembersCode, '
'$superclassIndex, $staticGettersCode, $staticSettersCode, '
'$constructorsCode, $ownerIndex, $mixinIndex, '
'$superinterfaceIndices, $classMetadataCode)';
- return result;
}
String _methodMirrorCode(
@@ -963,7 +982,9 @@ class _ReflectorDomain {
String _typeCodeOfClass(
ClassElement classElement, _ImportCollector importCollector) {
- if (classElement is MixinApplication && classElement.declaredName == null) {
+ if ((classElement is MixinApplication &&
+ classElement.declaredName == null) ||
+ classElement.isPrivate) {
return 'const r.FakeType(r"${_qualifiedName(classElement)}")';
}
if (classElement.type.isDynamic) return "dynamic";
@@ -1018,7 +1039,7 @@ class _ReflectorDomain {
// TODO(sigurdm) clarify: Find out how to get good uri's in a
// transformer.
// TODO(sigurdm) implement: Check for `uriCapability`.
- String uriCode = "null";
+ String uriCode = 'Uri.parse(r"reflectable://$library")';
sigurdm 2015/10/15 12:30:58 Is this any better?
eernst 2015/10/15 13:46:11 We cannot implement a map from `Uri` to `LibraryMi
String metadataCode;
if (_capabilities._supportsMetadata) {
@@ -2284,7 +2305,7 @@ class TransformerImplementation {
void addLibrary(LibraryElement library, ClassElement reflector) {
_ReflectorDomain domain = getReflectorDomain(reflector);
if (domain._capabilities.supportsLibraries) {
- assert(_isImportableLibrary(reflector.library, dataId, _resolver));
+ assert(_isImportableLibrary(library, dataId, _resolver));
importCollector._addLibrary(library);
domain._libraries.add(library);
}
@@ -2387,7 +2408,7 @@ class TransformerImplementation {
for (LibraryElement library in _resolver.libraries) {
for (ClassElement reflector
in getReflectors(library.name, library.metadata)) {
- assert(_isImportableLibrary(reflector.library, dataId, _resolver));
+ assert(_isImportableLibrary(library, dataId, _resolver));
addLibrary(library, reflector);
}

Powered by Google App Engine
This is Rietveld 408576698