@@ -1742,7 +1742,19 @@ namespace ts {
1742
1742
}
1743
1743
1744
1744
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
+
1746
1758
function canQualifySymbol(symbolFromSymbolTable: Symbol, meaning: SymbolFlags) {
1747
1759
// If the symbol is equivalent and doesn't need further qualification, this symbol is accessible
1748
1760
if (!needsQualification(symbolFromSymbolTable, enclosingDeclaration, meaning)) {
@@ -1764,34 +1776,36 @@ namespace ts {
1764
1776
}
1765
1777
}
1766
1778
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
+ }
1771
1784
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)) {
1780
1793
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
+ }
1785
1798
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
+ }
1791
1805
}
1792
1806
}
1793
- }
1794
- });
1807
+ });
1808
+ }
1795
1809
}
1796
1810
1797
1811
if (symbol) {
0 commit comments