@@ -5,22 +5,22 @@ import 'dart:async';
55import 'package:analyzer/analyzer.dart' ;
66import 'package:angular2/src/change_detection/parser/lexer.dart' as ng;
77import 'package:angular2/src/change_detection/parser/parser.dart' as ng;
8+ import 'package:angular2/src/render/api.dart' ;
89import 'package:angular2/src/render/dom/compiler/compile_pipeline.dart' ;
9- import 'package:angular2/src/render/dom/compiler/compile_step.dart' ;
10- import 'package:angular2/src/render/dom/compiler/property_binding_parser.dart' ;
11- import 'package:angular2/src/render/dom/compiler/text_interpolation_parser.dart' ;
12- import 'package:angular2/src/render/dom/compiler/view_splitter.dart' ;
13- import 'package:angular2/src/dom/dom_adapter.dart' ;
10+ import 'package:angular2/src/render/dom/compiler/template_loader.dart' ;
11+ import "package:angular2/src/services/xhr.dart" show XHR;
1412import 'package:angular2/src/reflection/reflection.dart' ;
13+ import 'package:angular2/src/services/url_resolver.dart' ;
1514import 'package:angular2/src/transform/common/asset_reader.dart' ;
1615import 'package:angular2/src/transform/common/logging.dart' ;
1716import 'package:angular2/src/transform/common/names.dart' ;
1817import 'package:angular2/src/transform/common/parser.dart' ;
1918import 'package:angular2/src/transform/common/property_utils.dart' as prop;
2019import 'package:barback/barback.dart' ;
21- import 'package:code_transformers/assets.dart' ;
2220
21+ import 'compile_step_factory.dart' ;
2322import 'recording_reflection_capabilities.dart' ;
23+ import 'xhr_impl.dart' ;
2424
2525/// Reads the `.ng_deps.dart` file represented by `entryPoint` and parses any
2626/// Angular 2 `View` annotations it declares to generate `getter` s,
@@ -30,28 +30,27 @@ import 'recording_reflection_capabilities.dart';
3030Future <String > processTemplates (AssetReader reader, AssetId entryPoint) async {
3131 var parser = new Parser (reader);
3232 NgDeps ngDeps = await parser.parse (entryPoint);
33- var extractor = new _TemplateExtractor (reader, entryPoint);
33+ var extractor = new _TemplateExtractor (new XhrImpl ( reader, entryPoint) );
3434
3535 var registrations = new StringBuffer ();
3636 for (var rType in ngDeps.registeredTypes) {
37- (await extractor.extractTemplates (rType))
38- .forEach ((RecordingReflectionCapabilities values) {
39- var calls = _generateGetters ('${rType .typeName }' , values.getterNames);
40- if (calls.isNotEmpty) {
41- registrations.write ('..${REGISTER_GETTERS_METHOD_NAME }'
42- '({${calls .join (', ' )}})' );
43- }
44- calls = _generateSetters ('${rType .typeName }' , values.setterNames);
45- if (calls.isNotEmpty) {
46- registrations.write ('..${REGISTER_SETTERS_METHOD_NAME }'
47- '({${calls .join (', ' )}})' );
48- }
49- calls = _generateMethods ('${rType .typeName }' , values.methodNames);
50- if (calls.isNotEmpty) {
51- registrations.write ('..${REGISTER_METHODS_METHOD_NAME }'
52- '({${calls .join (', ' )}})' );
53- }
54- });
37+ var values = await extractor.extractTemplates (rType);
38+ if (values == null ) continue ;
39+ var calls = _generateGetters ('${rType .typeName }' , values.getterNames);
40+ if (calls.isNotEmpty) {
41+ registrations.write ('..${REGISTER_GETTERS_METHOD_NAME }'
42+ '({${calls .join (', ' )}})' );
43+ }
44+ calls = _generateSetters ('${rType .typeName }' , values.setterNames);
45+ if (calls.isNotEmpty) {
46+ registrations.write ('..${REGISTER_SETTERS_METHOD_NAME }'
47+ '({${calls .join (', ' )}})' );
48+ }
49+ calls = _generateMethods ('${rType .typeName }' , values.methodNames);
50+ if (calls.isNotEmpty) {
51+ registrations.write ('..${REGISTER_METHODS_METHOD_NAME }'
52+ '({${calls .join (', ' )}})' );
53+ }
5554 }
5655
5756 var code = ngDeps.code;
@@ -105,75 +104,52 @@ Iterable<String> _generateMethods(
105104/// template code if necessary, and determines what values will be
106105/// reflectively accessed from that template.
107106class _TemplateExtractor {
108- final AssetReader _reader;
109- final AssetId _entryPoint;
110- final CompilePipeline _pipeline;
107+ final CompileStepFactory _factory;
111108 final _TemplateExtractVisitor _visitor = new _TemplateExtractVisitor ();
109+ final TemplateLoader _loader;
112110
113- _TemplateExtractor (this ._reader, this ._entryPoint)
114- : _pipeline = new CompilePipeline (_createCompileSteps ());
115-
116- static List <CompileStep > _createCompileSteps () {
117- var parser = new ng.Parser (new ng.Lexer ());
118- // TODO(kegluneq): Add other compile steps from default_steps.dart.
119- return [
120- new ViewSplitter (parser),
121- new PropertyBindingParser (parser),
122- new TextInterpolationParser (parser)
123- ];
124- }
111+ _TemplateExtractor (XHR xhr)
112+ : _loader = new TemplateLoader (xhr, new UrlResolver ()),
113+ _factory = new CompileStepFactory (new ng.Parser (new ng.Lexer ()));
125114
126- Future <List <RecordingReflectionCapabilities >> extractTemplates (
127- RegisteredType t) async {
128- return (await _processRegisteredType (t)).map (_processTemplate).toList ();
115+ Future <RecordingReflectionCapabilities > extractTemplates (RegisteredType t) {
116+ return _processTemplate (_processRegisteredType (t));
129117 }
130118
131- RecordingReflectionCapabilities _processTemplate (String templateCode) {
119+ Future <RecordingReflectionCapabilities > _processTemplate (
120+ ViewDefinition viewDef) async {
121+ // Check for "imperative views".
122+ if (viewDef.template == null && viewDef.absUrl == null ) return null ;
123+
132124 var recordingCapabilities = new RecordingReflectionCapabilities ();
133125 var savedReflectionCapabilities = reflector.reflectionCapabilities;
134126 reflector.reflectionCapabilities = recordingCapabilities;
135127
136- _pipeline.process (DOM .createTemplate (templateCode), templateCode);
128+ // TODO(kegluneq): Rewrite url to inline `template` where possible.
129+ // See [https://github.com/angular/angular/issues/1035].
130+ var domNode = await _loader.load (viewDef);
131+
132+ new CompilePipeline (_factory.createSteps (viewDef, [])).process (
133+ domNode, '$domNode ' );
137134
138135 reflector.reflectionCapabilities = savedReflectionCapabilities;
139136 return recordingCapabilities;
140137 }
141138
142- Future < List < String >> _processRegisteredType (RegisteredType t) async {
139+ ViewDefinition _processRegisteredType (RegisteredType t) {
143140 _visitor.reset ();
144141 t.annotations.accept (_visitor);
145- var toReturn = _visitor.inlineValues;
146- for (var url in _visitor.urlValues) {
147- var templateText = await _readUrlTemplate (url);
148- if (templateText != null ) {
149- toReturn.add (templateText);
150- }
151- }
152- return toReturn;
153- }
154-
155- // TODO(kegluneq): Rewrite these to `template` where possible.
156- // See [https://github.com/angular/angular/issues/1035].
157- Future <String > _readUrlTemplate (String url) async {
158- var assetId = uriToAssetId (_entryPoint, url, logger, null );
159- var templateExists = await _reader.hasInput (assetId);
160- if (! templateExists) {
161- logger.error ('Could not read template at uri $url from $_entryPoint ' );
162- return null ;
163- }
164- return await _reader.readAsString (assetId);
142+ return _visitor.viewDef;
165143 }
166144}
167145
168146/// Visitor responsible for processing the `annotations` property of a
169- /// {@link RegisterType} object and pulling out template text .
147+ /// {@link RegisterType} object and pulling out template information .
170148class _TemplateExtractVisitor extends Object with RecursiveAstVisitor <Object > {
171- final List <String > inlineValues = [];
172- final List <String > urlValues = [];
149+ ViewDefinition viewDef = new ViewDefinition ();
173150
174151 void reset () {
175- inlineValues.clear ();
176- urlValues.clear ();
152+ viewDef = new ViewDefinition ();
177153 }
178154
179155 @override
@@ -195,9 +171,16 @@ class _TemplateExtractVisitor extends Object with RecursiveAstVisitor<Object> {
195171 }
196172 var valueString = stringLiteralToString (node.expression);
197173 if (keyString == 'templateUrl' ) {
198- urlValues.add (valueString);
174+ if (viewDef.absUrl != null ) {
175+ logger.error (
176+ 'Found multiple values for "templateUrl". Source: ${node }' );
177+ }
178+ viewDef.absUrl = valueString;
199179 } else {
200- inlineValues.add (valueString);
180+ if (viewDef.template != null ) {
181+ logger.error ('Found multiple values for "template". Source: ${node }' );
182+ }
183+ viewDef.template = valueString;
201184 }
202185 }
203186 return null ;
0 commit comments