@@ -1742,7 +1742,19 @@ namespace ts {
17421742 }
17431743
17441744 function getAccessibleSymbolChain(symbol: Symbol, enclosingDeclaration: Node, meaning: SymbolFlags, useOnlyExternalAliasing: boolean): Symbol[] {
1745- function getAccessibleSymbolChainFromSymbolTable(symbols: SymbolTable): Symbol[] {
1745+ function getAccessibleSymbolChainFromSymbolTable(symbols: SymbolTable) {
1746+ return getAccessibleSymbolChainFromSymbolTableWorker(symbols, []);
1747+ }
1748+
1749+ function getAccessibleSymbolChainFromSymbolTableWorker(symbols: SymbolTable, visitedSymbolTables: SymbolTable[]): Symbol[] {
1750+ if (contains(visitedSymbolTables, symbols)) {
1751+ return undefined;
1752+ }
1753+ visitedSymbolTables.push(symbols);
1754+ const result = trySymbolTable(symbols);
1755+ visitedSymbolTables.pop();
1756+ return result;
1757+
17461758 function canQualifySymbol(symbolFromSymbolTable: Symbol, meaning: SymbolFlags) {
17471759 // If the symbol is equivalent and doesn't need further qualification, this symbol is accessible
17481760 if (!needsQualification(symbolFromSymbolTable, enclosingDeclaration, meaning)) {
@@ -1764,34 +1776,36 @@ namespace ts {
17641776 }
17651777 }
17661778
1767- // If symbol is directly available by its name in the symbol table
1768- if (isAccessible(symbols[symbol.name])) {
1769- return [symbol];
1770- }
1779+ function trySymbolTable(symbols: SymbolTable) {
1780+ // If symbol is directly available by its name in the symbol table
1781+ if (isAccessible(symbols[symbol.name])) {
1782+ return [symbol];
1783+ }
17711784
1772- // Check if symbol is any of the alias
1773- return forEachProperty(symbols, symbolFromSymbolTable => {
1774- if (symbolFromSymbolTable.flags & SymbolFlags.Alias
1775- && symbolFromSymbolTable.name !== "export="
1776- && !getDeclarationOfKind(symbolFromSymbolTable, SyntaxKind.ExportSpecifier)) {
1777- if (!useOnlyExternalAliasing || // We can use any type of alias to get the name
1778- // Is this external alias, then use it to name
1779- ts.forEach(symbolFromSymbolTable.declarations, isExternalModuleImportEqualsDeclaration)) {
1785+ // Check if symbol is any of the alias
1786+ return forEachProperty(symbols, symbolFromSymbolTable => {
1787+ if (symbolFromSymbolTable.flags & SymbolFlags.Alias
1788+ && symbolFromSymbolTable.name !== "export="
1789+ && !getDeclarationOfKind(symbolFromSymbolTable, SyntaxKind.ExportSpecifier)) {
1790+ if (!useOnlyExternalAliasing || // We can use any type of alias to get the name
1791+ // Is this external alias, then use it to name
1792+ ts.forEach(symbolFromSymbolTable.declarations, isExternalModuleImportEqualsDeclaration)) {
17801793
1781- const resolvedImportedSymbol = resolveAlias(symbolFromSymbolTable);
1782- if (isAccessible(symbolFromSymbolTable, resolveAlias(symbolFromSymbolTable))) {
1783- return [symbolFromSymbolTable];
1784- }
1794+ const resolvedImportedSymbol = resolveAlias(symbolFromSymbolTable);
1795+ if (isAccessible(symbolFromSymbolTable, resolveAlias(symbolFromSymbolTable))) {
1796+ return [symbolFromSymbolTable];
1797+ }
17851798
1786- // Look in the exported members, if we can find accessibleSymbolChain, symbol is accessible using this chain
1787- // but only if the symbolFromSymbolTable can be qualified
1788- const accessibleSymbolsFromExports = resolvedImportedSymbol.exports ? getAccessibleSymbolChainFromSymbolTable(resolvedImportedSymbol.exports) : undefined;
1789- if (accessibleSymbolsFromExports && canQualifySymbol(symbolFromSymbolTable, getQualifiedLeftMeaning(meaning))) {
1790- return [symbolFromSymbolTable].concat(accessibleSymbolsFromExports);
1799+ // Look in the exported members, if we can find accessibleSymbolChain, symbol is accessible using this chain
1800+ // but only if the symbolFromSymbolTable can be qualified
1801+ const accessibleSymbolsFromExports = resolvedImportedSymbol.exports ? getAccessibleSymbolChainFromSymbolTableWorker(resolvedImportedSymbol.exports, visitedSymbolTables) : undefined;
1802+ if (accessibleSymbolsFromExports && canQualifySymbol(symbolFromSymbolTable, getQualifiedLeftMeaning(meaning))) {
1803+ return [symbolFromSymbolTable].concat(accessibleSymbolsFromExports);
1804+ }
17911805 }
17921806 }
1793- }
1794- });
1807+ });
1808+ }
17951809 }
17961810
17971811 if (symbol) {
0 commit comments