Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fix(language-service): Should not crash if expr ends unexpectedly (#3…
…3524)

If there is any parser errors when parsing template, we should stop
immediately and not proceed with template expression diagnostics.

This regression is caused by 6d11154
and affected v9.0.0-next.4 onwards.

PR closes angular/vscode-ng-language-service#436

PR Close #33524
  • Loading branch information
kyliau authored and atscott committed Nov 1, 2019
1 parent ce30888 commit 9ebac71
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
11 changes: 4 additions & 7 deletions packages/language-service/src/diagnostics.ts
Expand Up @@ -21,26 +21,23 @@ import {findPropertyValueOfType, findTightestNode, offsetSpan, spanOf} from './u
* @param ast contains HTML and template AST
*/
export function getTemplateDiagnostics(ast: AstResult): ng.Diagnostic[] {
const results: ng.Diagnostic[] = [];
const {parseErrors, templateAst, htmlAst, template} = ast;
if (parseErrors) {
results.push(...parseErrors.map(e => {
if (parseErrors && parseErrors.length) {
return parseErrors.map(e => {
return {
kind: ng.DiagnosticKind.Error,
span: offsetSpan(spanOf(e.span), template.span.start),
message: e.msg,
};
}));
});
}
const expressionDiagnostics = getTemplateExpressionDiagnostics({
return getTemplateExpressionDiagnostics({
templateAst: templateAst,
htmlAst: htmlAst,
offset: template.span.start,
query: template.query,
members: template.members,
});
results.push(...expressionDiagnostics);
return results;
}

/**
Expand Down
13 changes: 13 additions & 0 deletions packages/language-service/test/diagnostics_spec.ts
Expand Up @@ -56,6 +56,19 @@ describe('diagnostics', () => {
}
});

it('should report error for unexpected end of expression', () => {
const content = mockHost.override(TEST_TEMPLATE, `{{ 5 / }}`);
const diags = ngLS.getDiagnostics(TEST_TEMPLATE);
expect(diags.length).toBe(1);
const {messageText, start, length} = diags[0];
expect(messageText)
.toBe(
'Parser Error: Unexpected end of expression: {{ 5 / }} ' +
'at the end of the expression [{{ 5 / }}] in /app/test.ng@0:0');
expect(start).toBe(0);
expect(length).toBe(content.length);
});

// https://github.com/angular/vscode-ng-language-service/issues/242
it('should support $any() type cast function', () => {
mockHost.override(TEST_TEMPLATE, `<div>{{$any(title).xyz}}</div>`);
Expand Down

0 comments on commit 9ebac71

Please sign in to comment.