From d921123e1b5ecdb992c440255b8edfb4a60d560c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 27 Mar 2026 11:50:37 +0100 Subject: [PATCH 1/3] Preserve original comments on params in dts generated by pseudo type node builder under removeComments: false --- internal/checker/pseudotypenodebuilder.go | 6 +++++- .../compiler/commentsFunction(target=es2015).js | 6 +++--- .../commentsFunction(target=es2015).js.diff | 15 --------------- 3 files changed, 8 insertions(+), 19 deletions(-) delete mode 100644 testdata/baselines/reference/submodule/compiler/commentsFunction(target=es2015).js.diff diff --git a/internal/checker/pseudotypenodebuilder.go b/internal/checker/pseudotypenodebuilder.go index 07d18e55f20..ab35200a603 100644 --- a/internal/checker/pseudotypenodebuilder.go +++ b/internal/checker/pseudotypenodebuilder.go @@ -258,7 +258,7 @@ func (b *NodeBuilderImpl) pseudoParameterToNode(p *pseudochecker.PseudoParameter if p.Optional { questionMark = b.f.NewToken(ast.KindQuestionToken) } - return b.f.NewParameterDeclaration( + parameter := b.f.NewParameterDeclaration( nil, dotDotDot, // matches strada behavior of always reserializing param names from scratch @@ -267,6 +267,10 @@ func (b *NodeBuilderImpl) pseudoParameterToNode(p *pseudochecker.PseudoParameter b.pseudoTypeToNode(p.Type), nil, ) + if original := p.Name.Parent; ast.IsParameter(original) { + b.setCommentRange(parameter, original) + } + return parameter } // see `typeNodeIsEquivalentToType` in strada, but applied more broadly here, so is setup to handle more equivalences - strada only used it via diff --git a/testdata/baselines/reference/submodule/compiler/commentsFunction(target=es2015).js b/testdata/baselines/reference/submodule/compiler/commentsFunction(target=es2015).js index 200f2da3cbe..98b32a717f8 100644 --- a/testdata/baselines/reference/submodule/compiler/commentsFunction(target=es2015).js +++ b/testdata/baselines/reference/submodule/compiler/commentsFunction(target=es2015).js @@ -112,9 +112,9 @@ b: number): void; /** fooFunc * comment */ -declare var fooFunc: (b: string) => string; -declare var lambdaFoo: (a: number, b: number) => number; -declare var lambddaNoVarComment: (a: number, b: number) => number; +declare var fooFunc: (/** fooFunctionValue param */ b: string) => string; +declare var lambdaFoo: (/**param a*/ a: number, /**param b*/ b: number) => number; +declare var lambddaNoVarComment: (/**param a*/ a: number, /**param b*/ b: number) => number; declare function blah(a: string): void; declare function blah2(a: string): void; declare function blah3(a: string): void; diff --git a/testdata/baselines/reference/submodule/compiler/commentsFunction(target=es2015).js.diff b/testdata/baselines/reference/submodule/compiler/commentsFunction(target=es2015).js.diff deleted file mode 100644 index 0c53b9a1036..00000000000 --- a/testdata/baselines/reference/submodule/compiler/commentsFunction(target=es2015).js.diff +++ /dev/null @@ -1,15 +0,0 @@ ---- old.commentsFunction(target=es2015).js -+++ new.commentsFunction(target=es2015).js -@@= skipped -111, +111 lines =@@ - /** fooFunc - * comment - */ --declare var fooFunc: (/** fooFunctionValue param */ b: string) => string; --declare var lambdaFoo: (/**param a*/ a: number, /**param b*/ b: number) => number; --declare var lambddaNoVarComment: (/**param a*/ a: number, /**param b*/ b: number) => number; -+declare var fooFunc: (b: string) => string; -+declare var lambdaFoo: (a: number, b: number) => number; -+declare var lambddaNoVarComment: (a: number, b: number) => number; - declare function blah(a: string): void; - declare function blah2(a: string): void; - declare function blah3(a: string): void; \ No newline at end of file From ead53f0279a33be3cc4fa357790d8bb87e1690e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 27 Mar 2026 14:46:27 +0100 Subject: [PATCH 2/3] refactor --- internal/checker/pseudotypenodebuilder.go | 6 ++---- internal/pseudochecker/lookup.go | 8 +++++--- internal/pseudochecker/type.go | 13 +++++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/internal/checker/pseudotypenodebuilder.go b/internal/checker/pseudotypenodebuilder.go index ab35200a603..a4e7e9f43f4 100644 --- a/internal/checker/pseudotypenodebuilder.go +++ b/internal/checker/pseudotypenodebuilder.go @@ -262,14 +262,12 @@ func (b *NodeBuilderImpl) pseudoParameterToNode(p *pseudochecker.PseudoParameter nil, dotDotDot, // matches strada behavior of always reserializing param names from scratch - b.parameterToParameterDeclarationName(p.Name.Parent.Symbol(), p.Name.Parent), + b.parameterToParameterDeclarationName(p.Declaration.Symbol, p.Declaration.AsNode()), questionMark, b.pseudoTypeToNode(p.Type), nil, ) - if original := p.Name.Parent; ast.IsParameter(original) { - b.setCommentRange(parameter, original) - } + b.setCommentRange(parameter, p.Declaration.AsNode()) return parameter } diff --git a/internal/pseudochecker/lookup.go b/internal/pseudochecker/lookup.go index 660e0384aa0..36f2a85f13b 100644 --- a/internal/pseudochecker/lookup.go +++ b/internal/pseudochecker/lookup.go @@ -659,11 +659,13 @@ func (ch *PseudoChecker) cloneParameters(nodes *ast.NodeList) []*PseudoParameter } result := make([]*PseudoParameter, 0, len(nodes.Nodes)) for _, e := range nodes.Nodes { + parameter := e.AsParameterDeclaration() result = append(result, NewPseudoParameter( - e.AsParameterDeclaration().DotDotDotToken != nil, + parameter, + parameter.DotDotDotToken != nil, e.Name(), - e.AsParameterDeclaration().QuestionToken != nil || e.AsParameterDeclaration().Initializer != nil, - ch.typeFromParameter(e.AsParameterDeclaration()), + parameter.QuestionToken != nil || parameter.Initializer != nil, + ch.typeFromParameter(parameter), )) } return result diff --git a/internal/pseudochecker/type.go b/internal/pseudochecker/type.go index de2f75db2a2..0546d2a88b2 100644 --- a/internal/pseudochecker/type.go +++ b/internal/pseudochecker/type.go @@ -159,14 +159,15 @@ func (t *PseudoType) AsPseudoTypeUnion() *PseudoTypeUnion { } type PseudoParameter struct { - Rest bool - Name *ast.Node - Optional bool - Type *PseudoType + Declaration *ast.ParameterDeclaration + Rest bool + Name *ast.Node + Optional bool + Type *PseudoType } -func NewPseudoParameter(isRest bool, name *ast.Node, isOptional bool, t *PseudoType) *PseudoParameter { - return &PseudoParameter{Rest: isRest, Name: name, Optional: isOptional, Type: t} +func NewPseudoParameter(declaration *ast.ParameterDeclaration, isRest bool, name *ast.Node, isOptional bool, t *PseudoType) *PseudoParameter { + return &PseudoParameter{Declaration: declaration, Rest: isRest, Name: name, Optional: isOptional, Type: t} } // PseudoTypeSingleCallSignature represents an object type with a single call signature, like an arrow or function expression From 65239b0d26c17f394594a85e9524444a6a8155fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Mon, 30 Mar 2026 12:02:43 +0200 Subject: [PATCH 3/3] just grab everything from `Declaration` --- internal/checker/pseudotypenodebuilder.go | 16 +++++++++------- internal/pseudochecker/lookup.go | 8 +------- internal/pseudochecker/type.go | 7 ++----- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/internal/checker/pseudotypenodebuilder.go b/internal/checker/pseudotypenodebuilder.go index a4e7e9f43f4..0d70d06c470 100644 --- a/internal/checker/pseudotypenodebuilder.go +++ b/internal/checker/pseudotypenodebuilder.go @@ -252,10 +252,10 @@ func (b *NodeBuilderImpl) pseudoParametersToNodeList(params []*pseudochecker.Pse func (b *NodeBuilderImpl) pseudoParameterToNode(p *pseudochecker.PseudoParameter) *ast.Node { var dotDotDot *ast.Node var questionMark *ast.Node - if p.Rest { + if p.Declaration.DotDotDotToken != nil { dotDotDot = b.f.NewToken(ast.KindDotDotDotToken) } - if p.Optional { + if p.Declaration.QuestionToken != nil || p.Declaration.Initializer != nil { questionMark = b.f.NewToken(ast.KindQuestionToken) } parameter := b.f.NewParameterDeclaration( @@ -381,7 +381,8 @@ func (b *NodeBuilderImpl) pseudoTypeEquivalentToType(t *pseudochecker.PseudoType for i, p := range d.Parameters { targetParam := targetSig.parameters[i] paramType := b.ch.getTypeOfParameter(targetParam) - if !b.pseudoTypeEquivalentToType(p.Type, paramType, p.Optional, false) { + isOptional := p.Declaration.QuestionToken != nil || p.Declaration.Initializer != nil + if !b.pseudoTypeEquivalentToType(p.Type, paramType, isOptional, false) { if reportErrors { b.ctx.tracker.ReportInferenceFallback(e.Name.Parent) } @@ -463,16 +464,17 @@ func (b *NodeBuilderImpl) pseudoTypeEquivalentToType(t *pseudochecker.PseudoType } for i, p := range pt.Parameters { targetParam := targetSig.parameters[i] - if p.Optional != b.ch.isOptionalParameter(targetParam.ValueDeclaration) { + isOptional := p.Declaration.QuestionToken != nil || p.Declaration.Initializer != nil + if isOptional != b.ch.isOptionalParameter(targetParam.ValueDeclaration) { if reportErrors { - b.ctx.tracker.ReportInferenceFallback(p.Name.Parent) + b.ctx.tracker.ReportInferenceFallback(p.Declaration.AsNode()) } return false } paramType := b.ch.getTypeOfParameter(targetParam) - if !b.pseudoTypeEquivalentToType(p.Type, paramType, p.Optional, false) { + if !b.pseudoTypeEquivalentToType(p.Type, paramType, isOptional, false) { if reportErrors { - b.ctx.tracker.ReportInferenceFallback(p.Name.Parent) + b.ctx.tracker.ReportInferenceFallback(p.Declaration.AsNode()) } return false } diff --git a/internal/pseudochecker/lookup.go b/internal/pseudochecker/lookup.go index 36f2a85f13b..ea1d835ea6c 100644 --- a/internal/pseudochecker/lookup.go +++ b/internal/pseudochecker/lookup.go @@ -660,13 +660,7 @@ func (ch *PseudoChecker) cloneParameters(nodes *ast.NodeList) []*PseudoParameter result := make([]*PseudoParameter, 0, len(nodes.Nodes)) for _, e := range nodes.Nodes { parameter := e.AsParameterDeclaration() - result = append(result, NewPseudoParameter( - parameter, - parameter.DotDotDotToken != nil, - e.Name(), - parameter.QuestionToken != nil || parameter.Initializer != nil, - ch.typeFromParameter(parameter), - )) + result = append(result, NewPseudoParameter(parameter, ch.typeFromParameter(parameter))) } return result } diff --git a/internal/pseudochecker/type.go b/internal/pseudochecker/type.go index 0546d2a88b2..3f3fe4a1a73 100644 --- a/internal/pseudochecker/type.go +++ b/internal/pseudochecker/type.go @@ -160,14 +160,11 @@ func (t *PseudoType) AsPseudoTypeUnion() *PseudoTypeUnion { type PseudoParameter struct { Declaration *ast.ParameterDeclaration - Rest bool - Name *ast.Node - Optional bool Type *PseudoType } -func NewPseudoParameter(declaration *ast.ParameterDeclaration, isRest bool, name *ast.Node, isOptional bool, t *PseudoType) *PseudoParameter { - return &PseudoParameter{Declaration: declaration, Rest: isRest, Name: name, Optional: isOptional, Type: t} +func NewPseudoParameter(declaration *ast.ParameterDeclaration, t *PseudoType) *PseudoParameter { + return &PseudoParameter{Declaration: declaration, Type: t} } // PseudoTypeSingleCallSignature represents an object type with a single call signature, like an arrow or function expression