feat(dart/transform): Add DirectiveMetadataExtractor transform step

Add a step that reads `DirectiveMetadata` object off annotated classes
into `.ng_meta.dart` files. These will be used by the `TemplateCompiler`
step as inputs to the Angular 2 render compiler.

Update one test to avoid unsupported functionality, format others.
This commit is contained in:
Tim Blasi
2015-05-01 13:57:44 -07:00
parent 8e1d53b5e9
commit 0520ca68b4
27 changed files with 214 additions and 78 deletions

View File

@ -1,9 +1,9 @@
library angular2.transform.template_compiler.directive_metadata_reader;
library angular2.transform.common.directive_metadata_reader;
import 'package:analyzer/analyzer.dart';
import 'package:angular2/src/render/api.dart';
import 'package:angular2/src/transform/common/logging.dart';
import 'package:angular2/src/transform/common/parser.dart';
import 'logging.dart';
import 'parser.dart';
/// Reads [DirectiveMetadata] from the `attributes` of `t`.
DirectiveMetadata readDirectiveMetadata(RegisteredType t) {

View File

@ -4,6 +4,7 @@ const SETUP_METHOD_NAME = 'initReflector';
const REFLECTOR_VAR_NAME = 'reflector';
const TRANSFORM_DYNAMIC_MODE = 'transform_dynamic';
const DEPS_EXTENSION = '.ng_deps.dart';
const META_EXTENSION = '.ng_meta.dart';
const REFLECTION_CAPABILITIES_NAME = 'ReflectionCapabilities';
const REGISTER_TYPE_METHOD_NAME = 'registerType';
const REGISTER_GETTERS_METHOD_NAME = 'registerGetters';

View File

@ -0,0 +1,28 @@
library angular2.transform.directive_metadata_extractor.extractor;
import 'dart:async';
import 'package:angular2/src/render/api.dart';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/directive_metadata_reader.dart';
import 'package:angular2/src/transform/common/parser.dart';
import 'package:barback/barback.dart';
/// Returns a map from a class name (that is, its `Identifier` stringified)
/// to its [DirectiveMetadata].
/// Will return `null` if there are no `Directive`-annotated classes in
/// `entryPoint`.
Future<Map<String, DirectiveMetadata>> extractDirectiveMetadata(
AssetReader reader, AssetId entryPoint) async {
var parser = new Parser(reader);
NgDeps ngDeps = await parser.parse(entryPoint);
if (ngDeps == null || ngDeps.registeredTypes.isEmpty) return null;
var retVal = <String, DirectiveMetadata>{};
ngDeps.registeredTypes.forEach((rType) {
var meta = readDirectiveMetadata(rType);
if (meta != null) {
retVal['${rType.typeName}'] = meta;
}
});
return retVal;
}

View File

@ -0,0 +1,56 @@
library angular2.transform.directive_metadata_extractor.transformer;
import 'dart:async';
import 'dart:convert';
import 'package:angular2/src/render/dom/convert.dart';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/logging.dart' as log;
import 'package:angular2/src/transform/common/names.dart';
import 'package:barback/barback.dart';
import 'extractor.dart';
/// Transformer responsible for processing .ng_deps.dart files created by
/// {@link DirectiveProcessor} and creating associated `.ng_meta.dart` files.
/// These files contain commented Json-formatted representations of all
/// `Directive`s in the associated file.
class DirectiveMetadataExtractor extends Transformer {
DirectiveMetadataExtractor();
@override
bool isPrimary(AssetId id) => id.path.endsWith(DEPS_EXTENSION);
@override
Future apply(Transform transform) async {
log.init(transform);
try {
var reader = new AssetReader.fromTransform(transform);
var fromAssetId = transform.primaryInput.id;
var metadataMap = await extractDirectiveMetadata(reader, fromAssetId);
if (metadataMap != null) {
var jsonMap = <String, Map>{};
metadataMap.forEach((k, v) {
jsonMap[k] = directiveMetadataToMap(v);
});
transform.addOutput(new Asset.fromString(
_outputAssetId(fromAssetId), '// ${JSON.encode(jsonMap)}'));
}
} catch (ex, stackTrace) {
log.logger.error('Extracting ng metadata failed.\n'
'Exception: $ex\n'
'Stack Trace: $stackTrace');
}
return null;
}
}
AssetId _outputAssetId(AssetId inputAssetId) {
assert(inputAssetId.path.endsWith(DEPS_EXTENSION));
var pathIn = inputAssetId.path;
return new AssetId(inputAssetId.package,
'${pathIn.substring(0, pathIn.length - DEPS_EXTENSION.length)}'
'${META_EXTENSION}');
}

View File

@ -4,6 +4,7 @@ import 'package:barback/barback.dart';
import 'package:dart_style/dart_style.dart';
import 'directive_linker/transformer.dart';
import 'directive_metadata_extractor/transformer.dart';
import 'directive_processor/transformer.dart';
import 'bind_generator/transformer.dart';
import 'reflection_remover/transformer.dart';
@ -24,7 +25,7 @@ class AngularTransformerGroup extends TransformerGroup {
var phases = [
[new ReflectionRemover(options)],
[new DirectiveProcessor(options)],
[new DirectiveLinker()],
[new DirectiveLinker(), new DirectiveMetadataExtractor()],
[new BindGenerator(options)],
[new TemplateCompiler(options)]
];