feat(language-service): expose determining the NgModule of a Directive (#32710)
This sets up the Language Service to support #32565. This PR exposes a `getDirectiveModule` method on `TypeScriptServiceHost` that returns the NgModule owning a Directive given the Directive's TypeScript node or its Angular `StaticSymbol`. Both types are supported to reduce extraneous helper methods. PR Close #32710
This commit is contained in:
parent
ab29874f09
commit
2846505dbd
|
@ -441,6 +441,14 @@ export class TypeScriptServiceHost implements LanguageServiceHost {
|
|||
return astResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a StaticSymbol from a file and symbol name.
|
||||
* @return Angular StaticSymbol matching the file and name, if any
|
||||
*/
|
||||
getStaticSymbol(file: string, name: string): StaticSymbol|undefined {
|
||||
return this.reflector.getStaticSymbol(file, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the NgModule which the directive associated with the `classSymbol`
|
||||
* belongs to, then return its schema and transitive directives and pipes.
|
||||
|
|
|
@ -170,4 +170,24 @@ describe('TypeScriptServiceHost', () => {
|
|||
const newModules = ngLSHost.getAnalyzedModules();
|
||||
expect(newModules).toBe(oldModules);
|
||||
});
|
||||
|
||||
it('should get the correct StaticSymbol for a Directive', () => {
|
||||
const tsLSHost = new MockTypescriptHost(['/app/app.component.ts', '/app/main.ts'], toh);
|
||||
const tsLS = ts.createLanguageService(tsLSHost);
|
||||
const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS);
|
||||
ngLSHost.getAnalyzedModules(); // modules are analyzed lazily
|
||||
const sf = ngLSHost.getSourceFile('/app/app.component.ts');
|
||||
expect(sf).toBeDefined();
|
||||
const directiveDecl = sf !.forEachChild(n => {
|
||||
if (ts.isClassDeclaration(n) && n.name && n.name.text === 'AppComponent') return n;
|
||||
});
|
||||
|
||||
expect(directiveDecl).toBeDefined();
|
||||
expect(directiveDecl !.name).toBeDefined();
|
||||
const fileName = directiveDecl !.getSourceFile().fileName;
|
||||
const symbolName = directiveDecl !.name !.getText();
|
||||
const directiveSymbol = ngLSHost.getStaticSymbol(fileName, symbolName);
|
||||
expect(directiveSymbol).toBeDefined();
|
||||
expect(directiveSymbol !.name).toBe('AppComponent');
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue