test(language-service): do not invalidate @angular/core (#36845)

Fix typo and add test cases for https://github.com/angular/angular/pull/36783

PR closes https://github.com/angular/vscode-ng-language-service/issues/713

PR Close #36845
This commit is contained in:
Keen Yee Liau 2020-04-28 14:56:56 -07:00 committed by Andrew Kushnir
parent 52d2e46700
commit 62ba0acfb5
2 changed files with 45 additions and 2 deletions

View File

@ -220,8 +220,12 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
const ANGULAR_CORE = '@angular/core'; const ANGULAR_CORE = '@angular/core';
const corePath = this.reflectorHost.moduleNameToFileName(ANGULAR_CORE); const corePath = this.reflectorHost.moduleNameToFileName(ANGULAR_CORE);
for (const {fileName} of program.getSourceFiles()) { for (const {fileName} of program.getSourceFiles()) {
// If the `@angular/core` has been edited, the language service should be restart, // If `@angular/core` is edited, the language service would have to be
// so ignore the change of `@angular/core`. // restarted, so ignore changes to `@angular/core`.
// When the StaticReflector is initialized at startup, it loads core
// symbols from @angular/core by calling initializeConversionMap(). This
// is only done once. If the file is invalidated, some of the core symbols
// will be lost permanently.
if (fileName === corePath) { if (fileName === corePath) {
continue; continue;
} }

View File

@ -176,4 +176,43 @@ describe('TypeScriptServiceHost', () => {
// files have changed. // files have changed.
expect(newModules).toBe(oldModules); expect(newModules).toBe(oldModules);
}); });
it('should not reload @angular/core on changes', () => {
const tsLSHost = new MockTypescriptHost(['/app/main.ts']);
const tsLS = ts.createLanguageService(tsLSHost);
const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS);
const oldModules = ngLSHost.getAnalyzedModules();
const ngCore = '/node_modules/@angular/core/core.d.ts';
const originalContent = tsLSHost.readFile(ngCore);
const oldVersion = tsLSHost.getScriptVersion(ngCore);
tsLSHost.override(ngCore, originalContent + '\n\n');
const newVersion = tsLSHost.getScriptVersion(ngCore);
expect(newVersion).not.toBe(oldVersion);
const newModules = ngLSHost.getAnalyzedModules();
// Had @angular/core been invalidated, we'd get a different instance of
// analyzed modules, with one module missing - ApplicationModule
// The absence of this module will cause language service to stop working.
expect(newModules).toBe(oldModules);
const ApplicationModule =
newModules.ngModules.find(m => m.type.reference.name === 'ApplicationModule');
expect(ApplicationModule).toBeDefined();
});
it('should reload @angular/common on changes', () => {
const tsLSHost = new MockTypescriptHost(['/app/main.ts']);
const tsLS = ts.createLanguageService(tsLSHost);
const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS);
const oldModules = ngLSHost.getAnalyzedModules();
const ngCommon = '/node_modules/@angular/common/common.d.ts';
const originalContent = tsLSHost.readFile(ngCommon);
const oldVersion = tsLSHost.getScriptVersion(ngCommon);
tsLSHost.override(ngCommon, originalContent + '\n\n');
const newVersion = tsLSHost.getScriptVersion(ngCommon);
expect(newVersion).not.toBe(oldVersion);
const newModules = ngLSHost.getAnalyzedModules();
// We get a new instance of analyzed modules
expect(newModules).not.toBe(oldModules);
// But the content should be exactly the same
expect(newModules).toEqual(oldModules);
});
}); });