@@ -308,6 +308,55 @@ function foo(options) {}`
308308 assert .Equal (t , scanner .GetTokenPosOfNode (typeNode , file , false /*includeJSDoc*/ ), strings .Index (sourceText , "{{" )+ 1 )
309309}
310310
311+ func TestJSDocAugmentsTypeArgumentsReparse (t * testing.T ) {
312+ t .Parallel ()
313+ sourceText := `/** @template T */
314+ class A {
315+ static extend() {
316+ return this;
317+ }
318+ }
319+
320+ /** @extends {A<string>} */
321+ class B extends A.extend() {}`
322+ opts := ast.SourceFileParseOptions {
323+ FileName : "/index.js" ,
324+ Path : "/index.js" ,
325+ }
326+
327+ file := parser .ParseSourceFile (opts , sourceText , core .ScriptKindJS )
328+ statements := file .Statements .Nodes
329+ assert .Equal (t , len (statements ), 2 )
330+
331+ classB := statements [1 ]
332+ assert .Assert (t , ast .IsClassDeclaration (classB ))
333+
334+ baseType := ast .GetClassExtendsHeritageElement (classB )
335+ assert .Assert (t , baseType != nil )
336+ assert .Assert (t , ast .IsCallExpression (baseType .Expression ()))
337+
338+ typeArguments := baseType .TypeArguments ()
339+ assert .Equal (t , len (typeArguments ), 1 )
340+
341+ typeArgument := typeArguments [0 ]
342+ assert .Equal (t , typeArgument .Kind , ast .KindStringKeyword )
343+ assert .Assert (t , typeArgument .Flags & ast .NodeFlagsReparsed != 0 )
344+
345+ jsDocs := classB .JSDoc (file )
346+ assert .Equal (t , len (jsDocs ), 1 )
347+
348+ tags := jsDocs [0 ].AsJSDoc ().Tags
349+ assert .Assert (t , tags != nil )
350+ assert .Equal (t , len (tags .Nodes ), 1 )
351+
352+ tag := tags .Nodes [0 ]
353+ assert .Assert (t , ast .IsJSDocAugmentsTag (tag ))
354+
355+ sourceTypeArguments := tag .ClassName ().TypeArguments ()
356+ assert .Equal (t , len (sourceTypeArguments ), 1 )
357+ assert .Equal (t , ast .GetReparsedNodeForNode (sourceTypeArguments [0 ]), typeArgument )
358+ }
359+
311360func TestSourceFilePositionMapWithNonASCIIStringLiteral (t * testing.T ) {
312361 t .Parallel ()
313362 sourceText := `const x = "─";
0 commit comments