feat(language-service): allow retreiving synchronized analyzed NgModules (#32779)
Sometimes modules retreived from the language service need to be synchronized to the last time they were updated, and not updated on-the-fly. This PR adds a flag to `TypeScriptServiceHost#getAnalyzedModules` that retreives cached analyzed NgModules rather than potentially recomputing them. PR Close #32779
This commit is contained in:
parent
28358b6395
commit
98feee7e0e
|
@ -152,9 +152,13 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
|
||||||
* and templateReferences.
|
* and templateReferences.
|
||||||
* In addition to returning information about NgModules, this method plays the
|
* In addition to returning information about NgModules, this method plays the
|
||||||
* same role as 'synchronizeHostData' in tsserver.
|
* same role as 'synchronizeHostData' in tsserver.
|
||||||
|
* @param ensureSynchronized whether or not the Language Service should make sure analyzedModules
|
||||||
|
* are synced to the last update of the project. If false, returns the set of analyzedModules
|
||||||
|
* that is already cached. This is useful if the project must not be reanalyzed, even if its
|
||||||
|
* file watchers (which are disjoint from the TypeScriptServiceHost) detect an update.
|
||||||
*/
|
*/
|
||||||
getAnalyzedModules(): NgAnalyzedModules {
|
getAnalyzedModules(ensureSynchronized = true): NgAnalyzedModules {
|
||||||
if (this.upToDate()) {
|
if (!ensureSynchronized || this.upToDate()) {
|
||||||
return this.analyzedModules;
|
return this.analyzedModules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -189,4 +189,31 @@ describe('TypeScriptServiceHost', () => {
|
||||||
expect(directiveSymbol).toBeDefined();
|
expect(directiveSymbol).toBeDefined();
|
||||||
expect(directiveSymbol !.name).toBe('AppComponent');
|
expect(directiveSymbol !.name).toBe('AppComponent');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should allow for retreiving analyzedModules in synchronized mode', () => {
|
||||||
|
const fileName = '/app/app.component.ts';
|
||||||
|
const tsLSHost = new MockTypescriptHost([fileName]);
|
||||||
|
const tsLS = ts.createLanguageService(tsLSHost);
|
||||||
|
const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS);
|
||||||
|
|
||||||
|
// Get initial state
|
||||||
|
const originalModules = ngLSHost.getAnalyzedModules();
|
||||||
|
|
||||||
|
// Override app.component.ts with a different component
|
||||||
|
tsLSHost.override(fileName, `
|
||||||
|
import {Component} from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
template: '<div>Hello!</div>',
|
||||||
|
})
|
||||||
|
export class HelloComponent {}
|
||||||
|
`);
|
||||||
|
// Make sure synchronized modules match the original state
|
||||||
|
const syncModules = ngLSHost.getAnalyzedModules(false);
|
||||||
|
expect(originalModules).toEqual(syncModules);
|
||||||
|
|
||||||
|
// Now, get modules for the updated project, which should not be synchronized
|
||||||
|
const updatedModules = ngLSHost.getAnalyzedModules();
|
||||||
|
expect(updatedModules).not.toEqual(syncModules);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue