feat(templates): introduce quoted expressions to support 3rd-party expression languages

A quoted expression is:

quoted expression = prefix `:` uninterpretedExpression
prefix = identifier
uninterpretedExpression = arbitrary string

Example: "route:/some/route"

Quoted expressions are parsed into a new AST node type Quote. The `prefix` part of the
node must be a legal identifier. The `uninterpretedExpression` part of the node is an
arbitrary string that Angular does not interpret.

This feature is meant to be used together with template AST transformers introduced in
https://github.com/angular/angular/commit/a43ed79ee7d49ec55a0adea9b587ed67780c870c. The
transformer would interpret the quoted expression and convert it into a standard AST no
longer containing quoted expressions. Angular will continue compiling the resulting AST
normally.
This commit is contained in:
Yegor Jbanov
2015-11-23 17:58:12 -08:00
committed by vsavkin
parent cf157b99d3
commit b6ec2387b3
5 changed files with 85 additions and 15 deletions
@@ -230,6 +230,15 @@ export function main() {
expectBindingError('"Foo"|1234').toThrowError(new RegExp('identifier or keyword'));
expectBindingError('"Foo"|"uppercase"').toThrowError(new RegExp('identifier or keyword'));
});
it('should parse quoted expressions', () => { checkBinding('a:b', 'a:b'); });
it('should ignore whitespace around quote prefix', () => { checkBinding(' a :b', 'a:b'); });
it('should refuse prefixes that are not single identifiers', () => {
expectBindingError('a + b:c').toThrowError();
expectBindingError('1:c').toThrowError();
});
});
it('should store the source in the result',
@@ -414,7 +423,7 @@ export function main() {
it("should throw when the given expression is not just a field name", () => {
expect(() => parseSimpleBinding("name + 1"))
.toThrowErrorWith(
'Simple binding expression can only contain field access and constants');
'Host binding expression can only contain field access and constants');
});
it('should throw when encountering interpolation', () => {
@@ -18,6 +18,7 @@ import {
LiteralPrimitive,
MethodCall,
PrefixNot,
Quote,
SafePropertyRead,
SafeMethodCall
} from 'angular2/src/core/change_detection/parser/ast';
@@ -187,5 +188,7 @@ export class Unparser implements AstVisitor {
this._expression += ')';
}
visitQuote(ast: Quote) { this._expression += `${ast.prefix}:${ast.uninterpretedExpression}`; }
private _visit(ast: AST) { ast.visit(this); }
}