@@ -10587,15 +10587,64 @@ module ts {
10587
10587
function getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[] {
10588
10588
let symbols: SymbolTable = {};
10589
10589
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 {
10591
10639
if (symbol.flags & meaning) {
10592
10640
let id = symbol.name;
10593
10641
if (!isReservedMemberName(id) && !hasProperty(symbols, id)) {
10594
10642
symbols[id] = symbol;
10595
10643
}
10596
10644
}
10597
10645
}
10598
- function copySymbols(source: SymbolTable, meaning: SymbolFlags) {
10646
+
10647
+ function copySymbols(source: SymbolTable, meaning: SymbolFlags): void {
10599
10648
if (meaning) {
10600
10649
for (let id in source) {
10601
10650
if (hasProperty(source, id)) {
@@ -10604,42 +10653,6 @@ module ts {
10604
10653
}
10605
10654
}
10606
10655
}
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);
10643
10656
}
10644
10657
10645
10658
function isTypeDeclarationName(name: Node): boolean {
0 commit comments