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

Unified Diff: third_party/pkg/angular/lib/tools/transformer/metadata_generator.dart

Issue 257423008: Update all Angular libs (run update_all.sh). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 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: 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('''
+};
+''');
+}

Powered by Google App Engine
This is Rietveld 408576698