fix(language-service): completions after "let x of |" in ngFor (#34473)

This commit fixes a bug in which we do testing for completions.
Subsequently, this exposes another bug in our implementation whereby
suggestions are not provided in "ngFor" where there should have been.

Currently, multiple test cases are grouped together in a single
template. This requires the template to be somewhat complete so that
test cases that depend on variables declared earlier would pass.

Consider the following example:

```
  template: `
    <div *ngFor="let ~{for-person}person of ~{for-people}people">
      <span>Name: {{~{for-interp-person}person.~{for-interp-name}name}}</span>
      <span>Age: {{person.~{for-interp-age}age}}</span>
    </div>`,
```

In order to test `~{for-interp-person}`, `people` has to be included after
`~{for-people}`. This means the test case for `~{for-people}` is not
reflective of the actual use case because the variable is already there!
In real case, the expression would be incomplete, and our implementation
failed to take that into account.

This commit breaks such test into individual tests, and fix the bugs in
the underlying implementation.

PR Close #34473
This commit is contained in:
Keen Yee Liau
2019-12-18 11:08:31 -08:00
committed by Alex Rickabaugh
parent 260a061f9f
commit 2dffe65cfd
5 changed files with 52 additions and 44 deletions

View File

@ -99,29 +99,6 @@ interface Person {
street: string;
}
@Component({
template: '<div *ngFor="let ~{for-let-empty}"></div>',
})
export class ForOfLetEmpty {
}
@Component({
template: '<div *ngFor="let i = ~{for-let-i-equal}"></div>',
})
export class ForLetIEqual {
}
@Component({
template: `
<div *ngFor="let ~{for-person}person of ~{for-people}people">
<span>Name: {{~{for-interp-person}person.~{for-interp-name}name}}</span>
<span>Age: {{person.~{for-interp-age}age}}</span>
</div>`,
})
export class ForUsingComponent {
people: Person[] = [];
}
@Component({
template: `
<div *ngFor="let person of people | async">