Chromium Code Reviews| Index: modules/angular2/src/transform/transformer.dart |
| diff --git a/modules/angular2/src/transform/transformer.dart b/modules/angular2/src/transform/transformer.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9199b08f81c811982a3fd079412d417b56ff061f |
| --- /dev/null |
| +++ b/modules/angular2/src/transform/transformer.dart |
| @@ -0,0 +1,103 @@ |
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| +library angular2.transformer; |
| + |
| +import 'dart:async'; |
| +import 'package:barback/barback.dart'; |
| +import 'package:code_transformers/resolver.dart'; |
| + |
| +import 'annotation_processor.dart'; |
| +import 'codegen.dart' as codegen; |
| +import 'html_transform.dart'; |
| +import 'options.dart'; |
| +import 'resolvers.dart'; |
| +import 'traversal.dart'; |
| + |
| +export 'options.dart'; |
| + |
| +/// Removes the mirror-based initialization logic and replaces it with static |
| +/// logic. |
| +class AngularTransformer extends Transformer { |
| + final Resolvers _resolvers; |
| + final TransformerOptions options; |
| + |
| + AngularTransformer(this.options) : _resolvers = createResolvers(); |
| + |
| + static const _entryPointParam = 'entry_point'; |
|
jakemac
2015/02/17 23:46:46
not sure that these are necessary, they only appea
tjblasi
2015/02/18 21:18:25
They're probably going to change in the future --
|
| + static const _newEntryPointParam = 'new_entry_point'; |
| + static const _htmlEntryPointParam = 'html_entry_point'; |
| + |
| + factory AngularTransformer.asPlugin(BarbackSettings settings) { |
| + var entryPoint = settings.configuration[_entryPointParam]; |
| + var newEntryPoint = settings.configuration[_newEntryPointParam]; |
| + if (newEntryPoint == null) { |
| + newEntryPoint = entryPoint.replaceFirst('.dart', '.bootstrap.dart'); |
| + } |
| + var htmlEntryPoint = settings.configuration[_htmlEntryPointParam]; |
| + return new AngularTransformer( |
| + new TransformerOptions(entryPoint, newEntryPoint, htmlEntryPoint)); |
| + } |
| + |
| + bool isPrimary(AssetId id) => |
| + options.entryPoint == id.path || options.htmlEntryPoint == id.path; |
| + |
| + Future apply(Transform transform) { |
| + if (transform.primaryInput.id.path == options.entryPoint) { |
| + return _buildBootstrapFile(transform); |
| + } else if (transform.primaryInput.id.path == options.htmlEntryPoint) { |
| + return transformHtmlEntryPoint(options, transform); |
| + } |
| + return null; |
| + } |
| + |
| + Future _buildBootstrapFile(Transform transform) { |
| + var newEntryPointId = |
| + new AssetId(transform.primaryInput.id.package, options.newEntryPoint); |
| + return transform.hasInput(newEntryPointId).then((exists) { |
| + if (exists) { |
| + transform.logger |
| + .error('New entry point file $newEntryPointId already exists.'); |
| + } else { |
| + return _resolvers.get(transform).then((resolver) { |
| + new _BootstrapFileBuilder(resolver, transform, |
| + transform.primaryInput.id, newEntryPointId).run(); |
| + resolver.release(); |
| + }); |
| + } |
| + }); |
| + } |
| +} |
| + |
| +class _BootstrapFileBuilder { |
| + final Resolver _resolver; |
| + final Transform _transform; |
| + final AssetId _entryPoint; |
| + final AssetId _newEntryPoint; |
| + |
| + AnnotationMatcher _directiveInfo; |
| + |
| + _BootstrapFileBuilder(Resolver resolver, Transform transform, |
| + this._entryPoint, this._newEntryPoint) |
| + : _resolver = resolver, |
| + _transform = transform, |
| + _directiveInfo = new AnnotationMatcher(resolver |
| + .getLibrary(new AssetId( |
| + 'angular2', 'lib/src/core/annotations/annotations.dart')) |
| + .getType('Directive')); |
| + |
| + /// Adds the new entry point file to the transform. Should only be ran once. |
| + void run() { |
| + var entryLib = _resolver.getLibrary(_entryPoint); |
| + |
| + new ImportTraversal(_directiveInfo).traverse(entryLib); |
| + |
| + var context = new codegen.Context(logger: _transform.logger); |
| + _directiveInfo.initQueue |
| + .forEach((entry) => context.directiveRegistry.register(entry)); |
| + |
| + _transform.addOutput(new Asset.fromString(_newEntryPoint, codegen |
| + .codegenEntryPoint(context, |
| + entryPoint: entryLib, newEntryPoint: _newEntryPoint))); |
| + } |
| +} |