26
26
import org .openrewrite .javascript .internal .tsc .generated .TSCTypeFlag ;
27
27
import org .openrewrite .javascript .tree .TsType ;
28
28
29
- import java .util .HashSet ;
30
- import java .util .List ;
31
- import java .util .Set ;
32
- import java .util .StringJoiner ;
29
+ import java .util .*;
33
30
34
31
import static org .openrewrite .javascript .internal .tsc .TSCProgramContext .CompilerBridgeSourceKind .ApplicationCode ;
35
32
@@ -39,23 +36,32 @@ public class TypeScriptSignatureBuilder implements JavaTypeSignatureBuilder {
39
36
@ Nullable
40
37
Set <String > typeVariableNameStack ;
41
38
39
+ Map <TSCNode , String > signatures = new IdentityHashMap <>();
40
+
42
41
@ Override
43
42
public String signature (@ Nullable Object object ) {
44
43
if (object == null ) {
45
44
return "{undefined}" ;
46
45
}
47
46
48
47
TSCNode node = (TSCNode ) object ;
48
+ String cached = signatures .get (node );
49
+ if (cached != null ) {
50
+ return cached ;
51
+ }
52
+
49
53
switch (node .syntaxKind ()) {
50
54
case SourceFile :
51
- return mapSourceFileFqn ((TSCNode .SourceFile ) node );
55
+ cached = mapSourceFileFqn ((TSCNode .SourceFile ) node );
56
+ break ;
52
57
case ClassDeclaration :
53
58
case EnumDeclaration :
54
59
case InterfaceDeclaration :
55
60
return node .hasProperty ("typeParameters" ) && !node .getNodeListProperty ("typeParameters" ).isEmpty () ?
56
61
parameterizedSignature (node ) : classSignature (node );
57
62
case ArrayType :
58
- return arraySignature (node );
63
+ cached = arraySignature (node );
64
+ break ;
59
65
case EnumMember :
60
66
return mapEnumMember (node );
61
67
case Identifier :
@@ -69,7 +75,8 @@ public String signature(@Nullable Object object) {
69
75
case TypeOperator :
70
76
return mapTypeOperator (node );
71
77
case TypeParameter :
72
- return genericSignature (node );
78
+ cached = genericSignature (node );
79
+ break ;
73
80
case ExpressionWithTypeArguments :
74
81
case TypeReference :
75
82
case TypeQuery :
@@ -78,8 +85,14 @@ public String signature(@Nullable Object object) {
78
85
return TsType .Union .getFullyQualifiedName ();
79
86
case PropertyDeclaration :
80
87
case VariableDeclaration :
81
- return variableSignature (node );
88
+ cached = variableSignature (node );
89
+ break ;
82
90
}
91
+ if (cached != null ) {
92
+ signatures .put (node , cached );
93
+ return cached ;
94
+ }
95
+
83
96
TSCType type = node .getTypeChecker ().getTypeAtLocation (node );
84
97
return mapType (type );
85
98
}
@@ -299,8 +312,9 @@ private String mapParameter(TSCNode node) {
299
312
300
313
private String mapQualifiedName (TSCNode node ) {
301
314
String left = signature (node .getNodeProperty ("left" ));
302
- if (left .contains ("<" )) {
303
- left = left .substring (0 , left .indexOf ('<' ));
315
+ int index = left .indexOf ('<' );
316
+ if (index != -1 ) {
317
+ left = left .substring (0 , index );
304
318
}
305
319
return left + "$" + node .getNodeProperty ("right" ).getText ();
306
320
}
0 commit comments