Skip to content

Commit

Permalink
fix(compiler): do not recurse to find static symbols of same module
Browse files Browse the repository at this point in the history
To create the symbols of a module, the static symbol resolver first gets
all the symbols loaded in the module by an export statement. For `export
* from './module'`-like statements, all symbols from `./module` must be
loaded. In cases where the exporting module is actually the same module
that the export statement is in, this causes an unbounded recursive
resolution of the same module.

Exports of the same module are not needed, as their symbols will be
resolved when the symbols in the module metadata's `metadata` key is
explored.

This commit resolves the unbounded recursion by loading exporting
modules only if they differ from the module currently being resolved.

Closes angular/vscode-ng-language-service#593
  • Loading branch information
Ayaz Hafiz authored and ayazhafiz committed Mar 8, 2020
1 parent ae0253f commit df17c1e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
4 changes: 2 additions & 2 deletions packages/compiler/src/aot/static_symbol_resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -313,9 +313,9 @@ export class StaticSymbolResolver {
}
});
} else {
// handle the symbols via export * directives.
// Handle the symbols loaded by 'export *' directives.
const resolvedModule = this.resolveModule(moduleExport.from, filePath);
if (resolvedModule) {
if (resolvedModule && resolvedModule !== filePath) {
const nestedExports = this.getSymbolsOf(resolvedModule);
nestedExports.forEach((targetSymbol) => {
const sourceSymbol = this.getStaticSymbol(filePath, targetSymbol.name);
Expand Down
13 changes: 13 additions & 0 deletions packages/compiler/test/aot/static_symbol_resolver_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,19 @@ describe('StaticSymbolResolver', () => {
.toBe(symbolResolver.getStaticSymbol('/tmp/src/export.ts', 'exportedObj', ['someMember']));
});

it('should not explore re-exports of the same module', () => {
init({
'/tmp/src/test.ts': `
export * from './test';
export const testValue = 10;
`,
});

const symbols = symbolResolver.getSymbolsOf('/tmp/src/test.ts');
expect(symbols).toEqual([symbolResolver.getStaticSymbol('/tmp/src/test.ts', 'testValue')]);
});

it('should use summaries in resolveSymbol and prefer them over regular metadata', () => {
const symbolA = symbolCache.get('/test.ts', 'a');
const symbolB = symbolCache.get('/test.ts', 'b');
Expand Down

0 comments on commit df17c1e

Please sign in to comment.