Index: third_party/pkg/angular/lib/tools/transformer/static_angular_generator.dart |
diff --git a/third_party/pkg/angular/lib/tools/transformer/static_angular_generator.dart b/third_party/pkg/angular/lib/tools/transformer/static_angular_generator.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cd45a883b291bc8e8aa287b8d274f1540ef521c3 |
--- /dev/null |
+++ b/third_party/pkg/angular/lib/tools/transformer/static_angular_generator.dart |
@@ -0,0 +1,94 @@ |
+library angular.tools.transformer.static_angular_generator; |
+ |
+import 'dart:async'; |
+import 'package:analyzer/src/generated/ast.dart'; |
+import 'package:analyzer/src/generated/element.dart'; |
+import 'package:angular/tools/transformer/options.dart'; |
+import 'package:code_transformers/resolver.dart'; |
+import 'package:barback/barback.dart'; |
+import 'package:path/path.dart' as path; |
+import 'package:source_maps/refactor.dart' show TextEditTransaction; |
+ |
+class StaticAngularGenerator extends Transformer with ResolverTransformer { |
+ final TransformOptions options; |
+ |
+ StaticAngularGenerator(this.options, Resolvers resolvers) { |
+ this.resolvers = resolvers; |
+ } |
+ |
+ void applyResolver(Transform transform, Resolver resolver) { |
+ var asset = transform.primaryInput; |
+ |
+ var dynamicApp = |
+ resolver.getLibraryFunction('angular.app.factory.applicationFactory'); |
+ if (dynamicApp == null) { |
+ // No dynamic app imports, exit. |
+ transform.addOutput(transform.primaryInput); |
+ return; |
+ } |
+ |
+ var id = asset.id; |
+ var lib = resolver.getLibrary(id); |
+ var transaction = resolver.createTextEditTransaction(lib); |
+ var unit = lib.definingCompilationUnit.node; |
+ |
+ for (var directive in unit.directives) { |
+ if (directive is ImportDirective && |
+ directive.uri.stringValue == 'package:angular/application_factory.dart') { |
+ var uri = directive.uri; |
+ transaction.edit(uri.beginToken.offset, uri.end, |
+ '\'package:angular/application_factory_static.dart\''); |
+ } |
+ } |
+ |
+ var dynamicToStatic = |
+ new _NgDynamicToStaticVisitor(dynamicApp, transaction); |
+ unit.accept(dynamicToStatic); |
+ |
+ var generatedFilePrefix = '${path.url.basenameWithoutExtension(id.path)}'; |
+ _addImport(transaction, unit, |
+ '${generatedFilePrefix}_static_expressions.dart', |
+ 'generated_static_expressions'); |
+ _addImport(transaction, unit, |
+ '${generatedFilePrefix}_static_metadata.dart', |
+ 'generated_static_metadata'); |
+ _addImport(transaction, unit, |
+ '${generatedFilePrefix}_static_injector.dart', |
+ 'generated_static_injector'); |
+ |
+ var printer = transaction.commit(); |
+ var url = id.path.startsWith('lib/') |
+ ? 'package:${id.package}/${id.path.substring(4)}' : id.path; |
+ printer.build(url); |
+ transform.addOutput(new Asset.fromString(id, printer.text)); |
+ } |
+} |
+ |
+/// Injects an import into the list of imports in the file. |
+void _addImport(TextEditTransaction transaction, CompilationUnit unit, |
+ String uri, String prefix) { |
+ var last = unit.directives.where((d) => d is ImportDirective).last; |
+ transaction.edit(last.end, last.end, '\nimport \'$uri\' as $prefix;'); |
+} |
+ |
+class _NgDynamicToStaticVisitor extends GeneralizingAstVisitor { |
+ final Element ngDynamicFn; |
+ final TextEditTransaction transaction; |
+ _NgDynamicToStaticVisitor(this.ngDynamicFn, this.transaction); |
+ |
+ visitMethodInvocation(MethodInvocation m) { |
+ if (m.methodName.bestElement == ngDynamicFn) { |
+ transaction.edit(m.methodName.beginToken.offset, |
+ m.methodName.endToken.end, 'staticApplicationFactory'); |
+ |
+ var args = m.argumentList; |
+ transaction.edit(args.beginToken.offset + 1, args.end - 1, |
+ 'generated_static_injector.factories, ' |
+ 'generated_static_metadata.typeAnnotations, ' |
+ 'generated_static_expressions.getters, ' |
+ 'generated_static_expressions.setters, ' |
+ 'generated_static_expressions.symbols'); |
+ } |
+ super.visitMethodInvocation(m); |
+ } |
+} |