Skip to content

Commit 0856516

Browse files
committed
refactor(renderer): separate compiler from renderer
Part of angular#1675 Closes angular#1702
1 parent 705d3aa commit 0856516

File tree

11 files changed

+75
-84
lines changed

11 files changed

+75
-84
lines changed

modules/angular2/src/core/application.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {AppViewPool, APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/compiler/vi
3232
import {AppViewManager} from 'angular2/src/core/compiler/view_manager';
3333
import {AppViewManagerUtils} from 'angular2/src/core/compiler/view_manager_utils';
3434
import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
35-
import {Renderer} from 'angular2/src/render/api';
35+
import {Renderer, RenderCompiler} from 'angular2/src/render/api';
3636
import {DirectDomRenderer} from 'angular2/src/render/dom/direct_dom_renderer';
3737
import * as rc from 'angular2/src/render/dom/compiler/compiler';
3838
import * as rvf from 'angular2/src/render/dom/view/view_factory';
@@ -92,7 +92,7 @@ function _injectorBindings(appComponentType): List<Binding> {
9292
[StyleUrlResolver, appDocumentToken]),
9393
DirectDomRenderer,
9494
bind(Renderer).toClass(DirectDomRenderer),
95-
bind(rc.Compiler).toClass(rc.DefaultCompiler),
95+
bind(RenderCompiler).toClass(rc.DefaultDomCompiler),
9696
// TODO(tbosch): We need an explicit factory here, as
9797
// we are getting errors in dart2js with mirrors...
9898
bind(rvf.ViewFactory).toFactory(

modules/angular2/src/core/compiler/compiler.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ export class Compiler {
5454
_componentUrlMapper: ComponentUrlMapper;
5555
_urlResolver: UrlResolver;
5656
_appUrl: string;
57-
_renderer: renderApi.Renderer;
57+
_render: renderApi.RenderCompiler;
5858
_protoViewFactory:ProtoViewFactory;
5959

6060
constructor(reader: DirectiveMetadataReader,
6161
cache:CompilerCache,
6262
templateResolver: TemplateResolver,
6363
componentUrlMapper: ComponentUrlMapper,
6464
urlResolver: UrlResolver,
65-
renderer: renderApi.Renderer,
65+
render: renderApi.RenderCompiler,
6666
protoViewFactory: ProtoViewFactory) {
6767
this._reader = reader;
6868
this._compilerCache = cache;
@@ -71,7 +71,7 @@ export class Compiler {
7171
this._componentUrlMapper = componentUrlMapper;
7272
this._urlResolver = urlResolver;
7373
this._appUrl = urlResolver.resolve(null, './');
74-
this._renderer = renderer;
74+
this._render = render;
7575
this._protoViewFactory = protoViewFactory;
7676
}
7777

@@ -94,7 +94,7 @@ export class Compiler {
9494
this._assertTypeIsComponent(componentBinding);
9595

9696
var directiveMetadata = Compiler.buildRenderDirective(componentBinding);
97-
return this._renderer.createHostProtoView(directiveMetadata).then( (hostRenderPv) => {
97+
return this._render.compileHost(directiveMetadata).then( (hostRenderPv) => {
9898
return this._compileNestedProtoViews(null, null, hostRenderPv, [componentBinding], true);
9999
}).then( (appProtoView) => {
100100
return new ProtoViewRef(appProtoView);
@@ -135,7 +135,7 @@ export class Compiler {
135135
}
136136
if (isPresent(template.renderer)) {
137137
var directives = [];
138-
pvPromise = this._renderer.createImperativeComponentProtoView(template.renderer).then( (renderPv) => {
138+
pvPromise = this._render.createImperativeComponentProtoView(template.renderer).then( (renderPv) => {
139139
return this._compileNestedProtoViews(null, componentBinding, renderPv, directives, true);
140140
});
141141
} else {
@@ -144,7 +144,7 @@ export class Compiler {
144144
(directive) => this._bindDirective(directive)
145145
);
146146
var renderTemplate = this._buildRenderTemplate(component, template, directives);
147-
pvPromise = this._renderer.compile(renderTemplate).then( (renderPv) => {
147+
pvPromise = this._render.compile(renderTemplate).then( (renderPv) => {
148148
return this._compileNestedProtoViews(null, componentBinding, renderPv, directives, true);
149149
});
150150
}
@@ -194,7 +194,7 @@ export class Compiler {
194194
ListWrapper.push(childComponentRenderPvRefs, isPresent(componentPv) ? componentPv.render : null);
195195
}
196196
});
197-
this._renderer.mergeChildComponentProtoViews(protoView.render, childComponentRenderPvRefs);
197+
this._render.mergeChildComponentProtoViews(protoView.render, childComponentRenderPvRefs);
198198
return protoView;
199199
};
200200
if (nestedPVPromises.length > 0) {
@@ -213,7 +213,7 @@ export class Compiler {
213213
templateAbsUrl = this._urlResolver.resolve(componentUrl, view.templateUrl);
214214
} else if (isPresent(view.template)) {
215215
// Note: If we have an inline template, we also need to send
216-
// the url for the component to the renderer so that it
216+
// the url for the component to the render so that it
217217
// is able to resolve urls in stylesheets.
218218
templateAbsUrl = componentUrl;
219219
}

modules/angular2/src/render/api.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,11 @@ export class ViewDefinition {
160160
}
161161
}
162162

163-
export class Renderer {
163+
export class RenderCompiler {
164164
/**
165165
* Creats a ProtoViewDto that contains a single nested component with the given componentId.
166166
*/
167-
createHostProtoView(componentId):Promise<ProtoViewDto> { return null; }
167+
compileHost(componentId):Promise<ProtoViewDto> { return null; }
168168

169169
/**
170170
* Creats a ProtoViewDto for a component that will use an imperative View using the given
@@ -189,7 +189,9 @@ export class Renderer {
189189
* RenderProtoView for every element with a component in this protoView or in a view container's protoView
190190
*/
191191
mergeChildComponentProtoViews(protoViewRef:RenderProtoViewRef, componentProtoViewRefs:List<RenderProtoViewRef>) { return null; }
192+
}
192193

194+
export class Renderer {
193195
/**
194196
* Creates a view and inserts it into a ViewContainer.
195197
* @param {RenderViewContainerRef} viewContainerRef

modules/angular2/src/render/dom/compiler/compiler.js

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,35 @@
11
import {Injectable} from 'angular2/src/di/annotations_impl';
22

33
import {PromiseWrapper, Promise} from 'angular2/src/facade/async';
4-
import {BaseException} from 'angular2/src/facade/lang';
4+
import {BaseException, isPresent} from 'angular2/src/facade/lang';
5+
import {ListWrapper} from 'angular2/src/facade/collection';
56
import {DOM} from 'angular2/src/dom/dom_adapter';
67

7-
import {ViewDefinition, ProtoViewDto, DirectiveMetadata} from '../../api';
8+
import {ViewDefinition, ProtoViewDto, DirectiveMetadata, RenderCompiler, RenderProtoViewRef} from '../../api';
89
import {CompilePipeline} from './compile_pipeline';
910
import {TemplateLoader} from 'angular2/src/render/dom/compiler/template_loader';
1011
import {CompileStepFactory, DefaultStepFactory} from './compile_step_factory';
1112
import {Parser} from 'angular2/change_detection';
1213
import {ShadowDomStrategy} from '../shadow_dom/shadow_dom_strategy';
14+
import {ProtoViewBuilder} from '../view/proto_view_builder';
15+
16+
import {DirectDomProtoViewRef} from '../direct_dom_renderer';
17+
18+
function _resolveProtoView(protoViewRef:DirectDomProtoViewRef) {
19+
return isPresent(protoViewRef) ? protoViewRef.delegate : null;
20+
}
1321

1422
/**
1523
* The compiler loads and translates the html templates of components into
1624
* nested ProtoViews. To decompose its functionality it uses
1725
* the CompilePipeline and the CompileSteps.
1826
*/
19-
export class Compiler {
27+
export class DomCompiler extends RenderCompiler {
2028
_templateLoader: TemplateLoader;
2129
_stepFactory: CompileStepFactory;
2230

2331
constructor(stepFactory: CompileStepFactory, templateLoader: TemplateLoader) {
32+
super();
2433
this._templateLoader = templateLoader;
2534
this._stepFactory = stepFactory;
2635
}
@@ -44,6 +53,18 @@ export class Compiler {
4453
return this._compileTemplate(hostViewDef, element);
4554
}
4655

56+
createImperativeComponentProtoView(rendererId):Promise<ProtoViewDto> {
57+
var protoViewBuilder = new ProtoViewBuilder(null);
58+
protoViewBuilder.setImperativeRendererId(rendererId);
59+
return PromiseWrapper.resolve(protoViewBuilder.build());
60+
}
61+
62+
mergeChildComponentProtoViews(protoViewRef:RenderProtoViewRef, protoViewRefs:List<RenderProtoViewRef>) {
63+
_resolveProtoView(protoViewRef).mergeChildComponentProtoViews(
64+
ListWrapper.map(protoViewRefs, _resolveProtoView)
65+
);
66+
}
67+
4768
_compileTemplate(viewDef: ViewDefinition, tplElement):Promise<ProtoViewDto> {
4869
var subTaskPromises = [];
4970
var pipeline = new CompilePipeline(this._stepFactory.createSteps(viewDef, subTaskPromises));
@@ -60,7 +81,7 @@ export class Compiler {
6081
}
6182

6283
@Injectable()
63-
export class DefaultCompiler extends Compiler {
84+
export class DefaultDomCompiler extends DomCompiler {
6485
constructor(parser:Parser, shadowDomStrategy:ShadowDomStrategy, templateLoader: TemplateLoader) {
6586
super(new DefaultStepFactory(parser, shadowDomStrategy), templateLoader);
6687
}

modules/angular2/src/render/dom/direct_dom_renderer.js

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {Injectable} from 'angular2/src/di/annotations_impl';
22

3-
import {Promise, PromiseWrapper} from 'angular2/src/facade/async';
43
import {List, ListWrapper} from 'angular2/src/facade/collection';
54
import {isBlank, isPresent, BaseException} from 'angular2/src/facade/lang';
65

@@ -9,9 +8,7 @@ import {RenderView} from './view/view';
98
import {RenderProtoView} from './view/proto_view';
109
import {ViewFactory} from './view/view_factory';
1110
import {RenderViewHydrator} from './view/view_hydrator';
12-
import {Compiler} from './compiler/compiler';
1311
import {ShadowDomStrategy} from './shadow_dom/shadow_dom_strategy';
14-
import {ProtoViewBuilder} from './view/proto_view_builder';
1512
import {ViewContainer} from './view/view_container';
1613

1714
function _resolveViewContainer(vc:api.RenderViewContainerRef) {
@@ -66,42 +63,18 @@ export class DirectDomViewRef extends api.RenderViewRef {
6663

6764
@Injectable()
6865
export class DirectDomRenderer extends api.Renderer {
69-
_compiler: Compiler;
7066
_viewFactory: ViewFactory;
7167
_viewHydrator: RenderViewHydrator;
7268
_shadowDomStrategy: ShadowDomStrategy;
7369

7470
constructor(
75-
compiler: Compiler, viewFactory: ViewFactory, viewHydrator: RenderViewHydrator, shadowDomStrategy: ShadowDomStrategy) {
71+
viewFactory: ViewFactory, viewHydrator: RenderViewHydrator, shadowDomStrategy: ShadowDomStrategy) {
7672
super();
77-
this._compiler = compiler;
7873
this._viewFactory = viewFactory;
7974
this._viewHydrator = viewHydrator;
8075
this._shadowDomStrategy = shadowDomStrategy;
8176
}
8277

83-
createHostProtoView(directiveMetadata:api.DirectiveMetadata):Promise<api.ProtoViewDto> {
84-
return this._compiler.compileHost(directiveMetadata);
85-
}
86-
87-
createImperativeComponentProtoView(rendererId):Promise<api.ProtoViewDto> {
88-
var protoViewBuilder = new ProtoViewBuilder(null);
89-
protoViewBuilder.setImperativeRendererId(rendererId);
90-
return PromiseWrapper.resolve(protoViewBuilder.build());
91-
}
92-
93-
compile(view:api.ViewDefinition):Promise<api.ProtoViewDto> {
94-
// Note: compiler already uses a DirectDomProtoViewRef, so we don't
95-
// need to do anything here
96-
return this._compiler.compile(view);
97-
}
98-
99-
mergeChildComponentProtoViews(protoViewRef:api.RenderProtoViewRef, protoViewRefs:List<api.RenderProtoViewRef>) {
100-
_resolveProtoView(protoViewRef).mergeChildComponentProtoViews(
101-
ListWrapper.map(protoViewRefs, _resolveProtoView)
102-
);
103-
}
104-
10578
createViewInContainer(vcRef:api.RenderViewContainerRef, atIndex:number, protoViewRef:api.RenderProtoViewRef):List<api.RenderViewRef> {
10679
var view = this._viewFactory.getView(_resolveProtoView(protoViewRef));
10780
var vc = _resolveViewContainer(vcRef);

modules/angular2/src/test_lib/test_injector.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import {AppViewPool, APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/compiler/vi
3939
import {AppViewManager} from 'angular2/src/core/compiler/view_manager';
4040
import {AppViewManagerUtils} from 'angular2/src/core/compiler/view_manager_utils';
4141
import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
42-
import {Renderer} from 'angular2/src/render/api';
42+
import {RenderCompiler, Renderer} from 'angular2/src/render/api';
4343
import {DirectDomRenderer} from 'angular2/src/render/dom/direct_dom_renderer';
4444
import * as rc from 'angular2/src/render/dom/compiler/compiler';
4545
import * as rvf from 'angular2/src/render/dom/view/view_factory';
@@ -82,7 +82,7 @@ function _getAppBindings() {
8282
[StyleUrlResolver, appDocumentToken]),
8383
bind(DirectDomRenderer).toClass(DirectDomRenderer),
8484
bind(Renderer).toClass(DirectDomRenderer),
85-
bind(rc.Compiler).toClass(rc.DefaultCompiler),
85+
bind(RenderCompiler).toClass(rc.DefaultDomCompiler),
8686
rvf.ViewFactory,
8787
rvh.RenderViewHydrator,
8888
bind(rvf.VIEW_POOL_CAPACITY).toValue(500),

modules/angular2/test/core/compiler/compiler_spec.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,23 @@ import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
3333
import {UrlResolver} from 'angular2/src/services/url_resolver';
3434
import * as renderApi from 'angular2/src/render/api';
3535
// TODO(tbosch): Spys don't support named modules...
36-
import {Renderer} from 'angular2/src/render/api';
36+
import {RenderCompiler} from 'angular2/src/render/api';
3737

3838
export function main() {
3939
describe('compiler', function() {
40-
var reader, tplResolver, renderer, protoViewFactory, cmpUrlMapper, renderCompileRequests;
40+
var reader, tplResolver, renderCompiler, protoViewFactory, cmpUrlMapper, renderCompileRequests;
4141

4242
beforeEach(() => {
4343
reader = new DirectiveMetadataReader();
4444
tplResolver = new FakeTemplateResolver();
4545
cmpUrlMapper = new RuntimeComponentUrlMapper();
46-
renderer = new SpyRenderer();
46+
renderCompiler = new SpyRenderCompiler();
4747
});
4848

4949
function createCompiler(renderCompileResults:List, protoViewFactoryResults:List<AppProtoView>) {
5050
var urlResolver = new FakeUrlResolver();
5151
renderCompileRequests = [];
52-
renderer.spy('compile').andCallFake( (template) => {
52+
renderCompiler.spy('compile').andCallFake( (template) => {
5353
ListWrapper.push(renderCompileRequests, template);
5454
return PromiseWrapper.resolve(ListWrapper.removeAt(renderCompileResults, 0));
5555
});
@@ -61,7 +61,7 @@ export function main() {
6161
tplResolver,
6262
cmpUrlMapper,
6363
urlResolver,
64-
renderer,
64+
renderCompiler,
6565
protoViewFactory
6666
);
6767
}
@@ -368,7 +368,7 @@ export function main() {
368368
}));
369369

370370
it('should create host proto views', inject([AsyncTestCompleter], (async) => {
371-
renderer.spy('createHostProtoView').andCallFake( (componentId) => {
371+
renderCompiler.spy('compileHost').andCallFake( (componentId) => {
372372
return PromiseWrapper.resolve(
373373
createRenderProtoView([createRenderComponentElementBinder(0)])
374374
);
@@ -392,7 +392,7 @@ export function main() {
392392
}));
393393

394394
it('should create imperative proto views', inject([AsyncTestCompleter], (async) => {
395-
renderer.spy('createImperativeComponentProtoView').andCallFake( (rendererId) => {
395+
renderCompiler.spy('createImperativeComponentProtoView').andCallFake( (rendererId) => {
396396
return PromiseWrapper.resolve(
397397
createRenderProtoView([])
398398
);
@@ -405,7 +405,7 @@ export function main() {
405405
);
406406
compiler.compile(MainComponent).then( (protoViewRef) => {
407407
expect(internalProtoView(protoViewRef)).toBe(mainProtoView);
408-
expect(renderer.spy('createImperativeComponentProtoView')).toHaveBeenCalledWith('some-renderer');
408+
expect(renderCompiler.spy('createImperativeComponentProtoView')).toHaveBeenCalledWith('some-renderer');
409409
async.done();
410410
});
411411
}));
@@ -515,9 +515,9 @@ class DirectiveWithAttributes {
515515
}
516516

517517
@proxy
518-
@IMPLEMENTS(Renderer)
519-
class SpyRenderer extends SpyObject {
520-
constructor(){super(Renderer);}
518+
@IMPLEMENTS(RenderCompiler)
519+
class SpyRenderCompiler extends SpyObject {
520+
constructor(){super(RenderCompiler);}
521521
noSuchMethod(m){return super.noSuchMethod(m)}
522522
}
523523

modules/angular2/test/render/dom/compiler/compiler_common_tests.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {List, ListWrapper, Map, MapWrapper, StringMapWrapper} from 'angular2/src
1616
import {Type, isBlank, stringify, isPresent} from 'angular2/src/facade/lang';
1717
import {PromiseWrapper, Promise} from 'angular2/src/facade/async';
1818

19-
import {Compiler, CompilerCache} from 'angular2/src/render/dom/compiler/compiler';
19+
import {DomCompiler} from 'angular2/src/render/dom/compiler/compiler';
2020
import {ProtoViewDto, ViewDefinition, DirectiveMetadata} from 'angular2/src/render/api';
2121
import {CompileElement} from 'angular2/src/render/dom/compiler/compile_element';
2222
import {CompileStep} from 'angular2/src/render/dom/compiler/compile_step'
@@ -27,7 +27,7 @@ import {TemplateLoader} from 'angular2/src/render/dom/compiler/template_loader';
2727
import {UrlResolver} from 'angular2/src/services/url_resolver';
2828

2929
export function runCompilerCommonTests() {
30-
describe('compiler', function() {
30+
describe('DomCompiler', function() {
3131
var mockStepFactory;
3232

3333
function createCompiler(processClosure, urlData = null) {
@@ -36,7 +36,7 @@ export function runCompilerCommonTests() {
3636
}
3737
var tplLoader = new FakeTemplateLoader(urlData);
3838
mockStepFactory = new MockStepFactory([new MockStep(processClosure)]);
39-
return new Compiler(mockStepFactory, tplLoader);
39+
return new DomCompiler(mockStepFactory, tplLoader);
4040
}
4141

4242
it('should run the steps and build the AppProtoView of the root element', inject([AsyncTestCompleter], (async) => {

0 commit comments

Comments
 (0)