Skip to content

Commit

Permalink
fix(language-service): Should not crash if expr ends unexpectedly (#3…
Browse files Browse the repository at this point in the history
…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.