1- library angular2.src.transform.template_parser .generator;
1+ library angular2.src.transform.template_compiler .generator;
22
33import 'dart:async' ;
44
55import 'package:analyzer/analyzer.dart' ;
6- import 'package:angular2/src/change_detection/parser/ast.dart' ;
76import 'package:angular2/src/change_detection/parser/lexer.dart' as ng;
87import 'package:angular2/src/change_detection/parser/parser.dart' as ng;
9- import 'package:angular2/src/core/compiler/pipeline/compile_element.dart' ;
108import 'package:angular2/src/core/compiler/pipeline/compile_pipeline.dart' ;
119import 'package:angular2/src/core/compiler/pipeline/compile_step.dart' ;
1210import 'package:angular2/src/core/compiler/pipeline/property_binding_parser.dart' ;
1311import 'package:angular2/src/core/compiler/pipeline/text_interpolation_parser.dart' ;
1412import 'package:angular2/src/core/compiler/pipeline/view_splitter.dart' ;
1513import 'package:angular2/src/dom/dom_adapter.dart' ;
16- import 'package:angular2/src/dom/html5lib_adapter.dart' ;
1714import 'package:angular2/src/reflection/reflection.dart' ;
1815import 'package:angular2/src/transform/common/asset_reader.dart' ;
1916import 'package:angular2/src/transform/common/logging.dart' ;
2017import 'package:angular2/src/transform/common/names.dart' ;
2118import 'package:angular2/src/transform/common/parser.dart' ;
2219import 'package:barback/barback.dart' ;
23- import 'package:code_transformers/assets.dart' ;
2420
2521import 'recording_reflection_capabilities.dart' ;
2622
23+ /// Reads the `.ng_deps.dart` file represented by `entryPoint` and parses any
24+ /// Angular 2 `Template` annotations it declares to generate `getter` s,
25+ /// `setter` s, and `method` s that would otherwise be reflectively accessed.
26+ ///
27+ /// This method assumes a [DomAdapter] has been registered.
2728Future <String > processTemplates (AssetReader reader, AssetId entryPoint) async {
2829 var parser = new Parser (reader);
2930 NgDeps ngDeps = await parser.parse (entryPoint);
@@ -34,66 +35,71 @@ Future<String> processTemplates(AssetReader reader, AssetId entryPoint) async {
3435 var values = _processTemplate (templateText);
3536 var calls = _generateGetters ('${rType .typeName }' , values.getterNames);
3637 if (calls.isNotEmpty) {
37- registrations.write ('..registerGetters({${calls .join (', ' )}})' );
38+ registrations.write ('..${REGISTER_GETTERS_METHOD_NAME }'
39+ '({${calls .join (', ' )}})' );
3840 }
3941 calls = _generateSetters ('${rType .typeName }' , values.setterNames);
4042 if (calls.isNotEmpty) {
41- registrations.write ('..registerSetters({${calls .join (', ' )}})' );
43+ registrations.write ('..${REGISTER_SETTERS_METHOD_NAME }'
44+ '({${calls .join (', ' )}})' );
45+ }
46+ calls = _generateMethods ('${rType .typeName }' , values.methodNames);
47+ if (calls.isNotEmpty) {
48+ registrations.write ('..${REGISTER_METHODS_METHOD_NAME }'
49+ '({${calls .join (', ' )}})' );
4250 }
4351 });
4452 });
4553
46- String code = ngDeps.code;
54+ var code = ngDeps.code;
4755 if (registrations.length == 0 ) return code;
4856 var codeInjectIdx = ngDeps.registeredTypes.last.registerMethod.end;
4957 return '${code .substring (0 , codeInjectIdx )}'
5058 '${registrations }'
5159 '${code .substring (codeInjectIdx )}' ;
5260}
5361
62+ Iterable <String > _generateGetters (String typeName, List <String > getterNames) {
63+ return getterNames.map ((prop) {
64+ // TODO(kegluneq): Include `typeName` where possible.
65+ return ''''$prop ': (o) => o.$prop ''' ;
66+ });
67+ }
68+
69+ Iterable <String > _generateSetters (String typeName, List <String > setterName) {
70+ return setterName.map ((prop) {
71+ return ''''$prop ': (o, v) => o.$prop = v''' ;
72+ });
73+ }
74+
75+ Iterable <String > _generateMethods (String typeName, List <String > methodNames) {
76+ return methodNames.map ((methodName) {
77+ return ''''$methodName ': (o, List args) =>
78+ Function.apply(o.$methodName , args)''' ;
79+ });
80+ }
81+
5482RecordingReflectionCapabilities _processTemplate (String templateCode) {
5583 var recordingCapabilities = new RecordingReflectionCapabilities ();
84+ var savedReflectionCapabilities = reflector.reflectionCapabilities;
5685 reflector.reflectionCapabilities = recordingCapabilities;
5786
58- var compilePipeline = new CompilePipeline (createCompileSteps ());
87+ var compilePipeline = new CompilePipeline (_createCompileSteps ());
5988 var template = DOM .createTemplate (templateCode);
6089 // TODO(kegluneq): Need to parse this from a file when not inline.
6190 compilePipeline.process (template, templateCode);
6291
92+ reflector.reflectionCapabilities = savedReflectionCapabilities;
6393 return recordingCapabilities;
6494}
6595
66- List <String > _generateGetters (String typeName, List <String > getterNames) {
67- var getters = [];
68- getterNames.forEach ((prop) {
69- // TODO(kegluneq): Include `typeName` where possible.
70- getters.add ('\' $prop \' : (o) => o.$prop ' );
71- });
72- return getters;
73- }
74-
75- List <String > _generateSetters (String typeName, List <String > setterName) {
76- var setters = [];
77- setterName.forEach ((prop) {
78- // TODO(kegluneq): Include `typeName` where possible.
79- setters.add ('\' $prop \' : (o, String v) => o.$prop = v' );
80- });
81- return setters;
82- }
83-
84- List <CompileStep > createCompileSteps () {
96+ List <CompileStep > _createCompileSteps () {
8597 var parser = new ng.Parser (new ng.Lexer ());
98+ // TODO(kegluneq): Add other compile steps from default_steps.dart.
8699 return [
87100 new ViewSplitter (parser),
88- // cssProcessor.getCompileStep(
89- // compiledComponent, shadowDomStrategy, templateUrl),
90101 new PropertyBindingParser (parser),
91- // new DirectiveParser(directives),
92102 new TextInterpolationParser (parser)
93- // new ElementBindingMarker(),
94- // new ProtoViewBuilder(changeDetection, shadowDomStrategy),
95- // new ProtoElementInjectorBuilder(),
96- // new ElementBinderBuilder(parser)
97103 ];
98104}
99105
@@ -103,6 +109,8 @@ List<String> _processRegisteredType(AssetReader reader, RegisteredType t) {
103109 return visitor.templateText;
104110}
105111
112+ /// Visitor responsible for processing the `annotations` property of a
113+ /// [RegisterType] object and pulling out template text.
106114class _TemplateExtractVisitor extends Object with RecursiveAstVisitor <Object > {
107115 final List <String > templateText = [];
108116 final AssetReader _reader;
0 commit comments