perf(ivy): template type-check the entire program in 1 file if possible (#29698)
The template type-checking engine previously would assemble a type-checking program by inserting Type Check Blocks (TCBs) into existing user files. This approach proved expensive, as TypeScript has to re-parse and re-type-check those files when processing the type-checking program. Instead, a far more performant approach is to augment the program with a single type-checking file, into which all TCBs are generated. Additionally, type constructors are also inlined into this file. This is not always possible - both TCBs and type constructors can sometimes require inlining into user code, particularly if bound generic type parameters are present, so the approach taken is actually a hybrid. These operations are inlined if necessary, but are otherwise generated in a single file. It is critically important that the original program also include an empty version of the type-checking file, otherwise the shape of the two programs will be different and TypeScript will throw away all the old program information. This leads to a painfully slow type checking pass, on the same order as the original program creation. A shim to generate this file in the original program is therefore added. Testing strategy: this commit is largely a refactor with no externally observable behavioral differences, and thus no tests are needed. PR Close #29698
This commit is contained in:

committed by
Ben Lesh

parent
f4c536ae36
commit
98f86de8da
@ -124,7 +124,7 @@ describe('ngtsc type checking', () => {
|
||||
selector: 'test',
|
||||
template: '<div *ngFor="let user of users">{{user.does_not_exist}}</div>',
|
||||
})
|
||||
class TestCmp {
|
||||
export class TestCmp {
|
||||
users: {name: string}[];
|
||||
}
|
||||
|
||||
@ -132,7 +132,7 @@ describe('ngtsc type checking', () => {
|
||||
declarations: [TestCmp],
|
||||
imports: [CommonModule],
|
||||
})
|
||||
class Module {}
|
||||
export class Module {}
|
||||
`);
|
||||
|
||||
const diags = env.driveDiagnostics();
|
||||
|
Reference in New Issue
Block a user