refactor(renderer): separate compiler from renderer
Part of #1675 Closes #1702
This commit is contained in:
+11
-11
@@ -33,23 +33,23 @@ import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
|
||||
import {UrlResolver} from 'angular2/src/services/url_resolver';
|
||||
import * as renderApi from 'angular2/src/render/api';
|
||||
// TODO(tbosch): Spys don't support named modules...
|
||||
import {Renderer} from 'angular2/src/render/api';
|
||||
import {RenderCompiler} from 'angular2/src/render/api';
|
||||
|
||||
export function main() {
|
||||
describe('compiler', function() {
|
||||
var reader, tplResolver, renderer, protoViewFactory, cmpUrlMapper, renderCompileRequests;
|
||||
var reader, tplResolver, renderCompiler, protoViewFactory, cmpUrlMapper, renderCompileRequests;
|
||||
|
||||
beforeEach(() => {
|
||||
reader = new DirectiveMetadataReader();
|
||||
tplResolver = new FakeTemplateResolver();
|
||||
cmpUrlMapper = new RuntimeComponentUrlMapper();
|
||||
renderer = new SpyRenderer();
|
||||
renderCompiler = new SpyRenderCompiler();
|
||||
});
|
||||
|
||||
function createCompiler(renderCompileResults:List, protoViewFactoryResults:List<AppProtoView>) {
|
||||
var urlResolver = new FakeUrlResolver();
|
||||
renderCompileRequests = [];
|
||||
renderer.spy('compile').andCallFake( (template) => {
|
||||
renderCompiler.spy('compile').andCallFake( (template) => {
|
||||
ListWrapper.push(renderCompileRequests, template);
|
||||
return PromiseWrapper.resolve(ListWrapper.removeAt(renderCompileResults, 0));
|
||||
});
|
||||
@@ -61,7 +61,7 @@ export function main() {
|
||||
tplResolver,
|
||||
cmpUrlMapper,
|
||||
urlResolver,
|
||||
renderer,
|
||||
renderCompiler,
|
||||
protoViewFactory
|
||||
);
|
||||
}
|
||||
@@ -368,7 +368,7 @@ export function main() {
|
||||
}));
|
||||
|
||||
it('should create host proto views', inject([AsyncTestCompleter], (async) => {
|
||||
renderer.spy('createHostProtoView').andCallFake( (componentId) => {
|
||||
renderCompiler.spy('compileHost').andCallFake( (componentId) => {
|
||||
return PromiseWrapper.resolve(
|
||||
createRenderProtoView([createRenderComponentElementBinder(0)])
|
||||
);
|
||||
@@ -392,7 +392,7 @@ export function main() {
|
||||
}));
|
||||
|
||||
it('should create imperative proto views', inject([AsyncTestCompleter], (async) => {
|
||||
renderer.spy('createImperativeComponentProtoView').andCallFake( (rendererId) => {
|
||||
renderCompiler.spy('createImperativeComponentProtoView').andCallFake( (rendererId) => {
|
||||
return PromiseWrapper.resolve(
|
||||
createRenderProtoView([])
|
||||
);
|
||||
@@ -405,7 +405,7 @@ export function main() {
|
||||
);
|
||||
compiler.compile(MainComponent).then( (protoViewRef) => {
|
||||
expect(internalProtoView(protoViewRef)).toBe(mainProtoView);
|
||||
expect(renderer.spy('createImperativeComponentProtoView')).toHaveBeenCalledWith('some-renderer');
|
||||
expect(renderCompiler.spy('createImperativeComponentProtoView')).toHaveBeenCalledWith('some-renderer');
|
||||
async.done();
|
||||
});
|
||||
}));
|
||||
@@ -515,9 +515,9 @@ class DirectiveWithAttributes {
|
||||
}
|
||||
|
||||
@proxy
|
||||
@IMPLEMENTS(Renderer)
|
||||
class SpyRenderer extends SpyObject {
|
||||
constructor(){super(Renderer);}
|
||||
@IMPLEMENTS(RenderCompiler)
|
||||
class SpyRenderCompiler extends SpyObject {
|
||||
constructor(){super(RenderCompiler);}
|
||||
noSuchMethod(m){return super.noSuchMethod(m)}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import {List, ListWrapper, Map, MapWrapper, StringMapWrapper} from 'angular2/src
|
||||
import {Type, isBlank, stringify, isPresent} from 'angular2/src/facade/lang';
|
||||
import {PromiseWrapper, Promise} from 'angular2/src/facade/async';
|
||||
|
||||
import {Compiler, CompilerCache} from 'angular2/src/render/dom/compiler/compiler';
|
||||
import {DomCompiler} from 'angular2/src/render/dom/compiler/compiler';
|
||||
import {ProtoViewDto, ViewDefinition, DirectiveMetadata} from 'angular2/src/render/api';
|
||||
import {CompileElement} from 'angular2/src/render/dom/compiler/compile_element';
|
||||
import {CompileStep} from 'angular2/src/render/dom/compiler/compile_step'
|
||||
@@ -27,7 +27,7 @@ import {TemplateLoader} from 'angular2/src/render/dom/compiler/template_loader';
|
||||
import {UrlResolver} from 'angular2/src/services/url_resolver';
|
||||
|
||||
export function runCompilerCommonTests() {
|
||||
describe('compiler', function() {
|
||||
describe('DomCompiler', function() {
|
||||
var mockStepFactory;
|
||||
|
||||
function createCompiler(processClosure, urlData = null) {
|
||||
@@ -36,7 +36,7 @@ export function runCompilerCommonTests() {
|
||||
}
|
||||
var tplLoader = new FakeTemplateLoader(urlData);
|
||||
mockStepFactory = new MockStepFactory([new MockStep(processClosure)]);
|
||||
return new Compiler(mockStepFactory, tplLoader);
|
||||
return new DomCompiler(mockStepFactory, tplLoader);
|
||||
}
|
||||
|
||||
it('should run the steps and build the AppProtoView of the root element', inject([AsyncTestCompleter], (async) => {
|
||||
|
||||
@@ -21,7 +21,7 @@ import {IntegrationTestbed, LoggingEventDispatcher, FakeEvent} from './integrati
|
||||
|
||||
export function main() {
|
||||
describe('DirectDomRenderer integration', () => {
|
||||
var testbed, renderer, eventPlugin, compileRoot, rootEl;
|
||||
var testbed, renderer, renderCompiler, eventPlugin, compileRoot, rootEl;
|
||||
|
||||
beforeEach(() => {
|
||||
rootEl = el('<div></div>');
|
||||
@@ -35,13 +35,14 @@ export function main() {
|
||||
templates: templates
|
||||
});
|
||||
renderer = testbed.renderer;
|
||||
renderCompiler = testbed.renderCompiler;
|
||||
eventPlugin = testbed.eventPlugin;
|
||||
compileRoot = (componentId) => testbed.compileRoot(componentId);
|
||||
}
|
||||
|
||||
it('should create host views while using the given elements in place', inject([AsyncTestCompleter], (async) => {
|
||||
createRenderer();
|
||||
renderer.createHostProtoView(someComponent).then( (rootProtoView) => {
|
||||
renderCompiler.compileHost(someComponent).then( (rootProtoView) => {
|
||||
expect(rootProtoView.elementBinders[0].directives[0].directiveIndex).toBe(0);
|
||||
var viewRefs = renderer.createInPlaceHostView(null, rootEl, rootProtoView.render);
|
||||
expect(viewRefs.length).toBe(1);
|
||||
@@ -52,7 +53,7 @@ export function main() {
|
||||
|
||||
it('should create imperative proto views', inject([AsyncTestCompleter], (async) => {
|
||||
createRenderer();
|
||||
renderer.createImperativeComponentProtoView('someRenderId').then( (rootProtoView) => {
|
||||
renderCompiler.createImperativeComponentProtoView('someRenderId').then( (rootProtoView) => {
|
||||
expect(rootProtoView.elementBinders).toEqual([]);
|
||||
|
||||
expect(rootProtoView.render.delegate.imperativeRendererId).toBe('someRenderId');
|
||||
@@ -62,14 +63,14 @@ export function main() {
|
||||
|
||||
it('should add a static component', inject([AsyncTestCompleter], (async) => {
|
||||
createRenderer();
|
||||
renderer.createHostProtoView(someComponent).then( (rootProtoView) => {
|
||||
renderCompiler.compileHost(someComponent).then( (rootProtoView) => {
|
||||
var template = new ViewDefinition({
|
||||
componentId: 'someComponent',
|
||||
template: 'hello',
|
||||
directives: []
|
||||
});
|
||||
renderer.compile(template).then( (pv) => {
|
||||
renderer.mergeChildComponentProtoViews(rootProtoView.render, [pv.render]);
|
||||
renderCompiler.compile(template).then( (pv) => {
|
||||
renderCompiler.mergeChildComponentProtoViews(rootProtoView.render, [pv.render]);
|
||||
renderer.createInPlaceHostView(null, rootEl, rootProtoView.render);
|
||||
expect(rootEl).toHaveText('hello');
|
||||
async.done();
|
||||
@@ -79,13 +80,13 @@ export function main() {
|
||||
|
||||
it('should add a a dynamic component', inject([AsyncTestCompleter], (async) => {
|
||||
createRenderer();
|
||||
renderer.createHostProtoView(someComponent).then( (rootProtoView) => {
|
||||
renderCompiler.compileHost(someComponent).then( (rootProtoView) => {
|
||||
var template = new ViewDefinition({
|
||||
componentId: 'someComponent',
|
||||
template: 'hello',
|
||||
directives: []
|
||||
});
|
||||
renderer.compile(template).then( (pv) => {
|
||||
renderCompiler.compile(template).then( (pv) => {
|
||||
var rootViewRef = renderer.createInPlaceHostView(null, rootEl, rootProtoView.render)[0];
|
||||
renderer.createDynamicComponentView(rootViewRef, 0, pv.render)[0];
|
||||
expect(rootEl).toHaveText('hello');
|
||||
|
||||
+7
-7
@@ -5,9 +5,8 @@ import {DOM} from 'angular2/src/dom/dom_adapter';
|
||||
|
||||
import {Parser, Lexer} from 'angular2/change_detection';
|
||||
import {DirectDomRenderer} from 'angular2/src/render/dom/direct_dom_renderer';
|
||||
import {Compiler} from 'angular2/src/render/dom/compiler/compiler';
|
||||
import {DefaultDomCompiler} from 'angular2/src/render/dom/compiler/compiler';
|
||||
import {RenderProtoViewRef, ProtoViewDto, ViewDefinition, RenderViewContainerRef, EventDispatcher, DirectiveMetadata} from 'angular2/src/render/api';
|
||||
import {DefaultStepFactory} from 'angular2/src/render/dom/compiler/compile_step_factory';
|
||||
import {TemplateLoader} from 'angular2/src/render/dom/compiler/template_loader';
|
||||
import {UrlResolver} from 'angular2/src/services/url_resolver';
|
||||
import {EmulatedUnscopedShadowDomStrategy} from 'angular2/src/render/dom/shadow_dom/emulated_unscoped_shadow_dom_strategy';
|
||||
@@ -19,6 +18,7 @@ import {RenderViewHydrator} from 'angular2/src/render/dom/view/view_hydrator';
|
||||
|
||||
export class IntegrationTestbed {
|
||||
renderer;
|
||||
renderCompiler;
|
||||
parser;
|
||||
eventPlugin;
|
||||
_templates:Map<string, ViewDefinition>;
|
||||
@@ -35,7 +35,7 @@ export class IntegrationTestbed {
|
||||
if (isBlank(shadowDomStrategy)) {
|
||||
shadowDomStrategy = new EmulatedUnscopedShadowDomStrategy(new StyleUrlResolver(urlResolver), null);
|
||||
}
|
||||
var compiler = new Compiler(new DefaultStepFactory(parser, shadowDomStrategy), new FakeTemplateLoader(urlResolver, urlData));
|
||||
this.renderCompiler = new DefaultDomCompiler(parser, shadowDomStrategy, new FakeTemplateLoader(urlResolver, urlData));
|
||||
|
||||
if (isBlank(viewCacheCapacity)) {
|
||||
viewCacheCapacity = 0;
|
||||
@@ -47,11 +47,11 @@ export class IntegrationTestbed {
|
||||
var eventManager = new EventManager([this.eventPlugin], new FakeVmTurnZone());
|
||||
var viewFactory = new ViewFactory(viewCacheCapacity, eventManager, shadowDomStrategy);
|
||||
var viewHydrator = new RenderViewHydrator(eventManager, viewFactory, shadowDomStrategy);
|
||||
this.renderer = new DirectDomRenderer(compiler, viewFactory, viewHydrator, shadowDomStrategy);
|
||||
this.renderer = new DirectDomRenderer(viewFactory, viewHydrator, shadowDomStrategy);
|
||||
}
|
||||
|
||||
compileRoot(componentMetadata):Promise<ProtoViewDto> {
|
||||
return this.renderer.createHostProtoView(componentMetadata).then( (rootProtoView) => {
|
||||
return this.renderCompiler.compileHost(componentMetadata).then( (rootProtoView) => {
|
||||
return this._compileNestedProtoViews(rootProtoView, [componentMetadata]);
|
||||
});
|
||||
}
|
||||
@@ -61,7 +61,7 @@ export class IntegrationTestbed {
|
||||
if (isBlank(childTemplate)) {
|
||||
throw new BaseException(`No template for component ${componentId}`);
|
||||
}
|
||||
return this.renderer.compile(childTemplate).then( (protoView) => {
|
||||
return this.renderCompiler.compile(childTemplate).then( (protoView) => {
|
||||
return this._compileNestedProtoViews(protoView, childTemplate.directives);
|
||||
});
|
||||
}
|
||||
@@ -103,7 +103,7 @@ export class IntegrationTestbed {
|
||||
});
|
||||
if (nestedPVPromises.length > 0) {
|
||||
return PromiseWrapper.all(nestedPVPromises).then((_) => {
|
||||
this.renderer.mergeChildComponentProtoViews(protoView.render, childComponentRenderPvRefs);
|
||||
this.renderCompiler.mergeChildComponentProtoViews(protoView.render, childComponentRenderPvRefs);
|
||||
return protoView;
|
||||
});
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user