@@ -30,6 +30,7 @@ func (p *Parser) reparseCommonJS(node *ast.Node) {
30
30
export .Flags = ast .NodeFlagsReparsed
31
31
export .Loc = bin .Loc
32
32
p .reparseList = append (p .reparseList , export )
33
+ p .setReparsed (node , export )
33
34
p .commonJSModuleIndicator = export
34
35
}
35
36
}
@@ -63,7 +64,7 @@ func (p *Parser) reparseTags(parent *ast.Node, jsDoc []*ast.Node) {
63
64
var t * ast.Node
64
65
switch typeExpression .Kind {
65
66
case ast .KindJSDocTypeExpression :
66
- t = typeExpression .Type ()
67
+ t = p . factory . DeepCloneNode ( typeExpression .Type () )
67
68
case ast .KindJSDocTypeLiteral :
68
69
members := p .nodeSlicePool .NewSlice (0 )
69
70
for _ , member := range typeExpression .AsJSDocTypeLiteral ().JSDocPropertyTags {
@@ -74,7 +75,7 @@ func (p *Parser) reparseTags(parent *ast.Node, jsDoc []*ast.Node) {
74
75
questionToken .Loc = core .NewTextRange (member .Pos (), member .End ())
75
76
questionToken .Flags = p .contextFlags | ast .NodeFlagsReparsed
76
77
}
77
- prop := p .factory .NewPropertySignatureDeclaration (nil , member .Name (), questionToken , member .Type (), nil /*initializer*/ )
78
+ prop := p .factory .NewPropertySignatureDeclaration (nil , p . factory . DeepCloneNode ( member .Name ()) , questionToken , p . factory . DeepCloneNode ( member .Type () ), nil /*initializer*/ )
78
79
prop .Loc = member .Loc
79
80
prop .Flags = p .contextFlags | ast .NodeFlagsReparsed
80
81
members = append (members , prop )
@@ -85,19 +86,30 @@ func (p *Parser) reparseTags(parent *ast.Node, jsDoc []*ast.Node) {
85
86
default :
86
87
panic ("typedef tag type expression should be a name reference or a type expression" + typeExpression .Kind .String ())
87
88
}
88
- typeAlias := p .factory .NewJSTypeAliasDeclaration (modifiers , tag .AsJSDocTypedefTag ().Name (), typeParameters , t )
89
+ typeAlias := p .factory .NewJSTypeAliasDeclaration (modifiers , p . factory . DeepCloneNode ( tag .AsJSDocTypedefTag ().Name () ), typeParameters , t )
89
90
typeAlias .Loc = core .NewTextRange (tag .Pos (), tag .End ())
90
91
typeAlias .Flags = p .contextFlags | ast .NodeFlagsReparsed
92
+ ast .SetParentInChildren (typeAlias )
91
93
p .reparseList = append (p .reparseList , typeAlias )
94
+ p .setReparsed (tag , typeAlias )
92
95
case ast .KindJSDocImportTag :
93
96
importTag := tag .AsJSDocImportTag ()
94
- importClause := importTag . ImportClause . Clone ( & p . factory )
97
+ importClause := p . factory . DeepCloneNode ( importTag . ImportClause )
95
98
importClause .Flags |= ast .NodeFlagsReparsed
99
+ var modifiers * ast.ModifierList
100
+ if importTag .Modifiers () != nil {
101
+ modifiers := importTag .Modifiers ().Clone (& p .factory )
102
+ for i , m := range modifiers .Nodes {
103
+ modifiers .Nodes [i ] = p .factory .DeepCloneNode (m )
104
+ modifiers .Nodes [i ].Flags |= ast .NodeFlagsReparsed
105
+ }
106
+ }
96
107
importClause .AsImportClause ().IsTypeOnly = true
97
- importDeclaration := p .factory .NewJSImportDeclaration (importTag . Modifiers () , importClause , importTag .ModuleSpecifier , importTag .Attributes )
108
+ importDeclaration := p .factory .NewJSImportDeclaration (modifiers , importClause , p . factory . DeepCloneNode ( importTag .ModuleSpecifier ), p . factory . DeepCloneNode ( importTag .Attributes ) )
98
109
importDeclaration .Loc = core .NewTextRange (tag .Pos (), tag .End ())
99
110
importDeclaration .Flags = p .contextFlags | ast .NodeFlagsReparsed
100
111
p .reparseList = append (p .reparseList , importDeclaration )
112
+ p .setReparsed (tag , importDeclaration )
101
113
// !!! @overload and other unattached tags (@callback et al) support goes here
102
114
}
103
115
if ! isLast {
@@ -209,16 +221,15 @@ func (p *Parser) gatherTypeParameters(j *ast.Node) *ast.NodeList {
209
221
constraint := tag .AsJSDocTemplateTag ().Constraint
210
222
for _ , tp := range tag .AsJSDocTemplateTag ().TypeParameters ().Nodes {
211
223
typeParameter := tp .AsTypeParameter ()
212
- var reparse * ast.Node
213
- if constraint == nil {
214
- reparse = typeParameter .Clone (& p .factory )
215
- } else {
216
- clone := constraint .Type ().Clone (& p .factory )
217
- clone .Flags |= ast .NodeFlagsReparsed
218
- reparse = p .factory .NewTypeParameterDeclaration (typeParameter .Modifiers (), typeParameter .Name (), clone , typeParameter .DefaultType )
219
- reparse .Loc = typeParameter .Loc
224
+ reparse := p .factory .DeepCloneNode (tp )
225
+ reparse .Loc = typeParameter .Loc
226
+ if constraint != nil {
227
+ constraintClone := p .factory .DeepCloneNode (constraint .Type ())
228
+ constraintClone .Flags |= ast .NodeFlagsReparsed
229
+ typeParameter .Constraint = constraintClone
220
230
}
221
231
reparse .Flags |= ast .NodeFlagsReparsed
232
+ p .setReparsed (tp , reparse )
222
233
typeParameters = append (typeParameters , reparse )
223
234
}
224
235
}
@@ -255,9 +266,13 @@ func getFunctionLikeHost(host *ast.Node) (*ast.Node, bool) {
255
266
}
256
267
257
268
func (p * Parser ) makeNewTypeAssertion (t * ast.TypeNode , e * ast.Node ) * ast.Node {
258
- assert := p .factory .NewTypeAssertion (t , e )
269
+ if t .Flags & ast .NodeFlagsReparsed == 0 {
270
+ panic ("should only pass reparsed type nodes to makeNewTypeAssertion" )
271
+ }
272
+ assert := p .factory .NewTypeAssertion (t , p .factory .DeepCloneNode (e ))
259
273
assert .Flags = p .contextFlags | ast .NodeFlagsReparsed
260
274
assert .Loc = core .NewTextRange (e .Pos (), e .End ())
275
+ p .setReparsed (e , assert )
261
276
return assert
262
277
}
263
278
@@ -270,10 +285,18 @@ func (p *Parser) makeNewType(typeExpression *ast.TypeNode, host *ast.Node) *ast.
270
285
} else {
271
286
panic ("JSDoc type expression already has a host: " + typeExpression .AsJSDocTypeExpression ().Host .Kind .String ())
272
287
}
273
- t := typeExpression .Type (). Clone ( & p . factory )
288
+ t := p . factory . DeepCloneNode ( typeExpression .Type ())
274
289
t .Flags |= ast .NodeFlagsReparsed
275
290
if host != nil {
276
291
t .Parent = host
277
292
}
293
+ p .setReparsed (typeExpression .Type (), t )
278
294
return t
279
295
}
296
+
297
+ func (p * Parser ) setReparsed (original * ast.Node , reparsed * ast.Node ) {
298
+ if p .reparsedNodes == nil {
299
+ p .reparsedNodes = make (map [* ast.Node ]* ast.Node )
300
+ }
301
+ p .reparsedNodes [original ] = reparsed
302
+ }
0 commit comments