@@ -6,8 +6,9 @@ import 'package:angular2/src/change_detection/parser/lexer.dart' as ng;
66import 'package:angular2/src/change_detection/parser/parser.dart' as ng;
77import 'package:angular2/src/core/compiler/proto_view_factory.dart' ;
88import 'package:angular2/src/render/api.dart' ;
9- import 'package:angular2/src/render/dom/compiler/compiler .dart' ;
9+ import 'package:angular2/src/render/dom/compiler/compile_pipeline .dart' ;
1010import 'package:angular2/src/render/dom/compiler/template_loader.dart' ;
11+ import 'package:angular2/src/render/dom/view/property_setter_factory.dart' ;
1112import 'package:angular2/src/services/xhr.dart' show XHR;
1213import 'package:angular2/src/reflection/reflection.dart' ;
1314import 'package:angular2/src/services/url_resolver.dart' ;
@@ -17,7 +18,7 @@ import 'package:barback/barback.dart';
1718
1819import 'change_detector_codegen.dart' as change;
1920import 'compile_step_factory.dart' ;
20- import 'recording_reflection_capabilities .dart' ;
21+ import 'reflection_capabilities .dart' ;
2122import 'reflector_register_codegen.dart' as reg;
2223import 'view_definition_creator.dart' ;
2324
@@ -39,34 +40,21 @@ Future<String> processTemplates(AssetReader reader, AssetId entryPoint,
3940 var result = await extractor.extractTemplates (viewDefEntry.viewDef);
4041 if (result == null ) continue ;
4142
42- registrations.generate (result.recording);
43+ if (generateRegistrations) {
44+ // TODO(kegluneq): Generate these getters & setters based on the
45+ // `ProtoViewDto` rather than querying the `ReflectionCapabilities`.
46+ registrations.generate (result.recording);
47+ }
4348 if (result.protoView != null && generateChangeDetectors) {
44- var savedReflectionCapabilities = reflector.reflectionCapabilities;
45- var recordingCapabilities = new RecordingReflectionCapabilities ();
46- reflector.reflectionCapabilities = recordingCapabilities;
47-
49+ var saved = reflector.reflectionCapabilities;
50+ reflector.reflectionCapabilities = const NullReflectionCapabilities ();
4851 var defs = getChangeDetectorDefinitions (viewDefEntry.hostMetadata,
4952 result.protoView, viewDefEntry.viewDef.directives);
5053 for (var i = 0 ; i < defs.length; ++ i) {
5154 changeDetectorClasses.generate ('${rType .typeName }' ,
5255 '_${rType .typeName }_ChangeDetector$i ' , defs[i]);
5356 }
54-
55- // Check that getters, setters, methods are the same as above.
56- assert (recordingCapabilities.getterNames
57- .containsAll (result.recording.getterNames));
58- assert (result.recording.getterNames
59- .containsAll (recordingCapabilities.getterNames));
60- assert (recordingCapabilities.setterNames
61- .containsAll (result.recording.setterNames));
62- assert (result.recording.setterNames
63- .containsAll (recordingCapabilities.setterNames));
64- assert (recordingCapabilities.methodNames
65- .containsAll (result.recording.methodNames));
66- assert (result.recording.methodNames
67- .containsAll (recordingCapabilities.methodNames));
68-
69- reflector.reflectionCapabilities = savedReflectionCapabilities;
57+ reflector.reflectionCapabilities = saved;
7058 }
7159 }
7260
@@ -88,25 +76,40 @@ Future<String> processTemplates(AssetReader reader, AssetId entryPoint,
8876/// template code if necessary, and determines what values will be
8977/// reflectively accessed from that template.
9078class _TemplateExtractor {
91- final RenderCompiler _compiler;
79+ final CompileStepFactory _factory;
80+ final TemplateLoader _loader;
9281
93- _TemplateExtractor (XHR xhr) : _compiler = new DomCompiler (
94- new CompileStepFactory (new ng.Parser (new ng.Lexer ())),
95- new TemplateLoader (xhr, new UrlResolver () ));
82+ _TemplateExtractor (XHR xhr)
83+ : _factory = new CompileStepFactory (new ng.Parser (new ng.Lexer ())),
84+ _loader = new TemplateLoader (xhr, new UrlResolver ());
9685
9786 Future <_ExtractResult > extractTemplates (ViewDefinition viewDef) async {
9887 // Check for "imperative views".
9988 if (viewDef.template == null && viewDef.absUrl == null ) return null ;
10089
90+ var templateEl = await _loader.load (viewDef);
91+
92+ // NOTE(kegluneq): Since this is a global, we must not have any async
93+ // operations between saving and restoring it, otherwise we can get into
94+ // a bad state. See issue #2359 for additional context.
10195 var savedReflectionCapabilities = reflector.reflectionCapabilities;
10296 var recordingCapabilities = new RecordingReflectionCapabilities ();
10397 reflector.reflectionCapabilities = recordingCapabilities;
10498
105- // TODO(kegluneq): Rewrite url to inline `template` where possible.
106- var protoViewDto = await _compiler.compile (viewDef);
99+ var subtaskPromises = [];
100+ var pipeline =
101+ new CompilePipeline (_factory.createSteps (viewDef, subtaskPromises));
102+
103+ var compileElements = pipeline.process (
104+ templateEl, ProtoViewDto .COMPONENT_VIEW_TYPE , viewDef.componentId);
105+ var protoViewDto = compileElements[0 ].inheritedProtoView
106+ .build (new PropertySetterFactory ());
107107
108108 reflector.reflectionCapabilities = savedReflectionCapabilities;
109- return new _ExtractResult (recordingCapabilities, protoViewDto);
109+
110+ return Future
111+ .wait (subtaskPromises)
112+ .then ((_) => new _ExtractResult (recordingCapabilities, protoViewDto));
110113 }
111114}
112115
0 commit comments