@@ -10587,15 +10587,64 @@ module ts {
1058710587 function getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[] {
1058810588 let symbols: SymbolTable = {};
1058910589 let memberFlags: NodeFlags = 0;
10590- function copySymbol(symbol: Symbol, meaning: SymbolFlags) {
10590+
10591+ if (isInsideWithStatementBody(location)) {
10592+ // We cannot answer semantic questions within a with block, do not proceed any further
10593+ return [];
10594+ }
10595+
10596+ populateSymbols();
10597+
10598+ return mapToArray(symbols);
10599+
10600+ function populateSymbols() {
10601+ while (location) {
10602+ if (location.locals && !isGlobalSourceFile(location)) {
10603+ copySymbols(location.locals, meaning);
10604+ }
10605+
10606+ switch (location.kind) {
10607+ case SyntaxKind.SourceFile:
10608+ if (!isExternalModule(<SourceFile>location)) {
10609+ break;
10610+ }
10611+ case SyntaxKind.ModuleDeclaration:
10612+ copySymbols(getSymbolOfNode(location).exports, meaning & SymbolFlags.ModuleMember);
10613+ break;
10614+ case SyntaxKind.EnumDeclaration:
10615+ copySymbols(getSymbolOfNode(location).exports, meaning & SymbolFlags.EnumMember);
10616+ break;
10617+ case SyntaxKind.ClassDeclaration:
10618+ case SyntaxKind.InterfaceDeclaration:
10619+ if (!(memberFlags & NodeFlags.Static)) {
10620+ copySymbols(getSymbolOfNode(location).members, meaning & SymbolFlags.Type);
10621+ }
10622+ break;
10623+ case SyntaxKind.FunctionExpression:
10624+ if ((<FunctionExpression>location).name) {
10625+ copySymbol(location.symbol, meaning);
10626+ }
10627+ break;
10628+ }
10629+
10630+ memberFlags = location.flags;
10631+ location = location.parent;
10632+ }
10633+
10634+ copySymbols(globals, meaning);
10635+ }
10636+
10637+ // Returns 'true' if we should stop processing symbols.
10638+ function copySymbol(symbol: Symbol, meaning: SymbolFlags): void {
1059110639 if (symbol.flags & meaning) {
1059210640 let id = symbol.name;
1059310641 if (!isReservedMemberName(id) && !hasProperty(symbols, id)) {
1059410642 symbols[id] = symbol;
1059510643 }
1059610644 }
1059710645 }
10598- function copySymbols(source: SymbolTable, meaning: SymbolFlags) {
10646+
10647+ function copySymbols(source: SymbolTable, meaning: SymbolFlags): void {
1059910648 if (meaning) {
1060010649 for (let id in source) {
1060110650 if (hasProperty(source, id)) {
@@ -10604,42 +10653,6 @@ module ts {
1060410653 }
1060510654 }
1060610655 }
10607-
10608- if (isInsideWithStatementBody(location)) {
10609- // We cannot answer semantic questions within a with block, do not proceed any further
10610- return [];
10611- }
10612-
10613- while (location) {
10614- if (location.locals && !isGlobalSourceFile(location)) {
10615- copySymbols(location.locals, meaning);
10616- }
10617- switch (location.kind) {
10618- case SyntaxKind.SourceFile:
10619- if (!isExternalModule(<SourceFile>location)) break;
10620- case SyntaxKind.ModuleDeclaration:
10621- copySymbols(getSymbolOfNode(location).exports, meaning & SymbolFlags.ModuleMember);
10622- break;
10623- case SyntaxKind.EnumDeclaration:
10624- copySymbols(getSymbolOfNode(location).exports, meaning & SymbolFlags.EnumMember);
10625- break;
10626- case SyntaxKind.ClassDeclaration:
10627- case SyntaxKind.InterfaceDeclaration:
10628- if (!(memberFlags & NodeFlags.Static)) {
10629- copySymbols(getSymbolOfNode(location).members, meaning & SymbolFlags.Type);
10630- }
10631- break;
10632- case SyntaxKind.FunctionExpression:
10633- if ((<FunctionExpression>location).name) {
10634- copySymbol(location.symbol, meaning);
10635- }
10636- break;
10637- }
10638- memberFlags = location.flags;
10639- location = location.parent;
10640- }
10641- copySymbols(globals, meaning);
10642- return mapToArray(symbols);
1064310656 }
1064410657
1064510658 function isTypeDeclarationName(name: Node): boolean {
0 commit comments