@@ -13,34 +13,36 @@ namespace ts {
13
13
return getSymbolWalker ;
14
14
15
15
function getSymbolWalker ( accept : ( symbol : Symbol ) => boolean = ( ) => true ) : SymbolWalker {
16
- let visitedTypes : Type [ ] = [ ] ;
17
- let visitedSymbols : Symbol [ ] = [ ] ;
16
+ let visitedTypes = createMap < Type > ( ) ; // Key is id as string
17
+ let visitedSymbols = createMap < Symbol > ( ) ; // Key is id as string
18
18
19
19
return {
20
20
walkType : type =>
21
21
{
22
- visitedTypes = [ ] ;
23
- visitedSymbols = [ ] ;
22
+ visitedTypes . clear ( ) ;
23
+ visitedSymbols . clear ( ) ;
24
24
visitType ( type ) ;
25
- return { visitedTypes, visitedSymbols } ;
25
+ return { visitedTypes : arrayFrom ( visitedTypes . values ( ) ) , visitedSymbols : arrayFrom ( visitedSymbols . values ( ) ) } ;
26
26
} ,
27
27
walkSymbol : symbol =>
28
28
{
29
- visitedTypes = [ ] ;
30
- visitedSymbols = [ ] ;
29
+ visitedTypes . clear ( ) ;
30
+ visitedSymbols . clear ( ) ;
31
31
visitSymbol ( symbol ) ;
32
- return { visitedTypes, visitedSymbols } ;
32
+ return { visitedTypes : arrayFrom ( visitedTypes . values ( ) ) , visitedSymbols : arrayFrom ( visitedSymbols . values ( ) ) } ;
33
33
} ,
34
34
} ;
35
35
36
36
function visitType ( type : Type ) : void {
37
37
if ( ! type ) {
38
38
return ;
39
39
}
40
- if ( contains ( visitedTypes , type ) ) {
40
+
41
+ const typeIdString = type . id . toString ( ) ;
42
+ if ( visitedTypes . has ( typeIdString ) ) {
41
43
return ;
42
44
}
43
- visitedTypes . push ( type ) ;
45
+ visitedTypes . set ( typeIdString , type ) ;
44
46
45
47
// Reuse visitSymbol to visit the type's symbol,
46
48
// but be sure to bail on recuring into the type if accept declines the symbol.
@@ -134,10 +136,11 @@ namespace ts {
134
136
if ( ! symbol ) {
135
137
return ;
136
138
}
137
- if ( contains ( visitedSymbols , symbol ) ) {
139
+ const symbolIdString = getSymbolId ( symbol ) . toString ( ) ;
140
+ if ( visitedSymbols . has ( symbolIdString ) ) {
138
141
return ;
139
142
}
140
- visitedSymbols . push ( symbol ) ;
143
+ visitedSymbols . set ( symbolIdString , symbol ) ;
141
144
if ( ! accept ( symbol ) ) {
142
145
return true ;
143
146
}
0 commit comments