From 3e7da4e8d958cc8692ee5778644d66447ed6ae97 Mon Sep 17 00:00:00 2001 From: zanuka Date: Sat, 15 Mar 2025 02:05:05 -0700 Subject: [PATCH 1/2] Fix: Support parameter properties in class constructors --- internal/transformers/runtimesyntax.go | 32 +++++++++++++++++++-- internal/transformers/runtimesyntax_test.go | 23 +++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/internal/transformers/runtimesyntax.go b/internal/transformers/runtimesyntax.go index 22ffa38e54..fa5da4bb9e 100644 --- a/internal/transformers/runtimesyntax.go +++ b/internal/transformers/runtimesyntax.go @@ -810,7 +810,35 @@ func (tx *RuntimeSyntaxTransformer) visitClassExpression(node *ast.ClassExpressi func (tx *RuntimeSyntaxTransformer) visitConstructorDeclaration(node *ast.ConstructorDeclaration) *ast.Node { modifiers := tx.visitor.VisitModifiers(node.Modifiers()) - parameters := tx.emitContext.VisitParameters(node.ParameterList(), tx.visitor) + + var nonParamPropertyParams []*ast.ParameterDeclaration + for _, param := range node.ParameterList().Nodes { + nonParamPropertyParams = append(nonParamPropertyParams, param.AsParameterDeclaration()) + } + + var newParams []*ast.Node + for _, param := range nonParamPropertyParams { + var paramModifiers *ast.ModifierList + if ast.IsParameterPropertyDeclaration(param.AsNode(), node.AsNode()) { + paramModifiers = nil + } else { + paramModifiers = param.Modifiers() + } + + newParam := tx.factory.NewParameterDeclaration( + paramModifiers, + param.DotDotDotToken, + param.Name().Clone(tx.factory), + param.QuestionToken, + nil, + param.Initializer, + ) + newParams = append(newParams, newParam) + } + + parameters := tx.factory.NewNodeList(newParams) + parameters.Loc = node.ParameterList().Loc + body := tx.visitConstructorBody(node.Body.AsBlock(), node.AsNode()) return tx.factory.UpdateConstructorDeclaration(node, modifiers, nil /*typeParameters*/, parameters, nil /*returnType*/, body) } @@ -878,7 +906,7 @@ func (tx *RuntimeSyntaxTransformer) visitConstructorBody(body *ast.Block, constr statements = append(statements, tx.transformConstructorBodyWorker(rest, superPath, parameterPropertyAssignments)...) } else { statements = append(statements, parameterPropertyAssignments...) - statements = append(statements, core.FirstResult(tx.visitor.VisitSlice(rest))...) + statements = append(statements, rest...) } statements = tx.emitContext.EndAndMergeVariableEnvironment(statements) diff --git a/internal/transformers/runtimesyntax_test.go b/internal/transformers/runtimesyntax_test.go index 98ea185363..8299db7cae 100644 --- a/internal/transformers/runtimesyntax_test.go +++ b/internal/transformers/runtimesyntax_test.go @@ -431,6 +431,29 @@ func TestParameterPropertyTransformer(t *testing.T) { constructor(x) { this.x = x; } +}`}, + {title: "multiple parameter properties", input: `class Project { + constructor( + public name: string, + public deadline: Date, + public budget: number + ) {} + + extendDeadline(days: number): void { + this.deadline.setDate(this.deadline.getDate() + days); + } +}`, output: `class Project { + name; + deadline; + budget; + constructor(name, deadline, budget) { + this.name = name; + this.deadline = deadline; + this.budget = budget; + } + extendDeadline(days) { + this.deadline.setDate(this.deadline.getDate() + days); + } }`}, } From d92783c5c119eae5cfb4591b98bacb63308866f0 Mon Sep 17 00:00:00 2001 From: zanuka Date: Sat, 15 Mar 2025 23:46:40 -0700 Subject: [PATCH 2/2] fix: remove extra blank lines in runtimesyntax.go --- internal/transformers/runtimesyntax.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/internal/transformers/runtimesyntax.go b/internal/transformers/runtimesyntax.go index fa5da4bb9e..07af0118f5 100644 --- a/internal/transformers/runtimesyntax.go +++ b/internal/transformers/runtimesyntax.go @@ -810,12 +810,10 @@ func (tx *RuntimeSyntaxTransformer) visitClassExpression(node *ast.ClassExpressi func (tx *RuntimeSyntaxTransformer) visitConstructorDeclaration(node *ast.ConstructorDeclaration) *ast.Node { modifiers := tx.visitor.VisitModifiers(node.Modifiers()) - var nonParamPropertyParams []*ast.ParameterDeclaration for _, param := range node.ParameterList().Nodes { nonParamPropertyParams = append(nonParamPropertyParams, param.AsParameterDeclaration()) } - var newParams []*ast.Node for _, param := range nonParamPropertyParams { var paramModifiers *ast.ModifierList @@ -824,7 +822,6 @@ func (tx *RuntimeSyntaxTransformer) visitConstructorDeclaration(node *ast.Constr } else { paramModifiers = param.Modifiers() } - newParam := tx.factory.NewParameterDeclaration( paramModifiers, param.DotDotDotToken, @@ -835,10 +832,8 @@ func (tx *RuntimeSyntaxTransformer) visitConstructorDeclaration(node *ast.Constr ) newParams = append(newParams, newParam) } - parameters := tx.factory.NewNodeList(newParams) parameters.Loc = node.ParameterList().Loc - body := tx.visitConstructorBody(node.Body.AsBlock(), node.AsNode()) return tx.factory.UpdateConstructorDeclaration(node, modifiers, nil /*typeParameters*/, parameters, nil /*returnType*/, body) }