perf(CD): Special cased interpolation in AST, Parser, and CD

This commit is contained in:
Misko Hevery
2015-01-08 16:17:56 -08:00
parent ee99a5a02b
commit 3b34ef43b1
8 changed files with 128 additions and 52 deletions

View File

@ -26,7 +26,7 @@ export function main() {
// Note: we don't test all corner cases of interpolation as we assume shared functionality between text interpolation
// and attribute interpolation.
var results = createPipeline().process(el('<div a="{{b}}"></div>'));
expect(MapWrapper.get(results[0].propertyBindings, 'a').source).toEqual('(b)');
expect(MapWrapper.get(results[0].propertyBindings, 'a').source).toEqual('{{b}}');
});
it('should detect let- syntax', () => {
@ -54,4 +54,4 @@ export function main() {
expect(MapWrapper.get(results[0].eventBindings, 'click').source).toEqual('b()');
});
});
}
}

View File

@ -19,39 +19,39 @@ export function main() {
it('should find text interpolation in normal elements', () => {
var results = createPipeline().process(el('<div>{{expr1}}<span></span>{{expr2}}</div>'));
var bindings = results[0].textNodeBindings;
expect(MapWrapper.get(bindings, 0).source).toEqual("(expr1)");
expect(MapWrapper.get(bindings, 2).source).toEqual("(expr2)");
expect(MapWrapper.get(bindings, 0).source).toEqual("{{expr1}}");
expect(MapWrapper.get(bindings, 2).source).toEqual("{{expr2}}");
});
it('should find text interpolation in template elements', () => {
var results = createPipeline().process(el('<template>{{expr1}}<span></span>{{expr2}}</template>'));
var bindings = results[0].textNodeBindings;
expect(MapWrapper.get(bindings, 0).source).toEqual("(expr1)");
expect(MapWrapper.get(bindings, 2).source).toEqual("(expr2)");
expect(MapWrapper.get(bindings, 0).source).toEqual("{{expr1}}");
expect(MapWrapper.get(bindings, 2).source).toEqual("{{expr2}}");
});
it('should allow multiple expressions', () => {
var results = createPipeline().process(el('<div>{{expr1}}{{expr2}}</div>'));
var bindings = results[0].textNodeBindings;
expect(MapWrapper.get(bindings, 0).source).toEqual("(expr1)+(expr2)");
expect(MapWrapper.get(bindings, 0).source).toEqual("{{expr1}}{{expr2}}");
});
it('should not interpolate when compileChildren is false', () => {
var results = createPipeline().process(el('<div>{{included}}<span ignore-children>{{excluded}}</span></div>'));
var bindings = results[0].textNodeBindings;
expect(MapWrapper.get(bindings, 0).source).toEqual("(included)");
expect(MapWrapper.get(bindings, 0).source).toEqual("{{included}}");
expect(results[1].textNodeBindings).toBe(null);
});
it('should allow fixed text before, in between and after expressions', () => {
var results = createPipeline().process(el('<div>a{{expr1}}b{{expr2}}c</div>'));
var bindings = results[0].textNodeBindings;
expect(MapWrapper.get(bindings, 0).source).toEqual("'a'+(expr1)+'b'+(expr2)+'c'");
expect(MapWrapper.get(bindings, 0).source).toEqual("a{{expr1}}b{{expr2}}c");
});
it('should escape quotes in fixed parts', () => {
var results = createPipeline().process(el("<div>'\"a{{expr1}}</div>"));
expect(MapWrapper.get(results[0].textNodeBindings, 0).source).toEqual("'\\'\"a'+(expr1)");
expect(MapWrapper.get(results[0].textNodeBindings, 0).source).toEqual("'\"a{{expr1}}");
});
});
}