Index: third_party/pkg/angular/lib/tools/transformer/metadata_generator.dart |
diff --git a/third_party/pkg/angular/lib/tools/transformer/metadata_generator.dart b/third_party/pkg/angular/lib/tools/transformer/metadata_generator.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c0ed75c5f5e0e23c57a3ddac310888b26a873fa4 |
--- /dev/null |
+++ b/third_party/pkg/angular/lib/tools/transformer/metadata_generator.dart |
@@ -0,0 +1,117 @@ |
+library angular.tools.transformer.metadata_generator; |
+ |
+import 'dart:async'; |
+import 'package:analyzer/src/generated/element.dart'; |
+import 'package:angular/tools/transformer/options.dart'; |
+import 'package:barback/barback.dart'; |
+import 'package:code_transformers/resolver.dart'; |
+import 'package:path/path.dart' as path; |
+ |
+import 'metadata_extractor.dart'; |
+ |
+class MetadataGenerator extends Transformer with ResolverTransformer { |
+ final TransformOptions options; |
+ |
+ MetadataGenerator(this.options, Resolvers resolvers) { |
+ this.resolvers = resolvers; |
+ } |
+ |
+ void applyResolver(Transform transform, Resolver resolver) { |
+ var asset = transform.primaryInput; |
+ var id = asset.id; |
+ var outputFilename = '${path.url.basenameWithoutExtension(id.path)}' |
+ '_static_metadata.dart'; |
+ var outputPath = path.url.join(path.url.dirname(id.path), outputFilename); |
+ var outputId = new AssetId(id.package, outputPath); |
+ |
+ var extractor = new AnnotationExtractor(transform.logger, resolver, |
+ outputId); |
+ |
+ var outputBuffer = new StringBuffer(); |
+ _writeHeader(asset.id, outputBuffer); |
+ |
+ var annotatedTypes = resolver.libraries |
+ .where((lib) => !lib.isInSdk) |
+ .expand((lib) => lib.units) |
+ .expand((unit) => unit.types) |
+ .map(extractor.extractAnnotations) |
+ .where((annotations) => annotations != null).toList(); |
+ |
+ var libs = annotatedTypes.expand((type) => type.referencedLibraries) |
+ .toSet(); |
+ |
+ var importPrefixes = <LibraryElement, String>{}; |
+ var index = 0; |
+ for (var lib in libs) { |
+ if (lib.isDartCore) { |
+ importPrefixes[lib] = ''; |
+ continue; |
+ } |
+ |
+ var prefix = 'import_${index++}'; |
+ var url = resolver.getImportUri(lib, from: outputId); |
+ outputBuffer.write('import \'$url\' as $prefix;\n'); |
+ importPrefixes[lib] = '$prefix.'; |
+ } |
+ |
+ _writePreamble(outputBuffer); |
+ |
+ _writeClassPreamble(outputBuffer); |
+ for (var type in annotatedTypes) { |
+ type.writeClassAnnotations( |
+ outputBuffer, transform.logger, resolver, importPrefixes); |
+ } |
+ _writeClassEpilogue(outputBuffer); |
+ |
+ transform.addOutput( |
+ new Asset.fromString(outputId, outputBuffer.toString())); |
+ transform.addOutput(asset); |
+ } |
+} |
+ |
+void _writeHeader(AssetId id, StringSink sink) { |
+ var libPath = path.withoutExtension(id.path).replaceAll('/', '.'); |
+ sink.write(''' |
+library ${id.package}.$libPath.generated_metadata; |
+ |
+import 'package:angular/core/registry.dart' show MetadataExtractor; |
+import 'package:di/di.dart' show Module; |
+ |
+'''); |
+} |
+ |
+void _writePreamble(StringSink sink) { |
+ sink.write(''' |
+Module get metadataModule => new Module() |
+ ..value(MetadataExtractor, new _StaticMetadataExtractor()); |
+ |
+class _StaticMetadataExtractor implements MetadataExtractor { |
+ Iterable call(Type type) { |
+ var annotations = typeAnnotations[type]; |
+ if (annotations != null) { |
+ return annotations; |
+ } |
+ return []; |
+ } |
+} |
+ |
+'''); |
+} |
+ |
+void _writeClassPreamble(StringSink sink) { |
+ sink.write(''' |
+final Map<Type, Object> typeAnnotations = { |
+'''); |
+} |
+ |
+void _writeClassEpilogue(StringSink sink) { |
+ sink.write(''' |
+}; |
+'''); |
+} |
+ |
+void _writeFooter(StringSink sink) { |
+ sink.write(''' |
+}; |
+'''); |
+} |