Index: pkg/compiler/lib/src/js_emitter/metadata_collector.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart |
index e8c8cc04487a2b0246a43cf612c89ab44b67ac50..47c3484977f50633ba813cdf1af9aa6c03727136 100644 |
--- a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart |
+++ b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart |
@@ -14,10 +14,15 @@ import '../elements/resolution_types.dart' |
import '../deferred_load.dart' show OutputUnit; |
import '../elements/elements.dart' |
show |
+ ClassElement, |
ConstructorElement, |
Element, |
+ FieldElement, |
FunctionElement, |
FunctionSignature, |
+ LibraryElement, |
+ MemberElement, |
+ MethodElement, |
MetadataAnnotation, |
ParameterElement; |
import '../js/js.dart' as jsAst; |
@@ -164,9 +169,30 @@ class MetadataCollector implements jsAst.TokenFinalizer { |
_backend.typeVariableCodegenAnalysis; |
DiagnosticReporter get reporter => _compiler.reporter; |
- bool _mustEmitMetadataFor(Element element) { |
+ jsAst.Fun buildLibraryMetadataFunction(LibraryElement element) { |
+ if (!_backend.mirrorsData.mustRetainMetadata || |
+ !_backend.mirrorsData.isLibraryReferencedFromMirrorSystem(element)) { |
+ return null; |
+ } |
+ return _buildMetadataFunction(element); |
+ } |
+ |
+ jsAst.Fun buildClassMetadataFunction(ClassElement element) { |
+ if (!_backend.mirrorsData.mustRetainMetadata || |
+ !_backend.mirrorsData.isClassReferencedFromMirrorSystem(element)) { |
+ return null; |
+ } |
+ return _buildMetadataFunction(element); |
+ } |
+ |
+ bool _mustEmitMetadataForMember(MemberElement element) { |
return _backend.mirrorsData.mustRetainMetadata && |
- _backend.mirrorsData.referencedFromMirrorSystem(element); |
+ _backend.mirrorsData.isMemberReferencedFromMirrorSystem(element); |
+ } |
+ |
+ jsAst.Fun buildFieldMetadataFunction(FieldElement element) { |
+ if (!_mustEmitMetadataForMember(element)) return null; |
+ return _buildMetadataFunction(element); |
} |
/// The metadata function returns the metadata associated with |
@@ -175,8 +201,7 @@ class MetadataCollector implements jsAst.TokenFinalizer { |
/// constructed yet. For example, a class is allowed to be |
/// annotated with itself. The metadata function is used by |
/// mirrors_patch to implement DeclarationMirror.metadata. |
- jsAst.Fun buildMetadataFunction(Element element) { |
- if (!_mustEmitMetadataFor(element)) return null; |
+ jsAst.Fun _buildMetadataFunction(Element element) { |
return reporter.withCurrentElement(element, () { |
List<jsAst.Expression> metadata = <jsAst.Expression>[]; |
for (MetadataAnnotation annotation in element.metadata) { |
@@ -325,7 +350,8 @@ class MetadataCollector implements jsAst.TokenFinalizer { |
if (ignoreTypeVariables) return new jsAst.LiteralNull(); |
return _typeVariableCodegenAnalysis.reifyTypeVariable(variable.element); |
}, (ResolutionTypedefType typedef) { |
- return _backend.mirrorsData.isAccessibleByReflection(typedef.element); |
+ return _backend.mirrorsData |
+ .isTypedefAccessibleByReflection(typedef.element); |
}); |
if (representation is jsAst.LiteralString) { |
@@ -351,9 +377,10 @@ class MetadataCollector implements jsAst.TokenFinalizer { |
}); |
} |
- List<jsAst.DeferredNumber> computeMetadata(FunctionElement element) { |
+ List<jsAst.DeferredNumber> computeMetadata(MethodElement element) { |
return reporter.withCurrentElement(element, () { |
- if (!_mustEmitMetadataFor(element)) return const <jsAst.DeferredNumber>[]; |
+ if (!_mustEmitMetadataForMember(element)) |
+ return const <jsAst.DeferredNumber>[]; |
List<jsAst.DeferredNumber> metadata = <jsAst.DeferredNumber>[]; |
for (MetadataAnnotation annotation in element.metadata) { |
metadata.add(reifyMetadata(annotation)); |