Skip to content

Commit 7cd307d

Browse files
committed
print decorators in js printer
1 parent ebc9718 commit 7cd307d

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

internal/js_parser/js_parser_lower.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2375,7 +2375,8 @@ func (p *parser) lowerClass(stmt js_ast.Stmt, expr js_ast.Expr, result visitClas
23752375
if key, ok := prop.Key.Data.(*js_ast.EString); ok {
23762376
isConstructor = helpers.UTF16EqualsString(key.Value, "constructor")
23772377
}
2378-
for i, arg := range fn.Fn.Args {
2378+
args := fn.Fn.Args
2379+
for i, arg := range args {
23792380
for _, decorator := range arg.Decorators {
23802381
// Generate a call to "__decorateParam()" for this parameter decorator
23812382
var decorators *[]js_ast.Expr = &prop.Decorators
@@ -2388,6 +2389,7 @@ func (p *parser) lowerClass(stmt js_ast.Stmt, expr js_ast.Expr, result visitClas
23882389
decorator,
23892390
}),
23902391
)
2392+
args[i].Decorators = nil
23912393
}
23922394
}
23932395
}
@@ -2492,6 +2494,7 @@ func (p *parser) lowerClass(stmt js_ast.Stmt, expr js_ast.Expr, result visitClas
24922494
descriptorKey,
24932495
{Loc: loc, Data: &js_ast.ENumber{Value: descriptorKind}},
24942496
})
2497+
prop.Decorators = nil
24952498

24962499
// Static decorators are grouped after instance decorators
24972500
if prop.Flags.Has(js_ast.PropertyIsStatic) {
@@ -2945,6 +2948,7 @@ func (p *parser) lowerClass(stmt js_ast.Stmt, expr js_ast.Expr, result visitClas
29452948
))
29462949
p.recordUsage(nameForClassDecorators.Ref)
29472950
p.recordUsage(nameForClassDecorators.Ref)
2951+
class.Decorators = nil
29482952
}
29492953
if generatedLocalStmt {
29502954
// "export default class x {}" => "class x {} export {x as default}"

internal/js_printer/js_printer.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,7 @@ func (p *printer) printFnArgs(args []js_ast.Arg, opts fnArgsOpts) {
839839
p.print(",")
840840
p.printSpace()
841841
}
842+
p.printDecorators(arg.Decorators, printDecoratorsAllOnOneLine)
842843
if opts.hasRestArg && i+1 == len(args) {
843844
p.print("...")
844845
}
@@ -863,6 +864,67 @@ func (p *printer) printFn(fn js_ast.Fn) {
863864
p.printBlock(fn.Body.Loc, fn.Body.Block)
864865
}
865866

867+
type printDecorators uint8
868+
869+
const (
870+
printDecoratorsOnSeparateLines printDecorators = iota
871+
printDecoratorsAllOnOneLine
872+
)
873+
874+
func (p *printer) printDecorators(decorators []js_ast.Expr, how printDecorators) {
875+
for _, decorator := range decorators {
876+
wrap := false
877+
expr := decorator
878+
879+
outer:
880+
for {
881+
switch e := expr.Data.(type) {
882+
case *js_ast.EIdentifier, *js_ast.ECall:
883+
// "@foo"
884+
break outer
885+
886+
case *js_ast.EDot:
887+
// "@foo.bar"
888+
expr = e.Target
889+
890+
case *js_ast.EIndex:
891+
if _, ok := e.Index.Data.(*js_ast.EPrivateIdentifier); !ok {
892+
// "@(foo[bar])"
893+
wrap = true
894+
break outer
895+
}
896+
897+
// "@foo.#bar"
898+
expr = e.Target
899+
900+
default:
901+
// "@(foo + bar)"
902+
// "@(() => {})"
903+
wrap = true
904+
break outer
905+
}
906+
}
907+
908+
p.print("@")
909+
if wrap {
910+
p.print("(")
911+
}
912+
p.printExpr(decorator, js_ast.LLowest, 0)
913+
if wrap {
914+
p.print(")")
915+
}
916+
917+
switch how {
918+
case printDecoratorsOnSeparateLines:
919+
p.printNewline()
920+
p.printIndent()
921+
922+
case printDecoratorsAllOnOneLine:
923+
p.printSpace()
924+
}
925+
}
926+
}
927+
866928
func (p *printer) printClass(class js_ast.Class) {
867929
if class.ExtendsOrNil.Data != nil {
868930
p.print(" extends")
@@ -879,6 +941,7 @@ func (p *printer) printClass(class js_ast.Class) {
879941
for _, item := range class.Properties {
880942
p.printSemicolonIfNeeded()
881943
p.printIndent()
944+
p.printDecorators(item.Decorators, printDecoratorsOnSeparateLines)
882945

883946
if item.Kind == js_ast.PropertyClassStaticBlock {
884947
p.addSourceMapping(item.Loc)
@@ -2507,6 +2570,7 @@ func (p *printer) printExpr(expr js_ast.Expr, level js_ast.L, flags printExprFla
25072570
if wrap {
25082571
p.print("(")
25092572
}
2573+
p.printDecorators(e.Class.Decorators, printDecoratorsAllOnOneLine)
25102574
p.printSpaceBeforeIdentifier()
25112575
p.addSourceMapping(expr.Loc)
25122576
p.print("class")
@@ -3737,6 +3801,7 @@ func (p *printer) printStmt(stmt js_ast.Stmt, flags printStmtFlags) {
37373801
p.printNewline()
37383802

37393803
case *js_ast.SClass:
3804+
p.printDecorators(s.Class.Decorators, printDecoratorsOnSeparateLines)
37403805
p.addSourceMapping(stmt.Loc)
37413806
p.printIndent()
37423807
p.printSpaceBeforeIdentifier()
@@ -3759,6 +3824,9 @@ func (p *printer) printStmt(stmt js_ast.Stmt, flags printStmtFlags) {
37593824
case *js_ast.SExportDefault:
37603825
p.addSourceMapping(stmt.Loc)
37613826
p.printIndent()
3827+
if s2, ok := s.Value.Data.(*js_ast.SClass); ok {
3828+
p.printDecorators(s2.Class.Decorators, printDecoratorsOnSeparateLines)
3829+
}
37623830
p.printSpaceBeforeIdentifier()
37633831
p.print("export default")
37643832
p.printSpace()

0 commit comments

Comments
 (0)