@@ -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