From 41178367d13b1796321416d1f9c84209cb676127 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Fri, 22 Jul 2016 17:16:56 -0700 Subject: [PATCH] feat(HtmlLexer): better hint on unclosed ICU message errors fixes #10227 --- modules/@angular/compiler/src/html_lexer.ts | 7 +++++-- modules/@angular/compiler/test/html_lexer_spec.ts | 12 ++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/modules/@angular/compiler/src/html_lexer.ts b/modules/@angular/compiler/src/html_lexer.ts index cb9b256c95..8a2d96bcb5 100644 --- a/modules/@angular/compiler/src/html_lexer.ts +++ b/modules/@angular/compiler/src/html_lexer.ts @@ -202,6 +202,9 @@ class _HtmlTokenizer { } private _createError(msg: string, span: ParseSourceSpan): _ControlFlowError { + if (this._isInExpansionForm()) { + msg += ' (Do you have an unescaped "{" in your template?).'; + } const error = new HtmlTokenError(msg, this._currentTokenType, span); this._currentTokenStart = null; this._currentTokenType = null; @@ -523,6 +526,8 @@ class _HtmlTokenizer { this._requireCharCode(chars.$LBRACE); this._endToken([]); + this._expansionCaseStack.push(HtmlTokenType.EXPANSION_FORM_START); + this._beginToken(HtmlTokenType.RAW_TEXT, this._getLocation()); const condition = this._readUntil(chars.$COMMA); this._endToken([condition], this._getLocation()); @@ -534,8 +539,6 @@ class _HtmlTokenizer { this._endToken([type], this._getLocation()); this._requireCharCode(chars.$COMMA); this._attemptCharCodeUntilFn(isNotWhitespace); - - this._expansionCaseStack.push(HtmlTokenType.EXPANSION_FORM_START); } private _consumeExpansionCaseStart() { diff --git a/modules/@angular/compiler/test/html_lexer_spec.ts b/modules/@angular/compiler/test/html_lexer_spec.ts index a0c754fd8a..c40dfe34ed 100644 --- a/modules/@angular/compiler/test/html_lexer_spec.ts +++ b/modules/@angular/compiler/test/html_lexer_spec.ts @@ -728,6 +728,14 @@ export function main() { }); describe('errors', () => { + it('should parse nested expansion forms', () => { + expect(tokenizeAndHumanizeErrors(`

before { after

`, true)).toEqual([[ + HtmlTokenType.RAW_TEXT, + 'Unexpected character "EOF" (Do you have an unescaped "{" in your template?).', + '0:21', + ]]); + }); + it('should include 2 lines of context in message', () => { let src = '111\n222\n333\nE\n444\n555\n666\n'; let file = new ParseSourceFile(src, 'file://'); @@ -787,7 +795,7 @@ function tokenizeAndHumanizeLineColumn(input: string): any[] { token => [token.type, humanizeLineColumn(token.sourceSpan.start)]); } -function tokenizeAndHumanizeErrors(input: string): any[] { - return tokenizeHtml(input, 'someUrl') +function tokenizeAndHumanizeErrors(input: string, tokenizeExpansionForms: boolean = false): any[] { + return tokenizeHtml(input, 'someUrl', tokenizeExpansionForms) .errors.map(e => [e.tokenType, e.msg, humanizeLineColumn(e.span.start)]); }