Skip to content

Commit 353bc12

Browse files
authored
Add precedence and printing for JSDoc types (#782)
1 parent 25d8ceb commit 353bc12

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed

internal/ast/precedence.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,12 @@ const (
414414
//
415415
TypePrecedenceConditional TypePrecedence = iota
416416

417+
// JSDoc precedence (optional and variadic types)
418+
//
419+
// JSDocType:
420+
// `...`? Type `=`?
421+
TypePrecedenceJSDoc
422+
417423
// Function precedence
418424
//
419425
// Type[Extends]:
@@ -651,6 +657,8 @@ func GetTypeNodePrecedence(n *TypeNode) TypePrecedence {
651657
switch n.Kind {
652658
case KindConditionalType:
653659
return TypePrecedenceConditional
660+
case KindJSDocOptionalType, KindJSDocVariadicType:
661+
return TypePrecedenceJSDoc
654662
case KindFunctionType, KindConstructorType:
655663
return TypePrecedenceFunction
656664
case KindUnionType:
@@ -684,6 +692,9 @@ func GetTypeNodePrecedence(n *TypeNode) TypePrecedence {
684692
KindObjectKeyword,
685693
KindIntrinsicKeyword,
686694
KindVoidKeyword,
695+
KindJSDocAllType,
696+
KindJSDocNullableType,
697+
KindJSDocNonNullableType,
687698
KindLiteralType,
688699
KindTypePredicate,
689700
KindTypeReference,

internal/printer/printer.go

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2258,13 +2258,16 @@ func (p *Printer) emitTypeNode(node *ast.TypeNode, precedence ast.TypePrecedence
22582258
// !!! Should this actually be considered a type?
22592259
p.emitExpressionWithTypeArguments(node.AsExpressionWithTypeArguments())
22602260

2261-
case ast.KindJSDocAllType,
2262-
ast.KindJSDocNullableType,
2263-
ast.KindJSDocNonNullableType,
2264-
ast.KindJSDocOptionalType,
2265-
ast.KindJSDocVariadicType:
2266-
// TODO
2267-
panic("not implemented")
2261+
case ast.KindJSDocAllType:
2262+
p.emitJSDocAllType(node)
2263+
case ast.KindJSDocNonNullableType:
2264+
p.emitJSDocNonNullableType(node.AsJSDocNonNullableType())
2265+
case ast.KindJSDocNullableType:
2266+
p.emitJSDocNullableType(node.AsJSDocNullableType())
2267+
case ast.KindJSDocOptionalType:
2268+
p.emitJSDocOptionalType(node.AsJSDocOptionalType())
2269+
case ast.KindJSDocVariadicType:
2270+
p.emitJSDocVariadicType(node.AsJSDocVariadicType())
22682271

22692272
default:
22702273
panic(fmt.Sprintf("unhandled TypeNode: %v", node.Kind))
@@ -2317,6 +2320,38 @@ func (p *Printer) emitBindingElementNode(node *ast.BindingElementNode) {
23172320
p.emitBindingElement(node.AsBindingElement())
23182321
}
23192322

2323+
func (p *Printer) emitJSDocAllType(node *ast.Node) {
2324+
p.emitKeywordNode(node)
2325+
}
2326+
2327+
func (p *Printer) emitJSDocNonNullableType(node *ast.JSDocNonNullableType) {
2328+
state := p.enterNode(node.AsNode())
2329+
p.writePunctuation("!")
2330+
p.emitTypeNode(node.Type, ast.TypePrecedenceNonArray)
2331+
p.exitNode(node.AsNode(), state)
2332+
}
2333+
2334+
func (p *Printer) emitJSDocNullableType(node *ast.JSDocNullableType) {
2335+
state := p.enterNode(node.AsNode())
2336+
p.writePunctuation("?")
2337+
p.emitTypeNode(node.Type, ast.TypePrecedenceNonArray)
2338+
p.exitNode(node.AsNode(), state)
2339+
}
2340+
2341+
func (p *Printer) emitJSDocOptionalType(node *ast.JSDocOptionalType) {
2342+
state := p.enterNode(node.AsNode())
2343+
p.emitTypeNode(node.Type, ast.TypePrecedenceJSDoc)
2344+
p.writePunctuation("=")
2345+
p.exitNode(node.AsNode(), state)
2346+
}
2347+
2348+
func (p *Printer) emitJSDocVariadicType(node *ast.JSDocVariadicType) {
2349+
state := p.enterNode(node.AsNode())
2350+
p.writePunctuation("...")
2351+
p.emitTypeNode(node.Type, ast.TypePrecedenceJSDoc)
2352+
p.exitNode(node.AsNode(), state)
2353+
}
2354+
23202355
//
23212356
// Expressions
23222357
//

0 commit comments

Comments
 (0)