fix(compiler): record correct end of expression (#34690)
This commit fixes a bug with the expression parser wherein the end index of an expression node was recorded as the start index of the next token, not the end index of the current token. Closes #33477 Closes https://github.com/angular/vscode-ng-language-service/issues/433 PR Close #34690
This commit is contained in:
@ -310,15 +310,30 @@ describe('completions', () => {
|
||||
expect(completions).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should include field reference', () => {
|
||||
mockHost.override(TEST_TEMPLATE, `<div *ngFor="let x of ~{cursor}"></div>`);
|
||||
const marker = mockHost.getLocationMarkerFor(TEST_TEMPLATE, 'cursor');
|
||||
const completions = ngLS.getCompletionsAtPosition(TEST_TEMPLATE, marker.start);
|
||||
expectContain(completions, CompletionKind.PROPERTY, ['title', 'heroes', 'league']);
|
||||
// the symbol 'x' declared in *ngFor is also in scope. This asserts that
|
||||
// we are actually taking the AST into account and not just referring to
|
||||
// the symbol table of the Component.
|
||||
expectContain(completions, CompletionKind.VARIABLE, ['x']);
|
||||
describe('template binding: key expression', () => {
|
||||
it('should complete the RHS of a template key expression without an expression value', () => {
|
||||
mockHost.override(
|
||||
TEST_TEMPLATE, `<div *ngFor="let x of ~{cursor}"></div>`); // value is undefined
|
||||
const marker = mockHost.getLocationMarkerFor(TEST_TEMPLATE, 'cursor');
|
||||
const completions = ngLS.getCompletionsAtPosition(TEST_TEMPLATE, marker.start);
|
||||
expectContain(completions, CompletionKind.PROPERTY, ['title', 'heroes', 'league']);
|
||||
// the symbol 'x' declared in *ngFor is also in scope. This asserts that
|
||||
// we are actually taking the AST into account and not just referring to
|
||||
// the symbol table of the Component.
|
||||
expectContain(completions, CompletionKind.VARIABLE, ['x']);
|
||||
});
|
||||
|
||||
it('should complete the RHS of a template key expression with an expression value', () => {
|
||||
mockHost.override(
|
||||
TEST_TEMPLATE, `<div *ngFor="let x of t~{cursor}"></div>`); // value is defined
|
||||
const marker = mockHost.getLocationMarkerFor(TEST_TEMPLATE, 'cursor');
|
||||
const completions = ngLS.getCompletionsAtPosition(TEST_TEMPLATE, marker.start);
|
||||
expectContain(completions, CompletionKind.PROPERTY, ['title', 'heroes', 'league']);
|
||||
// the symbol 'x' declared in *ngFor is also in scope. This asserts that
|
||||
// we are actually taking the AST into account and not just referring to
|
||||
// the symbol table of the Component.
|
||||
expectContain(completions, CompletionKind.VARIABLE, ['x']);
|
||||
});
|
||||
});
|
||||
|
||||
it('should include expression completions', () => {
|
||||
|
@ -328,7 +328,7 @@ describe('diagnostics', () => {
|
||||
it('report an unknown field in $implicit context', () => {
|
||||
mockHost.override(TEST_TEMPLATE, `
|
||||
<div *withContext="let myVar">
|
||||
{{ ~{start-emb}myVar.missingField ~{end-emb}}}
|
||||
{{ ~{start-emb}myVar.missingField~{end-emb} }}
|
||||
</div>
|
||||
`);
|
||||
const diags = ngLS.getSemanticDiagnostics(TEST_TEMPLATE);
|
||||
@ -346,7 +346,7 @@ describe('diagnostics', () => {
|
||||
it('report an unknown field in non implicit context', () => {
|
||||
mockHost.override(TEST_TEMPLATE, `
|
||||
<div *withContext="let myVar = nonImplicitPerson">
|
||||
{{ ~{start-emb}myVar.missingField ~{end-emb}}}
|
||||
{{ ~{start-emb}myVar.missingField~{end-emb} }}
|
||||
</div>
|
||||
`);
|
||||
const diags = ngLS.getSemanticDiagnostics(TEST_TEMPLATE);
|
||||
|
Reference in New Issue
Block a user