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..11461e335b44e8469bfca1135b1ace046e686235 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 |
@@ -657,8 +677,8 @@ class _ReflectorDomain { |
} else { |
librariesCode = _formatAsList("m.LibraryMirror", |
libraries.items.map((_LibraryDomain library) { |
- return _libraryMirrorCode(library, members, topLevelVariables, |
- fields.length, importCollector, logger); |
+ return _libraryMirrorCode(library, libraries.indexOf(library), members, |
+ topLevelVariables, fields.length, importCollector, logger); |
})); |
} |
@@ -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"; |
@@ -973,6 +994,7 @@ class _ReflectorDomain { |
String _libraryMirrorCode( |
_LibraryDomain libraryDomain, |
+ int libraryIndex, |
Enumerator<ExecutableElement> members, |
Enumerator<TopLevelVariableElement> variables, |
int fieldsLength, |
@@ -1017,8 +1039,10 @@ 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 = (_capabilities._supportsUri || |
+ _capabilities.supportsLibraries) |
+ ? 'Uri.parse(r"reflectable://$libraryIndex/$library")' |
+ : 'null'; |
String metadataCode; |
if (_capabilities._supportsMetadata) { |
@@ -1856,6 +1880,11 @@ class _Capabilities { |
capability == ec.metadataCapability); |
} |
+ bool get _supportsUri { |
+ return _capabilities.any( |
+ (ec.ReflectCapability capability) => capability == ec.uriCapability); |
+ } |
+ |
/// Returns [true] iff these [Capabilities] specify reflection support |
/// where the set of classes must be downwards closed, i.e., extra classes |
/// must be added beyond the ones that are directly covered by the given |
@@ -2284,7 +2313,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 +2416,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); |
} |