refactor(core): static-query schematic should check templates (#29713)

Queries can technically be also accessed within component templates
e.g.

```html
<my-comp [binding]="myQuery"></my-comp>
```

In that case the query with the property "myQuery" is accessed
statically and needs to be marked with `static: true`. There are
other edge cases that need to be handled as the template property
read doesn't necessarily resolve to the actual query property.

For example:

```html
<foo #myQuery></foo>
<my-comp [binding]="myQuery"></my-comp>
```

In this scenario the binding doesn't refer to the actual query
because the template reference variable takes precedence. The
query doesn't need to be marked with "static: true" this time.

This commit ensures that the `static-query` migration schematic
now handles this cases properly. Also template property reads
that access queries from within a `<ng-template>` are ignored
as these can't access the query before the view has been initialized.

Resolves FW-1216

PR Close #29713
This commit is contained in:
Paul Gschwendtner
2019-04-08 16:16:56 +02:00
committed by Igor Minar
parent b507d076be
commit 5b32f55a3a
16 changed files with 385 additions and 32 deletions

View File

@ -128,4 +128,24 @@ describe('Google3 explicitQueryTiming TSLint rule', () => {
expect(failures.length).toBe(1);
expect(failures[0].getFailure()).toMatch(/analysis of the query.*"{static: false}"/);
});
it('should detect query usage in component template', () => {
writeFile('index.ts', `
import {Component, ViewChild} from '@angular/core';
@Component({
template: \`
<span #test></span>
<my-comp [binding]="query"></my-comp>
\`
})
export class MyComp {
@ViewChild('test') query: any;
}
`);
runTSLint();
expectFileToContain('index.ts', `@ViewChild('test', { static: true }) query: any;`);
});
});