From 9baebcec1a4f1788c186591ef572f724dc4d1e2e Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 21 Aug 2026 23:28:43 -0700 Subject: [PATCH 01/13] Reduce AST method promotion --- tools/scripts/tsc/generate-encoder.ts | 2 +- tools/scripts/tsc/generate-go-ast.ts | 27 ++-- tsc/internal/api/encoder/encoder.go | 2 +- tsc/internal/api/encoder/encoder_generated.go | 8 +- tsc/internal/ast/ast.go | 21 ++- tsc/internal/ast/ast_generated.go | 140 +++++++++--------- tsc/internal/ast/utilities.go | 4 +- tsc/internal/checker/grammarchecks.go | 10 +- tsc/internal/checker/nodebuilder_hover.go | 4 +- tsc/internal/ls/autoimport/fix.go | 10 +- tsc/internal/ls/completions.go | 2 +- tsc/internal/ls/lsutil/organizeimports.go | 2 +- tsc/internal/ls/organizeimports.go | 2 +- tsc/internal/ls/signaturehelp.go | 4 +- tsc/internal/parser/reparser.go | 4 +- tsc/internal/printer/printer_test.go | 6 +- tsc/internal/scanner/scanner_test.go | 34 +++-- .../transformers/declarations/transform.go | 2 +- .../estransforms/optionalchain.go | 2 +- .../moduletransforms/commonjsmodule.go | 4 +- .../tstransforms/legacydecorators.go | 2 +- .../tstransforms/runtimesyntax.go | 2 +- .../transformers/tstransforms/typeeraser.go | 2 +- 23 files changed, 158 insertions(+), 138 deletions(-) diff --git a/tools/scripts/tsc/generate-encoder.ts b/tools/scripts/tsc/generate-encoder.ts index 6bf04ddbcb2d2..bdbbaaaa4532a 100644 --- a/tools/scripts/tsc/generate-encoder.ts +++ b/tools/scripts/tsc/generate-encoder.ts @@ -534,7 +534,7 @@ function generateGoRecordNodeStrings(w: CodeWriter) { const kinds = getGoKinds(node); const castName = goCastName(node); const textAccess = info.textMember.private - ? `node.${castName}().${api.capitalize(info.textMember.name)}()` + ? `node.${castName}().AsNode().${api.capitalize(info.textMember.name)}()` : `node.${castName}().${info.textMember.name}`; w.write(`case ${kinds.join(", ")}:`); diff --git a/tools/scripts/tsc/generate-go-ast.ts b/tools/scripts/tsc/generate-go-ast.ts index b64a685d90d67..496b2b8e0e5d7 100644 --- a/tools/scripts/tsc/generate-go-ast.ts +++ b/tools/scripts/tsc/generate-go-ast.ts @@ -354,6 +354,10 @@ function isNodeFlagsMember(m: MemberInfo): boolean { return type.kind === "primitive" && type.name === "NodeFlags"; } +function concreteNodeMemberAccess(m: MemberInfo): string { + return isNodeFlagsMember(m) ? `node.AsNode().${m.name}` : `node.${m.name}`; +} + function emitNewFactory( w: CodeWriter, funcName: string, @@ -447,11 +451,12 @@ function generateUpdateFactory(w: CodeWriter, node: NodeType) { // Build comparison (all update members) const comparisons = updateMembers.map(m => { const type = m.type; + const access = concreteNodeMemberAccess(m); // Slices can't be compared with != in Go if (type.kind === "list" && type.listKind === "raw") { - return `!core.Same(${m.goParamName()}, node.${m.name})`; + return `!core.Same(${m.goParamName()}, ${access})`; } - return `${m.goParamName()} != node.${m.name}`; + return `${m.goParamName()} != ${access}`; }); w.write(`if ${comparisons.join(" || ")} {`); @@ -460,13 +465,13 @@ function generateUpdateFactory(w: CodeWriter, node: NodeType) { // Call New with all members (Kind from original, everything else from params) const newArgs = members.map(m => { if (m.isKindParam()) { - return "node.Kind"; + return "node.AsNode().Kind"; } return m.goParamName(); }).join(", "); if (node.kindAliases.length > 0) { - w.write("switch node.Kind {"); + w.write("switch node.AsNode().Kind {"); w.push(); w.write(`case ${api.kindType(`SyntaxKind.${node.syntaxKindName}`).formatGoConstant()}:`); w.push(); @@ -480,7 +485,7 @@ function generateUpdateFactory(w: CodeWriter, node: NodeType) { } w.write("default:"); w.push(); - w.write(`panic("unexpected kind in Update${node.name}: " + node.Kind.String())`); + w.write(`panic("unexpected kind in Update${node.name}: " + node.AsNode().Kind.String())`); w.pop(); w.pop(); w.write("}"); @@ -638,7 +643,7 @@ function generateVisitEachChild(w: CodeWriter, node: NodeType) { const args = updateMembers.map(m => { if (!m.isChild()) { - return `node.${m.name}`; + return concreteNodeMemberAccess(m); } // Raw list: use the local variable @@ -683,19 +688,19 @@ function generateClone(w: CodeWriter, node: NodeType) { // Clone is a struct method, so it can access private fields directly const args = members.map(m => { if (m.isKindParam()) { - return "node.Kind"; + return "node.AsNode().Kind"; } const type = m.declaredType; if (m.inherited && type?.kind === "alias" && type.name === "ModifierLike") { - return "node.Modifiers()"; + return "node.AsNode().Modifiers()"; } // Use direct field access (Clone is a struct method, can access private fields) - return `node.${m.name}`; + return concreteNodeMemberAccess(m); }).join(", "); if (node.kindAliases.length > 0) { - w.write("switch node.Kind {"); + w.write("switch node.AsNode().Kind {"); w.push(); w.write(`case ${api.kindType(`SyntaxKind.${node.syntaxKindName}`).formatGoConstant()}:`); w.push(); @@ -709,7 +714,7 @@ function generateClone(w: CodeWriter, node: NodeType) { } w.write("default:"); w.push(); - w.write(`panic("unexpected kind in ${structName}.Clone: " + node.Kind.String())`); + w.write(`panic("unexpected kind in ${structName}.Clone: " + node.AsNode().Kind.String())`); w.pop(); w.pop(); w.write("}"); diff --git a/tsc/internal/api/encoder/encoder.go b/tsc/internal/api/encoder/encoder.go index f318a27c44547..30043eb6ea531 100644 --- a/tsc/internal/api/encoder/encoder.go +++ b/tsc/internal/api/encoder/encoder.go @@ -660,7 +660,7 @@ const noStructuredData = 0xFFFFFFFF func recordExtendedData_SourceFile(node *ast.Node, strs *stringTable, positionMap *ast.PositionMap, extendedData *[]byte, structuredData *[]byte) { sf := node.AsSourceFile() - textIndex := strs.add(sf.Text(), sf.Kind, sf.Pos(), sf.End()) + textIndex := strs.add(sf.Text(), sf.Kind, sf.AsNode().Pos(), sf.AsNode().End()) originalTextIndex := textIndex if sf.OriginalText() != sf.Text() { originalTextIndex = strs.add(sf.OriginalText(), 0, 0, 0) diff --git a/tsc/internal/api/encoder/encoder_generated.go b/tsc/internal/api/encoder/encoder_generated.go index d3e7599e326c7..f3a68ff24400e 100644 --- a/tsc/internal/api/encoder/encoder_generated.go +++ b/tsc/internal/api/encoder/encoder_generated.go @@ -667,13 +667,13 @@ func recordNodeStrings(node *ast.Node, strs *stringTable) uint32 { case ast.KindJsxText: return strs.add(node.AsJsxText().Text, node.Kind, node.Pos(), node.End()) case ast.KindJSDocText: - return strs.add(node.AsJSDocText().Text(), node.Kind, node.Pos(), node.End()) + return strs.add(node.AsJSDocText().AsNode().Text(), node.Kind, node.Pos(), node.End()) case ast.KindJSDocLink: - return strs.add(node.AsJSDocLink().Text(), node.Kind, node.Pos(), node.End()) + return strs.add(node.AsJSDocLink().AsNode().Text(), node.Kind, node.Pos(), node.End()) case ast.KindJSDocLinkPlain: - return strs.add(node.AsJSDocLinkPlain().Text(), node.Kind, node.Pos(), node.End()) + return strs.add(node.AsJSDocLinkPlain().AsNode().Text(), node.Kind, node.Pos(), node.End()) case ast.KindJSDocLinkCode: - return strs.add(node.AsJSDocLinkCode().Text(), node.Kind, node.Pos(), node.End()) + return strs.add(node.AsJSDocLinkCode().AsNode().Text(), node.Kind, node.Pos(), node.End()) default: panic(fmt.Sprintf("Unexpected node kind %v", node.Kind)) } diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index 07b0fdc62c644..79d4f92bd5fad 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -6,6 +6,7 @@ import ( "strings" "sync" "sync/atomic" + "unsafe" "github.com/microsoft/TypeScript/tsc/internal/collections" "github.com/microsoft/TypeScript/tsc/internal/core" @@ -176,7 +177,7 @@ func (list *ModifierList) Clone(f *NodeFactory) *ModifierList { // Interface values stored in AST nodes are never typed nil values. Construction code must ensure that // interface valued properties either store a true nil or a reference to a non-nil struct. -type Node struct { +type nodeFields struct { Kind Kind Flags NodeFlags Loc core.TextRange @@ -185,6 +186,10 @@ type Node struct { data nodeData } +type Node struct { + nodeFields +} + // Node accessors. Some accessors are implemented as methods on NodeData, others are implemented though // type switches. Either approach is fine. Interface methods are likely more performant, but have higher // code size costs because we have hundreds of implementations of the NodeData interface. @@ -1204,10 +1209,12 @@ type nodeData interface { // NodeDefault type NodeDefault struct { - Node + nodeFields } -func (node *NodeDefault) AsNode() *Node { return &node.Node } +func (node *NodeDefault) AsNode() *Node { return (*Node)(unsafe.Pointer(&node.nodeFields)) } +func (node *NodeDefault) Pos() int { return node.Loc.Pos() } +func (node *NodeDefault) End() int { return node.Loc.End() } func (node *NodeDefault) ForEachChild(v Visitor) bool { return false } func (node *NodeDefault) VisitEachChild(v *NodeVisitor) *Node { return node.AsNode() } @@ -1767,10 +1774,10 @@ func (node *BindingElement) computeSubtreeFacts() SubtreeFacts { } func (node *FunctionDeclaration) computeSubtreeFacts() SubtreeFacts { - if node.Body == nil || node.ModifierFlags()&ModifierFlagsAmbient != 0 { + if node.Body == nil || node.AsNode().ModifierFlags()&ModifierFlagsAmbient != 0 { return SubtreeContainsTypeScript } else { - isAsync := node.ModifierFlags()&ModifierFlagsAsync != 0 + isAsync := node.AsNode().ModifierFlags()&ModifierFlagsAsync != 0 isGenerator := node.AsteriskToken != nil return propagateModifierListSubtreeFacts(node.modifiers) | propagateSubtreeFacts(node.AsteriskToken) | @@ -1848,7 +1855,7 @@ func (node *EnumDeclaration) computeSubtreeFacts() SubtreeFacts { } func (node *ModuleDeclaration) computeSubtreeFacts() SubtreeFacts { - if node.ModifierFlags()&ModifierFlagsAmbient != 0 { + if node.AsNode().ModifierFlags()&ModifierFlagsAmbient != 0 { return SubtreeContainsTypeScript } else { return propagateModifierListSubtreeFacts(node.modifiers) | @@ -2065,7 +2072,7 @@ func (node *ArrowFunction) computeSubtreeFacts() SubtreeFacts { propagateEraseableSyntaxSubtreeFacts(node.Type) | propagateEraseableSyntaxSubtreeFacts(node.FullSignature) | propagateSubtreeFacts(node.Body) | - core.IfElse(node.ModifierFlags()&ModifierFlagsAsync != 0, SubtreeContainsAnyAwait, SubtreeFactsNone) + core.IfElse(node.AsNode().ModifierFlags()&ModifierFlagsAsync != 0, SubtreeContainsAnyAwait, SubtreeFactsNone) } func (node *ArrowFunction) propagateSubtreeFacts() SubtreeFacts { diff --git a/tsc/internal/ast/ast_generated.go b/tsc/internal/ast/ast_generated.go index 87c1e59f8653e..32ae17fadba5b 100644 --- a/tsc/internal/ast/ast_generated.go +++ b/tsc/internal/ast/ast_generated.go @@ -603,7 +603,7 @@ func (f *NodeFactory) NewToken(kind TokenSyntaxKind) *Node { } func (node *Token) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewToken(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewToken(node.AsNode().Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsToken(node *Node) bool { @@ -1032,7 +1032,7 @@ func (f *NodeFactory) NewForInOrOfStatement(kind Kind, awaitModifier *AwaitKeywo func (f *NodeFactory) UpdateForInOrOfStatement(node *ForInOrOfStatement, awaitModifier *AwaitKeyword, initializer *ForInitializer, expression *Expression, statement *Statement) *Node { if awaitModifier != node.AwaitModifier || initializer != node.Initializer || expression != node.Expression || statement != node.Statement { - return updateNode(f.NewForInOrOfStatement(node.Kind, awaitModifier, initializer, expression, statement), node.AsNode(), f.hooks) + return updateNode(f.NewForInOrOfStatement(node.AsNode().Kind, awaitModifier, initializer, expression, statement), node.AsNode(), f.hooks) } return node.AsNode() } @@ -1049,7 +1049,7 @@ func (node *ForInOrOfStatement) VisitEachChild(v *NodeVisitor) *Node { } func (node *ForInOrOfStatement) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewForInOrOfStatement(node.Kind, node.AwaitModifier, node.Initializer, node.Expression, node.Statement), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewForInOrOfStatement(node.AsNode().Kind, node.AwaitModifier, node.Initializer, node.Expression, node.Statement), node.AsNode(), f.AsNodeFactory().hooks) } func IsForInStatement(node *Node) bool { @@ -1332,7 +1332,7 @@ func (f *NodeFactory) NewCaseOrDefaultClause(kind Kind, expression *Expression, func (f *NodeFactory) UpdateCaseOrDefaultClause(node *CaseOrDefaultClause, expression *Expression, statements *StatementList) *Node { if expression != node.Expression || statements != node.Statements { - return updateNode(f.NewCaseOrDefaultClause(node.Kind, expression, statements), node.AsNode(), f.hooks) + return updateNode(f.NewCaseOrDefaultClause(node.AsNode().Kind, expression, statements), node.AsNode(), f.hooks) } return node.AsNode() } @@ -1346,7 +1346,7 @@ func (node *CaseOrDefaultClause) VisitEachChild(v *NodeVisitor) *Node { } func (node *CaseOrDefaultClause) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewCaseOrDefaultClause(node.Kind, node.Expression, node.Statements), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewCaseOrDefaultClause(node.AsNode().Kind, node.Expression, node.Statements), node.AsNode(), f.AsNodeFactory().hooks) } func (node *CaseOrDefaultClause) computeSubtreeFacts() SubtreeFacts { @@ -1684,7 +1684,7 @@ func (node *VariableStatement) VisitEachChild(v *NodeVisitor) *Node { } func (node *VariableStatement) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewVariableStatement(node.Modifiers(), node.DeclarationList), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewVariableStatement(node.AsNode().Modifiers(), node.DeclarationList), node.AsNode(), f.AsNodeFactory().hooks) } func IsVariableStatement(node *Node) bool { @@ -1764,7 +1764,7 @@ func (f *NodeFactory) NewVariableDeclarationList(declarations *VariableDeclarati } func (f *NodeFactory) UpdateVariableDeclarationList(node *VariableDeclarationList, declarations *VariableDeclarationNodeList, flags NodeFlags) *Node { - if declarations != node.Declarations || flags != node.Flags { + if declarations != node.Declarations || flags != node.AsNode().Flags { return updateNode(f.NewVariableDeclarationList(declarations, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -1775,11 +1775,11 @@ func (node *VariableDeclarationList) ForEachChild(v Visitor) bool { } func (node *VariableDeclarationList) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateVariableDeclarationList(node, v.visitNodes(node.Declarations), node.Flags) + return v.Factory.UpdateVariableDeclarationList(node, v.visitNodes(node.Declarations), node.AsNode().Flags) } func (node *VariableDeclarationList) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewVariableDeclarationList(node.Declarations, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewVariableDeclarationList(node.Declarations, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsVariableDeclarationList(node *Node) bool { @@ -1804,7 +1804,7 @@ func (f *NodeFactory) NewBindingPattern(kind Kind, elements *BindingElementList) func (f *NodeFactory) UpdateBindingPattern(node *BindingPattern, elements *BindingElementList) *Node { if elements != node.Elements { - return updateNode(f.NewBindingPattern(node.Kind, elements), node.AsNode(), f.hooks) + return updateNode(f.NewBindingPattern(node.AsNode().Kind, elements), node.AsNode(), f.hooks) } return node.AsNode() } @@ -1818,7 +1818,7 @@ func (node *BindingPattern) VisitEachChild(v *NodeVisitor) *Node { } func (node *BindingPattern) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewBindingPattern(node.Kind, node.Elements), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewBindingPattern(node.AsNode().Kind, node.Elements), node.AsNode(), f.AsNodeFactory().hooks) } func IsObjectBindingPattern(node *Node) bool { @@ -1877,7 +1877,7 @@ func (node *ParameterDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ParameterDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewParameterDeclaration(node.Modifiers(), node.DotDotDotToken, node.name, node.QuestionToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewParameterDeclaration(node.AsNode().Modifiers(), node.DotDotDotToken, node.name, node.QuestionToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ParameterDeclaration) Name() *DeclarationName { @@ -1975,7 +1975,7 @@ func (node *MissingDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *MissingDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewMissingDeclaration(node.Modifiers()), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewMissingDeclaration(node.AsNode().Modifiers()), node.AsNode(), f.AsNodeFactory().hooks) } func IsMissingDeclaration(node *Node) bool { @@ -2033,7 +2033,7 @@ func (node *FunctionDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *FunctionDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewFunctionDeclaration(node.Modifiers(), node.AsteriskToken, node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewFunctionDeclaration(node.AsNode().Modifiers(), node.AsteriskToken, node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *FunctionDeclaration) Name() *DeclarationName { @@ -2084,7 +2084,7 @@ func (node *ClassDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ClassDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewClassDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewClassDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ClassDeclaration) Name() *DeclarationName { @@ -2135,7 +2135,7 @@ func (node *ClassExpression) VisitEachChild(v *NodeVisitor) *Node { } func (node *ClassExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewClassExpression(node.Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewClassExpression(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ClassExpression) Name() *DeclarationName { @@ -2233,7 +2233,7 @@ func (node *InterfaceDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *InterfaceDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewInterfaceDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewInterfaceDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) } func (node *InterfaceDeclaration) Name() *DeclarationName { @@ -2280,13 +2280,13 @@ func (f *NodeFactory) NewJSTypeAliasDeclaration(modifiers *ModifierList, name *I func (f *NodeFactory) UpdateTypeAliasDeclaration(node *TypeAliasDeclaration, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, typeNode *TypeNode) *Node { if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || typeNode != node.Type { - switch node.Kind { + switch node.AsNode().Kind { case KindTypeAliasDeclaration: return updateNode(f.NewTypeAliasDeclaration(modifiers, name, typeParameters, typeNode), node.AsNode(), f.hooks) case KindJSTypeAliasDeclaration: return updateNode(f.NewJSTypeAliasDeclaration(modifiers, name, typeParameters, typeNode), node.AsNode(), f.hooks) default: - panic("unexpected kind in UpdateTypeAliasDeclaration: " + node.Kind.String()) + panic("unexpected kind in UpdateTypeAliasDeclaration: " + node.AsNode().Kind.String()) } } return node.AsNode() @@ -2304,13 +2304,13 @@ func (node *TypeAliasDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *TypeAliasDeclaration) Clone(f NodeFactoryCoercible) *Node { - switch node.Kind { + switch node.AsNode().Kind { case KindTypeAliasDeclaration: - return cloneNode(f.AsNodeFactory().NewTypeAliasDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewTypeAliasDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) case KindJSTypeAliasDeclaration: - return cloneNode(f.AsNodeFactory().NewJSTypeAliasDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewJSTypeAliasDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) default: - panic("unexpected kind in TypeAliasDeclaration.Clone: " + node.Kind.String()) + panic("unexpected kind in TypeAliasDeclaration.Clone: " + node.AsNode().Kind.String()) } } @@ -2410,7 +2410,7 @@ func (node *EnumDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *EnumDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewEnumDeclaration(node.Modifiers(), node.name, node.Members), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewEnumDeclaration(node.AsNode().Modifiers(), node.name, node.Members), node.AsNode(), f.AsNodeFactory().hooks) } func (node *EnumDeclaration) Name() *DeclarationName { @@ -2541,13 +2541,13 @@ func (f *NodeFactory) NewJSImportDeclaration(modifiers *ModifierList, importClau func (f *NodeFactory) UpdateImportDeclaration(node *ImportDeclaration, modifiers *ModifierList, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node { if modifiers != node.modifiers || importClause != node.ImportClause || moduleSpecifier != node.ModuleSpecifier || attributes != node.Attributes { - switch node.Kind { + switch node.AsNode().Kind { case KindImportDeclaration: return updateNode(f.NewImportDeclaration(modifiers, importClause, moduleSpecifier, attributes), node.AsNode(), f.hooks) case KindJSImportDeclaration: return updateNode(f.NewJSImportDeclaration(modifiers, importClause, moduleSpecifier, attributes), node.AsNode(), f.hooks) default: - panic("unexpected kind in UpdateImportDeclaration: " + node.Kind.String()) + panic("unexpected kind in UpdateImportDeclaration: " + node.AsNode().Kind.String()) } } return node.AsNode() @@ -2565,13 +2565,13 @@ func (node *ImportDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ImportDeclaration) Clone(f NodeFactoryCoercible) *Node { - switch node.Kind { + switch node.AsNode().Kind { case KindImportDeclaration: - return cloneNode(f.AsNodeFactory().NewImportDeclaration(node.Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewImportDeclaration(node.AsNode().Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) case KindJSImportDeclaration: - return cloneNode(f.AsNodeFactory().NewJSImportDeclaration(node.Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewJSImportDeclaration(node.AsNode().Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) default: - panic("unexpected kind in ImportDeclaration.Clone: " + node.Kind.String()) + panic("unexpected kind in ImportDeclaration.Clone: " + node.AsNode().Kind.String()) } } @@ -2762,7 +2762,7 @@ func (node *ExportAssignment) VisitEachChild(v *NodeVisitor) *Node { } func (node *ExportAssignment) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewExportAssignment(node.Modifiers(), node.IsExportEquals, node.Type, node.Expression), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewExportAssignment(node.AsNode().Modifiers(), node.IsExportEquals, node.Type, node.Expression), node.AsNode(), f.AsNodeFactory().hooks) } func IsExportAssignment(node *Node) bool { @@ -2804,7 +2804,7 @@ func (node *NamespaceExportDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *NamespaceExportDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewNamespaceExportDeclaration(node.Modifiers(), node.name), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewNamespaceExportDeclaration(node.AsNode().Modifiers(), node.name), node.AsNode(), f.AsNodeFactory().hooks) } func (node *NamespaceExportDeclaration) Name() *DeclarationName { @@ -3086,7 +3086,7 @@ func (node *ConstructorDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ConstructorDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewConstructorDeclaration(node.Modifiers(), node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewConstructorDeclaration(node.AsNode().Modifiers(), node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func IsConstructorDeclaration(node *Node) bool { @@ -3135,7 +3135,7 @@ func (node *GetAccessorDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *GetAccessorDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewGetAccessorDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewGetAccessorDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *GetAccessorDeclaration) Name() *DeclarationName { @@ -3188,7 +3188,7 @@ func (node *SetAccessorDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *SetAccessorDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewSetAccessorDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewSetAccessorDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *SetAccessorDeclaration) Name() *DeclarationName { @@ -3237,7 +3237,7 @@ func (node *IndexSignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *IndexSignatureDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewIndexSignatureDeclaration(node.Modifiers(), node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewIndexSignatureDeclaration(node.AsNode().Modifiers(), node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) } func IsIndexSignatureDeclaration(node *Node) bool { @@ -3289,7 +3289,7 @@ func (node *MethodSignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *MethodSignatureDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewMethodSignatureDeclaration(node.Modifiers(), node.name, node.PostfixToken, node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewMethodSignatureDeclaration(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) } func (node *MethodSignatureDeclaration) Name() *DeclarationName { @@ -3353,7 +3353,7 @@ func (node *MethodDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *MethodDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewMethodDeclaration(node.Modifiers(), node.AsteriskToken, node.name, node.PostfixToken, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewMethodDeclaration(node.AsNode().Modifiers(), node.AsteriskToken, node.name, node.PostfixToken, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *MethodDeclaration) Name() *DeclarationName { @@ -3408,7 +3408,7 @@ func (node *PropertySignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *PropertySignatureDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewPropertySignatureDeclaration(node.Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewPropertySignatureDeclaration(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertySignatureDeclaration) Name() *DeclarationName { @@ -3463,7 +3463,7 @@ func (node *PropertyDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *PropertyDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewPropertyDeclaration(node.Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewPropertyDeclaration(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertyDeclaration) Name() *DeclarationName { @@ -3535,7 +3535,7 @@ func (node *ClassStaticBlockDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ClassStaticBlockDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewClassStaticBlockDeclaration(node.Modifiers(), node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewClassStaticBlockDeclaration(node.AsNode().Modifiers(), node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func IsClassStaticBlockDeclaration(node *Node) bool { @@ -3578,7 +3578,7 @@ func (f *NodeFactory) NewKeywordExpression(kind KeywordExpressionSyntaxKind) *No } func (node *KeywordExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewKeywordExpression(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewKeywordExpression(node.AsNode().Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsKeywordExpression(node *Node) bool { @@ -3756,7 +3756,7 @@ func (node *BinaryExpression) VisitEachChild(v *NodeVisitor) *Node { } func (node *BinaryExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewBinaryExpression(node.Modifiers(), node.Left, node.Type, node.OperatorToken, node.Right), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewBinaryExpression(node.AsNode().Modifiers(), node.Left, node.Type, node.OperatorToken, node.Right), node.AsNode(), f.AsNodeFactory().hooks) } func IsBinaryExpression(node *Node) bool { @@ -3939,7 +3939,7 @@ func (node *ArrowFunction) VisitEachChild(v *NodeVisitor) *Node { } func (node *ArrowFunction) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewArrowFunction(node.Modifiers(), node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.EqualsGreaterThanToken, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewArrowFunction(node.AsNode().Modifiers(), node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.EqualsGreaterThanToken, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func IsArrowFunction(node *Node) bool { @@ -3997,7 +3997,7 @@ func (node *FunctionExpression) VisitEachChild(v *NodeVisitor) *Node { } func (node *FunctionExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewFunctionExpression(node.Modifiers(), node.AsteriskToken, node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewFunctionExpression(node.AsNode().Modifiers(), node.AsteriskToken, node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *FunctionExpression) Name() *DeclarationName { @@ -4171,7 +4171,7 @@ func (f *NodeFactory) NewPropertyAccessExpression(expression *Expression, questi } func (f *NodeFactory) UpdatePropertyAccessExpression(node *PropertyAccessExpression, expression *Expression, questionDotToken *QuestionDotToken, name *MemberName, flags NodeFlags) *Node { - if expression != node.Expression || questionDotToken != node.QuestionDotToken || name != node.name || flags != node.Flags { + if expression != node.Expression || questionDotToken != node.QuestionDotToken || name != node.name || flags != node.AsNode().Flags { return updateNode(f.NewPropertyAccessExpression(expression, questionDotToken, name, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4182,11 +4182,11 @@ func (node *PropertyAccessExpression) ForEachChild(v Visitor) bool { } func (node *PropertyAccessExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdatePropertyAccessExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNode(node.name), node.Flags) + return v.Factory.UpdatePropertyAccessExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNode(node.name), node.AsNode().Flags) } func (node *PropertyAccessExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewPropertyAccessExpression(node.Expression, node.QuestionDotToken, node.name, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewPropertyAccessExpression(node.Expression, node.QuestionDotToken, node.name, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertyAccessExpression) Name() *DeclarationName { @@ -4221,7 +4221,7 @@ func (f *NodeFactory) NewElementAccessExpression(expression *Expression, questio } func (f *NodeFactory) UpdateElementAccessExpression(node *ElementAccessExpression, expression *Expression, questionDotToken *QuestionDotToken, argumentExpression *Expression, flags NodeFlags) *Node { - if expression != node.Expression || questionDotToken != node.QuestionDotToken || argumentExpression != node.ArgumentExpression || flags != node.Flags { + if expression != node.Expression || questionDotToken != node.QuestionDotToken || argumentExpression != node.ArgumentExpression || flags != node.AsNode().Flags { return updateNode(f.NewElementAccessExpression(expression, questionDotToken, argumentExpression, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4232,11 +4232,11 @@ func (node *ElementAccessExpression) ForEachChild(v Visitor) bool { } func (node *ElementAccessExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateElementAccessExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNode(node.ArgumentExpression), node.Flags) + return v.Factory.UpdateElementAccessExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNode(node.ArgumentExpression), node.AsNode().Flags) } func (node *ElementAccessExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewElementAccessExpression(node.Expression, node.QuestionDotToken, node.ArgumentExpression, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewElementAccessExpression(node.Expression, node.QuestionDotToken, node.ArgumentExpression, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ElementAccessExpression) computeSubtreeFacts() SubtreeFacts { @@ -4275,7 +4275,7 @@ func (f *NodeFactory) NewCallExpression(expression *Expression, questionDotToken } func (f *NodeFactory) UpdateCallExpression(node *CallExpression, expression *Expression, questionDotToken *QuestionDotToken, typeArguments *TypeList, arguments *ElementList, flags NodeFlags) *Node { - if expression != node.Expression || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || arguments != node.Arguments || flags != node.Flags { + if expression != node.Expression || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || arguments != node.Arguments || flags != node.AsNode().Flags { return updateNode(f.NewCallExpression(expression, questionDotToken, typeArguments, arguments, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4289,11 +4289,11 @@ func (node *CallExpression) ForEachChild(v Visitor) bool { } func (node *CallExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateCallExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNodes(node.Arguments), node.Flags) + return v.Factory.UpdateCallExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNodes(node.Arguments), node.AsNode().Flags) } func (node *CallExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewCallExpression(node.Expression, node.QuestionDotToken, node.TypeArguments, node.Arguments, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewCallExpression(node.Expression, node.QuestionDotToken, node.TypeArguments, node.Arguments, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsCallExpression(node *Node) bool { @@ -4407,7 +4407,7 @@ func (f *NodeFactory) NewNonNullExpression(expression *Expression, flags NodeFla } func (f *NodeFactory) UpdateNonNullExpression(node *NonNullExpression, expression *Expression, flags NodeFlags) *Node { - if expression != node.Expression || flags != node.Flags { + if expression != node.Expression || flags != node.AsNode().Flags { return updateNode(f.NewNonNullExpression(expression, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4418,11 +4418,11 @@ func (node *NonNullExpression) ForEachChild(v Visitor) bool { } func (node *NonNullExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateNonNullExpression(node, v.visitNode(node.Expression), node.Flags) + return v.Factory.UpdateNonNullExpression(node, v.visitNode(node.Expression), node.AsNode().Flags) } func (node *NonNullExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewNonNullExpression(node.Expression, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewNonNullExpression(node.Expression, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsNonNullExpression(node *Node) bool { @@ -4583,7 +4583,7 @@ func (f *NodeFactory) NewTaggedTemplateExpression(tag *Expression, questionDotTo } func (f *NodeFactory) UpdateTaggedTemplateExpression(node *TaggedTemplateExpression, tag *Expression, questionDotToken *QuestionDotToken, typeArguments *TypeList, template *TemplateLiteral, flags NodeFlags) *Node { - if tag != node.Tag || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || template != node.Template || flags != node.Flags { + if tag != node.Tag || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || template != node.Template || flags != node.AsNode().Flags { return updateNode(f.NewTaggedTemplateExpression(tag, questionDotToken, typeArguments, template, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4597,11 +4597,11 @@ func (node *TaggedTemplateExpression) ForEachChild(v Visitor) bool { } func (node *TaggedTemplateExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateTaggedTemplateExpression(node, v.visitNode(node.Tag), v.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNode(node.Template), node.Flags) + return v.Factory.UpdateTaggedTemplateExpression(node, v.visitNode(node.Tag), v.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNode(node.Template), node.AsNode().Flags) } func (node *TaggedTemplateExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewTaggedTemplateExpression(node.Tag, node.QuestionDotToken, node.TypeArguments, node.Template, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewTaggedTemplateExpression(node.Tag, node.QuestionDotToken, node.TypeArguments, node.Template, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsTaggedTemplateExpression(node *Node) bool { @@ -4825,7 +4825,7 @@ func (node *PropertyAssignment) VisitEachChild(v *NodeVisitor) *Node { } func (node *PropertyAssignment) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewPropertyAssignment(node.Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewPropertyAssignment(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertyAssignment) Name() *DeclarationName { @@ -4883,7 +4883,7 @@ func (node *ShorthandPropertyAssignment) VisitEachChild(v *NodeVisitor) *Node { } func (node *ShorthandPropertyAssignment) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewShorthandPropertyAssignment(node.Modifiers(), node.name, node.PostfixToken, node.Type, node.EqualsToken, node.ObjectAssignmentInitializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewShorthandPropertyAssignment(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.Type, node.EqualsToken, node.ObjectAssignmentInitializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ShorthandPropertyAssignment) Name() *DeclarationName { @@ -5112,7 +5112,7 @@ func (f *NodeFactory) NewKeywordTypeNode(kind KeywordTypeSyntaxKind) *Node { } func (node *KeywordTypeNode) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewKeywordTypeNode(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewKeywordTypeNode(node.AsNode().Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsKeywordTypeNode(node *Node) bool { @@ -6091,7 +6091,7 @@ func (node *ConstructorTypeNode) VisitEachChild(v *NodeVisitor) *Node { } func (node *ConstructorTypeNode) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewConstructorTypeNode(node.Modifiers(), node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewConstructorTypeNode(node.AsNode().Modifiers(), node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) } func IsConstructorTypeNode(node *Node) bool { @@ -8068,7 +8068,7 @@ func (node *ModuleDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ModuleDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewModuleDeclaration(node.Modifiers(), node.Keyword, node.name, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewModuleDeclaration(node.AsNode().Modifiers(), node.Keyword, node.name, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ModuleDeclaration) Name() *DeclarationName { @@ -8119,7 +8119,7 @@ func (node *ImportEqualsDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ImportEqualsDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewImportEqualsDeclaration(node.Modifiers(), node.IsTypeOnly, node.name, node.ModuleReference), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewImportEqualsDeclaration(node.AsNode().Modifiers(), node.IsTypeOnly, node.name, node.ModuleReference), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ImportEqualsDeclaration) Name() *DeclarationName { @@ -8174,7 +8174,7 @@ func (node *ExportDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ExportDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewExportDeclaration(node.Modifiers(), node.IsTypeOnly, node.ExportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewExportDeclaration(node.AsNode().Modifiers(), node.IsTypeOnly, node.ExportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) } func IsExportDeclaration(node *Node) bool { @@ -8527,7 +8527,7 @@ func (node *TypeParameterDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *TypeParameterDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewTypeParameterDeclaration(node.Modifiers(), node.name, node.Constraint, node.Expression, node.DefaultType), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewTypeParameterDeclaration(node.AsNode().Modifiers(), node.name, node.Constraint, node.Expression, node.DefaultType), node.AsNode(), f.AsNodeFactory().hooks) } func (node *TypeParameterDeclaration) Name() *DeclarationName { @@ -8650,7 +8650,7 @@ func (f *NodeFactory) NewJSDocParameterOrPropertyTag(kind Kind, tagName *Identif func (f *NodeFactory) UpdateJSDocParameterOrPropertyTag(node *JSDocParameterOrPropertyTag, tagName *IdentifierNode, name *EntityName, isBracketed bool, typeExpression *TypeNode, isNameFirst bool, comment *NodeList) *Node { if tagName != node.TagName || name != node.name || isBracketed != node.IsBracketed || typeExpression != node.TypeExpression || isNameFirst != node.IsNameFirst || comment != node.Comment { - return updateNode(f.NewJSDocParameterOrPropertyTag(node.Kind, tagName, name, isBracketed, typeExpression, isNameFirst, comment), node.AsNode(), f.hooks) + return updateNode(f.NewJSDocParameterOrPropertyTag(node.AsNode().Kind, tagName, name, isBracketed, typeExpression, isNameFirst, comment), node.AsNode(), f.hooks) } return node.AsNode() } @@ -8664,7 +8664,7 @@ func (node *JSDocParameterOrPropertyTag) VisitEachChild(v *NodeVisitor) *Node { } func (node *JSDocParameterOrPropertyTag) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewJSDocParameterOrPropertyTag(node.Kind, node.TagName, node.name, node.IsBracketed, node.TypeExpression, node.IsNameFirst, node.Comment), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewJSDocParameterOrPropertyTag(node.AsNode().Kind, node.TagName, node.name, node.IsBracketed, node.TypeExpression, node.IsNameFirst, node.Comment), node.AsNode(), f.AsNodeFactory().hooks) } func (node *JSDocParameterOrPropertyTag) Name() *DeclarationName { diff --git a/tsc/internal/ast/utilities.go b/tsc/internal/ast/utilities.go index 42058ea2c399f..1dc5bdeca89da 100644 --- a/tsc/internal/ast/utilities.go +++ b/tsc/internal/ast/utilities.go @@ -2951,11 +2951,11 @@ func IsExclusivelyTypeOnlyImportOrExport(node *Node) bool { return node.IsTypeOnly() case KindImportDeclaration, KindJSImportDeclaration: if importClause := node.ImportClause(); importClause != nil { - return importClause.AsImportClause().IsTypeOnly() + return importClause.AsImportClause().AsNode().IsTypeOnly() } case KindJSDocImportTag: if importClause := node.ImportClause(); importClause != nil { - return importClause.AsImportClause().IsTypeOnly() + return importClause.AsImportClause().AsNode().IsTypeOnly() } } return false diff --git a/tsc/internal/checker/grammarchecks.go b/tsc/internal/checker/grammarchecks.go index be8c0af0e6fcb..320362b655e54 100644 --- a/tsc/internal/checker/grammarchecks.go +++ b/tsc/internal/checker/grammarchecks.go @@ -1519,7 +1519,7 @@ func (c *Checker) checkGrammarBindingElement(node *ast.BindingElement) bool { if node.DotDotDotToken != nil { elements := node.Parent.ElementList() if node.AsNode() != core.LastOrNil(elements.Nodes) { - return c.grammarErrorOnNode(&node.Node, diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern) + return c.grammarErrorOnNode(node.AsNode(), diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern) } c.checkGrammarForDisallowedTrailingComma(elements, diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma) @@ -2101,20 +2101,20 @@ func (c *Checker) checkGrammarImportClause(node *ast.ImportClause) bool { switch node.PhaseModifier { case ast.KindTypeKeyword: if node.Flags&ast.NodeFlagsJSDoc == 0 && node.Name() != nil && node.NamedBindings != nil { - return c.grammarErrorOnNode(&node.Node, diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both) + return c.grammarErrorOnNode(node.AsNode(), diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both) } if node.NamedBindings != nil && node.NamedBindings.Kind == ast.KindNamedImports { return c.checkGrammarTypeOnlyNamedImportsOrExports(node.NamedBindings) } case ast.KindDeferKeyword: if node.Name() != nil { - return c.grammarErrorOnNode(&node.Node, diagnostics.Default_imports_are_not_allowed_in_a_deferred_import) + return c.grammarErrorOnNode(node.AsNode(), diagnostics.Default_imports_are_not_allowed_in_a_deferred_import) } if node.NamedBindings != nil && node.NamedBindings.Kind == ast.KindNamedImports { - return c.grammarErrorOnNode(&node.Node, diagnostics.Named_imports_are_not_allowed_in_a_deferred_import) + return c.grammarErrorOnNode(node.AsNode(), diagnostics.Named_imports_are_not_allowed_in_a_deferred_import) } if c.moduleKind != core.ModuleKindESNext && c.moduleKind != core.ModuleKindPreserve { - return c.grammarErrorOnNode(&node.Node, diagnostics.Deferred_imports_are_only_supported_when_the_module_flag_is_set_to_esnext_or_preserve) + return c.grammarErrorOnNode(node.AsNode(), diagnostics.Deferred_imports_are_only_supported_when_the_module_flag_is_set_to_esnext_or_preserve) } } return false diff --git a/tsc/internal/checker/nodebuilder_hover.go b/tsc/internal/checker/nodebuilder_hover.go index fd5cd55f2b0a7..ece5e3f649d80 100644 --- a/tsc/internal/checker/nodebuilder_hover.go +++ b/tsc/internal/checker/nodebuilder_hover.go @@ -218,10 +218,10 @@ func typeElementsToClassElements(f *ast.NodeFactory, members []*ast.Node) []*ast switch m.Kind { case ast.KindPropertySignature: ps := m.AsPropertySignatureDeclaration() - members[i] = f.NewPropertyDeclaration(m.Modifiers(), ps.Name(), ps.QuestionToken(), ps.Type, nil) + members[i] = f.NewPropertyDeclaration(m.Modifiers(), ps.Name(), ps.AsNode().QuestionToken(), ps.Type, nil) case ast.KindMethodSignature: ms := m.AsMethodSignatureDeclaration() - members[i] = f.NewMethodDeclaration(m.Modifiers(), nil, ms.Name(), ms.QuestionToken(), ms.TypeParameters, ms.Parameters, ms.Type, nil, nil) + members[i] = f.NewMethodDeclaration(m.Modifiers(), nil, ms.Name(), ms.AsNode().QuestionToken(), ms.TypeParameters, ms.Parameters, ms.Type, nil, nil) } } return members diff --git a/tsc/internal/ls/autoimport/fix.go b/tsc/internal/ls/autoimport/fix.go index a035f305eaf1d..b1bed0a08d039 100644 --- a/tsc/internal/ls/autoimport/fix.go +++ b/tsc/internal/ls/autoimport/fix.go @@ -217,7 +217,7 @@ func addToExistingImport( importClause := importClauseOrBindingPattern.AsImportClause() // promoteFromTypeOnly = true if we need to promote the entire original clause from type only - promoteFromTypeOnly := importClause.IsTypeOnly() && core.Some(append(namedImports, defaultImport), func(i *newImportBinding) bool { + promoteFromTypeOnly := importClause.AsNode().IsTypeOnly() && core.Some(append(namedImports, defaultImport), func(i *newImportBinding) bool { if i == nil { return false } @@ -242,7 +242,7 @@ func addToExistingImport( identifier = ct.NodeFactory.NewIdentifier(namedImport.propertyName).AsIdentifier().AsNode() } return ct.NodeFactory.NewImportSpecifier( - (!importClause.IsTypeOnly() || promoteFromTypeOnly) && shouldUseTypeOnly(namedImport.addAsTypeOnly, preferences), + (!importClause.AsNode().IsTypeOnly() || promoteFromTypeOnly) && shouldUseTypeOnly(namedImport.addAsTypeOnly, preferences), identifier, ct.NodeFactory.NewIdentifier(namedImport.name), ) @@ -319,7 +319,7 @@ func addToExistingImport( } func getTypeKeywordOfTypeOnlyImport(importClause *ast.ImportClause, sourceFile *ast.SourceFile) *ast.Node { - debug.Assert(importClause.IsTypeOnly(), "import clause must be type-only") + debug.Assert(importClause.AsNode().IsTypeOnly(), "import clause must be type-only") // The first child of a type-only import clause is the 'type' keyword // import type { foo } from './bar' // ^^^^ @@ -753,7 +753,7 @@ func (v *View) tryAddToExistingImport( namedBindings := importClause.NamedBindings // A type-only import may not have both a default and named imports, so the only way a name can // be added to an existing type-only import is adding a named import to existing named bindings. - if importClause.IsTypeOnly() && !(importKind == lsproto.ImportKindNamed && namedBindings != nil) { + if importClause.AsNode().IsTypeOnly() && !(importKind == lsproto.ImportKindNamed && namedBindings != nil) { continue } @@ -779,7 +779,7 @@ func (v *View) tryAddToExistingImport( }, } - isTypeOnly := importClause.IsTypeOnly() + isTypeOnly := importClause.AsNode().IsTypeOnly() // Give preference to putting types in existing type-only imports and avoiding conversions // of import statements to/from type-only. if (addAsTypeOnly != lsproto.AddAsTypeOnlyNotAllowed && isTypeOnly) || diff --git a/tsc/internal/ls/completions.go b/tsc/internal/ls/completions.go index 2aef35353d1b1..2f59e9afb37c6 100644 --- a/tsc/internal/ls/completions.go +++ b/tsc/internal/ls/completions.go @@ -3124,7 +3124,7 @@ func shouldIncludeSymbol( symbolOrigin := checker.SkipAlias(symbol, typeChecker) // We only want to filter out the global keywords. // Auto Imports are not available for scripts so this conditional is always false. - if file.AsSourceFile().ExternalModuleIndicator != nil && + if file.AsNode().AsSourceFile().ExternalModuleIndicator != nil && compilerOptions.AllowUmdGlobalAccess != core.TSTrue && symbol != symbolOrigin && data.symbolToSortTextMap[ast.GetSymbolId(symbol)] == SortTextGlobalsOrKeywords && diff --git a/tsc/internal/ls/lsutil/organizeimports.go b/tsc/internal/ls/lsutil/organizeimports.go index 655cd800c8f53..5a771176913e8 100644 --- a/tsc/internal/ls/lsutil/organizeimports.go +++ b/tsc/internal/ls/lsutil/organizeimports.go @@ -347,7 +347,7 @@ func getImportKindOrder(s1 *ast.Statement) int { return importKindOrderSideEffect } importClause := importDecl.ImportClause.AsImportClause() - if importClause.IsTypeOnly() { + if importClause.AsNode().IsTypeOnly() { return importKindOrderTypeOnly } if importClause.NamedBindings != nil && importClause.NamedBindings.Kind == ast.KindNamespaceImport { diff --git a/tsc/internal/ls/organizeimports.go b/tsc/internal/ls/organizeimports.go index f543d2c4b2f11..96638bf85220e 100644 --- a/tsc/internal/ls/organizeimports.go +++ b/tsc/internal/ls/organizeimports.go @@ -662,7 +662,7 @@ func getCategorizedImports(importDecls []*ast.Statement) categorizedImports { clause := importDecl.AsImportDeclaration().ImportClause.AsImportClause() group := ®ularImports - if clause.IsTypeOnly() { + if clause.AsNode().IsTypeOnly() { group = &typeOnlyImports } diff --git a/tsc/internal/ls/signaturehelp.go b/tsc/internal/ls/signaturehelp.go index 25495583a9612..6727b7a15df98 100644 --- a/tsc/internal/ls/signaturehelp.go +++ b/tsc/internal/ls/signaturehelp.go @@ -1246,13 +1246,13 @@ func getChildListThatStartsWithOpenerToken(parent *ast.Node, openerToken *ast.No if ast.IsCallExpression(parent) { parentCallExpression := parent.AsCallExpression() if openerToken.Kind == ast.KindLessThanToken { - return parentCallExpression.TypeArgumentList() + return parentCallExpression.AsNode().TypeArgumentList() } return parentCallExpression.Arguments } else if ast.IsNewExpression(parent) { parentNewExpression := parent.AsNewExpression() if openerToken.Kind == ast.KindLessThanToken { - return parentNewExpression.TypeArgumentList() + return parentNewExpression.AsNode().TypeArgumentList() } return parentNewExpression.Arguments } diff --git a/tsc/internal/parser/reparser.go b/tsc/internal/parser/reparser.go index fce97c480286c..1abb0488bdd6e 100644 --- a/tsc/internal/parser/reparser.go +++ b/tsc/internal/parser/reparser.go @@ -370,7 +370,7 @@ func (p *Parser) reparseHosted(tag *ast.Node, parent *ast.Node, jsDoc *ast.Node) if parent.Expression().Kind == ast.KindBinaryExpression { bin := parent.Expression().AsBinaryExpression() if kind := ast.GetAssignmentDeclarationKind(bin.AsNode()); kind != ast.JSDeclarationKindNone && tag.TypeExpression() != nil { - bin.AsMutable().SetType(p.addDeepCloneReparse(tag.TypeExpression().Type())) + bin.AsNode().AsMutable().SetType(p.addDeepCloneReparse(tag.TypeExpression().Type())) p.finishMutatedNode(bin.AsNode()) return } @@ -474,7 +474,7 @@ func (p *Parser) reparseHosted(tag *ast.Node, parent *ast.Node, jsDoc *ast.Node) parameterTag := tag.AsJSDocParameterOrPropertyTag() if param, ok := findMatchingParameter(fun, parameterTag, jsDoc); ok { if param.Type == nil && parameterTag.TypeExpression != nil { - param.AsParameterDeclaration().Type = p.reparseJSDocTypeLiteral(parameterTag.TypeExpression.Type()) + param.AsNode().AsParameterDeclaration().Type = p.reparseJSDocTypeLiteral(parameterTag.TypeExpression.Type()) } if param.QuestionToken == nil { if question := p.makeQuestionIfOptional(parameterTag); question != nil { diff --git a/tsc/internal/printer/printer_test.go b/tsc/internal/printer/printer_test.go index 3b108fd1a79b1..114f5e246c466 100644 --- a/tsc/internal/printer/printer_test.go +++ b/tsc/internal/printer/printer_test.go @@ -2482,7 +2482,7 @@ func TestNoTrailingCommaAfterTransform(t *testing.T) { }) file = visitor.VisitSourceFile(file) - emittestutil.CheckEmit(t, emitContext, file.AsSourceFile(), "[a];") + emittestutil.CheckEmit(t, emitContext, file.AsNode().AsSourceFile(), "[a];") } func TestTrailingCommaAfterTransform(t *testing.T) { @@ -2503,7 +2503,7 @@ func TestTrailingCommaAfterTransform(t *testing.T) { }) file = visitor.VisitSourceFile(file) - emittestutil.CheckEmit(t, emitContext, file.AsSourceFile(), "[a,];") + emittestutil.CheckEmit(t, emitContext, file.AsNode().AsSourceFile(), "[a,];") } func TestPartiallyEmittedExpression(t *testing.T) { @@ -2518,7 +2518,7 @@ func TestPartiallyEmittedExpression(t *testing.T) { emitContext := printer.NewEmitContext() file = tstransforms.NewTypeEraserTransformer(&transformers.TransformOptions{CompilerOptions: compilerOptions, Context: emitContext}).TransformSourceFile(file) - emittestutil.CheckEmit(t, emitContext, file.AsSourceFile(), `return container.parent + emittestutil.CheckEmit(t, emitContext, file.AsNode().AsSourceFile(), `return container.parent .left .expression .expression;`) diff --git a/tsc/internal/scanner/scanner_test.go b/tsc/internal/scanner/scanner_test.go index 5c50a17fe0f59..038a6d9866850 100644 --- a/tsc/internal/scanner/scanner_test.go +++ b/tsc/internal/scanner/scanner_test.go @@ -49,20 +49,29 @@ func TestNormalizeJSDocTypeSourceText(t *testing.T) { func TestIsJSDocTypeExpressionOrChild(t *testing.T) { t.Parallel() - jsDocType := &ast.Node{Kind: ast.KindTypeReference, Flags: ast.NodeFlagsJSDoc} - jsDocTypeChild := &ast.Node{Kind: ast.KindIdentifier, Flags: ast.NodeFlagsJSDoc, Parent: jsDocType} - reparsedType := &ast.Node{Kind: ast.KindTypeLiteral, Flags: ast.NodeFlagsReparsed} - reparsedTypeChild := &ast.Node{Kind: ast.KindIdentifier, Flags: ast.NodeFlagsReparsed, Parent: reparsedType} - ordinaryType := &ast.Node{Kind: ast.KindTypeReference} - jsDocTag := &ast.Node{Kind: ast.KindJSDocParameterTag, Flags: ast.NodeFlagsJSDoc} - jsDocTagChild := &ast.Node{Kind: ast.KindIdentifier, Flags: ast.NodeFlagsJSDoc, Parent: jsDocTag} + jsDocType := &ast.Node{} + jsDocType.Kind, jsDocType.Flags = ast.KindTypeReference, ast.NodeFlagsJSDoc + jsDocTypeChild := &ast.Node{} + jsDocTypeChild.Kind, jsDocTypeChild.Flags, jsDocTypeChild.Parent = ast.KindIdentifier, ast.NodeFlagsJSDoc, jsDocType + reparsedType := &ast.Node{} + reparsedType.Kind, reparsedType.Flags = ast.KindTypeLiteral, ast.NodeFlagsReparsed + reparsedTypeChild := &ast.Node{} + reparsedTypeChild.Kind, reparsedTypeChild.Flags, reparsedTypeChild.Parent = ast.KindIdentifier, ast.NodeFlagsReparsed, reparsedType + ordinaryType := &ast.Node{} + ordinaryType.Kind = ast.KindTypeReference + jsDocTag := &ast.Node{} + jsDocTag.Kind, jsDocTag.Flags = ast.KindJSDocParameterTag, ast.NodeFlagsJSDoc + jsDocTagChild := &ast.Node{} + jsDocTagChild.Kind, jsDocTagChild.Flags, jsDocTagChild.Parent = ast.KindIdentifier, ast.NodeFlagsJSDoc, jsDocTag + jsDocTypeExpression := &ast.Node{} + jsDocTypeExpression.Kind = ast.KindJSDocTypeExpression tests := []struct { name string node *ast.Node expected bool }{ - {name: "type expression", node: &ast.Node{Kind: ast.KindJSDocTypeExpression}, expected: true}, + {name: "type expression", node: jsDocTypeExpression, expected: true}, {name: "JSDoc type", node: jsDocType, expected: true}, {name: "JSDoc type child", node: jsDocTypeChild, expected: true}, {name: "reparsed type", node: reparsedType, expected: true}, @@ -83,11 +92,10 @@ func TestGetTextOfNodeFromJSDocTypePreservesAsteriskType(t *testing.T) { t.Parallel() sourceText := strings.Join([]string{"", " * *"}, core.NewLineKindLF.GetNewLineCharacter()) - node := &ast.Node{ - Kind: ast.KindJSDocAllType, - Flags: ast.NodeFlagsJSDoc, - Loc: core.NewTextRange(0, len(sourceText)), - } + node := &ast.Node{} + node.Kind = ast.KindJSDocAllType + node.Flags = ast.NodeFlagsJSDoc + node.Loc = core.NewTextRange(0, len(sourceText)) assert.Equal(t, GetTextOfNodeFromSourceText(sourceText, node, false /*includeTrivia*/), "*") } diff --git a/tsc/internal/transformers/declarations/transform.go b/tsc/internal/transformers/declarations/transform.go index 08e26b96a82fd..3bf6758e0c855 100644 --- a/tsc/internal/transformers/declarations/transform.go +++ b/tsc/internal/transformers/declarations/transform.go @@ -2933,7 +2933,7 @@ func (tx *DeclarationTransformer) createFullExpandoBlock(id ast.NodeId) *ast.Nod var host []*ast.Node if n != nil && n.Kind == ast.KindSyntaxList { // find the first named syntax list element and use its' name & modifiers - for c := range n.AsSyntaxList().IterChildren() { + for c := range n.AsSyntaxList().AsNode().IterChildren() { if c.Name() != nil { name = c.Name().Clone(tx.Factory()) if c.Modifiers() != nil { diff --git a/tsc/internal/transformers/estransforms/optionalchain.go b/tsc/internal/transformers/estransforms/optionalchain.go index 33b269280f594..c4a4ab3d9ed4a 100644 --- a/tsc/internal/transformers/estransforms/optionalchain.go +++ b/tsc/internal/transformers/estransforms/optionalchain.go @@ -91,7 +91,7 @@ func (ch *optionalChainTransformer) visitPropertyOrElementAccessExpression(node expression = ch.Factory().UpdatePropertyAccessExpression(p, expression, nil /*questionDotToken*/, ch.Visitor().VisitNode(p.Name()), p.Flags) } else { p := node.AsElementAccessExpression() - expression = ch.Factory().UpdateElementAccessExpression(p, expression, nil, ch.Visitor().VisitNode(p.AsElementAccessExpression().ArgumentExpression), p.Flags) + expression = ch.Factory().UpdateElementAccessExpression(p, expression, nil, ch.Visitor().VisitNode(p.AsNode().AsElementAccessExpression().ArgumentExpression), p.Flags) } if thisArg != nil { diff --git a/tsc/internal/transformers/moduletransforms/commonjsmodule.go b/tsc/internal/transformers/moduletransforms/commonjsmodule.go index 9e7ca97dbe241..75ad72c619d66 100644 --- a/tsc/internal/transformers/moduletransforms/commonjsmodule.go +++ b/tsc/internal/transformers/moduletransforms/commonjsmodule.go @@ -1811,7 +1811,7 @@ func (tx *CommonJSModuleTransformer) visitCallExpression(node *ast.CallExpressio return tx.visitImportCallExpression(node, needsRewrite) } if needsRewrite { - return tx.shimOrRewriteImportOrRequireCall(node.AsCallExpression()) + return tx.shimOrRewriteImportOrRequireCall(node.AsNode().AsCallExpression()) } if ast.IsIdentifier(node.Expression) { // given: @@ -2093,7 +2093,7 @@ func (tx *CommonJSModuleTransformer) visitExpressionIdentifier(node *ast.Identif return reference } if ast.IsImportSpecifier(importDeclaration) { - name := importDeclaration.AsImportSpecifier().PropertyNameOrName() + name := importDeclaration.AsImportSpecifier().AsNode().PropertyNameOrName() decl := ast.FindAncestor(importDeclaration, ast.IsImportDeclaration) target := tx.Factory().NewGeneratedNameForNode(core.Coalesce(decl, importDeclaration)) var reference *ast.Node diff --git a/tsc/internal/transformers/tstransforms/legacydecorators.go b/tsc/internal/transformers/tstransforms/legacydecorators.go index 8eaa45e5071ad..91fe7d45961ad 100644 --- a/tsc/internal/transformers/tstransforms/legacydecorators.go +++ b/tsc/internal/transformers/tstransforms/legacydecorators.go @@ -663,7 +663,7 @@ type allDecorators struct { * @internal */ func getAllDecoratorsOfClass(node *ast.ClassDeclaration, useLegacyDecorators bool) *allDecorators { - decorators := node.Decorators() + decorators := node.AsNode().Decorators() var parameters [][]*ast.Node if useLegacyDecorators { parameters = getDecoratorsOfParameters(ast.GetFirstConstructorWithBody(node.AsNode())) diff --git a/tsc/internal/transformers/tstransforms/runtimesyntax.go b/tsc/internal/transformers/tstransforms/runtimesyntax.go index 35c29262606b0..0a912376640c8 100644 --- a/tsc/internal/transformers/tstransforms/runtimesyntax.go +++ b/tsc/internal/transformers/tstransforms/runtimesyntax.go @@ -749,7 +749,7 @@ 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()) + parameters := tx.EmitContext().VisitParameters(node.AsNode().ParameterList(), tx.Visitor()) body := tx.visitConstructorBody(node.Body.AsBlock(), node.AsNode()) return tx.Factory().UpdateConstructorDeclaration(node, modifiers, nil /*typeParameters*/, parameters, nil /*returnType*/, nil /*fullSignature*/, body) } diff --git a/tsc/internal/transformers/tstransforms/typeeraser.go b/tsc/internal/transformers/tstransforms/typeeraser.go index 0951065f645a4..d185112fb31b9 100644 --- a/tsc/internal/transformers/tstransforms/typeeraser.go +++ b/tsc/internal/transformers/tstransforms/typeeraser.go @@ -310,7 +310,7 @@ func (tx *TypeEraserTransformer) visit(node *ast.Node) *ast.Node { case ast.KindImportClause: n := node.AsImportClause() - if n.IsTypeOnly() { + if n.AsNode().IsTypeOnly() { // Always elide type-only imports return nil } From 8f8cf14fc33ff1f3826dc479b9d0082ac5082a9d Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:24:44 -0700 Subject: [PATCH 02/13] Generate AST node data accessor dispatch Replace nine nodeData interface methods with generated Kind-switch dispatchers to reduce interface method promotion and itab size. --- tools/scripts/tsc/generate-go-ast.ts | 58 ++++ tsc/internal/ast/ast.go | 40 +-- tsc/internal/ast/ast_generated.go | 419 +++++++++++++++++++++++++++ 3 files changed, 487 insertions(+), 30 deletions(-) diff --git a/tools/scripts/tsc/generate-go-ast.ts b/tools/scripts/tsc/generate-go-ast.ts index 496b2b8e0e5d7..a277c8ba35031 100644 --- a/tools/scripts/tsc/generate-go-ast.ts +++ b/tools/scripts/tsc/generate-go-ast.ts @@ -608,6 +608,57 @@ function generateForEachChildDispatch(w: CodeWriter) { w.write(""); } +const NODE_DATA_ACCESSORS: { method: string; ret: string; base: string; }[] = [ + { method: "FlowNodeData", ret: "*FlowNodeBase", base: "FlowNodeBase" }, + { method: "DeclarationData", ret: "*DeclarationBase", base: "DeclarationBase" }, + { method: "ExportableData", ret: "*ExportableBase", base: "ExportableBase" }, + { method: "LocalsContainerData", ret: "*LocalsContainerBase", base: "LocalsContainerBase" }, + { method: "FunctionLikeData", ret: "*FunctionLikeBase", base: "FunctionLikeBase" }, + { method: "ClassLikeData", ret: "*ClassLikeBase", base: "ClassLikeBase" }, + { method: "BodyData", ret: "*BodyBase", base: "BodyBase" }, + { method: "LiteralLikeData", ret: "*LiteralLikeNodeBase", base: "LiteralLikeNodeBase" }, + { method: "TemplateLiteralLikeData", ret: "*TemplateLiteralLikeNodeBase", base: "TemplateLiteralLikeNodeBase" }, +]; + +function transitiveBaseKeys(node: NodeType): Set { + const seen = new Set(); + const visit = (n: NodeType) => { + for (const base of n.extends) { + if (!seen.has(base.key)) { + seen.add(base.key); + visit(base); + } + } + }; + visit(node); + return seen; +} + +function generateNodeDataAccessors(w: CodeWriter) { + for (const { method, ret, base } of NODE_DATA_ACCESSORS) { + w.write(`func (n *Node) ${method}() ${ret} {`); + w.push(); + w.write("switch n.Kind {"); + for (const node of api.nodes()) { + if (!transitiveBaseKeys(node).has(base)) continue; + const kinds = node.allKinds().map(k => k.formatGoConstant()); + if (kinds.length === 0) continue; + w.write(`case ${kinds.join(", ")}:`); + w.push(); + w.write(`return n.data.(*${node.name}).${method}()`); + w.pop(); + } + w.write("default:"); + w.push(); + w.write("return nil"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); + } +} + // ── Generate VisitEachChild() ────────────────────────────────────────────── function generateVisitEachChild(w: CodeWriter, node: NodeType) { @@ -956,6 +1007,13 @@ function generate(): string { w.write(""); generateForEachChildDispatch(w); + // nodeData accessor dispatch + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write("// nodeData accessor dispatch"); + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write(""); + generateNodeDataAccessors(w); + // As*() casts w.write("// ──────────────────────────────────────────────────────────────────────"); w.write("// As*() cast methods"); diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index 79d4f92bd5fad..7de037082bf9a 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -209,27 +209,16 @@ func (n *Node) IterChildren() iter.Seq[*Node] { }) } } -func (n *Node) Clone(f NodeFactoryCoercible) *Node { return n.data.Clone(f) } -func (n *Node) VisitEachChild(v *NodeVisitor) *Node { return n.data.VisitEachChild(v) } -func (n *Node) Name() *DeclarationName { return n.data.Name() } -func (n *Node) Modifiers() *ModifierList { return n.data.Modifiers() } -func (n *Node) FlowNodeData() *FlowNodeBase { return n.data.FlowNodeData() } -func (n *Node) DeclarationData() *DeclarationBase { return n.data.DeclarationData() } -func (n *Node) ExportableData() *ExportableBase { return n.data.ExportableData() } -func (n *Node) LocalsContainerData() *LocalsContainerBase { return n.data.LocalsContainerData() } -func (n *Node) FunctionLikeData() *FunctionLikeBase { return n.data.FunctionLikeData() } -func (n *Node) ParameterList() *ParameterList { return n.data.FunctionLikeData().Parameters } -func (n *Node) Parameters() []*ParameterDeclarationNode { return n.ParameterList().Nodes } -func (n *Node) ClassLikeData() *ClassLikeBase { return n.data.ClassLikeData() } -func (n *Node) BodyData() *BodyBase { return n.data.BodyData() } -func (n *Node) SubtreeFacts() SubtreeFacts { return n.data.SubtreeFacts() } -func (n *Node) propagateSubtreeFacts() SubtreeFacts { return n.data.propagateSubtreeFacts() } -func (n *Node) LiteralLikeData() *LiteralLikeNodeBase { return n.data.LiteralLikeData() } -func (n *Node) TemplateLiteralLikeData() *TemplateLiteralLikeNodeBase { - return n.data.TemplateLiteralLikeData() -} -func (n *Node) KindString() string { return n.Kind.String() } -func (n *Node) KindValue() int16 { return int16(n.Kind) } +func (n *Node) Clone(f NodeFactoryCoercible) *Node { return n.data.Clone(f) } +func (n *Node) VisitEachChild(v *NodeVisitor) *Node { return n.data.VisitEachChild(v) } +func (n *Node) Name() *DeclarationName { return n.data.Name() } +func (n *Node) Modifiers() *ModifierList { return n.data.Modifiers() } +func (n *Node) ParameterList() *ParameterList { return n.FunctionLikeData().Parameters } +func (n *Node) Parameters() []*ParameterDeclarationNode { return n.ParameterList().Nodes } +func (n *Node) SubtreeFacts() SubtreeFacts { return n.data.SubtreeFacts() } +func (n *Node) propagateSubtreeFacts() SubtreeFacts { return n.data.propagateSubtreeFacts() } +func (n *Node) KindString() string { return n.Kind.String() } +func (n *Node) KindValue() int16 { return int16(n.Kind) } func (n *Node) Decorators() []*Node { if n.Modifiers() == nil { return nil @@ -1191,15 +1180,6 @@ type nodeData interface { Name() *DeclarationName Modifiers() *ModifierList setModifiers(modifiers *ModifierList) - FlowNodeData() *FlowNodeBase - DeclarationData() *DeclarationBase - ExportableData() *ExportableBase - LocalsContainerData() *LocalsContainerBase - FunctionLikeData() *FunctionLikeBase - ClassLikeData() *ClassLikeBase - BodyData() *BodyBase - LiteralLikeData() *LiteralLikeNodeBase - TemplateLiteralLikeData() *TemplateLiteralLikeNodeBase SubtreeFacts() SubtreeFacts computeSubtreeFacts() SubtreeFacts subtreeFactsWorker(self nodeData) SubtreeFacts diff --git a/tsc/internal/ast/ast_generated.go b/tsc/internal/ast/ast_generated.go index 32ae17fadba5b..115df0a0f1989 100644 --- a/tsc/internal/ast/ast_generated.go +++ b/tsc/internal/ast/ast_generated.go @@ -9024,6 +9024,425 @@ func (n *Node) ForEachChild(v Visitor) bool { } } +// ────────────────────────────────────────────────────────────────────── +// nodeData accessor dispatch +// ────────────────────────────────────────────────────────────────────── + +func (n *Node) FlowNodeData() *FlowNodeBase { + switch n.Kind { + case KindIdentifier: + return n.data.(*Identifier).FlowNodeData() + case KindQualifiedName: + return n.data.(*QualifiedName).FlowNodeData() + case KindEmptyStatement: + return n.data.(*EmptyStatement).FlowNodeData() + case KindIfStatement: + return n.data.(*IfStatement).FlowNodeData() + case KindDoStatement: + return n.data.(*DoStatement).FlowNodeData() + case KindWhileStatement: + return n.data.(*WhileStatement).FlowNodeData() + case KindForStatement: + return n.data.(*ForStatement).FlowNodeData() + case KindForInStatement, KindForOfStatement: + return n.data.(*ForInOrOfStatement).FlowNodeData() + case KindBreakStatement: + return n.data.(*BreakStatement).FlowNodeData() + case KindContinueStatement: + return n.data.(*ContinueStatement).FlowNodeData() + case KindReturnStatement: + return n.data.(*ReturnStatement).FlowNodeData() + case KindWithStatement: + return n.data.(*WithStatement).FlowNodeData() + case KindSwitchStatement: + return n.data.(*SwitchStatement).FlowNodeData() + case KindThrowStatement: + return n.data.(*ThrowStatement).FlowNodeData() + case KindTryStatement: + return n.data.(*TryStatement).FlowNodeData() + case KindDebuggerStatement: + return n.data.(*DebuggerStatement).FlowNodeData() + case KindLabeledStatement: + return n.data.(*LabeledStatement).FlowNodeData() + case KindExpressionStatement: + return n.data.(*ExpressionStatement).FlowNodeData() + case KindBlock: + return n.data.(*Block).FlowNodeData() + case KindVariableStatement: + return n.data.(*VariableStatement).FlowNodeData() + case KindBindingElement: + return n.data.(*BindingElement).FlowNodeData() + case KindMissingDeclaration: + return n.data.(*MissingDeclaration).FlowNodeData() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).FlowNodeData() + case KindClassDeclaration: + return n.data.(*ClassDeclaration).FlowNodeData() + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).FlowNodeData() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).FlowNodeData() + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).FlowNodeData() + case KindModuleBlock: + return n.data.(*ModuleBlock).FlowNodeData() + case KindNotEmittedStatement: + return n.data.(*NotEmittedStatement).FlowNodeData() + case KindImportDeclaration, KindJSImportDeclaration: + return n.data.(*ImportDeclaration).FlowNodeData() + case KindExportAssignment: + return n.data.(*ExportAssignment).FlowNodeData() + case KindNamespaceExportDeclaration: + return n.data.(*NamespaceExportDeclaration).FlowNodeData() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).FlowNodeData() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).FlowNodeData() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).FlowNodeData() + case KindNullKeyword, KindTrueKeyword, KindFalseKeyword, KindThisKeyword, KindSuperKeyword, KindImportKeyword: + return n.data.(*KeywordExpression).FlowNodeData() + case KindArrowFunction: + return n.data.(*ArrowFunction).FlowNodeData() + case KindFunctionExpression: + return n.data.(*FunctionExpression).FlowNodeData() + case KindPropertyAccessExpression: + return n.data.(*PropertyAccessExpression).FlowNodeData() + case KindElementAccessExpression: + return n.data.(*ElementAccessExpression).FlowNodeData() + case KindMetaProperty: + return n.data.(*MetaProperty).FlowNodeData() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).FlowNodeData() + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).FlowNodeData() + case KindExportDeclaration: + return n.data.(*ExportDeclaration).FlowNodeData() + default: + return nil + } +} + +func (n *Node) DeclarationData() *DeclarationBase { + switch n.Kind { + case KindVariableDeclaration: + return n.data.(*VariableDeclaration).DeclarationData() + case KindParameter: + return n.data.(*ParameterDeclaration).DeclarationData() + case KindBindingElement: + return n.data.(*BindingElement).DeclarationData() + case KindMissingDeclaration: + return n.data.(*MissingDeclaration).DeclarationData() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).DeclarationData() + case KindClassDeclaration: + return n.data.(*ClassDeclaration).DeclarationData() + case KindClassExpression: + return n.data.(*ClassExpression).DeclarationData() + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).DeclarationData() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).DeclarationData() + case KindEnumMember: + return n.data.(*EnumMember).DeclarationData() + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).DeclarationData() + case KindImportDeclaration, KindJSImportDeclaration: + return n.data.(*ImportDeclaration).DeclarationData() + case KindNamespaceImport: + return n.data.(*NamespaceImport).DeclarationData() + case KindExportAssignment: + return n.data.(*ExportAssignment).DeclarationData() + case KindNamespaceExportDeclaration: + return n.data.(*NamespaceExportDeclaration).DeclarationData() + case KindNamespaceExport: + return n.data.(*NamespaceExport).DeclarationData() + case KindExportSpecifier: + return n.data.(*ExportSpecifier).DeclarationData() + case KindCallSignature: + return n.data.(*CallSignatureDeclaration).DeclarationData() + case KindConstructSignature: + return n.data.(*ConstructSignatureDeclaration).DeclarationData() + case KindConstructor: + return n.data.(*ConstructorDeclaration).DeclarationData() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).DeclarationData() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).DeclarationData() + case KindIndexSignature: + return n.data.(*IndexSignatureDeclaration).DeclarationData() + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).DeclarationData() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).DeclarationData() + case KindPropertySignature: + return n.data.(*PropertySignatureDeclaration).DeclarationData() + case KindPropertyDeclaration: + return n.data.(*PropertyDeclaration).DeclarationData() + case KindSemicolonClassElement: + return n.data.(*SemicolonClassElement).DeclarationData() + case KindClassStaticBlockDeclaration: + return n.data.(*ClassStaticBlockDeclaration).DeclarationData() + case KindNoSubstitutionTemplateLiteral: + return n.data.(*NoSubstitutionTemplateLiteral).DeclarationData() + case KindBinaryExpression: + return n.data.(*BinaryExpression).DeclarationData() + case KindArrowFunction: + return n.data.(*ArrowFunction).DeclarationData() + case KindFunctionExpression: + return n.data.(*FunctionExpression).DeclarationData() + case KindCallExpression: + return n.data.(*CallExpression).DeclarationData() + case KindObjectLiteralExpression: + return n.data.(*ObjectLiteralExpression).DeclarationData() + case KindSpreadAssignment: + return n.data.(*SpreadAssignment).DeclarationData() + case KindPropertyAssignment: + return n.data.(*PropertyAssignment).DeclarationData() + case KindShorthandPropertyAssignment: + return n.data.(*ShorthandPropertyAssignment).DeclarationData() + case KindMappedType: + return n.data.(*MappedTypeNode).DeclarationData() + case KindTypeLiteral: + return n.data.(*TypeLiteralNode).DeclarationData() + case KindNamedTupleMember: + return n.data.(*NamedTupleMember).DeclarationData() + case KindFunctionType: + return n.data.(*FunctionTypeNode).DeclarationData() + case KindConstructorType: + return n.data.(*ConstructorTypeNode).DeclarationData() + case KindJsxAttributes: + return n.data.(*JsxAttributes).DeclarationData() + case KindJsxAttribute: + return n.data.(*JsxAttribute).DeclarationData() + case KindJSDocSignature: + return n.data.(*JSDocSignature).DeclarationData() + case KindSourceFile: + return n.data.(*SourceFile).DeclarationData() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).DeclarationData() + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).DeclarationData() + case KindExportDeclaration: + return n.data.(*ExportDeclaration).DeclarationData() + case KindImportClause: + return n.data.(*ImportClause).DeclarationData() + case KindImportSpecifier: + return n.data.(*ImportSpecifier).DeclarationData() + case KindTypeParameter: + return n.data.(*TypeParameterDeclaration).DeclarationData() + case KindJSDocTypeLiteral: + return n.data.(*JSDocTypeLiteral).DeclarationData() + default: + return nil + } +} + +func (n *Node) ExportableData() *ExportableBase { + switch n.Kind { + case KindVariableDeclaration: + return n.data.(*VariableDeclaration).ExportableData() + case KindBindingElement: + return n.data.(*BindingElement).ExportableData() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).ExportableData() + case KindClassDeclaration: + return n.data.(*ClassDeclaration).ExportableData() + case KindClassExpression: + return n.data.(*ClassExpression).ExportableData() + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).ExportableData() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).ExportableData() + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).ExportableData() + case KindNamespaceImport: + return n.data.(*NamespaceImport).ExportableData() + case KindExportSpecifier: + return n.data.(*ExportSpecifier).ExportableData() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).ExportableData() + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).ExportableData() + case KindImportClause: + return n.data.(*ImportClause).ExportableData() + case KindImportSpecifier: + return n.data.(*ImportSpecifier).ExportableData() + default: + return nil + } +} + +func (n *Node) LocalsContainerData() *LocalsContainerBase { + switch n.Kind { + case KindForStatement: + return n.data.(*ForStatement).LocalsContainerData() + case KindForInStatement, KindForOfStatement: + return n.data.(*ForInOrOfStatement).LocalsContainerData() + case KindCaseBlock: + return n.data.(*CaseBlock).LocalsContainerData() + case KindCatchClause: + return n.data.(*CatchClause).LocalsContainerData() + case KindBlock: + return n.data.(*Block).LocalsContainerData() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).LocalsContainerData() + case KindClassDeclaration: + return n.data.(*ClassDeclaration).LocalsContainerData() + case KindClassExpression: + return n.data.(*ClassExpression).LocalsContainerData() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).LocalsContainerData() + case KindCallSignature: + return n.data.(*CallSignatureDeclaration).LocalsContainerData() + case KindConstructSignature: + return n.data.(*ConstructSignatureDeclaration).LocalsContainerData() + case KindConstructor: + return n.data.(*ConstructorDeclaration).LocalsContainerData() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).LocalsContainerData() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).LocalsContainerData() + case KindIndexSignature: + return n.data.(*IndexSignatureDeclaration).LocalsContainerData() + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).LocalsContainerData() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).LocalsContainerData() + case KindClassStaticBlockDeclaration: + return n.data.(*ClassStaticBlockDeclaration).LocalsContainerData() + case KindArrowFunction: + return n.data.(*ArrowFunction).LocalsContainerData() + case KindFunctionExpression: + return n.data.(*FunctionExpression).LocalsContainerData() + case KindConditionalType: + return n.data.(*ConditionalTypeNode).LocalsContainerData() + case KindMappedType: + return n.data.(*MappedTypeNode).LocalsContainerData() + case KindFunctionType: + return n.data.(*FunctionTypeNode).LocalsContainerData() + case KindConstructorType: + return n.data.(*ConstructorTypeNode).LocalsContainerData() + case KindJSDocSignature: + return n.data.(*JSDocSignature).LocalsContainerData() + case KindSourceFile: + return n.data.(*SourceFile).LocalsContainerData() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).LocalsContainerData() + default: + return nil + } +} + +func (n *Node) FunctionLikeData() *FunctionLikeBase { + switch n.Kind { + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).FunctionLikeData() + case KindCallSignature: + return n.data.(*CallSignatureDeclaration).FunctionLikeData() + case KindConstructSignature: + return n.data.(*ConstructSignatureDeclaration).FunctionLikeData() + case KindConstructor: + return n.data.(*ConstructorDeclaration).FunctionLikeData() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).FunctionLikeData() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).FunctionLikeData() + case KindIndexSignature: + return n.data.(*IndexSignatureDeclaration).FunctionLikeData() + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).FunctionLikeData() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).FunctionLikeData() + case KindArrowFunction: + return n.data.(*ArrowFunction).FunctionLikeData() + case KindFunctionExpression: + return n.data.(*FunctionExpression).FunctionLikeData() + case KindFunctionType: + return n.data.(*FunctionTypeNode).FunctionLikeData() + case KindConstructorType: + return n.data.(*ConstructorTypeNode).FunctionLikeData() + case KindJSDocSignature: + return n.data.(*JSDocSignature).FunctionLikeData() + default: + return nil + } +} + +func (n *Node) ClassLikeData() *ClassLikeBase { + switch n.Kind { + case KindClassDeclaration: + return n.data.(*ClassDeclaration).ClassLikeData() + case KindClassExpression: + return n.data.(*ClassExpression).ClassLikeData() + default: + return nil + } +} + +func (n *Node) BodyData() *BodyBase { + switch n.Kind { + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).BodyData() + case KindConstructor: + return n.data.(*ConstructorDeclaration).BodyData() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).BodyData() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).BodyData() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).BodyData() + case KindArrowFunction: + return n.data.(*ArrowFunction).BodyData() + case KindFunctionExpression: + return n.data.(*FunctionExpression).BodyData() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).BodyData() + default: + return nil + } +} + +func (n *Node) LiteralLikeData() *LiteralLikeNodeBase { + switch n.Kind { + case KindStringLiteral: + return n.data.(*StringLiteral).LiteralLikeData() + case KindNumericLiteral: + return n.data.(*NumericLiteral).LiteralLikeData() + case KindBigIntLiteral: + return n.data.(*BigIntLiteral).LiteralLikeData() + case KindRegularExpressionLiteral: + return n.data.(*RegularExpressionLiteral).LiteralLikeData() + case KindNoSubstitutionTemplateLiteral: + return n.data.(*NoSubstitutionTemplateLiteral).LiteralLikeData() + case KindTemplateHead: + return n.data.(*TemplateHead).LiteralLikeData() + case KindTemplateMiddle: + return n.data.(*TemplateMiddle).LiteralLikeData() + case KindTemplateTail: + return n.data.(*TemplateTail).LiteralLikeData() + case KindJsxText: + return n.data.(*JsxText).LiteralLikeData() + default: + return nil + } +} + +func (n *Node) TemplateLiteralLikeData() *TemplateLiteralLikeNodeBase { + switch n.Kind { + case KindNoSubstitutionTemplateLiteral: + return n.data.(*NoSubstitutionTemplateLiteral).TemplateLiteralLikeData() + case KindTemplateHead: + return n.data.(*TemplateHead).TemplateLiteralLikeData() + case KindTemplateMiddle: + return n.data.(*TemplateMiddle).TemplateLiteralLikeData() + case KindTemplateTail: + return n.data.(*TemplateTail).TemplateLiteralLikeData() + default: + return nil + } +} + // ────────────────────────────────────────────────────────────────────── // As*() cast methods // ────────────────────────────────────────────────────────────────────── From 17a2bf02d8a1e01b56b33028c1106840fe6bd239 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:34:12 -0700 Subject: [PATCH 03/13] Remove ForEachChild from nodeData --- tsc/internal/ast/ast.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index 7de037082bf9a..208949280f3f9 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -1174,7 +1174,6 @@ func (n *Node) AsFlowReduceLabelData() *FlowReduceLabelData { type nodeData interface { AsNode() *Node - ForEachChild(v Visitor) bool VisitEachChild(v *NodeVisitor) *Node Clone(v NodeFactoryCoercible) *Node Name() *DeclarationName From e1cae40f757baba20bb0fa99c6144beb197dba22 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:38:02 -0700 Subject: [PATCH 04/13] Remove AsNode from nodeData --- tools/scripts/tsc/generate-go-ast.ts | 4 +- tsc/internal/ast/ast.go | 10 +- tsc/internal/ast/ast_generated.go | 386 +++++++++++++-------------- tsc/internal/ast/flow.go | 4 +- 4 files changed, 201 insertions(+), 203 deletions(-) diff --git a/tools/scripts/tsc/generate-go-ast.ts b/tools/scripts/tsc/generate-go-ast.ts index a277c8ba35031..b385f52dae210 100644 --- a/tools/scripts/tsc/generate-go-ast.ts +++ b/tools/scripts/tsc/generate-go-ast.ts @@ -394,7 +394,7 @@ function emitNewFactory( const kindArg = kindMember ? kindMember.goParamName() : `Kind${kindName}`; if (nodeFlagsMembers.length > 0) { - w.write(`node := f.newNode(${kindArg}, data)`); + w.write(`node := f.newNode(${kindArg}, data.AsNode(), data)`); for (const m of nodeFlagsMembers) { const param = m.goParamName(); if (m.bitmask) { @@ -407,7 +407,7 @@ function emitNewFactory( w.write("return node"); } else { - w.write(`return f.newNode(${kindArg}, data)`); + w.write(`return f.newNode(${kindArg}, data.AsNode(), data)`); } w.pop(); diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index 208949280f3f9..c493c4b2f245f 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -72,8 +72,7 @@ func NewNodeFactory(hooks NodeFactoryHooks) *NodeFactory { return &NodeFactory{hooks: hooks} } -func newNode(kind Kind, data nodeData, hooks NodeFactoryHooks) *Node { - n := data.AsNode() +func newNode(kind Kind, n *Node, data nodeData, hooks NodeFactoryHooks) *Node { n.Loc = core.UndefinedTextRange() n.Kind = kind n.data = data @@ -83,9 +82,9 @@ func newNode(kind Kind, data nodeData, hooks NodeFactoryHooks) *Node { return n } -func (f *NodeFactory) newNode(kind Kind, data nodeData) *Node { +func (f *NodeFactory) newNode(kind Kind, n *Node, data nodeData) *Node { f.nodeCount++ - return newNode(kind, data, f.hooks) + return newNode(kind, n, data, f.hooks) } func (f *NodeFactory) NodeCount() int { @@ -1173,7 +1172,6 @@ func (n *Node) AsFlowReduceLabelData() *FlowReduceLabelData { // NodeData type nodeData interface { - AsNode() *Node VisitEachChild(v *NodeVisitor) *Node Clone(v NodeFactoryCoercible) *Node Name() *DeclarationName @@ -2532,7 +2530,7 @@ func (f *NodeFactory) NewSourceFile(opts SourceFileParseOptions, text string, st data.text = text data.Statements = statements data.EndOfFileToken = endOfFileToken - return f.newNode(KindSourceFile, data) + return f.newNode(KindSourceFile, data.AsNode(), data) } func (node *SourceFile) ParseOptions() SourceFileParseOptions { diff --git a/tsc/internal/ast/ast_generated.go b/tsc/internal/ast/ast_generated.go index 115df0a0f1989..59fbb04415827 100644 --- a/tsc/internal/ast/ast_generated.go +++ b/tsc/internal/ast/ast_generated.go @@ -599,7 +599,7 @@ type Token struct { func (f *NodeFactory) NewToken(kind TokenSyntaxKind) *Node { data := f.tokenArena.New() - return f.newNode(kind, data) + return f.newNode(kind, data.AsNode(), data) } func (node *Token) Clone(f NodeFactoryCoercible) *Node { @@ -628,7 +628,7 @@ func (f *NodeFactory) NewIdentifier(text string) *Node { data := f.identifierArena.New() data.Text = text f.textCount++ - return f.newNode(KindIdentifier, data) + return f.newNode(KindIdentifier, data.AsNode(), data) } func (node *Identifier) Clone(f NodeFactoryCoercible) *Node { @@ -652,7 +652,7 @@ func (f *NodeFactory) NewPrivateIdentifier(text string) *Node { data := &PrivateIdentifier{} data.Text = text f.textCount++ - return f.newNode(KindPrivateIdentifier, data) + return f.newNode(KindPrivateIdentifier, data.AsNode(), data) } func (node *PrivateIdentifier) Clone(f NodeFactoryCoercible) *Node { @@ -679,7 +679,7 @@ func (f *NodeFactory) NewQualifiedName(left *EntityName, right *MemberName) *Nod data := &QualifiedName{} data.Left = left data.Right = right - return f.newNode(KindQualifiedName, data) + return f.newNode(KindQualifiedName, data.AsNode(), data) } func (f *NodeFactory) UpdateQualifiedName(node *QualifiedName, left *EntityName, right *MemberName) *Node { @@ -723,7 +723,7 @@ type ComputedPropertyName struct { func (f *NodeFactory) NewComputedPropertyName(expression *Expression) *Node { data := &ComputedPropertyName{} data.Expression = expression - return f.newNode(KindComputedPropertyName, data) + return f.newNode(KindComputedPropertyName, data.AsNode(), data) } func (f *NodeFactory) UpdateComputedPropertyName(node *ComputedPropertyName, expression *Expression) *Node { @@ -766,7 +766,7 @@ type Decorator struct { func (f *NodeFactory) NewDecorator(expression *LeftHandSideExpression) *Node { data := &Decorator{} data.Expression = expression - return f.newNode(KindDecorator, data) + return f.newNode(KindDecorator, data.AsNode(), data) } func (f *NodeFactory) UpdateDecorator(node *Decorator, expression *LeftHandSideExpression) *Node { @@ -802,7 +802,7 @@ type EmptyStatement struct { func (f *NodeFactory) NewEmptyStatement() *Node { data := &EmptyStatement{} - return f.newNode(KindEmptyStatement, data) + return f.newNode(KindEmptyStatement, data.AsNode(), data) } func (node *EmptyStatement) Clone(f NodeFactoryCoercible) *Node { @@ -830,7 +830,7 @@ func (f *NodeFactory) NewIfStatement(expression *Expression, thenStatement *Stat data.Expression = expression data.ThenStatement = thenStatement data.ElseStatement = elseStatement - return f.newNode(KindIfStatement, data) + return f.newNode(KindIfStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateIfStatement(node *IfStatement, expression *Expression, thenStatement *Statement, elseStatement *Statement) *Node { @@ -876,7 +876,7 @@ func (f *NodeFactory) NewDoStatement(statement *Statement, expression *Expressio data := &DoStatement{} data.Statement = statement data.Expression = expression - return f.newNode(KindDoStatement, data) + return f.newNode(KindDoStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateDoStatement(node *DoStatement, statement *Statement, expression *Expression) *Node { @@ -921,7 +921,7 @@ func (f *NodeFactory) NewWhileStatement(expression *Expression, statement *State data := &WhileStatement{} data.Expression = expression data.Statement = statement - return f.newNode(KindWhileStatement, data) + return f.newNode(KindWhileStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateWhileStatement(node *WhileStatement, expression *Expression, statement *Statement) *Node { @@ -971,7 +971,7 @@ func (f *NodeFactory) NewForStatement(initializer *ForInitializer, condition *Ex data.Condition = condition data.Incrementor = incrementor data.Statement = statement - return f.newNode(KindForStatement, data) + return f.newNode(KindForStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateForStatement(node *ForStatement, initializer *ForInitializer, condition *Expression, incrementor *Expression, statement *Statement) *Node { @@ -1027,7 +1027,7 @@ func (f *NodeFactory) NewForInOrOfStatement(kind Kind, awaitModifier *AwaitKeywo data.Initializer = initializer data.Expression = expression data.Statement = statement - return f.newNode(kind, data) + return f.newNode(kind, data.AsNode(), data) } func (f *NodeFactory) UpdateForInOrOfStatement(node *ForInOrOfStatement, awaitModifier *AwaitKeyword, initializer *ForInitializer, expression *Expression, statement *Statement) *Node { @@ -1072,7 +1072,7 @@ type BreakStatement struct { func (f *NodeFactory) NewBreakStatement(label *IdentifierNode) *Node { data := &BreakStatement{} data.Label = label - return f.newNode(KindBreakStatement, data) + return f.newNode(KindBreakStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateBreakStatement(node *BreakStatement, label *IdentifierNode) *Node { @@ -1110,7 +1110,7 @@ type ContinueStatement struct { func (f *NodeFactory) NewContinueStatement(label *IdentifierNode) *Node { data := &ContinueStatement{} data.Label = label - return f.newNode(KindContinueStatement, data) + return f.newNode(KindContinueStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateContinueStatement(node *ContinueStatement, label *IdentifierNode) *Node { @@ -1149,7 +1149,7 @@ type ReturnStatement struct { func (f *NodeFactory) NewReturnStatement(expression *Expression) *Node { data := f.returnStatementArena.New() data.Expression = expression - return f.newNode(KindReturnStatement, data) + return f.newNode(KindReturnStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateReturnStatement(node *ReturnStatement, expression *Expression) *Node { @@ -1190,7 +1190,7 @@ func (f *NodeFactory) NewWithStatement(expression *Expression, statement *Statem data := &WithStatement{} data.Expression = expression data.Statement = statement - return f.newNode(KindWithStatement, data) + return f.newNode(KindWithStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateWithStatement(node *WithStatement, expression *Expression, statement *Statement) *Node { @@ -1236,7 +1236,7 @@ func (f *NodeFactory) NewSwitchStatement(expression *Expression, caseBlock *Case data := &SwitchStatement{} data.Expression = expression data.CaseBlock = caseBlock - return f.newNode(KindSwitchStatement, data) + return f.newNode(KindSwitchStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateSwitchStatement(node *SwitchStatement, expression *Expression, caseBlock *CaseBlockNode) *Node { @@ -1281,7 +1281,7 @@ type CaseBlock struct { func (f *NodeFactory) NewCaseBlock(clauses *CaseClausesList) *Node { data := &CaseBlock{} data.Clauses = clauses - return f.newNode(KindCaseBlock, data) + return f.newNode(KindCaseBlock, data.AsNode(), data) } func (f *NodeFactory) UpdateCaseBlock(node *CaseBlock, clauses *CaseClausesList) *Node { @@ -1327,7 +1327,7 @@ func (f *NodeFactory) NewCaseOrDefaultClause(kind Kind, expression *Expression, data := &CaseOrDefaultClause{} data.Expression = expression data.Statements = statements - return f.newNode(kind, data) + return f.newNode(kind, data.AsNode(), data) } func (f *NodeFactory) UpdateCaseOrDefaultClause(node *CaseOrDefaultClause, expression *Expression, statements *StatementList) *Node { @@ -1375,7 +1375,7 @@ type ThrowStatement struct { func (f *NodeFactory) NewThrowStatement(expression *Expression) *Node { data := &ThrowStatement{} data.Expression = expression - return f.newNode(KindThrowStatement, data) + return f.newNode(KindThrowStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateThrowStatement(node *ThrowStatement, expression *Expression) *Node { @@ -1422,7 +1422,7 @@ func (f *NodeFactory) NewTryStatement(tryBlock *BlockNode, catchClause *CatchCla data.TryBlock = tryBlock data.CatchClause = catchClause data.FinallyBlock = finallyBlock - return f.newNode(KindTryStatement, data) + return f.newNode(KindTryStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateTryStatement(node *TryStatement, tryBlock *BlockNode, catchClause *CatchClauseNode, finallyBlock *BlockNode) *Node { @@ -1470,7 +1470,7 @@ func (f *NodeFactory) NewCatchClause(variableDeclaration *VariableDeclarationNod data := &CatchClause{} data.VariableDeclaration = variableDeclaration data.Block = block - return f.newNode(KindCatchClause, data) + return f.newNode(KindCatchClause, data.AsNode(), data) } func (f *NodeFactory) UpdateCatchClause(node *CatchClause, variableDeclaration *VariableDeclarationNode, block *BlockNode) *Node { @@ -1506,7 +1506,7 @@ type DebuggerStatement struct { func (f *NodeFactory) NewDebuggerStatement() *Node { data := &DebuggerStatement{} - return f.newNode(KindDebuggerStatement, data) + return f.newNode(KindDebuggerStatement, data.AsNode(), data) } func (node *DebuggerStatement) Clone(f NodeFactoryCoercible) *Node { @@ -1531,7 +1531,7 @@ func (f *NodeFactory) NewLabeledStatement(label *IdentifierNode, statement *Stat data := &LabeledStatement{} data.Label = label data.Statement = statement - return f.newNode(KindLabeledStatement, data) + return f.newNode(KindLabeledStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateLabeledStatement(node *LabeledStatement, label *IdentifierNode, statement *Statement) *Node { @@ -1574,7 +1574,7 @@ type ExpressionStatement struct { func (f *NodeFactory) NewExpressionStatement(expression *Expression) *Node { data := f.expressionStatementArena.New() data.Expression = expression - return f.newNode(KindExpressionStatement, data) + return f.newNode(KindExpressionStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateExpressionStatement(node *ExpressionStatement, expression *Expression) *Node { @@ -1620,7 +1620,7 @@ func (f *NodeFactory) NewBlock(statements *StatementList, multiLine bool) *Node data := f.blockArena.New() data.Statements = statements data.MultiLine = multiLine - return f.newNode(KindBlock, data) + return f.newNode(KindBlock, data.AsNode(), data) } func (f *NodeFactory) UpdateBlock(node *Block, statements *StatementList, multiLine bool) *Node { @@ -1665,7 +1665,7 @@ func (f *NodeFactory) NewVariableStatement(modifiers *ModifierList, declarationL data := f.variableStatementArena.New() data.modifiers = modifiers data.DeclarationList = declarationList - return f.newNode(KindVariableStatement, data) + return f.newNode(KindVariableStatement, data.AsNode(), data) } func (f *NodeFactory) UpdateVariableStatement(node *VariableStatement, modifiers *ModifierList, declarationList *VariableDeclarationListNode) *Node { @@ -1712,7 +1712,7 @@ func (f *NodeFactory) NewVariableDeclaration(name *BindingName, exclamationToken data.ExclamationToken = exclamationToken data.Type = typeNode data.Initializer = initializer - return f.newNode(KindVariableDeclaration, data) + return f.newNode(KindVariableDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateVariableDeclaration(node *VariableDeclaration, name *BindingName, exclamationToken *ExclamationToken, typeNode *TypeNode, initializer *Expression) *Node { @@ -1758,7 +1758,7 @@ type VariableDeclarationList struct { func (f *NodeFactory) NewVariableDeclarationList(declarations *VariableDeclarationNodeList, flags NodeFlags) *Node { data := f.variableDeclarationListArena.New() data.Declarations = declarations - node := f.newNode(KindVariableDeclarationList, data) + node := f.newNode(KindVariableDeclarationList, data.AsNode(), data) node.Flags = flags return node } @@ -1799,7 +1799,7 @@ type BindingPattern struct { func (f *NodeFactory) NewBindingPattern(kind Kind, elements *BindingElementList) *Node { data := &BindingPattern{} data.Elements = elements - return f.newNode(kind, data) + return f.newNode(kind, data.AsNode(), data) } func (f *NodeFactory) UpdateBindingPattern(node *BindingPattern, elements *BindingElementList) *Node { @@ -1853,7 +1853,7 @@ func (f *NodeFactory) NewParameterDeclaration(modifiers *ModifierList, dotDotDot data.QuestionToken = questionToken data.Type = typeNode data.Initializer = initializer - return f.newNode(KindParameter, data) + return f.newNode(KindParameter, data.AsNode(), data) } func (f *NodeFactory) UpdateParameterDeclaration(node *ParameterDeclaration, modifiers *ModifierList, dotDotDotToken *DotDotDotToken, name *BindingName, questionToken *QuestionToken, typeNode *TypeNode, initializer *Expression) *Node { @@ -1910,7 +1910,7 @@ func (f *NodeFactory) NewBindingElement(dotDotDotToken *DotDotDotToken, property data.PropertyName = propertyName data.name = name data.Initializer = initializer - return f.newNode(KindBindingElement, data) + return f.newNode(KindBindingElement, data.AsNode(), data) } func (f *NodeFactory) UpdateBindingElement(node *BindingElement, dotDotDotToken *DotDotDotToken, propertyName *PropertyName, name *BindingName, initializer *Expression) *Node { @@ -1956,7 +1956,7 @@ type MissingDeclaration struct { func (f *NodeFactory) NewMissingDeclaration(modifiers *ModifierList) *Node { data := &MissingDeclaration{} data.modifiers = modifiers - return f.newNode(KindMissingDeclaration, data) + return f.newNode(KindMissingDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateMissingDeclaration(node *MissingDeclaration, modifiers *ModifierList) *Node { @@ -2007,7 +2007,7 @@ func (f *NodeFactory) NewFunctionDeclaration(modifiers *ModifierList, asteriskTo data.Type = typeNode data.FullSignature = fullSignature data.Body = body - return f.newNode(KindFunctionDeclaration, data) + return f.newNode(KindFunctionDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateFunctionDeclaration(node *FunctionDeclaration, modifiers *ModifierList, asteriskToken *AsteriskToken, name *IdentifierNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { @@ -2061,7 +2061,7 @@ func (f *NodeFactory) NewClassDeclaration(modifiers *ModifierList, name *Identif data.TypeParameters = typeParameters data.HeritageClauses = heritageClauses data.Members = members - return f.newNode(KindClassDeclaration, data) + return f.newNode(KindClassDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateClassDeclaration(node *ClassDeclaration, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *ClassElementList) *Node { @@ -2112,7 +2112,7 @@ func (f *NodeFactory) NewClassExpression(modifiers *ModifierList, name *Identifi data.TypeParameters = typeParameters data.HeritageClauses = heritageClauses data.Members = members - return f.newNode(KindClassExpression, data) + return f.newNode(KindClassExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateClassExpression(node *ClassExpression, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *ClassElementList) *Node { @@ -2161,7 +2161,7 @@ func (f *NodeFactory) NewHeritageClause(token Kind, types *HeritageClauseElement data := f.heritageClauseArena.New() data.Token = token data.Types = types - return f.newNode(KindHeritageClause, data) + return f.newNode(KindHeritageClause, data.AsNode(), data) } func (f *NodeFactory) UpdateHeritageClause(node *HeritageClause, token Kind, types *HeritageClauseElementList) *Node { @@ -2210,7 +2210,7 @@ func (f *NodeFactory) NewInterfaceDeclaration(modifiers *ModifierList, name *Ide data.TypeParameters = typeParameters data.HeritageClauses = heritageClauses data.Members = members - return f.newNode(KindInterfaceDeclaration, data) + return f.newNode(KindInterfaceDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateInterfaceDeclaration(node *InterfaceDeclaration, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *TypeElementList) *Node { @@ -2266,7 +2266,7 @@ func (f *NodeFactory) NewTypeAliasDeclaration(modifiers *ModifierList, name *Ide data.name = name data.TypeParameters = typeParameters data.Type = typeNode - return f.newNode(KindTypeAliasDeclaration, data) + return f.newNode(KindTypeAliasDeclaration, data.AsNode(), data) } func (f *NodeFactory) NewJSTypeAliasDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, typeNode *TypeNode) *Node { @@ -2275,7 +2275,7 @@ func (f *NodeFactory) NewJSTypeAliasDeclaration(modifiers *ModifierList, name *I data.name = name data.TypeParameters = typeParameters data.Type = typeNode - return f.newNode(KindJSTypeAliasDeclaration, data) + return f.newNode(KindJSTypeAliasDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateTypeAliasDeclaration(node *TypeAliasDeclaration, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, typeNode *TypeNode) *Node { @@ -2342,7 +2342,7 @@ func (f *NodeFactory) NewEnumMember(name *PropertyName, initializer *Expression) data := &EnumMember{} data.name = name data.Initializer = initializer - return f.newNode(KindEnumMember, data) + return f.newNode(KindEnumMember, data.AsNode(), data) } func (f *NodeFactory) UpdateEnumMember(node *EnumMember, name *PropertyName, initializer *Expression) *Node { @@ -2391,7 +2391,7 @@ func (f *NodeFactory) NewEnumDeclaration(modifiers *ModifierList, name *Identifi data.modifiers = modifiers data.name = name data.Members = members - return f.newNode(KindEnumDeclaration, data) + return f.newNode(KindEnumDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateEnumDeclaration(node *EnumDeclaration, modifiers *ModifierList, name *IdentifierNode, members *EnumMemberList) *Node { @@ -2434,7 +2434,7 @@ type ModuleBlock struct { func (f *NodeFactory) NewModuleBlock(statements *StatementList) *Node { data := &ModuleBlock{} data.Statements = statements - return f.newNode(KindModuleBlock, data) + return f.newNode(KindModuleBlock, data.AsNode(), data) } func (f *NodeFactory) UpdateModuleBlock(node *ModuleBlock, statements *StatementList) *Node { @@ -2474,7 +2474,7 @@ type NotEmittedStatement struct { func (f *NodeFactory) NewNotEmittedStatement() *Node { data := &NotEmittedStatement{} - return f.newNode(KindNotEmittedStatement, data) + return f.newNode(KindNotEmittedStatement, data.AsNode(), data) } func (node *NotEmittedStatement) Clone(f NodeFactoryCoercible) *Node { @@ -2496,7 +2496,7 @@ type NotEmittedTypeElement struct { func (f *NodeFactory) NewNotEmittedTypeElement() *Node { data := &NotEmittedTypeElement{} - return f.newNode(KindNotEmittedTypeElement, data) + return f.newNode(KindNotEmittedTypeElement, data.AsNode(), data) } func (node *NotEmittedTypeElement) Clone(f NodeFactoryCoercible) *Node { @@ -2527,7 +2527,7 @@ func (f *NodeFactory) NewImportDeclaration(modifiers *ModifierList, importClause data.ImportClause = importClause data.ModuleSpecifier = moduleSpecifier data.Attributes = attributes - return f.newNode(KindImportDeclaration, data) + return f.newNode(KindImportDeclaration, data.AsNode(), data) } func (f *NodeFactory) NewJSImportDeclaration(modifiers *ModifierList, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node { @@ -2536,7 +2536,7 @@ func (f *NodeFactory) NewJSImportDeclaration(modifiers *ModifierList, importClau data.ImportClause = importClause data.ModuleSpecifier = moduleSpecifier data.Attributes = attributes - return f.newNode(KindJSImportDeclaration, data) + return f.newNode(KindJSImportDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateImportDeclaration(node *ImportDeclaration, modifiers *ModifierList, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node { @@ -2602,7 +2602,7 @@ type ExternalModuleReference struct { func (f *NodeFactory) NewExternalModuleReference(expression *Expression) *Node { data := &ExternalModuleReference{} data.Expression = expression - return f.newNode(KindExternalModuleReference, data) + return f.newNode(KindExternalModuleReference, data.AsNode(), data) } func (f *NodeFactory) UpdateExternalModuleReference(node *ExternalModuleReference, expression *Expression) *Node { @@ -2646,7 +2646,7 @@ type NamespaceImport struct { func (f *NodeFactory) NewNamespaceImport(name *IdentifierNode) *Node { data := &NamespaceImport{} data.name = name - return f.newNode(KindNamespaceImport, data) + return f.newNode(KindNamespaceImport, data.AsNode(), data) } func (f *NodeFactory) UpdateNamespaceImport(node *NamespaceImport, name *IdentifierNode) *Node { @@ -2693,7 +2693,7 @@ type NamedImports struct { func (f *NodeFactory) NewNamedImports(elements *ImportSpecifierList) *Node { data := &NamedImports{} data.Elements = elements - return f.newNode(KindNamedImports, data) + return f.newNode(KindNamedImports, data.AsNode(), data) } func (f *NodeFactory) UpdateNamedImports(node *NamedImports, elements *ImportSpecifierList) *Node { @@ -2743,7 +2743,7 @@ func (f *NodeFactory) NewExportAssignment(modifiers *ModifierList, isExportEqual data.IsExportEquals = isExportEquals data.Type = typeNode data.Expression = expression - return f.newNode(KindExportAssignment, data) + return f.newNode(KindExportAssignment, data.AsNode(), data) } func (f *NodeFactory) UpdateExportAssignment(node *ExportAssignment, modifiers *ModifierList, isExportEquals bool, typeNode *TypeNode, expression *Expression) *Node { @@ -2785,7 +2785,7 @@ func (f *NodeFactory) NewNamespaceExportDeclaration(modifiers *ModifierList, nam data := &NamespaceExportDeclaration{} data.modifiers = modifiers data.name = name - return f.newNode(KindNamespaceExportDeclaration, data) + return f.newNode(KindNamespaceExportDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateNamespaceExportDeclaration(node *NamespaceExportDeclaration, modifiers *ModifierList, name *IdentifierNode) *Node { @@ -2828,7 +2828,7 @@ type NamespaceExport struct { func (f *NodeFactory) NewNamespaceExport(name *ModuleExportName) *Node { data := &NamespaceExport{} data.name = name - return f.newNode(KindNamespaceExport, data) + return f.newNode(KindNamespaceExport, data.AsNode(), data) } func (f *NodeFactory) UpdateNamespaceExport(node *NamespaceExport, name *ModuleExportName) *Node { @@ -2875,7 +2875,7 @@ type NamedExports struct { func (f *NodeFactory) NewNamedExports(elements *ExportSpecifierList) *Node { data := &NamedExports{} data.Elements = elements - return f.newNode(KindNamedExports, data) + return f.newNode(KindNamedExports, data.AsNode(), data) } func (f *NodeFactory) UpdateNamedExports(node *NamedExports, elements *ExportSpecifierList) *Node { @@ -2924,7 +2924,7 @@ func (f *NodeFactory) NewExportSpecifier(isTypeOnly bool, propertyName *ModuleEx data.IsTypeOnly = isTypeOnly data.PropertyName = propertyName data.name = name - return f.newNode(KindExportSpecifier, data) + return f.newNode(KindExportSpecifier, data.AsNode(), data) } func (f *NodeFactory) UpdateExportSpecifier(node *ExportSpecifier, isTypeOnly bool, propertyName *ModuleExportName, name *ModuleExportName) *Node { @@ -2971,7 +2971,7 @@ func (f *NodeFactory) NewCallSignatureDeclaration(typeParameters *TypeParameterL data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode - return f.newNode(KindCallSignature, data) + return f.newNode(KindCallSignature, data.AsNode(), data) } func (f *NodeFactory) UpdateCallSignatureDeclaration(node *CallSignatureDeclaration, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { @@ -3014,7 +3014,7 @@ func (f *NodeFactory) NewConstructSignatureDeclaration(typeParameters *TypeParam data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode - return f.newNode(KindConstructSignature, data) + return f.newNode(KindConstructSignature, data.AsNode(), data) } func (f *NodeFactory) UpdateConstructSignatureDeclaration(node *ConstructSignatureDeclaration, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { @@ -3062,7 +3062,7 @@ func (f *NodeFactory) NewConstructorDeclaration(modifiers *ModifierList, typePar data.Type = typeNode data.FullSignature = fullSignature data.Body = body - return f.newNode(KindConstructor, data) + return f.newNode(KindConstructor, data.AsNode(), data) } func (f *NodeFactory) UpdateConstructorDeclaration(node *ConstructorDeclaration, modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { @@ -3110,7 +3110,7 @@ func (f *NodeFactory) NewGetAccessorDeclaration(modifiers *ModifierList, name *P data.Type = typeNode data.FullSignature = fullSignature data.Body = body - return f.newNode(KindGetAccessor, data) + return f.newNode(KindGetAccessor, data.AsNode(), data) } func (f *NodeFactory) UpdateGetAccessorDeclaration(node *GetAccessorDeclaration, modifiers *ModifierList, name *PropertyName, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { @@ -3163,7 +3163,7 @@ func (f *NodeFactory) NewSetAccessorDeclaration(modifiers *ModifierList, name *P data.Type = typeNode data.FullSignature = fullSignature data.Body = body - return f.newNode(KindSetAccessor, data) + return f.newNode(KindSetAccessor, data.AsNode(), data) } func (f *NodeFactory) UpdateSetAccessorDeclaration(node *SetAccessorDeclaration, modifiers *ModifierList, name *PropertyName, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { @@ -3218,7 +3218,7 @@ func (f *NodeFactory) NewIndexSignatureDeclaration(modifiers *ModifierList, para data.modifiers = modifiers data.Parameters = parameters data.Type = typeNode - return f.newNode(KindIndexSignature, data) + return f.newNode(KindIndexSignature, data.AsNode(), data) } func (f *NodeFactory) UpdateIndexSignatureDeclaration(node *IndexSignatureDeclaration, modifiers *ModifierList, parameters *ParameterList, typeNode *TypeNode) *Node { @@ -3265,7 +3265,7 @@ func (f *NodeFactory) NewMethodSignatureDeclaration(modifiers *ModifierList, nam data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode - return f.newNode(KindMethodSignature, data) + return f.newNode(KindMethodSignature, data.AsNode(), data) } func (f *NodeFactory) UpdateMethodSignatureDeclaration(node *MethodSignatureDeclaration, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { @@ -3326,7 +3326,7 @@ func (f *NodeFactory) NewMethodDeclaration(modifiers *ModifierList, asteriskToke data.Type = typeNode data.FullSignature = fullSignature data.Body = body - return f.newNode(KindMethodDeclaration, data) + return f.newNode(KindMethodDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateMethodDeclaration(node *MethodDeclaration, modifiers *ModifierList, asteriskToken *AsteriskToken, name *PropertyName, postfixToken *TokenNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { @@ -3385,7 +3385,7 @@ func (f *NodeFactory) NewPropertySignatureDeclaration(modifiers *ModifierList, n data.PostfixToken = postfixToken data.Type = typeNode data.Initializer = initializer - return f.newNode(KindPropertySignature, data) + return f.newNode(KindPropertySignature, data.AsNode(), data) } func (f *NodeFactory) UpdatePropertySignatureDeclaration(node *PropertySignatureDeclaration, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node { @@ -3440,7 +3440,7 @@ func (f *NodeFactory) NewPropertyDeclaration(modifiers *ModifierList, name *Prop data.PostfixToken = postfixToken data.Type = typeNode data.Initializer = initializer - return f.newNode(KindPropertyDeclaration, data) + return f.newNode(KindPropertyDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdatePropertyDeclaration(node *PropertyDeclaration, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node { @@ -3486,7 +3486,7 @@ type SemicolonClassElement struct { func (f *NodeFactory) NewSemicolonClassElement() *Node { data := &SemicolonClassElement{} - return f.newNode(KindSemicolonClassElement, data) + return f.newNode(KindSemicolonClassElement, data.AsNode(), data) } func (node *SemicolonClassElement) Clone(f NodeFactoryCoercible) *Node { @@ -3516,7 +3516,7 @@ func (f *NodeFactory) NewClassStaticBlockDeclaration(modifiers *ModifierList, bo data := &ClassStaticBlockDeclaration{} data.modifiers = modifiers data.Body = body - return f.newNode(KindClassStaticBlockDeclaration, data) + return f.newNode(KindClassStaticBlockDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateClassStaticBlockDeclaration(node *ClassStaticBlockDeclaration, modifiers *ModifierList, body *BlockNode) *Node { @@ -3552,7 +3552,7 @@ type OmittedExpression struct { func (f *NodeFactory) NewOmittedExpression() *Node { data := &OmittedExpression{} - return f.newNode(KindOmittedExpression, data) + return f.newNode(KindOmittedExpression, data.AsNode(), data) } func (node *OmittedExpression) Clone(f NodeFactoryCoercible) *Node { @@ -3574,7 +3574,7 @@ type KeywordExpression struct { func (f *NodeFactory) NewKeywordExpression(kind KeywordExpressionSyntaxKind) *Node { data := f.keywordExpressionArena.New() - return f.newNode(kind, data) + return f.newNode(kind, data.AsNode(), data) } func (node *KeywordExpression) Clone(f NodeFactoryCoercible) *Node { @@ -3602,7 +3602,7 @@ func (f *NodeFactory) NewStringLiteral(text string, tokenFlags TokenFlags) *Node data.Text = text data.TokenFlags = tokenFlags & TokenFlagsStringLiteralFlags f.textCount++ - return f.newNode(KindStringLiteral, data) + return f.newNode(KindStringLiteral, data.AsNode(), data) } func (node *StringLiteral) Clone(f NodeFactoryCoercible) *Node { @@ -3626,7 +3626,7 @@ func (f *NodeFactory) NewNumericLiteral(text string, tokenFlags TokenFlags) *Nod data.Text = text data.TokenFlags = tokenFlags & TokenFlagsNumericLiteralFlags f.textCount++ - return f.newNode(KindNumericLiteral, data) + return f.newNode(KindNumericLiteral, data.AsNode(), data) } func (node *NumericLiteral) Clone(f NodeFactoryCoercible) *Node { @@ -3650,7 +3650,7 @@ func (f *NodeFactory) NewBigIntLiteral(text string, tokenFlags TokenFlags) *Node data.Text = text data.TokenFlags = tokenFlags & TokenFlagsNumericLiteralFlags f.textCount++ - return f.newNode(KindBigIntLiteral, data) + return f.newNode(KindBigIntLiteral, data.AsNode(), data) } func (node *BigIntLiteral) Clone(f NodeFactoryCoercible) *Node { @@ -3674,7 +3674,7 @@ func (f *NodeFactory) NewRegularExpressionLiteral(text string, tokenFlags TokenF data.Text = text data.TokenFlags = tokenFlags & TokenFlagsRegularExpressionLiteralFlags f.textCount++ - return f.newNode(KindRegularExpressionLiteral, data) + return f.newNode(KindRegularExpressionLiteral, data.AsNode(), data) } func (node *RegularExpressionLiteral) Clone(f NodeFactoryCoercible) *Node { @@ -3700,7 +3700,7 @@ func (f *NodeFactory) NewNoSubstitutionTemplateLiteral(text string, templateFlag data.Text = text data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags f.textCount++ - return f.newNode(KindNoSubstitutionTemplateLiteral, data) + return f.newNode(KindNoSubstitutionTemplateLiteral, data.AsNode(), data) } func (node *NoSubstitutionTemplateLiteral) Clone(f NodeFactoryCoercible) *Node { @@ -3733,7 +3733,7 @@ func (f *NodeFactory) NewBinaryExpression(modifiers *ModifierList, left *Express data.Type = typeNode data.OperatorToken = operatorToken data.Right = right - return f.newNode(KindBinaryExpression, data) + return f.newNode(KindBinaryExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateBinaryExpression(node *BinaryExpression, modifiers *ModifierList, left *Expression, typeNode *TypeNode, operatorToken *BinaryOperatorToken, right *Expression) *Node { @@ -3777,7 +3777,7 @@ func (f *NodeFactory) NewPrefixUnaryExpression(operator Kind, operand *Expressio data := f.prefixUnaryExpressionArena.New() data.Operator = operator data.Operand = operand - return f.newNode(KindPrefixUnaryExpression, data) + return f.newNode(KindPrefixUnaryExpression, data.AsNode(), data) } func (f *NodeFactory) UpdatePrefixUnaryExpression(node *PrefixUnaryExpression, operator Kind, operand *Expression) *Node { @@ -3821,7 +3821,7 @@ func (f *NodeFactory) NewPostfixUnaryExpression(operand *Expression, operator Ki data := &PostfixUnaryExpression{} data.Operand = operand data.Operator = operator - return f.newNode(KindPostfixUnaryExpression, data) + return f.newNode(KindPostfixUnaryExpression, data.AsNode(), data) } func (f *NodeFactory) UpdatePostfixUnaryExpression(node *PostfixUnaryExpression, operand *Expression, operator Kind) *Node { @@ -3865,7 +3865,7 @@ func (f *NodeFactory) NewYieldExpression(asteriskToken *AsteriskToken, expressio data := &YieldExpression{} data.AsteriskToken = asteriskToken data.Expression = expression - return f.newNode(KindYieldExpression, data) + return f.newNode(KindYieldExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateYieldExpression(node *YieldExpression, asteriskToken *AsteriskToken, expression *Expression) *Node { @@ -3914,7 +3914,7 @@ func (f *NodeFactory) NewArrowFunction(modifiers *ModifierList, typeParameters * data.FullSignature = fullSignature data.EqualsGreaterThanToken = equalsGreaterThanToken data.Body = body - return f.newNode(KindArrowFunction, data) + return f.newNode(KindArrowFunction, data.AsNode(), data) } func (f *NodeFactory) UpdateArrowFunction(node *ArrowFunction, modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, equalsGreaterThanToken *EqualsGreaterThanToken, body *ConciseBody) *Node { @@ -3971,7 +3971,7 @@ func (f *NodeFactory) NewFunctionExpression(modifiers *ModifierList, asteriskTok data.Type = typeNode data.FullSignature = fullSignature data.Body = body - return f.newNode(KindFunctionExpression, data) + return f.newNode(KindFunctionExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateFunctionExpression(node *FunctionExpression, modifiers *ModifierList, asteriskToken *AsteriskToken, name *IdentifierNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { @@ -4022,7 +4022,7 @@ func (f *NodeFactory) NewAsExpression(expression *Expression, typeNode *TypeNode data := &AsExpression{} data.Expression = expression data.Type = typeNode - return f.newNode(KindAsExpression, data) + return f.newNode(KindAsExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateAsExpression(node *AsExpression, expression *Expression, typeNode *TypeNode) *Node { @@ -4062,7 +4062,7 @@ func (f *NodeFactory) NewSatisfiesExpression(expression *Expression, typeNode *T data := &SatisfiesExpression{} data.Expression = expression data.Type = typeNode - return f.newNode(KindSatisfiesExpression, data) + return f.newNode(KindSatisfiesExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateSatisfiesExpression(node *SatisfiesExpression, expression *Expression, typeNode *TypeNode) *Node { @@ -4109,7 +4109,7 @@ func (f *NodeFactory) NewConditionalExpression(condition *Expression, questionTo data.WhenTrue = whenTrue data.ColonToken = colonToken data.WhenFalse = whenFalse - return f.newNode(KindConditionalExpression, data) + return f.newNode(KindConditionalExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateConditionalExpression(node *ConditionalExpression, condition *Expression, questionToken *QuestionToken, whenTrue *Expression, colonToken *ColonToken, whenFalse *Expression) *Node { @@ -4165,7 +4165,7 @@ func (f *NodeFactory) NewPropertyAccessExpression(expression *Expression, questi data.Expression = expression data.QuestionDotToken = questionDotToken data.name = name - node := f.newNode(KindPropertyAccessExpression, data) + node := f.newNode(KindPropertyAccessExpression, data.AsNode(), data) node.Flags |= flags & NodeFlagsOptionalChain return node } @@ -4215,7 +4215,7 @@ func (f *NodeFactory) NewElementAccessExpression(expression *Expression, questio data.Expression = expression data.QuestionDotToken = questionDotToken data.ArgumentExpression = argumentExpression - node := f.newNode(KindElementAccessExpression, data) + node := f.newNode(KindElementAccessExpression, data.AsNode(), data) node.Flags |= flags & NodeFlagsOptionalChain return node } @@ -4269,7 +4269,7 @@ func (f *NodeFactory) NewCallExpression(expression *Expression, questionDotToken data.QuestionDotToken = questionDotToken data.TypeArguments = typeArguments data.Arguments = arguments - node := f.newNode(KindCallExpression, data) + node := f.newNode(KindCallExpression, data.AsNode(), data) node.Flags |= flags & NodeFlagsOptionalChain return node } @@ -4317,7 +4317,7 @@ func (f *NodeFactory) NewNewExpression(expression *Expression, typeArguments *Ty data.Expression = expression data.TypeArguments = typeArguments data.Arguments = arguments - return f.newNode(KindNewExpression, data) + return f.newNode(KindNewExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateNewExpression(node *NewExpression, expression *Expression, typeArguments *TypeList, arguments *ElementList) *Node { @@ -4359,7 +4359,7 @@ func (f *NodeFactory) NewMetaProperty(keywordToken Kind, name *IdentifierNode) * data := &MetaProperty{} data.KeywordToken = keywordToken data.name = name - return f.newNode(KindMetaProperty, data) + return f.newNode(KindMetaProperty, data.AsNode(), data) } func (f *NodeFactory) UpdateMetaProperty(node *MetaProperty, keywordToken Kind, name *IdentifierNode) *Node { @@ -4401,7 +4401,7 @@ type NonNullExpression struct { func (f *NodeFactory) NewNonNullExpression(expression *Expression, flags NodeFlags) *Node { data := &NonNullExpression{} data.Expression = expression - node := f.newNode(KindNonNullExpression, data) + node := f.newNode(KindNonNullExpression, data.AsNode(), data) node.Flags |= flags & NodeFlagsOptionalChain return node } @@ -4441,7 +4441,7 @@ type SpreadElement struct { func (f *NodeFactory) NewSpreadElement(expression *Expression) *Node { data := &SpreadElement{} data.Expression = expression - return f.newNode(KindSpreadElement, data) + return f.newNode(KindSpreadElement, data.AsNode(), data) } func (f *NodeFactory) UpdateSpreadElement(node *SpreadElement, expression *Expression) *Node { @@ -4482,7 +4482,7 @@ func (f *NodeFactory) NewTemplateExpression(head *TemplateHeadNode, templateSpan data := &TemplateExpression{} data.Head = head data.TemplateSpans = templateSpans - return f.newNode(KindTemplateExpression, data) + return f.newNode(KindTemplateExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateTemplateExpression(node *TemplateExpression, head *TemplateHeadNode, templateSpans *TemplateSpanList) *Node { @@ -4527,7 +4527,7 @@ func (f *NodeFactory) NewTemplateSpan(expression *Expression, literal *TemplateM data := &TemplateSpan{} data.Expression = expression data.Literal = literal - return f.newNode(KindTemplateSpan, data) + return f.newNode(KindTemplateSpan, data.AsNode(), data) } func (f *NodeFactory) UpdateTemplateSpan(node *TemplateSpan, expression *Expression, literal *TemplateMiddleOrTail) *Node { @@ -4577,7 +4577,7 @@ func (f *NodeFactory) NewTaggedTemplateExpression(tag *Expression, questionDotTo data.QuestionDotToken = questionDotToken data.TypeArguments = typeArguments data.Template = template - node := f.newNode(KindTaggedTemplateExpression, data) + node := f.newNode(KindTaggedTemplateExpression, data.AsNode(), data) node.Flags |= flags & NodeFlagsOptionalChain return node } @@ -4620,7 +4620,7 @@ type ParenthesizedExpression struct { func (f *NodeFactory) NewParenthesizedExpression(expression *Expression) *Node { data := f.parenthesizedExpressionArena.New() data.Expression = expression - return f.newNode(KindParenthesizedExpression, data) + return f.newNode(KindParenthesizedExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateParenthesizedExpression(node *ParenthesizedExpression, expression *Expression) *Node { @@ -4665,7 +4665,7 @@ func (f *NodeFactory) NewArrayLiteralExpression(elements *ElementList, multiLine data := &ArrayLiteralExpression{} data.Elements = elements data.MultiLine = multiLine - return f.newNode(KindArrayLiteralExpression, data) + return f.newNode(KindArrayLiteralExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateArrayLiteralExpression(node *ArrayLiteralExpression, elements *ElementList, multiLine bool) *Node { @@ -4711,7 +4711,7 @@ func (f *NodeFactory) NewObjectLiteralExpression(properties *NodeList, multiLine data := &ObjectLiteralExpression{} data.Properties = properties data.MultiLine = multiLine - return f.newNode(KindObjectLiteralExpression, data) + return f.newNode(KindObjectLiteralExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateObjectLiteralExpression(node *ObjectLiteralExpression, properties *NodeList, multiLine bool) *Node { @@ -4755,7 +4755,7 @@ type SpreadAssignment struct { func (f *NodeFactory) NewSpreadAssignment(expression *Expression) *Node { data := &SpreadAssignment{} data.Expression = expression - return f.newNode(KindSpreadAssignment, data) + return f.newNode(KindSpreadAssignment, data.AsNode(), data) } func (f *NodeFactory) UpdateSpreadAssignment(node *SpreadAssignment, expression *Expression) *Node { @@ -4802,7 +4802,7 @@ func (f *NodeFactory) NewPropertyAssignment(modifiers *ModifierList, name *Prope data.PostfixToken = postfixToken data.Type = typeNode data.Initializer = initializer - return f.newNode(KindPropertyAssignment, data) + return f.newNode(KindPropertyAssignment, data.AsNode(), data) } func (f *NodeFactory) UpdatePropertyAssignment(node *PropertyAssignment, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node { @@ -4859,7 +4859,7 @@ func (f *NodeFactory) NewShorthandPropertyAssignment(modifiers *ModifierList, na data.Type = typeNode data.EqualsToken = equalsToken data.ObjectAssignmentInitializer = objectAssignmentInitializer - return f.newNode(KindShorthandPropertyAssignment, data) + return f.newNode(KindShorthandPropertyAssignment, data.AsNode(), data) } func (f *NodeFactory) UpdateShorthandPropertyAssignment(node *ShorthandPropertyAssignment, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, equalsToken *EqualsToken, objectAssignmentInitializer *Expression) *Node { @@ -4906,7 +4906,7 @@ type DeleteExpression struct { func (f *NodeFactory) NewDeleteExpression(expression *Expression) *Node { data := &DeleteExpression{} data.Expression = expression - return f.newNode(KindDeleteExpression, data) + return f.newNode(KindDeleteExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateDeleteExpression(node *DeleteExpression, expression *Expression) *Node { @@ -4948,7 +4948,7 @@ type TypeOfExpression struct { func (f *NodeFactory) NewTypeOfExpression(expression *Expression) *Node { data := &TypeOfExpression{} data.Expression = expression - return f.newNode(KindTypeOfExpression, data) + return f.newNode(KindTypeOfExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateTypeOfExpression(node *TypeOfExpression, expression *Expression) *Node { @@ -4990,7 +4990,7 @@ type VoidExpression struct { func (f *NodeFactory) NewVoidExpression(expression *Expression) *Node { data := &VoidExpression{} data.Expression = expression - return f.newNode(KindVoidExpression, data) + return f.newNode(KindVoidExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateVoidExpression(node *VoidExpression, expression *Expression) *Node { @@ -5032,7 +5032,7 @@ type AwaitExpression struct { func (f *NodeFactory) NewAwaitExpression(expression *Expression) *Node { data := &AwaitExpression{} data.Expression = expression - return f.newNode(KindAwaitExpression, data) + return f.newNode(KindAwaitExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateAwaitExpression(node *AwaitExpression, expression *Expression) *Node { @@ -5072,7 +5072,7 @@ func (f *NodeFactory) NewTypeAssertion(typeNode *TypeNode, expression *Expressio data := &TypeAssertion{} data.Type = typeNode data.Expression = expression - return f.newNode(KindTypeAssertionExpression, data) + return f.newNode(KindTypeAssertionExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateTypeAssertion(node *TypeAssertion, typeNode *TypeNode, expression *Expression) *Node { @@ -5108,7 +5108,7 @@ type KeywordTypeNode struct { func (f *NodeFactory) NewKeywordTypeNode(kind KeywordTypeSyntaxKind) *Node { data := f.keywordTypeNodeArena.New() - return f.newNode(kind, data) + return f.newNode(kind, data.AsNode(), data) } func (node *KeywordTypeNode) Clone(f NodeFactoryCoercible) *Node { @@ -5134,7 +5134,7 @@ type UnionTypeNode struct { func (f *NodeFactory) NewUnionTypeNode(types *TypeList) *Node { data := f.unionTypeNodeArena.New() data.Types = types - return f.newNode(KindUnionType, data) + return f.newNode(KindUnionType, data.AsNode(), data) } func (f *NodeFactory) UpdateUnionTypeNode(node *UnionTypeNode, types *TypeList) *Node { @@ -5171,7 +5171,7 @@ type IntersectionTypeNode struct { func (f *NodeFactory) NewIntersectionTypeNode(types *TypeList) *Node { data := f.intersectionTypeNodeArena.New() data.Types = types - return f.newNode(KindIntersectionType, data) + return f.newNode(KindIntersectionType, data.AsNode(), data) } func (f *NodeFactory) UpdateIntersectionTypeNode(node *IntersectionTypeNode, types *TypeList) *Node { @@ -5216,7 +5216,7 @@ func (f *NodeFactory) NewConditionalTypeNode(checkType *TypeNode, extendsType *T data.ExtendsType = extendsType data.TrueType = trueType data.FalseType = falseType - return f.newNode(KindConditionalType, data) + return f.newNode(KindConditionalType, data.AsNode(), data) } func (f *NodeFactory) UpdateConditionalTypeNode(node *ConditionalTypeNode, checkType *TypeNode, extendsType *TypeNode, trueType *TypeNode, falseType *TypeNode) *Node { @@ -5259,7 +5259,7 @@ func (f *NodeFactory) NewTypeOperatorNode(operator Kind, typeNode *TypeNode) *No data := f.typeOperatorNodeArena.New() data.Operator = operator data.Type = typeNode - return f.newNode(KindTypeOperator, data) + return f.newNode(KindTypeOperator, data.AsNode(), data) } func (f *NodeFactory) UpdateTypeOperatorNode(node *TypeOperatorNode, operator Kind, typeNode *TypeNode) *Node { @@ -5297,7 +5297,7 @@ type InferTypeNode struct { func (f *NodeFactory) NewInferTypeNode(typeParameter *TypeParameterDeclarationNode) *Node { data := &InferTypeNode{} data.TypeParameter = typeParameter - return f.newNode(KindInferType, data) + return f.newNode(KindInferType, data.AsNode(), data) } func (f *NodeFactory) UpdateInferTypeNode(node *InferTypeNode, typeParameter *TypeParameterDeclarationNode) *Node { @@ -5335,7 +5335,7 @@ type ArrayTypeNode struct { func (f *NodeFactory) NewArrayTypeNode(elementType *TypeNode) *Node { data := f.arrayTypeNodeArena.New() data.ElementType = elementType - return f.newNode(KindArrayType, data) + return f.newNode(KindArrayType, data.AsNode(), data) } func (f *NodeFactory) UpdateArrayTypeNode(node *ArrayTypeNode, elementType *TypeNode) *Node { @@ -5375,7 +5375,7 @@ func (f *NodeFactory) NewIndexedAccessTypeNode(objectType *TypeNode, indexType * data := f.indexedAccessTypeNodeArena.New() data.ObjectType = objectType data.IndexType = indexType - return f.newNode(KindIndexedAccessType, data) + return f.newNode(KindIndexedAccessType, data.AsNode(), data) } func (f *NodeFactory) UpdateIndexedAccessTypeNode(node *IndexedAccessTypeNode, objectType *TypeNode, indexType *TypeNode) *Node { @@ -5414,7 +5414,7 @@ func (f *NodeFactory) NewTypeReferenceNode(typeName *EntityName, typeArguments * data := f.typeReferenceNodeArena.New() data.TypeName = typeName data.TypeArguments = typeArguments - return f.newNode(KindTypeReference, data) + return f.newNode(KindTypeReference, data.AsNode(), data) } func (f *NodeFactory) UpdateTypeReferenceNode(node *TypeReferenceNode, typeName *EntityName, typeArguments *TypeList) *Node { @@ -5455,7 +5455,7 @@ func (f *NodeFactory) NewExpressionWithTypeArguments(expression *Expression, typ data := f.expressionWithTypeArgumentsArena.New() data.Expression = expression data.TypeArguments = typeArguments - return f.newNode(KindExpressionWithTypeArguments, data) + return f.newNode(KindExpressionWithTypeArguments, data.AsNode(), data) } func (f *NodeFactory) UpdateExpressionWithTypeArguments(node *ExpressionWithTypeArguments, expression *Expression, typeArguments *TypeList) *Node { @@ -5493,7 +5493,7 @@ type LiteralTypeNode struct { func (f *NodeFactory) NewLiteralTypeNode(literal *Node) *Node { data := f.literalTypeNodeArena.New() data.Literal = literal - return f.newNode(KindLiteralType, data) + return f.newNode(KindLiteralType, data.AsNode(), data) } func (f *NodeFactory) UpdateLiteralTypeNode(node *LiteralTypeNode, literal *Node) *Node { @@ -5529,7 +5529,7 @@ type ThisTypeNode struct { func (f *NodeFactory) NewThisTypeNode() *Node { data := &ThisTypeNode{} - return f.newNode(KindThisType, data) + return f.newNode(KindThisType, data.AsNode(), data) } func (node *ThisTypeNode) Clone(f NodeFactoryCoercible) *Node { @@ -5556,7 +5556,7 @@ func (f *NodeFactory) NewTypePredicateNode(assertsModifier *AssertsKeyword, para data.AssertsModifier = assertsModifier data.ParameterName = parameterName data.Type = typeNode - return f.newNode(KindTypePredicate, data) + return f.newNode(KindTypePredicate, data.AsNode(), data) } func (f *NodeFactory) UpdateTypePredicateNode(node *TypePredicateNode, assertsModifier *AssertsKeyword, parameterName *TypePredicateParameterName, typeNode *TypeNode) *Node { @@ -5597,7 +5597,7 @@ func (f *NodeFactory) NewImportAttribute(name *ImportAttributeName, value *Expre data := &ImportAttribute{} data.name = name data.Value = value - return f.newNode(KindImportAttribute, data) + return f.newNode(KindImportAttribute, data.AsNode(), data) } func (f *NodeFactory) UpdateImportAttribute(node *ImportAttribute, name *ImportAttributeName, value *Expression) *Node { @@ -5649,7 +5649,7 @@ func (f *NodeFactory) NewImportAttributes(token Kind, attributes *ImportAttribut data.Token = token data.Attributes = attributes data.MultiLine = multiLine - return f.newNode(KindImportAttributes, data) + return f.newNode(KindImportAttributes, data.AsNode(), data) } func (f *NodeFactory) UpdateImportAttributes(node *ImportAttributes, token Kind, attributes *ImportAttributeList, multiLine bool) *Node { @@ -5692,7 +5692,7 @@ func (f *NodeFactory) NewTypeQueryNode(exprName *EntityName, typeArguments *Type data := &TypeQueryNode{} data.ExprName = exprName data.TypeArguments = typeArguments - return f.newNode(KindTypeQuery, data) + return f.newNode(KindTypeQuery, data.AsNode(), data) } func (f *NodeFactory) UpdateTypeQueryNode(node *TypeQueryNode, exprName *EntityName, typeArguments *TypeList) *Node { @@ -5742,7 +5742,7 @@ func (f *NodeFactory) NewMappedTypeNode(readonlyToken *TokenNode, typeParameter data.QuestionToken = questionToken data.Type = typeNode data.Members = members - return f.newNode(KindMappedType, data) + return f.newNode(KindMappedType, data.AsNode(), data) } func (f *NodeFactory) UpdateMappedTypeNode(node *MappedTypeNode, readonlyToken *TokenNode, typeParameter *TypeParameterDeclarationNode, nameType *TypeNode, questionToken *TokenNode, typeNode *TypeNode, members *TypeElementList) *Node { @@ -5786,7 +5786,7 @@ type TypeLiteralNode struct { func (f *NodeFactory) NewTypeLiteralNode(members *TypeElementList) *Node { data := f.typeLiteralNodeArena.New() data.Members = members - return f.newNode(KindTypeLiteral, data) + return f.newNode(KindTypeLiteral, data.AsNode(), data) } func (f *NodeFactory) UpdateTypeLiteralNode(node *TypeLiteralNode, members *TypeElementList) *Node { @@ -5824,7 +5824,7 @@ type TupleTypeNode struct { func (f *NodeFactory) NewTupleTypeNode(elements *TypeList) *Node { data := &TupleTypeNode{} data.Elements = elements - return f.newNode(KindTupleType, data) + return f.newNode(KindTupleType, data.AsNode(), data) } func (f *NodeFactory) UpdateTupleTypeNode(node *TupleTypeNode, elements *TypeList) *Node { @@ -5869,7 +5869,7 @@ func (f *NodeFactory) NewNamedTupleMember(dotDotDotToken *DotDotDotToken, name * data.name = name data.QuestionToken = questionToken data.Type = typeNode - return f.newNode(KindNamedTupleMember, data) + return f.newNode(KindNamedTupleMember, data.AsNode(), data) } func (f *NodeFactory) UpdateNamedTupleMember(node *NamedTupleMember, dotDotDotToken *DotDotDotToken, name *IdentifierNode, questionToken *QuestionToken, typeNode *TypeNode) *Node { @@ -5914,7 +5914,7 @@ type OptionalTypeNode struct { func (f *NodeFactory) NewOptionalTypeNode(typeNode *TypeNode) *Node { data := &OptionalTypeNode{} data.Type = typeNode - return f.newNode(KindOptionalType, data) + return f.newNode(KindOptionalType, data.AsNode(), data) } func (f *NodeFactory) UpdateOptionalTypeNode(node *OptionalTypeNode, typeNode *TypeNode) *Node { @@ -5952,7 +5952,7 @@ type RestTypeNode struct { func (f *NodeFactory) NewRestTypeNode(typeNode *TypeNode) *Node { data := &RestTypeNode{} data.Type = typeNode - return f.newNode(KindRestType, data) + return f.newNode(KindRestType, data.AsNode(), data) } func (f *NodeFactory) UpdateRestTypeNode(node *RestTypeNode, typeNode *TypeNode) *Node { @@ -5990,7 +5990,7 @@ type ParenthesizedTypeNode struct { func (f *NodeFactory) NewParenthesizedTypeNode(typeNode *TypeNode) *Node { data := f.parenthesizedTypeNodeArena.New() data.Type = typeNode - return f.newNode(KindParenthesizedType, data) + return f.newNode(KindParenthesizedType, data.AsNode(), data) } func (f *NodeFactory) UpdateParenthesizedTypeNode(node *ParenthesizedTypeNode, typeNode *TypeNode) *Node { @@ -6029,7 +6029,7 @@ func (f *NodeFactory) NewFunctionTypeNode(typeParameters *TypeParameterList, par data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode - return f.newNode(KindFunctionType, data) + return f.newNode(KindFunctionType, data.AsNode(), data) } func (f *NodeFactory) UpdateFunctionTypeNode(node *FunctionTypeNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { @@ -6069,7 +6069,7 @@ func (f *NodeFactory) NewConstructorTypeNode(modifiers *ModifierList, typeParame data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode - return f.newNode(KindConstructorType, data) + return f.newNode(KindConstructorType, data.AsNode(), data) } func (f *NodeFactory) UpdateConstructorTypeNode(node *ConstructorTypeNode, modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { @@ -6113,7 +6113,7 @@ func (f *NodeFactory) NewTemplateHead(text string, rawText string, templateFlags data.RawText = rawText data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags f.textCount++ - return f.newNode(KindTemplateHead, data) + return f.newNode(KindTemplateHead, data.AsNode(), data) } func (node *TemplateHead) Clone(f NodeFactoryCoercible) *Node { @@ -6139,7 +6139,7 @@ func (f *NodeFactory) NewTemplateMiddle(text string, rawText string, templateFla data.RawText = rawText data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags f.textCount++ - return f.newNode(KindTemplateMiddle, data) + return f.newNode(KindTemplateMiddle, data.AsNode(), data) } func (node *TemplateMiddle) Clone(f NodeFactoryCoercible) *Node { @@ -6165,7 +6165,7 @@ func (f *NodeFactory) NewTemplateTail(text string, rawText string, templateFlags data.RawText = rawText data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags f.textCount++ - return f.newNode(KindTemplateTail, data) + return f.newNode(KindTemplateTail, data.AsNode(), data) } func (node *TemplateTail) Clone(f NodeFactoryCoercible) *Node { @@ -6190,7 +6190,7 @@ func (f *NodeFactory) NewTemplateLiteralTypeNode(head *TemplateHeadNode, templat data := &TemplateLiteralTypeNode{} data.Head = head data.TemplateSpans = templateSpans - return f.newNode(KindTemplateLiteralType, data) + return f.newNode(KindTemplateLiteralType, data.AsNode(), data) } func (f *NodeFactory) UpdateTemplateLiteralTypeNode(node *TemplateLiteralTypeNode, head *TemplateHeadNode, templateSpans *TemplateLiteralTypeSpanList) *Node { @@ -6230,7 +6230,7 @@ func (f *NodeFactory) NewTemplateLiteralTypeSpan(typeNode *TypeNode, literal *Te data := &TemplateLiteralTypeSpan{} data.Type = typeNode data.Literal = literal - return f.newNode(KindTemplateLiteralTypeSpan, data) + return f.newNode(KindTemplateLiteralTypeSpan, data.AsNode(), data) } func (f *NodeFactory) UpdateTemplateLiteralTypeSpan(node *TemplateLiteralTypeSpan, typeNode *TypeNode, literal *TemplateMiddleOrTail) *Node { @@ -6272,7 +6272,7 @@ func (f *NodeFactory) NewSyntheticExpression(typeNode any, isSpread bool, tupleN data.Type = typeNode data.IsSpread = isSpread data.TupleNameSource = tupleNameSource - return f.newNode(KindSyntheticExpression, data) + return f.newNode(KindSyntheticExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateSyntheticExpression(node *SyntheticExpression, typeNode any, isSpread bool, tupleNameSource *Node) *Node { @@ -6310,7 +6310,7 @@ type PartiallyEmittedExpression struct { func (f *NodeFactory) NewPartiallyEmittedExpression(expression *Expression) *Node { data := &PartiallyEmittedExpression{} data.Expression = expression - return f.newNode(KindPartiallyEmittedExpression, data) + return f.newNode(KindPartiallyEmittedExpression, data.AsNode(), data) } func (f *NodeFactory) UpdatePartiallyEmittedExpression(node *PartiallyEmittedExpression, expression *Expression) *Node { @@ -6357,7 +6357,7 @@ func (f *NodeFactory) NewJsxElement(openingElement *JsxOpeningElementNode, child data.OpeningElement = openingElement data.Children = children data.ClosingElement = closingElement - return f.newNode(KindJsxElement, data) + return f.newNode(KindJsxElement, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxElement(node *JsxElement, openingElement *JsxOpeningElementNode, children *JsxChildList, closingElement *JsxClosingElementNode) *Node { @@ -6397,7 +6397,7 @@ type JsxAttributes struct { func (f *NodeFactory) NewJsxAttributes(properties *JsxAttributeList) *Node { data := &JsxAttributes{} data.Properties = properties - return f.newNode(KindJsxAttributes, data) + return f.newNode(KindJsxAttributes, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxAttributes(node *JsxAttributes, properties *JsxAttributeList) *Node { @@ -6438,7 +6438,7 @@ func (f *NodeFactory) NewJsxNamespacedName(namespace *IdentifierNode, name *Iden data := &JsxNamespacedName{} data.Namespace = namespace data.name = name - return f.newNode(KindJsxNamespacedName, data) + return f.newNode(KindJsxNamespacedName, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxNamespacedName(node *JsxNamespacedName, namespace *IdentifierNode, name *IdentifierNode) *Node { @@ -6485,7 +6485,7 @@ func (f *NodeFactory) NewJsxOpeningElement(tagName *JsxTagNameExpression, typeAr data.TagName = tagName data.TypeArguments = typeArguments data.Attributes = attributes - return f.newNode(KindJsxOpeningElement, data) + return f.newNode(KindJsxOpeningElement, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxOpeningElement(node *JsxOpeningElement, tagName *JsxTagNameExpression, typeArguments *TypeList, attributes *JsxAttributesNode) *Node { @@ -6528,7 +6528,7 @@ func (f *NodeFactory) NewJsxSelfClosingElement(tagName *JsxTagNameExpression, ty data.TagName = tagName data.TypeArguments = typeArguments data.Attributes = attributes - return f.newNode(KindJsxSelfClosingElement, data) + return f.newNode(KindJsxSelfClosingElement, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxSelfClosingElement(node *JsxSelfClosingElement, tagName *JsxTagNameExpression, typeArguments *TypeList, attributes *JsxAttributesNode) *Node { @@ -6571,7 +6571,7 @@ func (f *NodeFactory) NewJsxFragment(openingFragment *JsxOpeningFragmentNode, ch data.OpeningFragment = openingFragment data.Children = children data.ClosingFragment = closingFragment - return f.newNode(KindJsxFragment, data) + return f.newNode(KindJsxFragment, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxFragment(node *JsxFragment, openingFragment *JsxOpeningFragmentNode, children *JsxChildList, closingFragment *JsxClosingFragmentNode) *Node { @@ -6607,7 +6607,7 @@ type JsxOpeningFragment struct { func (f *NodeFactory) NewJsxOpeningFragment() *Node { data := &JsxOpeningFragment{} - return f.newNode(KindJsxOpeningFragment, data) + return f.newNode(KindJsxOpeningFragment, data.AsNode(), data) } func (node *JsxOpeningFragment) Clone(f NodeFactoryCoercible) *Node { @@ -6628,7 +6628,7 @@ type JsxClosingFragment struct { func (f *NodeFactory) NewJsxClosingFragment() *Node { data := &JsxClosingFragment{} - return f.newNode(KindJsxClosingFragment, data) + return f.newNode(KindJsxClosingFragment, data.AsNode(), data) } func (node *JsxClosingFragment) Clone(f NodeFactoryCoercible) *Node { @@ -6655,7 +6655,7 @@ func (f *NodeFactory) NewJsxAttribute(name *JsxAttributeName, initializer *JsxAt data := &JsxAttribute{} data.name = name data.Initializer = initializer - return f.newNode(KindJsxAttribute, data) + return f.newNode(KindJsxAttribute, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxAttribute(node *JsxAttribute, name *JsxAttributeName, initializer *JsxAttributeValue) *Node { @@ -6698,7 +6698,7 @@ type JsxSpreadAttribute struct { func (f *NodeFactory) NewJsxSpreadAttribute(expression *Expression) *Node { data := &JsxSpreadAttribute{} data.Expression = expression - return f.newNode(KindJsxSpreadAttribute, data) + return f.newNode(KindJsxSpreadAttribute, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxSpreadAttribute(node *JsxSpreadAttribute, expression *Expression) *Node { @@ -6736,7 +6736,7 @@ type JsxClosingElement struct { func (f *NodeFactory) NewJsxClosingElement(tagName *JsxTagNameExpression) *Node { data := &JsxClosingElement{} data.TagName = tagName - return f.newNode(KindJsxClosingElement, data) + return f.newNode(KindJsxClosingElement, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxClosingElement(node *JsxClosingElement, tagName *JsxTagNameExpression) *Node { @@ -6776,7 +6776,7 @@ func (f *NodeFactory) NewJsxExpression(dotDotDotToken *DotDotDotToken, expressio data := &JsxExpression{} data.DotDotDotToken = dotDotDotToken data.Expression = expression - return f.newNode(KindJsxExpression, data) + return f.newNode(KindJsxExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateJsxExpression(node *JsxExpression, dotDotDotToken *DotDotDotToken, expression *Expression) *Node { @@ -6817,7 +6817,7 @@ func (f *NodeFactory) NewJsxText(text string, containsOnlyTriviaWhiteSpaces bool data.Text = text data.ContainsOnlyTriviaWhiteSpaces = containsOnlyTriviaWhiteSpaces f.textCount++ - return f.newNode(KindJsxText, data) + return f.newNode(KindJsxText, data.AsNode(), data) } func (node *JsxText) Clone(f NodeFactoryCoercible) *Node { @@ -6840,7 +6840,7 @@ type SyntaxList struct { func (f *NodeFactory) NewSyntaxList(children []*Node) *Node { data := &SyntaxList{} data.Children = children - return f.newNode(KindSyntaxList, data) + return f.newNode(KindSyntaxList, data.AsNode(), data) } func (f *NodeFactory) UpdateSyntaxList(node *SyntaxList, children []*Node) *Node { @@ -6881,7 +6881,7 @@ func (f *NodeFactory) NewJSDoc(comment *NodeList, tags *NodeList) *Node { data := f.jsdocArena.New() data.Comment = comment data.Tags = tags - return f.newNode(KindJSDoc, data) + return f.newNode(KindJSDoc, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDoc(node *JSDoc, comment *NodeList, tags *NodeList) *Node { @@ -6919,7 +6919,7 @@ type JSDocTypeExpression struct { func (f *NodeFactory) NewJSDocTypeExpression(typeNode *TypeNode) *Node { data := &JSDocTypeExpression{} data.Type = typeNode - return f.newNode(KindJSDocTypeExpression, data) + return f.newNode(KindJSDocTypeExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocTypeExpression(node *JSDocTypeExpression, typeNode *TypeNode) *Node { @@ -6957,7 +6957,7 @@ type JSDocNonNullableType struct { func (f *NodeFactory) NewJSDocNonNullableType(typeNode *TypeNode) *Node { data := &JSDocNonNullableType{} data.Type = typeNode - return f.newNode(KindJSDocNonNullableType, data) + return f.newNode(KindJSDocNonNullableType, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocNonNullableType(node *JSDocNonNullableType, typeNode *TypeNode) *Node { @@ -6995,7 +6995,7 @@ type JSDocNullableType struct { func (f *NodeFactory) NewJSDocNullableType(typeNode *TypeNode) *Node { data := &JSDocNullableType{} data.Type = typeNode - return f.newNode(KindJSDocNullableType, data) + return f.newNode(KindJSDocNullableType, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocNullableType(node *JSDocNullableType, typeNode *TypeNode) *Node { @@ -7031,7 +7031,7 @@ type JSDocAllType struct { func (f *NodeFactory) NewJSDocAllType() *Node { data := &JSDocAllType{} - return f.newNode(KindJSDocAllType, data) + return f.newNode(KindJSDocAllType, data.AsNode(), data) } func (node *JSDocAllType) Clone(f NodeFactoryCoercible) *Node { @@ -7054,7 +7054,7 @@ type JSDocVariadicType struct { func (f *NodeFactory) NewJSDocVariadicType(typeNode *TypeNode) *Node { data := &JSDocVariadicType{} data.Type = typeNode - return f.newNode(KindJSDocVariadicType, data) + return f.newNode(KindJSDocVariadicType, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocVariadicType(node *JSDocVariadicType, typeNode *TypeNode) *Node { @@ -7092,7 +7092,7 @@ type JSDocOptionalType struct { func (f *NodeFactory) NewJSDocOptionalType(typeNode *TypeNode) *Node { data := &JSDocOptionalType{} data.Type = typeNode - return f.newNode(KindJSDocOptionalType, data) + return f.newNode(KindJSDocOptionalType, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocOptionalType(node *JSDocOptionalType, typeNode *TypeNode) *Node { @@ -7132,7 +7132,7 @@ func (f *NodeFactory) NewJSDocTypeTag(tagName *IdentifierNode, typeExpression *N data.TagName = tagName data.TypeExpression = typeExpression data.Comment = comment - return f.newNode(KindJSDocTypeTag, data) + return f.newNode(KindJSDocTypeTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocTypeTag(node *JSDocTypeTag, tagName *IdentifierNode, typeExpression *Node, comment *NodeList) *Node { @@ -7170,7 +7170,7 @@ func (f *NodeFactory) NewJSDocUnknownTag(tagName *IdentifierNode, comment *NodeL data := f.jsdocUnknownTagArena.New() data.TagName = tagName data.Comment = comment - return f.newNode(KindJSDocUnknownTag, data) + return f.newNode(KindJSDocUnknownTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocUnknownTag(node *JSDocUnknownTag, tagName *IdentifierNode, comment *NodeList) *Node { @@ -7212,7 +7212,7 @@ func (f *NodeFactory) NewJSDocTemplateTag(tagName *IdentifierNode, constraint *N data.Constraint = constraint data.TypeParameters = typeParameters data.Comment = comment - return f.newNode(KindJSDocTemplateTag, data) + return f.newNode(KindJSDocTemplateTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocTemplateTag(node *JSDocTemplateTag, tagName *IdentifierNode, constraint *Node, typeParameters *TypeParameterList, comment *NodeList) *Node { @@ -7255,7 +7255,7 @@ func (f *NodeFactory) NewJSDocReturnTag(tagName *IdentifierNode, typeExpression data.TagName = tagName data.TypeExpression = typeExpression data.Comment = comment - return f.newNode(KindJSDocReturnTag, data) + return f.newNode(KindJSDocReturnTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocReturnTag(node *JSDocReturnTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node { @@ -7293,7 +7293,7 @@ func (f *NodeFactory) NewJSDocPublicTag(tagName *IdentifierNode, comment *NodeLi data := &JSDocPublicTag{} data.TagName = tagName data.Comment = comment - return f.newNode(KindJSDocPublicTag, data) + return f.newNode(KindJSDocPublicTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocPublicTag(node *JSDocPublicTag, tagName *IdentifierNode, comment *NodeList) *Node { @@ -7331,7 +7331,7 @@ func (f *NodeFactory) NewJSDocPrivateTag(tagName *IdentifierNode, comment *NodeL data := &JSDocPrivateTag{} data.TagName = tagName data.Comment = comment - return f.newNode(KindJSDocPrivateTag, data) + return f.newNode(KindJSDocPrivateTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocPrivateTag(node *JSDocPrivateTag, tagName *IdentifierNode, comment *NodeList) *Node { @@ -7369,7 +7369,7 @@ func (f *NodeFactory) NewJSDocProtectedTag(tagName *IdentifierNode, comment *Nod data := &JSDocProtectedTag{} data.TagName = tagName data.Comment = comment - return f.newNode(KindJSDocProtectedTag, data) + return f.newNode(KindJSDocProtectedTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocProtectedTag(node *JSDocProtectedTag, tagName *IdentifierNode, comment *NodeList) *Node { @@ -7407,7 +7407,7 @@ func (f *NodeFactory) NewJSDocReadonlyTag(tagName *IdentifierNode, comment *Node data := &JSDocReadonlyTag{} data.TagName = tagName data.Comment = comment - return f.newNode(KindJSDocReadonlyTag, data) + return f.newNode(KindJSDocReadonlyTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocReadonlyTag(node *JSDocReadonlyTag, tagName *IdentifierNode, comment *NodeList) *Node { @@ -7445,7 +7445,7 @@ func (f *NodeFactory) NewJSDocOverrideTag(tagName *IdentifierNode, comment *Node data := &JSDocOverrideTag{} data.TagName = tagName data.Comment = comment - return f.newNode(KindJSDocOverrideTag, data) + return f.newNode(KindJSDocOverrideTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocOverrideTag(node *JSDocOverrideTag, tagName *IdentifierNode, comment *NodeList) *Node { @@ -7483,7 +7483,7 @@ func (f *NodeFactory) NewJSDocDeprecatedTag(tagName *IdentifierNode, comment *No data := f.jsdocDeprecatedTagArena.New() data.TagName = tagName data.Comment = comment - return f.newNode(KindJSDocDeprecatedTag, data) + return f.newNode(KindJSDocDeprecatedTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocDeprecatedTag(node *JSDocDeprecatedTag, tagName *IdentifierNode, comment *NodeList) *Node { @@ -7523,7 +7523,7 @@ func (f *NodeFactory) NewJSDocSeeTag(tagName *IdentifierNode, nameExpression *Ty data.TagName = tagName data.NameExpression = nameExpression data.Comment = comment - return f.newNode(KindJSDocSeeTag, data) + return f.newNode(KindJSDocSeeTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocSeeTag(node *JSDocSeeTag, tagName *IdentifierNode, nameExpression *TypeNode, comment *NodeList) *Node { @@ -7563,7 +7563,7 @@ func (f *NodeFactory) NewJSDocImplementsTag(tagName *IdentifierNode, className * data.TagName = tagName data.ClassName = className data.Comment = comment - return f.newNode(KindJSDocImplementsTag, data) + return f.newNode(KindJSDocImplementsTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocImplementsTag(node *JSDocImplementsTag, tagName *IdentifierNode, className *ExpressionWithTypeArgumentsNode, comment *NodeList) *Node { @@ -7603,7 +7603,7 @@ func (f *NodeFactory) NewJSDocAugmentsTag(tagName *IdentifierNode, className *Ex data.TagName = tagName data.ClassName = className data.Comment = comment - return f.newNode(KindJSDocAugmentsTag, data) + return f.newNode(KindJSDocAugmentsTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocAugmentsTag(node *JSDocAugmentsTag, tagName *IdentifierNode, className *ExpressionWithTypeArgumentsNode, comment *NodeList) *Node { @@ -7643,7 +7643,7 @@ func (f *NodeFactory) NewJSDocSatisfiesTag(tagName *IdentifierNode, typeExpressi data.TagName = tagName data.TypeExpression = typeExpression data.Comment = comment - return f.newNode(KindJSDocSatisfiesTag, data) + return f.newNode(KindJSDocSatisfiesTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocSatisfiesTag(node *JSDocSatisfiesTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node { @@ -7683,7 +7683,7 @@ func (f *NodeFactory) NewJSDocThrowsTag(tagName *IdentifierNode, typeExpression data.TagName = tagName data.TypeExpression = typeExpression data.Comment = comment - return f.newNode(KindJSDocThrowsTag, data) + return f.newNode(KindJSDocThrowsTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocThrowsTag(node *JSDocThrowsTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node { @@ -7723,7 +7723,7 @@ func (f *NodeFactory) NewJSDocThisTag(tagName *IdentifierNode, typeExpression *T data.TagName = tagName data.TypeExpression = typeExpression data.Comment = comment - return f.newNode(KindJSDocThisTag, data) + return f.newNode(KindJSDocThisTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocThisTag(node *JSDocThisTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node { @@ -7767,7 +7767,7 @@ func (f *NodeFactory) NewJSDocImportTag(tagName *IdentifierNode, importClause *I data.ModuleSpecifier = moduleSpecifier data.Attributes = attributes data.Comment = comment - return f.newNode(KindJSDocImportTag, data) + return f.newNode(KindJSDocImportTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocImportTag(node *JSDocImportTag, tagName *IdentifierNode, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode, comment *NodeList) *Node { @@ -7813,7 +7813,7 @@ func (f *NodeFactory) NewJSDocCallbackTag(tagName *IdentifierNode, typeExpressio data.TypeExpression = typeExpression data.name = name data.Comment = comment - return f.newNode(KindJSDocCallbackTag, data) + return f.newNode(KindJSDocCallbackTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocCallbackTag(node *JSDocCallbackTag, tagName *IdentifierNode, typeExpression *TypeNode, name *JSDocFullName, comment *NodeList) *Node { @@ -7860,7 +7860,7 @@ func (f *NodeFactory) NewJSDocOverloadTag(tagName *IdentifierNode, typeExpressio data.TagName = tagName data.TypeExpression = typeExpression data.Comment = comment - return f.newNode(KindJSDocOverloadTag, data) + return f.newNode(KindJSDocOverloadTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocOverloadTag(node *JSDocOverloadTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node { @@ -7902,7 +7902,7 @@ func (f *NodeFactory) NewJSDocTypedefTag(tagName *IdentifierNode, typeExpression data.TypeExpression = typeExpression data.name = name data.Comment = comment - return f.newNode(KindJSDocTypedefTag, data) + return f.newNode(KindJSDocTypedefTag, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocTypedefTag(node *JSDocTypedefTag, tagName *IdentifierNode, typeExpression *Node, name *JSDocFullName, comment *NodeList) *Node { @@ -7950,7 +7950,7 @@ func (f *NodeFactory) NewJSDocSignature(typeParameters *TypeParameterList, param data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode - return f.newNode(KindJSDocSignature, data) + return f.newNode(KindJSDocSignature, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocSignature(node *JSDocSignature, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { @@ -7988,7 +7988,7 @@ type JSDocNameReference struct { func (f *NodeFactory) NewJSDocNameReference(name *EntityName) *Node { data := &JSDocNameReference{} data.name = name - return f.newNode(KindJSDocNameReference, data) + return f.newNode(KindJSDocNameReference, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocNameReference(node *JSDocNameReference, name *EntityName) *Node { @@ -8049,7 +8049,7 @@ func (f *NodeFactory) NewModuleDeclaration(modifiers *ModifierList, keyword Kind data.Keyword = keyword data.name = name data.Body = body - return f.newNode(KindModuleDeclaration, data) + return f.newNode(KindModuleDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateModuleDeclaration(node *ModuleDeclaration, modifiers *ModifierList, keyword Kind, name *ModuleName, body *ModuleBody) *Node { @@ -8100,7 +8100,7 @@ func (f *NodeFactory) NewImportEqualsDeclaration(modifiers *ModifierList, isType data.IsTypeOnly = isTypeOnly data.name = name data.ModuleReference = moduleReference - return f.newNode(KindImportEqualsDeclaration, data) + return f.newNode(KindImportEqualsDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateImportEqualsDeclaration(node *ImportEqualsDeclaration, modifiers *ModifierList, isTypeOnly bool, name *IdentifierNode, moduleReference *ModuleReference) *Node { @@ -8152,7 +8152,7 @@ func (f *NodeFactory) NewExportDeclaration(modifiers *ModifierList, isTypeOnly b data.ExportClause = exportClause data.ModuleSpecifier = moduleSpecifier data.Attributes = attributes - return f.newNode(KindExportDeclaration, data) + return f.newNode(KindExportDeclaration, data.AsNode(), data) } func (f *NodeFactory) UpdateExportDeclaration(node *ExportDeclaration, modifiers *ModifierList, isTypeOnly bool, exportClause *NamedExportBindings, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node { @@ -8200,7 +8200,7 @@ func (f *NodeFactory) NewImportTypeNode(isTypeOf bool, argument *TypeNode, attri data.Attributes = attributes data.Qualifier = qualifier data.TypeArguments = typeArguments - return f.newNode(KindImportType, data) + return f.newNode(KindImportType, data.AsNode(), data) } func (f *NodeFactory) UpdateImportTypeNode(node *ImportTypeNode, isTypeOf bool, argument *TypeNode, attributes *ImportAttributesNode, qualifier *EntityName, typeArguments *TypeList) *Node { @@ -8248,7 +8248,7 @@ func (f *NodeFactory) NewImportClause(phaseModifier ImportPhaseModifierSyntaxKin data.PhaseModifier = phaseModifier data.name = name data.NamedBindings = namedBindings - return f.newNode(KindImportClause, data) + return f.newNode(KindImportClause, data.AsNode(), data) } func (f *NodeFactory) UpdateImportClause(node *ImportClause, phaseModifier ImportPhaseModifierSyntaxKind, name *IdentifierNode, namedBindings *NamedImportBindings) *Node { @@ -8297,7 +8297,7 @@ func (f *NodeFactory) NewImportSpecifier(isTypeOnly bool, propertyName *ModuleEx data.IsTypeOnly = isTypeOnly data.PropertyName = propertyName data.name = name - return f.newNode(KindImportSpecifier, data) + return f.newNode(KindImportSpecifier, data.AsNode(), data) } func (f *NodeFactory) UpdateImportSpecifier(node *ImportSpecifier, isTypeOnly bool, propertyName *ModuleExportName, name *IdentifierNode) *Node { @@ -8339,7 +8339,7 @@ func (f *NodeFactory) NewJSDocText(text []string) *Node { data := f.jsdocTextArena.New() data.text = text f.textCount++ - return f.newNode(KindJSDocText, data) + return f.newNode(KindJSDocText, data.AsNode(), data) } func (node *JSDocText) Clone(f NodeFactoryCoercible) *Node { @@ -8364,7 +8364,7 @@ func (f *NodeFactory) NewJSDocLink(name *EntityName, text []string) *Node { data.name = name data.text = text f.textCount++ - return f.newNode(KindJSDocLink, data) + return f.newNode(KindJSDocLink, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocLink(node *JSDocLink, name *EntityName, text []string) *Node { @@ -8408,7 +8408,7 @@ func (f *NodeFactory) NewJSDocLinkPlain(name *EntityName, text []string) *Node { data.name = name data.text = text f.textCount++ - return f.newNode(KindJSDocLinkPlain, data) + return f.newNode(KindJSDocLinkPlain, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocLinkPlain(node *JSDocLinkPlain, name *EntityName, text []string) *Node { @@ -8452,7 +8452,7 @@ func (f *NodeFactory) NewJSDocLinkCode(name *EntityName, text []string) *Node { data.name = name data.text = text f.textCount++ - return f.newNode(KindJSDocLinkCode, data) + return f.newNode(KindJSDocLinkCode, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocLinkCode(node *JSDocLinkCode, name *EntityName, text []string) *Node { @@ -8504,7 +8504,7 @@ func (f *NodeFactory) NewTypeParameterDeclaration(modifiers *ModifierList, name data.Constraint = constraint data.Expression = expression data.DefaultType = defaultType - return f.newNode(KindTypeParameter, data) + return f.newNode(KindTypeParameter, data.AsNode(), data) } func (f *NodeFactory) UpdateTypeParameterDeclaration(node *TypeParameterDeclaration, modifiers *ModifierList, name *IdentifierNode, constraint *TypeNode, expression *Expression, defaultType *TypeNode) *Node { @@ -8552,7 +8552,7 @@ func (f *NodeFactory) NewSyntheticReferenceExpression(expression *Expression, th data := &SyntheticReferenceExpression{} data.Expression = expression data.ThisArg = thisArg - return f.newNode(KindSyntheticReferenceExpression, data) + return f.newNode(KindSyntheticReferenceExpression, data.AsNode(), data) } func (f *NodeFactory) UpdateSyntheticReferenceExpression(node *SyntheticReferenceExpression, expression *Expression, thisArg *Expression) *Node { @@ -8598,7 +8598,7 @@ func (f *NodeFactory) NewJSDocTypeLiteral(jsdocPropertyTags []*Node, isArrayType data := &JSDocTypeLiteral{} data.JSDocPropertyTags = jsdocPropertyTags data.IsArrayType = isArrayType - return f.newNode(KindJSDocTypeLiteral, data) + return f.newNode(KindJSDocTypeLiteral, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocTypeLiteral(node *JSDocTypeLiteral, jsdocPropertyTags []*Node, isArrayType bool) *Node { @@ -8645,7 +8645,7 @@ func (f *NodeFactory) NewJSDocParameterOrPropertyTag(kind Kind, tagName *Identif data.TypeExpression = typeExpression data.IsNameFirst = isNameFirst data.Comment = comment - return f.newNode(kind, data) + return f.newNode(kind, data.AsNode(), data) } func (f *NodeFactory) UpdateJSDocParameterOrPropertyTag(node *JSDocParameterOrPropertyTag, tagName *IdentifierNode, name *EntityName, isBracketed bool, typeExpression *TypeNode, isNameFirst bool, comment *NodeList) *Node { diff --git a/tsc/internal/ast/flow.go b/tsc/internal/ast/flow.go index 274a92f716689..3ca4b9033c335 100644 --- a/tsc/internal/ast/flow.go +++ b/tsc/internal/ast/flow.go @@ -52,7 +52,7 @@ func NewFlowSwitchClauseData(switchStatement *Node, clauseStart int, clauseEnd i node.SwitchStatement = switchStatement node.ClauseStart = int32(clauseStart) node.ClauseEnd = int32(clauseEnd) - return newNode(KindUnknown, node, NodeFactoryHooks{}) + return newNode(KindUnknown, node.AsNode(), node, NodeFactoryHooks{}) } func (node *FlowSwitchClauseData) IsEmpty() bool { @@ -71,5 +71,5 @@ func NewFlowReduceLabelData(target *FlowLabel, antecedents *FlowList) *Node { node := &FlowReduceLabelData{} node.Target = target node.Antecedents = antecedents - return newNode(KindUnknown, node, NodeFactoryHooks{}) + return newNode(KindUnknown, node.AsNode(), node, NodeFactoryHooks{}) } From 83f1aa2f5f2b7ec6b6a9e10acb7f92d0b8c6764f Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:42:45 -0700 Subject: [PATCH 05/13] Generate remaining node method dispatch --- tools/scripts/tsc/generate-go-ast.ts | 159 +++++ tsc/internal/ast/ast.go | 12 +- tsc/internal/ast/ast_generated.go | 969 +++++++++++++++++++++++++++ 3 files changed, 1129 insertions(+), 11 deletions(-) diff --git a/tools/scripts/tsc/generate-go-ast.ts b/tools/scripts/tsc/generate-go-ast.ts index b385f52dae210..12c6e6fc89283 100644 --- a/tools/scripts/tsc/generate-go-ast.ts +++ b/tools/scripts/tsc/generate-go-ast.ts @@ -608,6 +608,49 @@ function generateForEachChildDispatch(w: CodeWriter) { w.write(""); } +function generateVisitEachChildDispatch(w: CodeWriter) { + w.write("func (n *Node) VisitEachChild(v *NodeVisitor) *Node {"); + w.push(); + w.write("switch n.Kind {"); + for (const node of api.nodes()) { + if (!hasForEachChild(node)) continue; + const kinds = node.allKinds().map(kind => kind.formatGoConstant()); + if (kinds.length === 0) continue; + w.write(`case ${kinds.join(", ")}:`); + w.push(); + w.write(`return n.data.(*${node.name}).VisitEachChild(v)`); + w.pop(); + } + w.write("default:"); + w.push(); + w.write("return n"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); +} + +function generateCloneDispatch(w: CodeWriter) { + w.write("func (n *Node) Clone(f NodeFactoryCoercible) *Node {"); + w.push(); + w.write("switch n.Kind {"); + for (const [node, kinds] of canonicalNodesByKind()) { + w.write(`case ${kinds.join(", ")}:`); + w.push(); + w.write(`return n.data.(*${node.name}).Clone(f)`); + w.pop(); + } + w.write("default:"); + w.push(); + w.write("return nil"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); +} + const NODE_DATA_ACCESSORS: { method: string; ret: string; base: string; }[] = [ { method: "FlowNodeData", ret: "*FlowNodeBase", base: "FlowNodeBase" }, { method: "DeclarationData", ret: "*DeclarationBase", base: "DeclarationBase" }, @@ -659,6 +702,99 @@ function generateNodeDataAccessors(w: CodeWriter) { } } +function hasMember(node: NodeType, name: string): boolean { + return schemaMembers(node).some(member => member.name === name); +} + +function canonicalNodesByKind(): Map { + // Token's kind union overlaps the concrete identifier, literal, and keyword + // nodes. Later schema entries are the canonical representation for those + // kinds. + const nodeByKind = new Map(); + for (const node of api.nodes()) { + for (const kind of node.allKinds()) { + nodeByKind.set(kind.formatGoConstant(), node); + } + } + + const kindsByNode = new Map(); + for (const [kind, node] of nodeByKind) { + const kinds = kindsByNode.get(node); + if (kinds) { + kinds.push(kind); + } + else { + kindsByNode.set(node, [kind]); + } + } + return kindsByNode; +} + +function generateNameDispatch(w: CodeWriter) { + w.write("func (n *Node) Name() *DeclarationName {"); + w.push(); + w.write("switch n.Kind {"); + for (const node of api.nodes()) { + if (!hasMember(node, "name")) continue; + const kinds = node.allKinds().map(kind => kind.formatGoConstant()); + if (kinds.length === 0) continue; + w.write(`case ${kinds.join(", ")}:`); + w.push(); + w.write(`return n.data.(*${node.name}).Name()`); + w.pop(); + } + w.write("default:"); + w.push(); + w.write("return nil"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); +} + +function generateModifiersDispatch(w: CodeWriter) { + w.write("func (n *Node) Modifiers() *ModifierList {"); + w.push(); + w.write("switch n.Kind {"); + for (const node of api.nodes()) { + if (!hasMember(node, "modifiers")) continue; + const kinds = node.allKinds().map(kind => kind.formatGoConstant()); + if (kinds.length === 0) continue; + w.write(`case ${kinds.join(", ")}:`); + w.push(); + w.write(`return n.data.(*${node.name}).Modifiers()`); + w.pop(); + } + w.write("default:"); + w.push(); + w.write("return nil"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); +} + +function generateSetModifiersDispatch(w: CodeWriter) { + w.write("func (n *MutableNode) SetModifiers(modifiers *ModifierList) {"); + w.push(); + w.write("switch n.Kind {"); + for (const node of api.nodes()) { + if (!hasMember(node, "modifiers")) continue; + const kinds = node.allKinds().map(kind => kind.formatGoConstant()); + if (kinds.length === 0) continue; + w.write(`case ${kinds.join(", ")}:`); + w.push(); + w.write(`n.data.(*${node.name}).setModifiers(modifiers)`); + w.pop(); + } + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); +} + // ── Generate VisitEachChild() ────────────────────────────────────────────── function generateVisitEachChild(w: CodeWriter, node: NodeType) { @@ -1007,6 +1143,20 @@ function generate(): string { w.write(""); generateForEachChildDispatch(w); + // VisitEachChild dispatch + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write("// VisitEachChild dispatch"); + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write(""); + generateVisitEachChildDispatch(w); + + // Clone dispatch + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write("// Clone dispatch"); + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write(""); + generateCloneDispatch(w); + // nodeData accessor dispatch w.write("// ──────────────────────────────────────────────────────────────────────"); w.write("// nodeData accessor dispatch"); @@ -1014,6 +1164,15 @@ function generate(): string { w.write(""); generateNodeDataAccessors(w); + // Common node accessor dispatch + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write("// Common node accessor dispatch"); + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write(""); + generateNameDispatch(w); + generateModifiersDispatch(w); + generateSetModifiersDispatch(w); + // As*() casts w.write("// ──────────────────────────────────────────────────────────────────────"); w.write("// As*() cast methods"); diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index c493c4b2f245f..09aa7f159a9d8 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -208,10 +208,6 @@ func (n *Node) IterChildren() iter.Seq[*Node] { }) } } -func (n *Node) Clone(f NodeFactoryCoercible) *Node { return n.data.Clone(f) } -func (n *Node) VisitEachChild(v *NodeVisitor) *Node { return n.data.VisitEachChild(v) } -func (n *Node) Name() *DeclarationName { return n.data.Name() } -func (n *Node) Modifiers() *ModifierList { return n.data.Modifiers() } func (n *Node) ParameterList() *ParameterList { return n.FunctionLikeData().Parameters } func (n *Node) Parameters() []*ParameterDeclarationNode { return n.ParameterList().Nodes } func (n *Node) SubtreeFacts() SubtreeFacts { return n.data.SubtreeFacts() } @@ -227,8 +223,7 @@ func (n *Node) Decorators() []*Node { type MutableNode Node -func (n *Node) AsMutable() *MutableNode { return (*MutableNode)(n) } -func (n *MutableNode) SetModifiers(modifiers *ModifierList) { n.data.setModifiers(modifiers) } +func (n *Node) AsMutable() *MutableNode { return (*MutableNode)(n) } func (n *Node) Symbol() *Symbol { data := n.DeclarationData() @@ -1172,11 +1167,6 @@ func (n *Node) AsFlowReduceLabelData() *FlowReduceLabelData { // NodeData type nodeData interface { - VisitEachChild(v *NodeVisitor) *Node - Clone(v NodeFactoryCoercible) *Node - Name() *DeclarationName - Modifiers() *ModifierList - setModifiers(modifiers *ModifierList) SubtreeFacts() SubtreeFacts computeSubtreeFacts() SubtreeFacts subtreeFactsWorker(self nodeData) SubtreeFacts diff --git a/tsc/internal/ast/ast_generated.go b/tsc/internal/ast/ast_generated.go index 59fbb04415827..f3cebd0a47beb 100644 --- a/tsc/internal/ast/ast_generated.go +++ b/tsc/internal/ast/ast_generated.go @@ -9024,6 +9024,746 @@ func (n *Node) ForEachChild(v Visitor) bool { } } +// ────────────────────────────────────────────────────────────────────── +// VisitEachChild dispatch +// ────────────────────────────────────────────────────────────────────── + +func (n *Node) VisitEachChild(v *NodeVisitor) *Node { + switch n.Kind { + case KindQualifiedName: + return n.data.(*QualifiedName).VisitEachChild(v) + case KindComputedPropertyName: + return n.data.(*ComputedPropertyName).VisitEachChild(v) + case KindDecorator: + return n.data.(*Decorator).VisitEachChild(v) + case KindIfStatement: + return n.data.(*IfStatement).VisitEachChild(v) + case KindDoStatement: + return n.data.(*DoStatement).VisitEachChild(v) + case KindWhileStatement: + return n.data.(*WhileStatement).VisitEachChild(v) + case KindForStatement: + return n.data.(*ForStatement).VisitEachChild(v) + case KindForInStatement, KindForOfStatement: + return n.data.(*ForInOrOfStatement).VisitEachChild(v) + case KindBreakStatement: + return n.data.(*BreakStatement).VisitEachChild(v) + case KindContinueStatement: + return n.data.(*ContinueStatement).VisitEachChild(v) + case KindReturnStatement: + return n.data.(*ReturnStatement).VisitEachChild(v) + case KindWithStatement: + return n.data.(*WithStatement).VisitEachChild(v) + case KindSwitchStatement: + return n.data.(*SwitchStatement).VisitEachChild(v) + case KindCaseBlock: + return n.data.(*CaseBlock).VisitEachChild(v) + case KindCaseClause, KindDefaultClause: + return n.data.(*CaseOrDefaultClause).VisitEachChild(v) + case KindThrowStatement: + return n.data.(*ThrowStatement).VisitEachChild(v) + case KindTryStatement: + return n.data.(*TryStatement).VisitEachChild(v) + case KindCatchClause: + return n.data.(*CatchClause).VisitEachChild(v) + case KindLabeledStatement: + return n.data.(*LabeledStatement).VisitEachChild(v) + case KindExpressionStatement: + return n.data.(*ExpressionStatement).VisitEachChild(v) + case KindBlock: + return n.data.(*Block).VisitEachChild(v) + case KindVariableStatement: + return n.data.(*VariableStatement).VisitEachChild(v) + case KindVariableDeclaration: + return n.data.(*VariableDeclaration).VisitEachChild(v) + case KindVariableDeclarationList: + return n.data.(*VariableDeclarationList).VisitEachChild(v) + case KindObjectBindingPattern, KindArrayBindingPattern: + return n.data.(*BindingPattern).VisitEachChild(v) + case KindParameter: + return n.data.(*ParameterDeclaration).VisitEachChild(v) + case KindBindingElement: + return n.data.(*BindingElement).VisitEachChild(v) + case KindMissingDeclaration: + return n.data.(*MissingDeclaration).VisitEachChild(v) + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).VisitEachChild(v) + case KindClassDeclaration: + return n.data.(*ClassDeclaration).VisitEachChild(v) + case KindClassExpression: + return n.data.(*ClassExpression).VisitEachChild(v) + case KindHeritageClause: + return n.data.(*HeritageClause).VisitEachChild(v) + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).VisitEachChild(v) + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).VisitEachChild(v) + case KindEnumMember: + return n.data.(*EnumMember).VisitEachChild(v) + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).VisitEachChild(v) + case KindModuleBlock: + return n.data.(*ModuleBlock).VisitEachChild(v) + case KindImportDeclaration, KindJSImportDeclaration: + return n.data.(*ImportDeclaration).VisitEachChild(v) + case KindExternalModuleReference: + return n.data.(*ExternalModuleReference).VisitEachChild(v) + case KindNamespaceImport: + return n.data.(*NamespaceImport).VisitEachChild(v) + case KindNamedImports: + return n.data.(*NamedImports).VisitEachChild(v) + case KindExportAssignment: + return n.data.(*ExportAssignment).VisitEachChild(v) + case KindNamespaceExportDeclaration: + return n.data.(*NamespaceExportDeclaration).VisitEachChild(v) + case KindNamespaceExport: + return n.data.(*NamespaceExport).VisitEachChild(v) + case KindNamedExports: + return n.data.(*NamedExports).VisitEachChild(v) + case KindExportSpecifier: + return n.data.(*ExportSpecifier).VisitEachChild(v) + case KindCallSignature: + return n.data.(*CallSignatureDeclaration).VisitEachChild(v) + case KindConstructSignature: + return n.data.(*ConstructSignatureDeclaration).VisitEachChild(v) + case KindConstructor: + return n.data.(*ConstructorDeclaration).VisitEachChild(v) + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).VisitEachChild(v) + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).VisitEachChild(v) + case KindIndexSignature: + return n.data.(*IndexSignatureDeclaration).VisitEachChild(v) + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).VisitEachChild(v) + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).VisitEachChild(v) + case KindPropertySignature: + return n.data.(*PropertySignatureDeclaration).VisitEachChild(v) + case KindPropertyDeclaration: + return n.data.(*PropertyDeclaration).VisitEachChild(v) + case KindClassStaticBlockDeclaration: + return n.data.(*ClassStaticBlockDeclaration).VisitEachChild(v) + case KindBinaryExpression: + return n.data.(*BinaryExpression).VisitEachChild(v) + case KindPrefixUnaryExpression: + return n.data.(*PrefixUnaryExpression).VisitEachChild(v) + case KindPostfixUnaryExpression: + return n.data.(*PostfixUnaryExpression).VisitEachChild(v) + case KindYieldExpression: + return n.data.(*YieldExpression).VisitEachChild(v) + case KindArrowFunction: + return n.data.(*ArrowFunction).VisitEachChild(v) + case KindFunctionExpression: + return n.data.(*FunctionExpression).VisitEachChild(v) + case KindAsExpression: + return n.data.(*AsExpression).VisitEachChild(v) + case KindSatisfiesExpression: + return n.data.(*SatisfiesExpression).VisitEachChild(v) + case KindConditionalExpression: + return n.data.(*ConditionalExpression).VisitEachChild(v) + case KindPropertyAccessExpression: + return n.data.(*PropertyAccessExpression).VisitEachChild(v) + case KindElementAccessExpression: + return n.data.(*ElementAccessExpression).VisitEachChild(v) + case KindCallExpression: + return n.data.(*CallExpression).VisitEachChild(v) + case KindNewExpression: + return n.data.(*NewExpression).VisitEachChild(v) + case KindMetaProperty: + return n.data.(*MetaProperty).VisitEachChild(v) + case KindNonNullExpression: + return n.data.(*NonNullExpression).VisitEachChild(v) + case KindSpreadElement: + return n.data.(*SpreadElement).VisitEachChild(v) + case KindTemplateExpression: + return n.data.(*TemplateExpression).VisitEachChild(v) + case KindTemplateSpan: + return n.data.(*TemplateSpan).VisitEachChild(v) + case KindTaggedTemplateExpression: + return n.data.(*TaggedTemplateExpression).VisitEachChild(v) + case KindParenthesizedExpression: + return n.data.(*ParenthesizedExpression).VisitEachChild(v) + case KindArrayLiteralExpression: + return n.data.(*ArrayLiteralExpression).VisitEachChild(v) + case KindObjectLiteralExpression: + return n.data.(*ObjectLiteralExpression).VisitEachChild(v) + case KindSpreadAssignment: + return n.data.(*SpreadAssignment).VisitEachChild(v) + case KindPropertyAssignment: + return n.data.(*PropertyAssignment).VisitEachChild(v) + case KindShorthandPropertyAssignment: + return n.data.(*ShorthandPropertyAssignment).VisitEachChild(v) + case KindDeleteExpression: + return n.data.(*DeleteExpression).VisitEachChild(v) + case KindTypeOfExpression: + return n.data.(*TypeOfExpression).VisitEachChild(v) + case KindVoidExpression: + return n.data.(*VoidExpression).VisitEachChild(v) + case KindAwaitExpression: + return n.data.(*AwaitExpression).VisitEachChild(v) + case KindTypeAssertionExpression: + return n.data.(*TypeAssertion).VisitEachChild(v) + case KindUnionType: + return n.data.(*UnionTypeNode).VisitEachChild(v) + case KindIntersectionType: + return n.data.(*IntersectionTypeNode).VisitEachChild(v) + case KindConditionalType: + return n.data.(*ConditionalTypeNode).VisitEachChild(v) + case KindTypeOperator: + return n.data.(*TypeOperatorNode).VisitEachChild(v) + case KindInferType: + return n.data.(*InferTypeNode).VisitEachChild(v) + case KindArrayType: + return n.data.(*ArrayTypeNode).VisitEachChild(v) + case KindIndexedAccessType: + return n.data.(*IndexedAccessTypeNode).VisitEachChild(v) + case KindTypeReference: + return n.data.(*TypeReferenceNode).VisitEachChild(v) + case KindExpressionWithTypeArguments: + return n.data.(*ExpressionWithTypeArguments).VisitEachChild(v) + case KindLiteralType: + return n.data.(*LiteralTypeNode).VisitEachChild(v) + case KindTypePredicate: + return n.data.(*TypePredicateNode).VisitEachChild(v) + case KindImportAttribute: + return n.data.(*ImportAttribute).VisitEachChild(v) + case KindImportAttributes: + return n.data.(*ImportAttributes).VisitEachChild(v) + case KindTypeQuery: + return n.data.(*TypeQueryNode).VisitEachChild(v) + case KindMappedType: + return n.data.(*MappedTypeNode).VisitEachChild(v) + case KindTypeLiteral: + return n.data.(*TypeLiteralNode).VisitEachChild(v) + case KindTupleType: + return n.data.(*TupleTypeNode).VisitEachChild(v) + case KindNamedTupleMember: + return n.data.(*NamedTupleMember).VisitEachChild(v) + case KindOptionalType: + return n.data.(*OptionalTypeNode).VisitEachChild(v) + case KindRestType: + return n.data.(*RestTypeNode).VisitEachChild(v) + case KindParenthesizedType: + return n.data.(*ParenthesizedTypeNode).VisitEachChild(v) + case KindFunctionType: + return n.data.(*FunctionTypeNode).VisitEachChild(v) + case KindConstructorType: + return n.data.(*ConstructorTypeNode).VisitEachChild(v) + case KindTemplateLiteralType: + return n.data.(*TemplateLiteralTypeNode).VisitEachChild(v) + case KindTemplateLiteralTypeSpan: + return n.data.(*TemplateLiteralTypeSpan).VisitEachChild(v) + case KindSyntheticExpression: + return n.data.(*SyntheticExpression).VisitEachChild(v) + case KindPartiallyEmittedExpression: + return n.data.(*PartiallyEmittedExpression).VisitEachChild(v) + case KindJsxElement: + return n.data.(*JsxElement).VisitEachChild(v) + case KindJsxAttributes: + return n.data.(*JsxAttributes).VisitEachChild(v) + case KindJsxNamespacedName: + return n.data.(*JsxNamespacedName).VisitEachChild(v) + case KindJsxOpeningElement: + return n.data.(*JsxOpeningElement).VisitEachChild(v) + case KindJsxSelfClosingElement: + return n.data.(*JsxSelfClosingElement).VisitEachChild(v) + case KindJsxFragment: + return n.data.(*JsxFragment).VisitEachChild(v) + case KindJsxAttribute: + return n.data.(*JsxAttribute).VisitEachChild(v) + case KindJsxSpreadAttribute: + return n.data.(*JsxSpreadAttribute).VisitEachChild(v) + case KindJsxClosingElement: + return n.data.(*JsxClosingElement).VisitEachChild(v) + case KindJsxExpression: + return n.data.(*JsxExpression).VisitEachChild(v) + case KindSyntaxList: + return n.data.(*SyntaxList).VisitEachChild(v) + case KindJSDoc: + return n.data.(*JSDoc).VisitEachChild(v) + case KindJSDocTypeExpression: + return n.data.(*JSDocTypeExpression).VisitEachChild(v) + case KindJSDocNonNullableType: + return n.data.(*JSDocNonNullableType).VisitEachChild(v) + case KindJSDocNullableType: + return n.data.(*JSDocNullableType).VisitEachChild(v) + case KindJSDocVariadicType: + return n.data.(*JSDocVariadicType).VisitEachChild(v) + case KindJSDocOptionalType: + return n.data.(*JSDocOptionalType).VisitEachChild(v) + case KindJSDocTypeTag: + return n.data.(*JSDocTypeTag).VisitEachChild(v) + case KindJSDocUnknownTag: + return n.data.(*JSDocUnknownTag).VisitEachChild(v) + case KindJSDocTemplateTag: + return n.data.(*JSDocTemplateTag).VisitEachChild(v) + case KindJSDocReturnTag: + return n.data.(*JSDocReturnTag).VisitEachChild(v) + case KindJSDocPublicTag: + return n.data.(*JSDocPublicTag).VisitEachChild(v) + case KindJSDocPrivateTag: + return n.data.(*JSDocPrivateTag).VisitEachChild(v) + case KindJSDocProtectedTag: + return n.data.(*JSDocProtectedTag).VisitEachChild(v) + case KindJSDocReadonlyTag: + return n.data.(*JSDocReadonlyTag).VisitEachChild(v) + case KindJSDocOverrideTag: + return n.data.(*JSDocOverrideTag).VisitEachChild(v) + case KindJSDocDeprecatedTag: + return n.data.(*JSDocDeprecatedTag).VisitEachChild(v) + case KindJSDocSeeTag: + return n.data.(*JSDocSeeTag).VisitEachChild(v) + case KindJSDocImplementsTag: + return n.data.(*JSDocImplementsTag).VisitEachChild(v) + case KindJSDocAugmentsTag: + return n.data.(*JSDocAugmentsTag).VisitEachChild(v) + case KindJSDocSatisfiesTag: + return n.data.(*JSDocSatisfiesTag).VisitEachChild(v) + case KindJSDocThrowsTag: + return n.data.(*JSDocThrowsTag).VisitEachChild(v) + case KindJSDocThisTag: + return n.data.(*JSDocThisTag).VisitEachChild(v) + case KindJSDocImportTag: + return n.data.(*JSDocImportTag).VisitEachChild(v) + case KindJSDocCallbackTag: + return n.data.(*JSDocCallbackTag).VisitEachChild(v) + case KindJSDocOverloadTag: + return n.data.(*JSDocOverloadTag).VisitEachChild(v) + case KindJSDocTypedefTag: + return n.data.(*JSDocTypedefTag).VisitEachChild(v) + case KindJSDocSignature: + return n.data.(*JSDocSignature).VisitEachChild(v) + case KindJSDocNameReference: + return n.data.(*JSDocNameReference).VisitEachChild(v) + case KindSourceFile: + return n.data.(*SourceFile).VisitEachChild(v) + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).VisitEachChild(v) + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).VisitEachChild(v) + case KindExportDeclaration: + return n.data.(*ExportDeclaration).VisitEachChild(v) + case KindImportType: + return n.data.(*ImportTypeNode).VisitEachChild(v) + case KindImportClause: + return n.data.(*ImportClause).VisitEachChild(v) + case KindImportSpecifier: + return n.data.(*ImportSpecifier).VisitEachChild(v) + case KindJSDocLink: + return n.data.(*JSDocLink).VisitEachChild(v) + case KindJSDocLinkPlain: + return n.data.(*JSDocLinkPlain).VisitEachChild(v) + case KindJSDocLinkCode: + return n.data.(*JSDocLinkCode).VisitEachChild(v) + case KindTypeParameter: + return n.data.(*TypeParameterDeclaration).VisitEachChild(v) + case KindSyntheticReferenceExpression: + return n.data.(*SyntheticReferenceExpression).VisitEachChild(v) + case KindJSDocTypeLiteral: + return n.data.(*JSDocTypeLiteral).VisitEachChild(v) + case KindJSDocParameterTag, KindJSDocPropertyTag: + return n.data.(*JSDocParameterOrPropertyTag).VisitEachChild(v) + default: + return n + } +} + +// ────────────────────────────────────────────────────────────────────── +// Clone dispatch +// ────────────────────────────────────────────────────────────────────── + +func (n *Node) Clone(f NodeFactoryCoercible) *Node { + switch n.Kind { + case KindUnknown, KindEndOfFile, KindSingleLineCommentTrivia, KindMultiLineCommentTrivia, KindNewLineTrivia, KindWhitespaceTrivia, KindConflictMarkerTrivia, KindNonTextFileMarkerTrivia, KindJsxTextAllWhiteSpaces, KindOpenBraceToken, KindCloseBraceToken, KindOpenParenToken, KindCloseParenToken, KindOpenBracketToken, KindCloseBracketToken, KindDotToken, KindDotDotDotToken, KindSemicolonToken, KindCommaToken, KindQuestionDotToken, KindLessThanToken, KindLessThanSlashToken, KindGreaterThanToken, KindLessThanEqualsToken, KindGreaterThanEqualsToken, KindEqualsEqualsToken, KindExclamationEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindEqualsGreaterThanToken, KindPlusToken, KindMinusToken, KindAsteriskToken, KindAsteriskAsteriskToken, KindSlashToken, KindPercentToken, KindPlusPlusToken, KindMinusMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindExclamationToken, KindTildeToken, KindAmpersandAmpersandToken, KindBarBarToken, KindQuestionToken, KindColonToken, KindAtToken, KindQuestionQuestionToken, KindBacktickToken, KindHashToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskEqualsToken, KindAsteriskAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken, KindCaretEqualsToken, KindJSDocCommentTextToken, KindBreakKeyword, KindCaseKeyword, KindCatchKeyword, KindClassKeyword, KindConstKeyword, KindContinueKeyword, KindDebuggerKeyword, KindDefaultKeyword, KindDeleteKeyword, KindDoKeyword, KindElseKeyword, KindEnumKeyword, KindExportKeyword, KindExtendsKeyword, KindFinallyKeyword, KindForKeyword, KindFunctionKeyword, KindIfKeyword, KindInKeyword, KindInstanceOfKeyword, KindNewKeyword, KindReturnKeyword, KindSwitchKeyword, KindThrowKeyword, KindTryKeyword, KindTypeOfKeyword, KindVarKeyword, KindWhileKeyword, KindWithKeyword, KindImplementsKeyword, KindInterfaceKeyword, KindLetKeyword, KindPackageKeyword, KindPrivateKeyword, KindProtectedKeyword, KindPublicKeyword, KindStaticKeyword, KindYieldKeyword, KindAbstractKeyword, KindAccessorKeyword, KindAsKeyword, KindAssertsKeyword, KindAssertKeyword, KindAsyncKeyword, KindAwaitKeyword, KindConstructorKeyword, KindDeclareKeyword, KindGetKeyword, KindImmediateKeyword, KindInferKeyword, KindIsKeyword, KindKeyOfKeyword, KindModuleKeyword, KindNamespaceKeyword, KindOutKeyword, KindReadonlyKeyword, KindRequireKeyword, KindSatisfiesKeyword, KindSetKeyword, KindTypeKeyword, KindUniqueKeyword, KindUsingKeyword, KindFromKeyword, KindGlobalKeyword, KindOverrideKeyword, KindOfKeyword, KindDeferKeyword: + return n.data.(*Token).Clone(f) + case KindNumericLiteral: + return n.data.(*NumericLiteral).Clone(f) + case KindBigIntLiteral: + return n.data.(*BigIntLiteral).Clone(f) + case KindStringLiteral: + return n.data.(*StringLiteral).Clone(f) + case KindJsxText: + return n.data.(*JsxText).Clone(f) + case KindRegularExpressionLiteral: + return n.data.(*RegularExpressionLiteral).Clone(f) + case KindNoSubstitutionTemplateLiteral: + return n.data.(*NoSubstitutionTemplateLiteral).Clone(f) + case KindTemplateHead: + return n.data.(*TemplateHead).Clone(f) + case KindTemplateMiddle: + return n.data.(*TemplateMiddle).Clone(f) + case KindTemplateTail: + return n.data.(*TemplateTail).Clone(f) + case KindIdentifier: + return n.data.(*Identifier).Clone(f) + case KindPrivateIdentifier: + return n.data.(*PrivateIdentifier).Clone(f) + case KindFalseKeyword, KindImportKeyword, KindNullKeyword, KindSuperKeyword, KindThisKeyword, KindTrueKeyword: + return n.data.(*KeywordExpression).Clone(f) + case KindVoidKeyword, KindAnyKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindBigIntKeyword: + return n.data.(*KeywordTypeNode).Clone(f) + case KindQualifiedName: + return n.data.(*QualifiedName).Clone(f) + case KindComputedPropertyName: + return n.data.(*ComputedPropertyName).Clone(f) + case KindDecorator: + return n.data.(*Decorator).Clone(f) + case KindEmptyStatement: + return n.data.(*EmptyStatement).Clone(f) + case KindIfStatement: + return n.data.(*IfStatement).Clone(f) + case KindDoStatement: + return n.data.(*DoStatement).Clone(f) + case KindWhileStatement: + return n.data.(*WhileStatement).Clone(f) + case KindForStatement: + return n.data.(*ForStatement).Clone(f) + case KindForInStatement, KindForOfStatement: + return n.data.(*ForInOrOfStatement).Clone(f) + case KindBreakStatement: + return n.data.(*BreakStatement).Clone(f) + case KindContinueStatement: + return n.data.(*ContinueStatement).Clone(f) + case KindReturnStatement: + return n.data.(*ReturnStatement).Clone(f) + case KindWithStatement: + return n.data.(*WithStatement).Clone(f) + case KindSwitchStatement: + return n.data.(*SwitchStatement).Clone(f) + case KindCaseBlock: + return n.data.(*CaseBlock).Clone(f) + case KindCaseClause, KindDefaultClause: + return n.data.(*CaseOrDefaultClause).Clone(f) + case KindThrowStatement: + return n.data.(*ThrowStatement).Clone(f) + case KindTryStatement: + return n.data.(*TryStatement).Clone(f) + case KindCatchClause: + return n.data.(*CatchClause).Clone(f) + case KindDebuggerStatement: + return n.data.(*DebuggerStatement).Clone(f) + case KindLabeledStatement: + return n.data.(*LabeledStatement).Clone(f) + case KindExpressionStatement: + return n.data.(*ExpressionStatement).Clone(f) + case KindBlock: + return n.data.(*Block).Clone(f) + case KindVariableStatement: + return n.data.(*VariableStatement).Clone(f) + case KindVariableDeclaration: + return n.data.(*VariableDeclaration).Clone(f) + case KindVariableDeclarationList: + return n.data.(*VariableDeclarationList).Clone(f) + case KindObjectBindingPattern, KindArrayBindingPattern: + return n.data.(*BindingPattern).Clone(f) + case KindParameter: + return n.data.(*ParameterDeclaration).Clone(f) + case KindBindingElement: + return n.data.(*BindingElement).Clone(f) + case KindMissingDeclaration: + return n.data.(*MissingDeclaration).Clone(f) + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).Clone(f) + case KindClassDeclaration: + return n.data.(*ClassDeclaration).Clone(f) + case KindClassExpression: + return n.data.(*ClassExpression).Clone(f) + case KindHeritageClause: + return n.data.(*HeritageClause).Clone(f) + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).Clone(f) + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).Clone(f) + case KindEnumMember: + return n.data.(*EnumMember).Clone(f) + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).Clone(f) + case KindModuleBlock: + return n.data.(*ModuleBlock).Clone(f) + case KindNotEmittedStatement: + return n.data.(*NotEmittedStatement).Clone(f) + case KindNotEmittedTypeElement: + return n.data.(*NotEmittedTypeElement).Clone(f) + case KindImportDeclaration, KindJSImportDeclaration: + return n.data.(*ImportDeclaration).Clone(f) + case KindExternalModuleReference: + return n.data.(*ExternalModuleReference).Clone(f) + case KindNamespaceImport: + return n.data.(*NamespaceImport).Clone(f) + case KindNamedImports: + return n.data.(*NamedImports).Clone(f) + case KindExportAssignment: + return n.data.(*ExportAssignment).Clone(f) + case KindNamespaceExportDeclaration: + return n.data.(*NamespaceExportDeclaration).Clone(f) + case KindNamespaceExport: + return n.data.(*NamespaceExport).Clone(f) + case KindNamedExports: + return n.data.(*NamedExports).Clone(f) + case KindExportSpecifier: + return n.data.(*ExportSpecifier).Clone(f) + case KindCallSignature: + return n.data.(*CallSignatureDeclaration).Clone(f) + case KindConstructSignature: + return n.data.(*ConstructSignatureDeclaration).Clone(f) + case KindConstructor: + return n.data.(*ConstructorDeclaration).Clone(f) + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).Clone(f) + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).Clone(f) + case KindIndexSignature: + return n.data.(*IndexSignatureDeclaration).Clone(f) + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).Clone(f) + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).Clone(f) + case KindPropertySignature: + return n.data.(*PropertySignatureDeclaration).Clone(f) + case KindPropertyDeclaration: + return n.data.(*PropertyDeclaration).Clone(f) + case KindSemicolonClassElement: + return n.data.(*SemicolonClassElement).Clone(f) + case KindClassStaticBlockDeclaration: + return n.data.(*ClassStaticBlockDeclaration).Clone(f) + case KindOmittedExpression: + return n.data.(*OmittedExpression).Clone(f) + case KindBinaryExpression: + return n.data.(*BinaryExpression).Clone(f) + case KindPrefixUnaryExpression: + return n.data.(*PrefixUnaryExpression).Clone(f) + case KindPostfixUnaryExpression: + return n.data.(*PostfixUnaryExpression).Clone(f) + case KindYieldExpression: + return n.data.(*YieldExpression).Clone(f) + case KindArrowFunction: + return n.data.(*ArrowFunction).Clone(f) + case KindFunctionExpression: + return n.data.(*FunctionExpression).Clone(f) + case KindAsExpression: + return n.data.(*AsExpression).Clone(f) + case KindSatisfiesExpression: + return n.data.(*SatisfiesExpression).Clone(f) + case KindConditionalExpression: + return n.data.(*ConditionalExpression).Clone(f) + case KindPropertyAccessExpression: + return n.data.(*PropertyAccessExpression).Clone(f) + case KindElementAccessExpression: + return n.data.(*ElementAccessExpression).Clone(f) + case KindCallExpression: + return n.data.(*CallExpression).Clone(f) + case KindNewExpression: + return n.data.(*NewExpression).Clone(f) + case KindMetaProperty: + return n.data.(*MetaProperty).Clone(f) + case KindNonNullExpression: + return n.data.(*NonNullExpression).Clone(f) + case KindSpreadElement: + return n.data.(*SpreadElement).Clone(f) + case KindTemplateExpression: + return n.data.(*TemplateExpression).Clone(f) + case KindTemplateSpan: + return n.data.(*TemplateSpan).Clone(f) + case KindTaggedTemplateExpression: + return n.data.(*TaggedTemplateExpression).Clone(f) + case KindParenthesizedExpression: + return n.data.(*ParenthesizedExpression).Clone(f) + case KindArrayLiteralExpression: + return n.data.(*ArrayLiteralExpression).Clone(f) + case KindObjectLiteralExpression: + return n.data.(*ObjectLiteralExpression).Clone(f) + case KindSpreadAssignment: + return n.data.(*SpreadAssignment).Clone(f) + case KindPropertyAssignment: + return n.data.(*PropertyAssignment).Clone(f) + case KindShorthandPropertyAssignment: + return n.data.(*ShorthandPropertyAssignment).Clone(f) + case KindDeleteExpression: + return n.data.(*DeleteExpression).Clone(f) + case KindTypeOfExpression: + return n.data.(*TypeOfExpression).Clone(f) + case KindVoidExpression: + return n.data.(*VoidExpression).Clone(f) + case KindAwaitExpression: + return n.data.(*AwaitExpression).Clone(f) + case KindTypeAssertionExpression: + return n.data.(*TypeAssertion).Clone(f) + case KindUnionType: + return n.data.(*UnionTypeNode).Clone(f) + case KindIntersectionType: + return n.data.(*IntersectionTypeNode).Clone(f) + case KindConditionalType: + return n.data.(*ConditionalTypeNode).Clone(f) + case KindTypeOperator: + return n.data.(*TypeOperatorNode).Clone(f) + case KindInferType: + return n.data.(*InferTypeNode).Clone(f) + case KindArrayType: + return n.data.(*ArrayTypeNode).Clone(f) + case KindIndexedAccessType: + return n.data.(*IndexedAccessTypeNode).Clone(f) + case KindTypeReference: + return n.data.(*TypeReferenceNode).Clone(f) + case KindExpressionWithTypeArguments: + return n.data.(*ExpressionWithTypeArguments).Clone(f) + case KindLiteralType: + return n.data.(*LiteralTypeNode).Clone(f) + case KindThisType: + return n.data.(*ThisTypeNode).Clone(f) + case KindTypePredicate: + return n.data.(*TypePredicateNode).Clone(f) + case KindImportAttribute: + return n.data.(*ImportAttribute).Clone(f) + case KindImportAttributes: + return n.data.(*ImportAttributes).Clone(f) + case KindTypeQuery: + return n.data.(*TypeQueryNode).Clone(f) + case KindMappedType: + return n.data.(*MappedTypeNode).Clone(f) + case KindTypeLiteral: + return n.data.(*TypeLiteralNode).Clone(f) + case KindTupleType: + return n.data.(*TupleTypeNode).Clone(f) + case KindNamedTupleMember: + return n.data.(*NamedTupleMember).Clone(f) + case KindOptionalType: + return n.data.(*OptionalTypeNode).Clone(f) + case KindRestType: + return n.data.(*RestTypeNode).Clone(f) + case KindParenthesizedType: + return n.data.(*ParenthesizedTypeNode).Clone(f) + case KindFunctionType: + return n.data.(*FunctionTypeNode).Clone(f) + case KindConstructorType: + return n.data.(*ConstructorTypeNode).Clone(f) + case KindTemplateLiteralType: + return n.data.(*TemplateLiteralTypeNode).Clone(f) + case KindTemplateLiteralTypeSpan: + return n.data.(*TemplateLiteralTypeSpan).Clone(f) + case KindSyntheticExpression: + return n.data.(*SyntheticExpression).Clone(f) + case KindPartiallyEmittedExpression: + return n.data.(*PartiallyEmittedExpression).Clone(f) + case KindJsxElement: + return n.data.(*JsxElement).Clone(f) + case KindJsxAttributes: + return n.data.(*JsxAttributes).Clone(f) + case KindJsxNamespacedName: + return n.data.(*JsxNamespacedName).Clone(f) + case KindJsxOpeningElement: + return n.data.(*JsxOpeningElement).Clone(f) + case KindJsxSelfClosingElement: + return n.data.(*JsxSelfClosingElement).Clone(f) + case KindJsxFragment: + return n.data.(*JsxFragment).Clone(f) + case KindJsxOpeningFragment: + return n.data.(*JsxOpeningFragment).Clone(f) + case KindJsxClosingFragment: + return n.data.(*JsxClosingFragment).Clone(f) + case KindJsxAttribute: + return n.data.(*JsxAttribute).Clone(f) + case KindJsxSpreadAttribute: + return n.data.(*JsxSpreadAttribute).Clone(f) + case KindJsxClosingElement: + return n.data.(*JsxClosingElement).Clone(f) + case KindJsxExpression: + return n.data.(*JsxExpression).Clone(f) + case KindSyntaxList: + return n.data.(*SyntaxList).Clone(f) + case KindJSDoc: + return n.data.(*JSDoc).Clone(f) + case KindJSDocTypeExpression: + return n.data.(*JSDocTypeExpression).Clone(f) + case KindJSDocNonNullableType: + return n.data.(*JSDocNonNullableType).Clone(f) + case KindJSDocNullableType: + return n.data.(*JSDocNullableType).Clone(f) + case KindJSDocAllType: + return n.data.(*JSDocAllType).Clone(f) + case KindJSDocVariadicType: + return n.data.(*JSDocVariadicType).Clone(f) + case KindJSDocOptionalType: + return n.data.(*JSDocOptionalType).Clone(f) + case KindJSDocTypeTag: + return n.data.(*JSDocTypeTag).Clone(f) + case KindJSDocUnknownTag: + return n.data.(*JSDocUnknownTag).Clone(f) + case KindJSDocTemplateTag: + return n.data.(*JSDocTemplateTag).Clone(f) + case KindJSDocReturnTag: + return n.data.(*JSDocReturnTag).Clone(f) + case KindJSDocPublicTag: + return n.data.(*JSDocPublicTag).Clone(f) + case KindJSDocPrivateTag: + return n.data.(*JSDocPrivateTag).Clone(f) + case KindJSDocProtectedTag: + return n.data.(*JSDocProtectedTag).Clone(f) + case KindJSDocReadonlyTag: + return n.data.(*JSDocReadonlyTag).Clone(f) + case KindJSDocOverrideTag: + return n.data.(*JSDocOverrideTag).Clone(f) + case KindJSDocDeprecatedTag: + return n.data.(*JSDocDeprecatedTag).Clone(f) + case KindJSDocSeeTag: + return n.data.(*JSDocSeeTag).Clone(f) + case KindJSDocImplementsTag: + return n.data.(*JSDocImplementsTag).Clone(f) + case KindJSDocAugmentsTag: + return n.data.(*JSDocAugmentsTag).Clone(f) + case KindJSDocSatisfiesTag: + return n.data.(*JSDocSatisfiesTag).Clone(f) + case KindJSDocThrowsTag: + return n.data.(*JSDocThrowsTag).Clone(f) + case KindJSDocThisTag: + return n.data.(*JSDocThisTag).Clone(f) + case KindJSDocImportTag: + return n.data.(*JSDocImportTag).Clone(f) + case KindJSDocCallbackTag: + return n.data.(*JSDocCallbackTag).Clone(f) + case KindJSDocOverloadTag: + return n.data.(*JSDocOverloadTag).Clone(f) + case KindJSDocTypedefTag: + return n.data.(*JSDocTypedefTag).Clone(f) + case KindJSDocSignature: + return n.data.(*JSDocSignature).Clone(f) + case KindJSDocNameReference: + return n.data.(*JSDocNameReference).Clone(f) + case KindSourceFile: + return n.data.(*SourceFile).Clone(f) + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).Clone(f) + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).Clone(f) + case KindExportDeclaration: + return n.data.(*ExportDeclaration).Clone(f) + case KindImportType: + return n.data.(*ImportTypeNode).Clone(f) + case KindImportClause: + return n.data.(*ImportClause).Clone(f) + case KindImportSpecifier: + return n.data.(*ImportSpecifier).Clone(f) + case KindJSDocText: + return n.data.(*JSDocText).Clone(f) + case KindJSDocLink: + return n.data.(*JSDocLink).Clone(f) + case KindJSDocLinkPlain: + return n.data.(*JSDocLinkPlain).Clone(f) + case KindJSDocLinkCode: + return n.data.(*JSDocLinkCode).Clone(f) + case KindTypeParameter: + return n.data.(*TypeParameterDeclaration).Clone(f) + case KindSyntheticReferenceExpression: + return n.data.(*SyntheticReferenceExpression).Clone(f) + case KindJSDocTypeLiteral: + return n.data.(*JSDocTypeLiteral).Clone(f) + case KindJSDocParameterTag, KindJSDocPropertyTag: + return n.data.(*JSDocParameterOrPropertyTag).Clone(f) + default: + return nil + } +} + // ────────────────────────────────────────────────────────────────────── // nodeData accessor dispatch // ────────────────────────────────────────────────────────────────────── @@ -9443,6 +10183,235 @@ func (n *Node) TemplateLiteralLikeData() *TemplateLiteralLikeNodeBase { } } +// ────────────────────────────────────────────────────────────────────── +// Common node accessor dispatch +// ────────────────────────────────────────────────────────────────────── + +func (n *Node) Name() *DeclarationName { + switch n.Kind { + case KindVariableDeclaration: + return n.data.(*VariableDeclaration).Name() + case KindParameter: + return n.data.(*ParameterDeclaration).Name() + case KindBindingElement: + return n.data.(*BindingElement).Name() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).Name() + case KindClassDeclaration: + return n.data.(*ClassDeclaration).Name() + case KindClassExpression: + return n.data.(*ClassExpression).Name() + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).Name() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).Name() + case KindEnumMember: + return n.data.(*EnumMember).Name() + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).Name() + case KindNamespaceImport: + return n.data.(*NamespaceImport).Name() + case KindNamespaceExportDeclaration: + return n.data.(*NamespaceExportDeclaration).Name() + case KindNamespaceExport: + return n.data.(*NamespaceExport).Name() + case KindExportSpecifier: + return n.data.(*ExportSpecifier).Name() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).Name() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).Name() + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).Name() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).Name() + case KindPropertySignature: + return n.data.(*PropertySignatureDeclaration).Name() + case KindPropertyDeclaration: + return n.data.(*PropertyDeclaration).Name() + case KindFunctionExpression: + return n.data.(*FunctionExpression).Name() + case KindPropertyAccessExpression: + return n.data.(*PropertyAccessExpression).Name() + case KindMetaProperty: + return n.data.(*MetaProperty).Name() + case KindPropertyAssignment: + return n.data.(*PropertyAssignment).Name() + case KindShorthandPropertyAssignment: + return n.data.(*ShorthandPropertyAssignment).Name() + case KindImportAttribute: + return n.data.(*ImportAttribute).Name() + case KindNamedTupleMember: + return n.data.(*NamedTupleMember).Name() + case KindJsxNamespacedName: + return n.data.(*JsxNamespacedName).Name() + case KindJsxAttribute: + return n.data.(*JsxAttribute).Name() + case KindJSDocCallbackTag: + return n.data.(*JSDocCallbackTag).Name() + case KindJSDocTypedefTag: + return n.data.(*JSDocTypedefTag).Name() + case KindJSDocNameReference: + return n.data.(*JSDocNameReference).Name() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).Name() + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).Name() + case KindImportClause: + return n.data.(*ImportClause).Name() + case KindImportSpecifier: + return n.data.(*ImportSpecifier).Name() + case KindJSDocLink: + return n.data.(*JSDocLink).Name() + case KindJSDocLinkPlain: + return n.data.(*JSDocLinkPlain).Name() + case KindJSDocLinkCode: + return n.data.(*JSDocLinkCode).Name() + case KindTypeParameter: + return n.data.(*TypeParameterDeclaration).Name() + case KindJSDocParameterTag, KindJSDocPropertyTag: + return n.data.(*JSDocParameterOrPropertyTag).Name() + default: + return nil + } +} + +func (n *Node) Modifiers() *ModifierList { + switch n.Kind { + case KindVariableStatement: + return n.data.(*VariableStatement).Modifiers() + case KindParameter: + return n.data.(*ParameterDeclaration).Modifiers() + case KindMissingDeclaration: + return n.data.(*MissingDeclaration).Modifiers() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).Modifiers() + case KindClassDeclaration: + return n.data.(*ClassDeclaration).Modifiers() + case KindClassExpression: + return n.data.(*ClassExpression).Modifiers() + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).Modifiers() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).Modifiers() + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).Modifiers() + case KindImportDeclaration, KindJSImportDeclaration: + return n.data.(*ImportDeclaration).Modifiers() + case KindExportAssignment: + return n.data.(*ExportAssignment).Modifiers() + case KindNamespaceExportDeclaration: + return n.data.(*NamespaceExportDeclaration).Modifiers() + case KindConstructor: + return n.data.(*ConstructorDeclaration).Modifiers() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).Modifiers() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).Modifiers() + case KindIndexSignature: + return n.data.(*IndexSignatureDeclaration).Modifiers() + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).Modifiers() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).Modifiers() + case KindPropertySignature: + return n.data.(*PropertySignatureDeclaration).Modifiers() + case KindPropertyDeclaration: + return n.data.(*PropertyDeclaration).Modifiers() + case KindClassStaticBlockDeclaration: + return n.data.(*ClassStaticBlockDeclaration).Modifiers() + case KindBinaryExpression: + return n.data.(*BinaryExpression).Modifiers() + case KindArrowFunction: + return n.data.(*ArrowFunction).Modifiers() + case KindFunctionExpression: + return n.data.(*FunctionExpression).Modifiers() + case KindPropertyAssignment: + return n.data.(*PropertyAssignment).Modifiers() + case KindShorthandPropertyAssignment: + return n.data.(*ShorthandPropertyAssignment).Modifiers() + case KindConstructorType: + return n.data.(*ConstructorTypeNode).Modifiers() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).Modifiers() + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).Modifiers() + case KindExportDeclaration: + return n.data.(*ExportDeclaration).Modifiers() + case KindTypeParameter: + return n.data.(*TypeParameterDeclaration).Modifiers() + default: + return nil + } +} + +func (n *MutableNode) SetModifiers(modifiers *ModifierList) { + switch n.Kind { + case KindVariableStatement: + n.data.(*VariableStatement).setModifiers(modifiers) + case KindParameter: + n.data.(*ParameterDeclaration).setModifiers(modifiers) + case KindMissingDeclaration: + n.data.(*MissingDeclaration).setModifiers(modifiers) + case KindFunctionDeclaration: + n.data.(*FunctionDeclaration).setModifiers(modifiers) + case KindClassDeclaration: + n.data.(*ClassDeclaration).setModifiers(modifiers) + case KindClassExpression: + n.data.(*ClassExpression).setModifiers(modifiers) + case KindInterfaceDeclaration: + n.data.(*InterfaceDeclaration).setModifiers(modifiers) + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + n.data.(*TypeAliasDeclaration).setModifiers(modifiers) + case KindEnumDeclaration: + n.data.(*EnumDeclaration).setModifiers(modifiers) + case KindImportDeclaration, KindJSImportDeclaration: + n.data.(*ImportDeclaration).setModifiers(modifiers) + case KindExportAssignment: + n.data.(*ExportAssignment).setModifiers(modifiers) + case KindNamespaceExportDeclaration: + n.data.(*NamespaceExportDeclaration).setModifiers(modifiers) + case KindConstructor: + n.data.(*ConstructorDeclaration).setModifiers(modifiers) + case KindGetAccessor: + n.data.(*GetAccessorDeclaration).setModifiers(modifiers) + case KindSetAccessor: + n.data.(*SetAccessorDeclaration).setModifiers(modifiers) + case KindIndexSignature: + n.data.(*IndexSignatureDeclaration).setModifiers(modifiers) + case KindMethodSignature: + n.data.(*MethodSignatureDeclaration).setModifiers(modifiers) + case KindMethodDeclaration: + n.data.(*MethodDeclaration).setModifiers(modifiers) + case KindPropertySignature: + n.data.(*PropertySignatureDeclaration).setModifiers(modifiers) + case KindPropertyDeclaration: + n.data.(*PropertyDeclaration).setModifiers(modifiers) + case KindClassStaticBlockDeclaration: + n.data.(*ClassStaticBlockDeclaration).setModifiers(modifiers) + case KindBinaryExpression: + n.data.(*BinaryExpression).setModifiers(modifiers) + case KindArrowFunction: + n.data.(*ArrowFunction).setModifiers(modifiers) + case KindFunctionExpression: + n.data.(*FunctionExpression).setModifiers(modifiers) + case KindPropertyAssignment: + n.data.(*PropertyAssignment).setModifiers(modifiers) + case KindShorthandPropertyAssignment: + n.data.(*ShorthandPropertyAssignment).setModifiers(modifiers) + case KindConstructorType: + n.data.(*ConstructorTypeNode).setModifiers(modifiers) + case KindModuleDeclaration: + n.data.(*ModuleDeclaration).setModifiers(modifiers) + case KindImportEqualsDeclaration: + n.data.(*ImportEqualsDeclaration).setModifiers(modifiers) + case KindExportDeclaration: + n.data.(*ExportDeclaration).setModifiers(modifiers) + case KindTypeParameter: + n.data.(*TypeParameterDeclaration).setModifiers(modifiers) + } +} + // ────────────────────────────────────────────────────────────────────── // As*() cast methods // ────────────────────────────────────────────────────────────────────── From 7c6a84563207e00d390353b01aa0b42a7672b80b Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:58:12 -0700 Subject: [PATCH 06/13] Remove nodeData interface --- tools/scripts/tsc/generate-go-ast.ts | 179 +++- tsc/internal/ast/ast.go | 35 +- tsc/internal/ast/ast_generated.go | 1225 +++++++++++++++++++++++++- tsc/internal/ast/token_test.go | 54 ++ 4 files changed, 1426 insertions(+), 67 deletions(-) create mode 100644 tsc/internal/ast/token_test.go diff --git a/tools/scripts/tsc/generate-go-ast.ts b/tools/scripts/tsc/generate-go-ast.ts index 12c6e6fc89283..2bc609f2e9629 100644 --- a/tools/scripts/tsc/generate-go-ast.ts +++ b/tools/scripts/tsc/generate-go-ast.ts @@ -358,6 +358,27 @@ function concreteNodeMemberAccess(m: MemberInfo): string { return isNodeFlagsMember(m) ? `node.AsNode().${m.name}` : `node.${m.name}`; } +function canonicalNodesByKind(): Map { + const nodeByKind = new Map(); + for (const node of api.nodes()) { + for (const kind of node.allKinds()) { + nodeByKind.set(kind.formatGoConstant(), node); + } + } + + const kindsByNode = new Map(); + for (const [kind, node] of nodeByKind) { + const kinds = kindsByNode.get(node); + if (kinds) { + kinds.push(kind); + } + else { + kindsByNode.set(node, [kind]); + } + } + return kindsByNode; +} + function emitNewFactory( w: CodeWriter, funcName: string, @@ -420,7 +441,39 @@ function generateNewFactory(w: CodeWriter, node: NodeType) { const members = schemaMembers(node); const kindMember = members.find(m => m.isKindParam()); const nodeFlagsMembers = members.filter(m => isNodeFlagsMember(m)); - emitNewFactory(w, `New${node.name}`, node.syntaxKindName, structName, node, members, kindMember, nodeFlagsMembers); + if (node.name === "Token") { + const tokenKinds = new Set(node.allKinds().map(kind => kind.formatGoConstant())); + w.write("func (f *NodeFactory) NewToken(kind TokenSyntaxKind) *Node {"); + w.push(); + w.write("switch kind {"); + for (const [canonicalNode, kinds] of canonicalNodesByKind()) { + if (canonicalNode === node) continue; + const overlappingKinds = kinds.filter(kind => tokenKinds.has(kind)); + if (overlappingKinds.length === 0) continue; + w.write(`case ${overlappingKinds.join(", ")}:`); + w.push(); + if (canonicalNode.arena) { + w.write(`data := f.${api.uncapitalize(canonicalNode.name)}Arena.New()`); + } + else { + w.write(`data := &${canonicalNode.name}{}`); + } + w.write("return f.newNode(kind, data.AsNode(), data)"); + w.pop(); + } + w.write("default:"); + w.push(); + w.write("data := f.tokenArena.New()"); + w.write("return f.newNode(kind, data.AsNode(), data)"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); + } + else { + emitNewFactory(w, `New${node.name}`, node.syntaxKindName, structName, node, members, kindMember, nodeFlagsMembers); + } for (const alias of node.kindAliases) { emitNewFactory(w, `New${alias}`, alias, structName, node, members, kindMember, nodeFlagsMembers); } @@ -574,14 +627,12 @@ function hasForEachChild(node: NodeType): boolean { // Generates a (*Node).ForEachChild method that dispatches on node.Kind to the // concrete node type's ForEachChild method. // -// This deliberately avoids calling node.data.ForEachChild(v) through the -// nodeData interface. An interface (or other indirect) call is opaque to escape -// analysis, which must then assume the visitor `v` escapes; that forces caller -// closures — and any locals they capture — onto the heap. Dispatching through a -// Kind switch to a statically-resolved concrete method lets escape analysis -// prove the visitor does not escape, keeping caller closures on the stack. The -// integer switch over Kind also compiles to a jump table, making dispatch -// cheaper than the interface call it replaces. +// An indirect call is opaque to escape analysis, which must then assume the +// visitor `v` escapes; that forces caller closures — and any locals they +// capture — onto the heap. Dispatching through a Kind switch to a +// statically-resolved concrete method lets escape analysis prove the visitor +// does not escape, keeping caller closures on the stack. The integer switch +// over Kind also compiles to a jump table. // // Kinds whose node has no children fall through to `default` and return false, // matching NodeDefault.ForEachChild. @@ -651,7 +702,72 @@ function generateCloneDispatch(w: CodeWriter) { w.write(""); } -const NODE_DATA_ACCESSORS: { method: string; ret: string; base: string; }[] = [ +function generateSubtreeFactsDispatch(w: CodeWriter) { + w.write("func (n *Node) SubtreeFacts() SubtreeFacts {"); + w.push(); + w.write("switch n.Kind {"); + for (const [node, kinds] of canonicalNodesByKind()) { + w.write(`case ${kinds.join(", ")}:`); + w.push(); + if (transitiveBaseKeys(node).has("CompositeBase")) { + w.write(`return n.data.(*${node.name}).subtreeFactsWorker(n)`); + } + else { + w.write("return n.computeSubtreeFacts()"); + } + w.pop(); + } + w.write("default:"); + w.push(); + w.write("return SubtreeFactsNone"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); +} + +function generateComputeSubtreeFactsDispatch(w: CodeWriter) { + w.write("func (n *Node) computeSubtreeFacts() SubtreeFacts {"); + w.push(); + w.write("switch n.Kind {"); + for (const [node, kinds] of canonicalNodesByKind()) { + w.write(`case ${kinds.join(", ")}:`); + w.push(); + w.write(`return n.data.(*${node.name}).computeSubtreeFacts()`); + w.pop(); + } + w.write("default:"); + w.push(); + w.write("return SubtreeFactsNone"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); +} + +function generatePropagateSubtreeFactsDispatch(w: CodeWriter) { + w.write("func (n *Node) propagateSubtreeFacts() SubtreeFacts {"); + w.push(); + w.write("switch n.Kind {"); + for (const [node, kinds] of canonicalNodesByKind()) { + w.write(`case ${kinds.join(", ")}:`); + w.push(); + w.write(`return n.data.(*${node.name}).propagateSubtreeFacts()`); + w.pop(); + } + w.write("default:"); + w.push(); + w.write("return SubtreeFactsNone"); + w.pop(); + w.write("}"); + w.pop(); + w.write("}"); + w.write(""); +} + +const NODE_ACCESSORS: { method: string; ret: string; base: string; }[] = [ { method: "FlowNodeData", ret: "*FlowNodeBase", base: "FlowNodeBase" }, { method: "DeclarationData", ret: "*DeclarationBase", base: "DeclarationBase" }, { method: "ExportableData", ret: "*ExportableBase", base: "ExportableBase" }, @@ -677,8 +793,8 @@ function transitiveBaseKeys(node: NodeType): Set { return seen; } -function generateNodeDataAccessors(w: CodeWriter) { - for (const { method, ret, base } of NODE_DATA_ACCESSORS) { +function generateNodeAccessors(w: CodeWriter) { + for (const { method, ret, base } of NODE_ACCESSORS) { w.write(`func (n *Node) ${method}() ${ret} {`); w.push(); w.write("switch n.Kind {"); @@ -706,30 +822,6 @@ function hasMember(node: NodeType, name: string): boolean { return schemaMembers(node).some(member => member.name === name); } -function canonicalNodesByKind(): Map { - // Token's kind union overlaps the concrete identifier, literal, and keyword - // nodes. Later schema entries are the canonical representation for those - // kinds. - const nodeByKind = new Map(); - for (const node of api.nodes()) { - for (const kind of node.allKinds()) { - nodeByKind.set(kind.formatGoConstant(), node); - } - } - - const kindsByNode = new Map(); - for (const [kind, node] of nodeByKind) { - const kinds = kindsByNode.get(node); - if (kinds) { - kinds.push(kind); - } - else { - kindsByNode.set(node, [kind]); - } - } - return kindsByNode; -} - function generateNameDispatch(w: CodeWriter) { w.write("func (n *Node) Name() *DeclarationName {"); w.push(); @@ -1157,12 +1249,21 @@ function generate(): string { w.write(""); generateCloneDispatch(w); - // nodeData accessor dispatch + // Subtree facts dispatch + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write("// Subtree facts dispatch"); + w.write("// ──────────────────────────────────────────────────────────────────────"); + w.write(""); + generateSubtreeFactsDispatch(w); + generateComputeSubtreeFactsDispatch(w); + generatePropagateSubtreeFactsDispatch(w); + + // Node accessor dispatch w.write("// ──────────────────────────────────────────────────────────────────────"); - w.write("// nodeData accessor dispatch"); + w.write("// Node accessor dispatch"); w.write("// ──────────────────────────────────────────────────────────────────────"); w.write(""); - generateNodeDataAccessors(w); + generateNodeAccessors(w); // Common node accessor dispatch w.write("// ──────────────────────────────────────────────────────────────────────"); diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index 09aa7f159a9d8..47150d2e03389 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -72,7 +72,7 @@ func NewNodeFactory(hooks NodeFactoryHooks) *NodeFactory { return &NodeFactory{hooks: hooks} } -func newNode(kind Kind, n *Node, data nodeData, hooks NodeFactoryHooks) *Node { +func newNode(kind Kind, n *Node, data any, hooks NodeFactoryHooks) *Node { n.Loc = core.UndefinedTextRange() n.Kind = kind n.data = data @@ -82,7 +82,7 @@ func newNode(kind Kind, n *Node, data nodeData, hooks NodeFactoryHooks) *Node { return n } -func (f *NodeFactory) newNode(kind Kind, n *Node, data nodeData) *Node { +func (f *NodeFactory) newNode(kind Kind, n *Node, data any) *Node { f.nodeCount++ return newNode(kind, n, data, f.hooks) } @@ -182,7 +182,7 @@ type nodeFields struct { Loc core.TextRange id atomic.Uint64 Parent *Node - data nodeData + data any } type Node struct { @@ -197,11 +197,8 @@ func (n *Node) AsNode() *Node { return n } func (n *Node) Pos() int { return n.Loc.Pos() } func (n *Node) End() int { return n.Loc.End() } func (n *Node) IterChildren() iter.Seq[*Node] { - // Implemented directly (rather than through the nodeData interface) so that the - // returned iterator and the visitor closure it passes to ForEachChild do not - // escape: an interface call is opaque to escape analysis. `true` stops a TS - // visitor early, whereas `false` stops a Go iterator yield, so the result is - // inverted. + // `true` stops a TS visitor early, whereas `false` stops a Go iterator yield, + // so the result is inverted. return func(yield func(*Node) bool) { n.ForEachChild(func(child *Node) bool { return !yield(child) @@ -210,8 +207,6 @@ func (n *Node) IterChildren() iter.Seq[*Node] { } func (n *Node) ParameterList() *ParameterList { return n.FunctionLikeData().Parameters } func (n *Node) Parameters() []*ParameterDeclarationNode { return n.ParameterList().Nodes } -func (n *Node) SubtreeFacts() SubtreeFacts { return n.data.SubtreeFacts() } -func (n *Node) propagateSubtreeFacts() SubtreeFacts { return n.data.propagateSubtreeFacts() } func (n *Node) KindString() string { return n.Kind.String() } func (n *Node) KindValue() int16 { return int16(n.Kind) } func (n *Node) Decorators() []*Node { @@ -1164,15 +1159,6 @@ func (n *Node) AsFlowReduceLabelData() *FlowReduceLabelData { return n.data.(*FlowReduceLabelData) } -// NodeData - -type nodeData interface { - SubtreeFacts() SubtreeFacts - computeSubtreeFacts() SubtreeFacts - subtreeFactsWorker(self nodeData) SubtreeFacts - propagateSubtreeFacts() SubtreeFacts -} - // NodeDefault type NodeDefault struct { @@ -1199,14 +1185,13 @@ func (node *NodeDefault) BodyData() *BodyBase func (node *NodeDefault) LiteralLikeData() *LiteralLikeNodeBase { return nil } func (node *NodeDefault) TemplateLiteralLikeData() *TemplateLiteralLikeNodeBase { return nil } func (node *NodeDefault) SubtreeFacts() SubtreeFacts { - return node.data.subtreeFactsWorker(node.data) + return node.AsNode().SubtreeFacts() } -func (node *NodeDefault) subtreeFactsWorker(self nodeData) SubtreeFacts { +func (node *NodeDefault) subtreeFactsWorker(self *Node) SubtreeFacts { // To avoid excessive conditional checks, the default implementation of subtreeFactsWorker directly invokes // computeSubtreeFacts. More complex nodes should implement CompositeNodeBase, which overrides this - // method to cache the result. `self` is passed along to ensure we lookup `computeSubtreeFacts` on the - // correct type, as `CompositeNodeBase` does not, itself, inherit from `Node`. + // method to cache the result. return self.computeSubtreeFacts() } @@ -1215,7 +1200,7 @@ func (node *NodeDefault) computeSubtreeFacts() SubtreeFacts { } func (node *NodeDefault) propagateSubtreeFacts() SubtreeFacts { - return node.data.SubtreeFacts() & ^SubtreeExclusionsNode + return node.AsNode().SubtreeFacts() & ^SubtreeExclusionsNode } // NodeBase @@ -1570,7 +1555,7 @@ func (node *Node) EagerJSDoc(file *SourceFile) []*Node { // CompositeBase -func (node *CompositeBase) subtreeFactsWorker(self nodeData) SubtreeFacts { +func (node *CompositeBase) subtreeFactsWorker(self *Node) SubtreeFacts { // computeSubtreeFacts() is expected to be idempotent, so races will only impact time, not correctness. facts := SubtreeFacts(node.facts.Load()) if facts&SubtreeFactsComputed == 0 { diff --git a/tsc/internal/ast/ast_generated.go b/tsc/internal/ast/ast_generated.go index f3cebd0a47beb..a5a34240e17ef 100644 --- a/tsc/internal/ast/ast_generated.go +++ b/tsc/internal/ast/ast_generated.go @@ -598,8 +598,50 @@ type Token struct { } func (f *NodeFactory) NewToken(kind TokenSyntaxKind) *Node { - data := f.tokenArena.New() - return f.newNode(kind, data.AsNode(), data) + switch kind { + case KindNumericLiteral: + data := f.numericLiteralArena.New() + return f.newNode(kind, data.AsNode(), data) + case KindBigIntLiteral: + data := &BigIntLiteral{} + return f.newNode(kind, data.AsNode(), data) + case KindStringLiteral: + data := f.stringLiteralArena.New() + return f.newNode(kind, data.AsNode(), data) + case KindJsxText: + data := &JsxText{} + return f.newNode(kind, data.AsNode(), data) + case KindRegularExpressionLiteral: + data := &RegularExpressionLiteral{} + return f.newNode(kind, data.AsNode(), data) + case KindNoSubstitutionTemplateLiteral: + data := &NoSubstitutionTemplateLiteral{} + return f.newNode(kind, data.AsNode(), data) + case KindTemplateHead: + data := &TemplateHead{} + return f.newNode(kind, data.AsNode(), data) + case KindTemplateMiddle: + data := &TemplateMiddle{} + return f.newNode(kind, data.AsNode(), data) + case KindTemplateTail: + data := &TemplateTail{} + return f.newNode(kind, data.AsNode(), data) + case KindIdentifier: + data := f.identifierArena.New() + return f.newNode(kind, data.AsNode(), data) + case KindPrivateIdentifier: + data := &PrivateIdentifier{} + return f.newNode(kind, data.AsNode(), data) + case KindFalseKeyword, KindImportKeyword, KindNullKeyword, KindSuperKeyword, KindThisKeyword, KindTrueKeyword: + data := f.keywordExpressionArena.New() + return f.newNode(kind, data.AsNode(), data) + case KindVoidKeyword, KindAnyKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindBigIntKeyword: + data := f.keywordTypeNodeArena.New() + return f.newNode(kind, data.AsNode(), data) + default: + data := f.tokenArena.New() + return f.newNode(kind, data.AsNode(), data) + } } func (node *Token) Clone(f NodeFactoryCoercible) *Node { @@ -9765,7 +9807,1184 @@ func (n *Node) Clone(f NodeFactoryCoercible) *Node { } // ────────────────────────────────────────────────────────────────────── -// nodeData accessor dispatch +// Subtree facts dispatch +// ────────────────────────────────────────────────────────────────────── + +func (n *Node) SubtreeFacts() SubtreeFacts { + switch n.Kind { + case KindUnknown, KindEndOfFile, KindSingleLineCommentTrivia, KindMultiLineCommentTrivia, KindNewLineTrivia, KindWhitespaceTrivia, KindConflictMarkerTrivia, KindNonTextFileMarkerTrivia, KindJsxTextAllWhiteSpaces, KindOpenBraceToken, KindCloseBraceToken, KindOpenParenToken, KindCloseParenToken, KindOpenBracketToken, KindCloseBracketToken, KindDotToken, KindDotDotDotToken, KindSemicolonToken, KindCommaToken, KindQuestionDotToken, KindLessThanToken, KindLessThanSlashToken, KindGreaterThanToken, KindLessThanEqualsToken, KindGreaterThanEqualsToken, KindEqualsEqualsToken, KindExclamationEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindEqualsGreaterThanToken, KindPlusToken, KindMinusToken, KindAsteriskToken, KindAsteriskAsteriskToken, KindSlashToken, KindPercentToken, KindPlusPlusToken, KindMinusMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindExclamationToken, KindTildeToken, KindAmpersandAmpersandToken, KindBarBarToken, KindQuestionToken, KindColonToken, KindAtToken, KindQuestionQuestionToken, KindBacktickToken, KindHashToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskEqualsToken, KindAsteriskAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken, KindCaretEqualsToken, KindJSDocCommentTextToken, KindBreakKeyword, KindCaseKeyword, KindCatchKeyword, KindClassKeyword, KindConstKeyword, KindContinueKeyword, KindDebuggerKeyword, KindDefaultKeyword, KindDeleteKeyword, KindDoKeyword, KindElseKeyword, KindEnumKeyword, KindExportKeyword, KindExtendsKeyword, KindFinallyKeyword, KindForKeyword, KindFunctionKeyword, KindIfKeyword, KindInKeyword, KindInstanceOfKeyword, KindNewKeyword, KindReturnKeyword, KindSwitchKeyword, KindThrowKeyword, KindTryKeyword, KindTypeOfKeyword, KindVarKeyword, KindWhileKeyword, KindWithKeyword, KindImplementsKeyword, KindInterfaceKeyword, KindLetKeyword, KindPackageKeyword, KindPrivateKeyword, KindProtectedKeyword, KindPublicKeyword, KindStaticKeyword, KindYieldKeyword, KindAbstractKeyword, KindAccessorKeyword, KindAsKeyword, KindAssertsKeyword, KindAssertKeyword, KindAsyncKeyword, KindAwaitKeyword, KindConstructorKeyword, KindDeclareKeyword, KindGetKeyword, KindImmediateKeyword, KindInferKeyword, KindIsKeyword, KindKeyOfKeyword, KindModuleKeyword, KindNamespaceKeyword, KindOutKeyword, KindReadonlyKeyword, KindRequireKeyword, KindSatisfiesKeyword, KindSetKeyword, KindTypeKeyword, KindUniqueKeyword, KindUsingKeyword, KindFromKeyword, KindGlobalKeyword, KindOverrideKeyword, KindOfKeyword, KindDeferKeyword: + return n.computeSubtreeFacts() + case KindNumericLiteral: + return n.computeSubtreeFacts() + case KindBigIntLiteral: + return n.computeSubtreeFacts() + case KindStringLiteral: + return n.computeSubtreeFacts() + case KindJsxText: + return n.computeSubtreeFacts() + case KindRegularExpressionLiteral: + return n.computeSubtreeFacts() + case KindNoSubstitutionTemplateLiteral: + return n.computeSubtreeFacts() + case KindTemplateHead: + return n.computeSubtreeFacts() + case KindTemplateMiddle: + return n.computeSubtreeFacts() + case KindTemplateTail: + return n.computeSubtreeFacts() + case KindIdentifier: + return n.computeSubtreeFacts() + case KindPrivateIdentifier: + return n.computeSubtreeFacts() + case KindFalseKeyword, KindImportKeyword, KindNullKeyword, KindSuperKeyword, KindThisKeyword, KindTrueKeyword: + return n.computeSubtreeFacts() + case KindVoidKeyword, KindAnyKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindBigIntKeyword: + return n.computeSubtreeFacts() + case KindQualifiedName: + return n.data.(*QualifiedName).subtreeFactsWorker(n) + case KindComputedPropertyName: + return n.data.(*ComputedPropertyName).subtreeFactsWorker(n) + case KindDecorator: + return n.data.(*Decorator).subtreeFactsWorker(n) + case KindEmptyStatement: + return n.computeSubtreeFacts() + case KindIfStatement: + return n.data.(*IfStatement).subtreeFactsWorker(n) + case KindDoStatement: + return n.data.(*DoStatement).subtreeFactsWorker(n) + case KindWhileStatement: + return n.data.(*WhileStatement).subtreeFactsWorker(n) + case KindForStatement: + return n.data.(*ForStatement).subtreeFactsWorker(n) + case KindForInStatement, KindForOfStatement: + return n.data.(*ForInOrOfStatement).subtreeFactsWorker(n) + case KindBreakStatement: + return n.computeSubtreeFacts() + case KindContinueStatement: + return n.computeSubtreeFacts() + case KindReturnStatement: + return n.data.(*ReturnStatement).subtreeFactsWorker(n) + case KindWithStatement: + return n.data.(*WithStatement).subtreeFactsWorker(n) + case KindSwitchStatement: + return n.data.(*SwitchStatement).subtreeFactsWorker(n) + case KindCaseBlock: + return n.data.(*CaseBlock).subtreeFactsWorker(n) + case KindCaseClause, KindDefaultClause: + return n.data.(*CaseOrDefaultClause).subtreeFactsWorker(n) + case KindThrowStatement: + return n.data.(*ThrowStatement).subtreeFactsWorker(n) + case KindTryStatement: + return n.data.(*TryStatement).subtreeFactsWorker(n) + case KindCatchClause: + return n.data.(*CatchClause).subtreeFactsWorker(n) + case KindDebuggerStatement: + return n.computeSubtreeFacts() + case KindLabeledStatement: + return n.computeSubtreeFacts() + case KindExpressionStatement: + return n.computeSubtreeFacts() + case KindBlock: + return n.data.(*Block).subtreeFactsWorker(n) + case KindVariableStatement: + return n.data.(*VariableStatement).subtreeFactsWorker(n) + case KindVariableDeclaration: + return n.data.(*VariableDeclaration).subtreeFactsWorker(n) + case KindVariableDeclarationList: + return n.data.(*VariableDeclarationList).subtreeFactsWorker(n) + case KindObjectBindingPattern, KindArrayBindingPattern: + return n.data.(*BindingPattern).subtreeFactsWorker(n) + case KindParameter: + return n.data.(*ParameterDeclaration).subtreeFactsWorker(n) + case KindBindingElement: + return n.data.(*BindingElement).subtreeFactsWorker(n) + case KindMissingDeclaration: + return n.computeSubtreeFacts() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).subtreeFactsWorker(n) + case KindClassDeclaration: + return n.data.(*ClassDeclaration).subtreeFactsWorker(n) + case KindClassExpression: + return n.data.(*ClassExpression).subtreeFactsWorker(n) + case KindHeritageClause: + return n.data.(*HeritageClause).subtreeFactsWorker(n) + case KindInterfaceDeclaration: + return n.computeSubtreeFacts() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.computeSubtreeFacts() + case KindEnumMember: + return n.data.(*EnumMember).subtreeFactsWorker(n) + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).subtreeFactsWorker(n) + case KindModuleBlock: + return n.data.(*ModuleBlock).subtreeFactsWorker(n) + case KindNotEmittedStatement: + return n.computeSubtreeFacts() + case KindNotEmittedTypeElement: + return n.computeSubtreeFacts() + case KindImportDeclaration, KindJSImportDeclaration: + return n.data.(*ImportDeclaration).subtreeFactsWorker(n) + case KindExternalModuleReference: + return n.computeSubtreeFacts() + case KindNamespaceImport: + return n.computeSubtreeFacts() + case KindNamedImports: + return n.data.(*NamedImports).subtreeFactsWorker(n) + case KindExportAssignment: + return n.data.(*ExportAssignment).subtreeFactsWorker(n) + case KindNamespaceExportDeclaration: + return n.computeSubtreeFacts() + case KindNamespaceExport: + return n.computeSubtreeFacts() + case KindNamedExports: + return n.data.(*NamedExports).subtreeFactsWorker(n) + case KindExportSpecifier: + return n.data.(*ExportSpecifier).subtreeFactsWorker(n) + case KindCallSignature: + return n.computeSubtreeFacts() + case KindConstructSignature: + return n.computeSubtreeFacts() + case KindConstructor: + return n.data.(*ConstructorDeclaration).subtreeFactsWorker(n) + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).subtreeFactsWorker(n) + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).subtreeFactsWorker(n) + case KindIndexSignature: + return n.computeSubtreeFacts() + case KindMethodSignature: + return n.computeSubtreeFacts() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).subtreeFactsWorker(n) + case KindPropertySignature: + return n.computeSubtreeFacts() + case KindPropertyDeclaration: + return n.data.(*PropertyDeclaration).subtreeFactsWorker(n) + case KindSemicolonClassElement: + return n.computeSubtreeFacts() + case KindClassStaticBlockDeclaration: + return n.data.(*ClassStaticBlockDeclaration).subtreeFactsWorker(n) + case KindOmittedExpression: + return n.computeSubtreeFacts() + case KindBinaryExpression: + return n.data.(*BinaryExpression).subtreeFactsWorker(n) + case KindPrefixUnaryExpression: + return n.computeSubtreeFacts() + case KindPostfixUnaryExpression: + return n.computeSubtreeFacts() + case KindYieldExpression: + return n.computeSubtreeFacts() + case KindArrowFunction: + return n.data.(*ArrowFunction).subtreeFactsWorker(n) + case KindFunctionExpression: + return n.data.(*FunctionExpression).subtreeFactsWorker(n) + case KindAsExpression: + return n.computeSubtreeFacts() + case KindSatisfiesExpression: + return n.computeSubtreeFacts() + case KindConditionalExpression: + return n.data.(*ConditionalExpression).subtreeFactsWorker(n) + case KindPropertyAccessExpression: + return n.data.(*PropertyAccessExpression).subtreeFactsWorker(n) + case KindElementAccessExpression: + return n.data.(*ElementAccessExpression).subtreeFactsWorker(n) + case KindCallExpression: + return n.data.(*CallExpression).subtreeFactsWorker(n) + case KindNewExpression: + return n.data.(*NewExpression).subtreeFactsWorker(n) + case KindMetaProperty: + return n.data.(*MetaProperty).subtreeFactsWorker(n) + case KindNonNullExpression: + return n.computeSubtreeFacts() + case KindSpreadElement: + return n.computeSubtreeFacts() + case KindTemplateExpression: + return n.data.(*TemplateExpression).subtreeFactsWorker(n) + case KindTemplateSpan: + return n.computeSubtreeFacts() + case KindTaggedTemplateExpression: + return n.data.(*TaggedTemplateExpression).subtreeFactsWorker(n) + case KindParenthesizedExpression: + return n.computeSubtreeFacts() + case KindArrayLiteralExpression: + return n.data.(*ArrayLiteralExpression).subtreeFactsWorker(n) + case KindObjectLiteralExpression: + return n.data.(*ObjectLiteralExpression).subtreeFactsWorker(n) + case KindSpreadAssignment: + return n.computeSubtreeFacts() + case KindPropertyAssignment: + return n.data.(*PropertyAssignment).subtreeFactsWorker(n) + case KindShorthandPropertyAssignment: + return n.data.(*ShorthandPropertyAssignment).subtreeFactsWorker(n) + case KindDeleteExpression: + return n.computeSubtreeFacts() + case KindTypeOfExpression: + return n.computeSubtreeFacts() + case KindVoidExpression: + return n.computeSubtreeFacts() + case KindAwaitExpression: + return n.computeSubtreeFacts() + case KindTypeAssertionExpression: + return n.computeSubtreeFacts() + case KindUnionType: + return n.computeSubtreeFacts() + case KindIntersectionType: + return n.computeSubtreeFacts() + case KindConditionalType: + return n.computeSubtreeFacts() + case KindTypeOperator: + return n.computeSubtreeFacts() + case KindInferType: + return n.computeSubtreeFacts() + case KindArrayType: + return n.computeSubtreeFacts() + case KindIndexedAccessType: + return n.computeSubtreeFacts() + case KindTypeReference: + return n.computeSubtreeFacts() + case KindExpressionWithTypeArguments: + return n.data.(*ExpressionWithTypeArguments).subtreeFactsWorker(n) + case KindLiteralType: + return n.computeSubtreeFacts() + case KindThisType: + return n.computeSubtreeFacts() + case KindTypePredicate: + return n.computeSubtreeFacts() + case KindImportAttribute: + return n.data.(*ImportAttribute).subtreeFactsWorker(n) + case KindImportAttributes: + return n.data.(*ImportAttributes).subtreeFactsWorker(n) + case KindTypeQuery: + return n.computeSubtreeFacts() + case KindMappedType: + return n.computeSubtreeFacts() + case KindTypeLiteral: + return n.computeSubtreeFacts() + case KindTupleType: + return n.computeSubtreeFacts() + case KindNamedTupleMember: + return n.computeSubtreeFacts() + case KindOptionalType: + return n.computeSubtreeFacts() + case KindRestType: + return n.computeSubtreeFacts() + case KindParenthesizedType: + return n.computeSubtreeFacts() + case KindFunctionType: + return n.computeSubtreeFacts() + case KindConstructorType: + return n.computeSubtreeFacts() + case KindTemplateLiteralType: + return n.computeSubtreeFacts() + case KindTemplateLiteralTypeSpan: + return n.computeSubtreeFacts() + case KindSyntheticExpression: + return n.computeSubtreeFacts() + case KindPartiallyEmittedExpression: + return n.computeSubtreeFacts() + case KindJsxElement: + return n.data.(*JsxElement).subtreeFactsWorker(n) + case KindJsxAttributes: + return n.data.(*JsxAttributes).subtreeFactsWorker(n) + case KindJsxNamespacedName: + return n.data.(*JsxNamespacedName).subtreeFactsWorker(n) + case KindJsxOpeningElement: + return n.data.(*JsxOpeningElement).subtreeFactsWorker(n) + case KindJsxSelfClosingElement: + return n.data.(*JsxSelfClosingElement).subtreeFactsWorker(n) + case KindJsxFragment: + return n.data.(*JsxFragment).subtreeFactsWorker(n) + case KindJsxOpeningFragment: + return n.computeSubtreeFacts() + case KindJsxClosingFragment: + return n.computeSubtreeFacts() + case KindJsxAttribute: + return n.data.(*JsxAttribute).subtreeFactsWorker(n) + case KindJsxSpreadAttribute: + return n.computeSubtreeFacts() + case KindJsxClosingElement: + return n.computeSubtreeFacts() + case KindJsxExpression: + return n.computeSubtreeFacts() + case KindSyntaxList: + return n.computeSubtreeFacts() + case KindJSDoc: + return n.computeSubtreeFacts() + case KindJSDocTypeExpression: + return n.computeSubtreeFacts() + case KindJSDocNonNullableType: + return n.computeSubtreeFacts() + case KindJSDocNullableType: + return n.computeSubtreeFacts() + case KindJSDocAllType: + return n.computeSubtreeFacts() + case KindJSDocVariadicType: + return n.computeSubtreeFacts() + case KindJSDocOptionalType: + return n.computeSubtreeFacts() + case KindJSDocTypeTag: + return n.computeSubtreeFacts() + case KindJSDocUnknownTag: + return n.computeSubtreeFacts() + case KindJSDocTemplateTag: + return n.computeSubtreeFacts() + case KindJSDocReturnTag: + return n.computeSubtreeFacts() + case KindJSDocPublicTag: + return n.computeSubtreeFacts() + case KindJSDocPrivateTag: + return n.computeSubtreeFacts() + case KindJSDocProtectedTag: + return n.computeSubtreeFacts() + case KindJSDocReadonlyTag: + return n.computeSubtreeFacts() + case KindJSDocOverrideTag: + return n.computeSubtreeFacts() + case KindJSDocDeprecatedTag: + return n.computeSubtreeFacts() + case KindJSDocSeeTag: + return n.computeSubtreeFacts() + case KindJSDocImplementsTag: + return n.computeSubtreeFacts() + case KindJSDocAugmentsTag: + return n.computeSubtreeFacts() + case KindJSDocSatisfiesTag: + return n.computeSubtreeFacts() + case KindJSDocThrowsTag: + return n.computeSubtreeFacts() + case KindJSDocThisTag: + return n.computeSubtreeFacts() + case KindJSDocImportTag: + return n.computeSubtreeFacts() + case KindJSDocCallbackTag: + return n.computeSubtreeFacts() + case KindJSDocOverloadTag: + return n.computeSubtreeFacts() + case KindJSDocTypedefTag: + return n.computeSubtreeFacts() + case KindJSDocSignature: + return n.computeSubtreeFacts() + case KindJSDocNameReference: + return n.computeSubtreeFacts() + case KindSourceFile: + return n.data.(*SourceFile).subtreeFactsWorker(n) + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).subtreeFactsWorker(n) + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).subtreeFactsWorker(n) + case KindExportDeclaration: + return n.data.(*ExportDeclaration).subtreeFactsWorker(n) + case KindImportType: + return n.computeSubtreeFacts() + case KindImportClause: + return n.data.(*ImportClause).subtreeFactsWorker(n) + case KindImportSpecifier: + return n.data.(*ImportSpecifier).subtreeFactsWorker(n) + case KindJSDocText: + return n.computeSubtreeFacts() + case KindJSDocLink: + return n.computeSubtreeFacts() + case KindJSDocLinkPlain: + return n.computeSubtreeFacts() + case KindJSDocLinkCode: + return n.computeSubtreeFacts() + case KindTypeParameter: + return n.computeSubtreeFacts() + case KindSyntheticReferenceExpression: + return n.computeSubtreeFacts() + case KindJSDocTypeLiteral: + return n.computeSubtreeFacts() + case KindJSDocParameterTag, KindJSDocPropertyTag: + return n.computeSubtreeFacts() + default: + return SubtreeFactsNone + } +} + +func (n *Node) computeSubtreeFacts() SubtreeFacts { + switch n.Kind { + case KindUnknown, KindEndOfFile, KindSingleLineCommentTrivia, KindMultiLineCommentTrivia, KindNewLineTrivia, KindWhitespaceTrivia, KindConflictMarkerTrivia, KindNonTextFileMarkerTrivia, KindJsxTextAllWhiteSpaces, KindOpenBraceToken, KindCloseBraceToken, KindOpenParenToken, KindCloseParenToken, KindOpenBracketToken, KindCloseBracketToken, KindDotToken, KindDotDotDotToken, KindSemicolonToken, KindCommaToken, KindQuestionDotToken, KindLessThanToken, KindLessThanSlashToken, KindGreaterThanToken, KindLessThanEqualsToken, KindGreaterThanEqualsToken, KindEqualsEqualsToken, KindExclamationEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindEqualsGreaterThanToken, KindPlusToken, KindMinusToken, KindAsteriskToken, KindAsteriskAsteriskToken, KindSlashToken, KindPercentToken, KindPlusPlusToken, KindMinusMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindExclamationToken, KindTildeToken, KindAmpersandAmpersandToken, KindBarBarToken, KindQuestionToken, KindColonToken, KindAtToken, KindQuestionQuestionToken, KindBacktickToken, KindHashToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskEqualsToken, KindAsteriskAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken, KindCaretEqualsToken, KindJSDocCommentTextToken, KindBreakKeyword, KindCaseKeyword, KindCatchKeyword, KindClassKeyword, KindConstKeyword, KindContinueKeyword, KindDebuggerKeyword, KindDefaultKeyword, KindDeleteKeyword, KindDoKeyword, KindElseKeyword, KindEnumKeyword, KindExportKeyword, KindExtendsKeyword, KindFinallyKeyword, KindForKeyword, KindFunctionKeyword, KindIfKeyword, KindInKeyword, KindInstanceOfKeyword, KindNewKeyword, KindReturnKeyword, KindSwitchKeyword, KindThrowKeyword, KindTryKeyword, KindTypeOfKeyword, KindVarKeyword, KindWhileKeyword, KindWithKeyword, KindImplementsKeyword, KindInterfaceKeyword, KindLetKeyword, KindPackageKeyword, KindPrivateKeyword, KindProtectedKeyword, KindPublicKeyword, KindStaticKeyword, KindYieldKeyword, KindAbstractKeyword, KindAccessorKeyword, KindAsKeyword, KindAssertsKeyword, KindAssertKeyword, KindAsyncKeyword, KindAwaitKeyword, KindConstructorKeyword, KindDeclareKeyword, KindGetKeyword, KindImmediateKeyword, KindInferKeyword, KindIsKeyword, KindKeyOfKeyword, KindModuleKeyword, KindNamespaceKeyword, KindOutKeyword, KindReadonlyKeyword, KindRequireKeyword, KindSatisfiesKeyword, KindSetKeyword, KindTypeKeyword, KindUniqueKeyword, KindUsingKeyword, KindFromKeyword, KindGlobalKeyword, KindOverrideKeyword, KindOfKeyword, KindDeferKeyword: + return n.data.(*Token).computeSubtreeFacts() + case KindNumericLiteral: + return n.data.(*NumericLiteral).computeSubtreeFacts() + case KindBigIntLiteral: + return n.data.(*BigIntLiteral).computeSubtreeFacts() + case KindStringLiteral: + return n.data.(*StringLiteral).computeSubtreeFacts() + case KindJsxText: + return n.data.(*JsxText).computeSubtreeFacts() + case KindRegularExpressionLiteral: + return n.data.(*RegularExpressionLiteral).computeSubtreeFacts() + case KindNoSubstitutionTemplateLiteral: + return n.data.(*NoSubstitutionTemplateLiteral).computeSubtreeFacts() + case KindTemplateHead: + return n.data.(*TemplateHead).computeSubtreeFacts() + case KindTemplateMiddle: + return n.data.(*TemplateMiddle).computeSubtreeFacts() + case KindTemplateTail: + return n.data.(*TemplateTail).computeSubtreeFacts() + case KindIdentifier: + return n.data.(*Identifier).computeSubtreeFacts() + case KindPrivateIdentifier: + return n.data.(*PrivateIdentifier).computeSubtreeFacts() + case KindFalseKeyword, KindImportKeyword, KindNullKeyword, KindSuperKeyword, KindThisKeyword, KindTrueKeyword: + return n.data.(*KeywordExpression).computeSubtreeFacts() + case KindVoidKeyword, KindAnyKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindBigIntKeyword: + return n.data.(*KeywordTypeNode).computeSubtreeFacts() + case KindQualifiedName: + return n.data.(*QualifiedName).computeSubtreeFacts() + case KindComputedPropertyName: + return n.data.(*ComputedPropertyName).computeSubtreeFacts() + case KindDecorator: + return n.data.(*Decorator).computeSubtreeFacts() + case KindEmptyStatement: + return n.data.(*EmptyStatement).computeSubtreeFacts() + case KindIfStatement: + return n.data.(*IfStatement).computeSubtreeFacts() + case KindDoStatement: + return n.data.(*DoStatement).computeSubtreeFacts() + case KindWhileStatement: + return n.data.(*WhileStatement).computeSubtreeFacts() + case KindForStatement: + return n.data.(*ForStatement).computeSubtreeFacts() + case KindForInStatement, KindForOfStatement: + return n.data.(*ForInOrOfStatement).computeSubtreeFacts() + case KindBreakStatement: + return n.data.(*BreakStatement).computeSubtreeFacts() + case KindContinueStatement: + return n.data.(*ContinueStatement).computeSubtreeFacts() + case KindReturnStatement: + return n.data.(*ReturnStatement).computeSubtreeFacts() + case KindWithStatement: + return n.data.(*WithStatement).computeSubtreeFacts() + case KindSwitchStatement: + return n.data.(*SwitchStatement).computeSubtreeFacts() + case KindCaseBlock: + return n.data.(*CaseBlock).computeSubtreeFacts() + case KindCaseClause, KindDefaultClause: + return n.data.(*CaseOrDefaultClause).computeSubtreeFacts() + case KindThrowStatement: + return n.data.(*ThrowStatement).computeSubtreeFacts() + case KindTryStatement: + return n.data.(*TryStatement).computeSubtreeFacts() + case KindCatchClause: + return n.data.(*CatchClause).computeSubtreeFacts() + case KindDebuggerStatement: + return n.data.(*DebuggerStatement).computeSubtreeFacts() + case KindLabeledStatement: + return n.data.(*LabeledStatement).computeSubtreeFacts() + case KindExpressionStatement: + return n.data.(*ExpressionStatement).computeSubtreeFacts() + case KindBlock: + return n.data.(*Block).computeSubtreeFacts() + case KindVariableStatement: + return n.data.(*VariableStatement).computeSubtreeFacts() + case KindVariableDeclaration: + return n.data.(*VariableDeclaration).computeSubtreeFacts() + case KindVariableDeclarationList: + return n.data.(*VariableDeclarationList).computeSubtreeFacts() + case KindObjectBindingPattern, KindArrayBindingPattern: + return n.data.(*BindingPattern).computeSubtreeFacts() + case KindParameter: + return n.data.(*ParameterDeclaration).computeSubtreeFacts() + case KindBindingElement: + return n.data.(*BindingElement).computeSubtreeFacts() + case KindMissingDeclaration: + return n.data.(*MissingDeclaration).computeSubtreeFacts() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).computeSubtreeFacts() + case KindClassDeclaration: + return n.data.(*ClassDeclaration).computeSubtreeFacts() + case KindClassExpression: + return n.data.(*ClassExpression).computeSubtreeFacts() + case KindHeritageClause: + return n.data.(*HeritageClause).computeSubtreeFacts() + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).computeSubtreeFacts() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).computeSubtreeFacts() + case KindEnumMember: + return n.data.(*EnumMember).computeSubtreeFacts() + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).computeSubtreeFacts() + case KindModuleBlock: + return n.data.(*ModuleBlock).computeSubtreeFacts() + case KindNotEmittedStatement: + return n.data.(*NotEmittedStatement).computeSubtreeFacts() + case KindNotEmittedTypeElement: + return n.data.(*NotEmittedTypeElement).computeSubtreeFacts() + case KindImportDeclaration, KindJSImportDeclaration: + return n.data.(*ImportDeclaration).computeSubtreeFacts() + case KindExternalModuleReference: + return n.data.(*ExternalModuleReference).computeSubtreeFacts() + case KindNamespaceImport: + return n.data.(*NamespaceImport).computeSubtreeFacts() + case KindNamedImports: + return n.data.(*NamedImports).computeSubtreeFacts() + case KindExportAssignment: + return n.data.(*ExportAssignment).computeSubtreeFacts() + case KindNamespaceExportDeclaration: + return n.data.(*NamespaceExportDeclaration).computeSubtreeFacts() + case KindNamespaceExport: + return n.data.(*NamespaceExport).computeSubtreeFacts() + case KindNamedExports: + return n.data.(*NamedExports).computeSubtreeFacts() + case KindExportSpecifier: + return n.data.(*ExportSpecifier).computeSubtreeFacts() + case KindCallSignature: + return n.data.(*CallSignatureDeclaration).computeSubtreeFacts() + case KindConstructSignature: + return n.data.(*ConstructSignatureDeclaration).computeSubtreeFacts() + case KindConstructor: + return n.data.(*ConstructorDeclaration).computeSubtreeFacts() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).computeSubtreeFacts() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).computeSubtreeFacts() + case KindIndexSignature: + return n.data.(*IndexSignatureDeclaration).computeSubtreeFacts() + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).computeSubtreeFacts() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).computeSubtreeFacts() + case KindPropertySignature: + return n.data.(*PropertySignatureDeclaration).computeSubtreeFacts() + case KindPropertyDeclaration: + return n.data.(*PropertyDeclaration).computeSubtreeFacts() + case KindSemicolonClassElement: + return n.data.(*SemicolonClassElement).computeSubtreeFacts() + case KindClassStaticBlockDeclaration: + return n.data.(*ClassStaticBlockDeclaration).computeSubtreeFacts() + case KindOmittedExpression: + return n.data.(*OmittedExpression).computeSubtreeFacts() + case KindBinaryExpression: + return n.data.(*BinaryExpression).computeSubtreeFacts() + case KindPrefixUnaryExpression: + return n.data.(*PrefixUnaryExpression).computeSubtreeFacts() + case KindPostfixUnaryExpression: + return n.data.(*PostfixUnaryExpression).computeSubtreeFacts() + case KindYieldExpression: + return n.data.(*YieldExpression).computeSubtreeFacts() + case KindArrowFunction: + return n.data.(*ArrowFunction).computeSubtreeFacts() + case KindFunctionExpression: + return n.data.(*FunctionExpression).computeSubtreeFacts() + case KindAsExpression: + return n.data.(*AsExpression).computeSubtreeFacts() + case KindSatisfiesExpression: + return n.data.(*SatisfiesExpression).computeSubtreeFacts() + case KindConditionalExpression: + return n.data.(*ConditionalExpression).computeSubtreeFacts() + case KindPropertyAccessExpression: + return n.data.(*PropertyAccessExpression).computeSubtreeFacts() + case KindElementAccessExpression: + return n.data.(*ElementAccessExpression).computeSubtreeFacts() + case KindCallExpression: + return n.data.(*CallExpression).computeSubtreeFacts() + case KindNewExpression: + return n.data.(*NewExpression).computeSubtreeFacts() + case KindMetaProperty: + return n.data.(*MetaProperty).computeSubtreeFacts() + case KindNonNullExpression: + return n.data.(*NonNullExpression).computeSubtreeFacts() + case KindSpreadElement: + return n.data.(*SpreadElement).computeSubtreeFacts() + case KindTemplateExpression: + return n.data.(*TemplateExpression).computeSubtreeFacts() + case KindTemplateSpan: + return n.data.(*TemplateSpan).computeSubtreeFacts() + case KindTaggedTemplateExpression: + return n.data.(*TaggedTemplateExpression).computeSubtreeFacts() + case KindParenthesizedExpression: + return n.data.(*ParenthesizedExpression).computeSubtreeFacts() + case KindArrayLiteralExpression: + return n.data.(*ArrayLiteralExpression).computeSubtreeFacts() + case KindObjectLiteralExpression: + return n.data.(*ObjectLiteralExpression).computeSubtreeFacts() + case KindSpreadAssignment: + return n.data.(*SpreadAssignment).computeSubtreeFacts() + case KindPropertyAssignment: + return n.data.(*PropertyAssignment).computeSubtreeFacts() + case KindShorthandPropertyAssignment: + return n.data.(*ShorthandPropertyAssignment).computeSubtreeFacts() + case KindDeleteExpression: + return n.data.(*DeleteExpression).computeSubtreeFacts() + case KindTypeOfExpression: + return n.data.(*TypeOfExpression).computeSubtreeFacts() + case KindVoidExpression: + return n.data.(*VoidExpression).computeSubtreeFacts() + case KindAwaitExpression: + return n.data.(*AwaitExpression).computeSubtreeFacts() + case KindTypeAssertionExpression: + return n.data.(*TypeAssertion).computeSubtreeFacts() + case KindUnionType: + return n.data.(*UnionTypeNode).computeSubtreeFacts() + case KindIntersectionType: + return n.data.(*IntersectionTypeNode).computeSubtreeFacts() + case KindConditionalType: + return n.data.(*ConditionalTypeNode).computeSubtreeFacts() + case KindTypeOperator: + return n.data.(*TypeOperatorNode).computeSubtreeFacts() + case KindInferType: + return n.data.(*InferTypeNode).computeSubtreeFacts() + case KindArrayType: + return n.data.(*ArrayTypeNode).computeSubtreeFacts() + case KindIndexedAccessType: + return n.data.(*IndexedAccessTypeNode).computeSubtreeFacts() + case KindTypeReference: + return n.data.(*TypeReferenceNode).computeSubtreeFacts() + case KindExpressionWithTypeArguments: + return n.data.(*ExpressionWithTypeArguments).computeSubtreeFacts() + case KindLiteralType: + return n.data.(*LiteralTypeNode).computeSubtreeFacts() + case KindThisType: + return n.data.(*ThisTypeNode).computeSubtreeFacts() + case KindTypePredicate: + return n.data.(*TypePredicateNode).computeSubtreeFacts() + case KindImportAttribute: + return n.data.(*ImportAttribute).computeSubtreeFacts() + case KindImportAttributes: + return n.data.(*ImportAttributes).computeSubtreeFacts() + case KindTypeQuery: + return n.data.(*TypeQueryNode).computeSubtreeFacts() + case KindMappedType: + return n.data.(*MappedTypeNode).computeSubtreeFacts() + case KindTypeLiteral: + return n.data.(*TypeLiteralNode).computeSubtreeFacts() + case KindTupleType: + return n.data.(*TupleTypeNode).computeSubtreeFacts() + case KindNamedTupleMember: + return n.data.(*NamedTupleMember).computeSubtreeFacts() + case KindOptionalType: + return n.data.(*OptionalTypeNode).computeSubtreeFacts() + case KindRestType: + return n.data.(*RestTypeNode).computeSubtreeFacts() + case KindParenthesizedType: + return n.data.(*ParenthesizedTypeNode).computeSubtreeFacts() + case KindFunctionType: + return n.data.(*FunctionTypeNode).computeSubtreeFacts() + case KindConstructorType: + return n.data.(*ConstructorTypeNode).computeSubtreeFacts() + case KindTemplateLiteralType: + return n.data.(*TemplateLiteralTypeNode).computeSubtreeFacts() + case KindTemplateLiteralTypeSpan: + return n.data.(*TemplateLiteralTypeSpan).computeSubtreeFacts() + case KindSyntheticExpression: + return n.data.(*SyntheticExpression).computeSubtreeFacts() + case KindPartiallyEmittedExpression: + return n.data.(*PartiallyEmittedExpression).computeSubtreeFacts() + case KindJsxElement: + return n.data.(*JsxElement).computeSubtreeFacts() + case KindJsxAttributes: + return n.data.(*JsxAttributes).computeSubtreeFacts() + case KindJsxNamespacedName: + return n.data.(*JsxNamespacedName).computeSubtreeFacts() + case KindJsxOpeningElement: + return n.data.(*JsxOpeningElement).computeSubtreeFacts() + case KindJsxSelfClosingElement: + return n.data.(*JsxSelfClosingElement).computeSubtreeFacts() + case KindJsxFragment: + return n.data.(*JsxFragment).computeSubtreeFacts() + case KindJsxOpeningFragment: + return n.data.(*JsxOpeningFragment).computeSubtreeFacts() + case KindJsxClosingFragment: + return n.data.(*JsxClosingFragment).computeSubtreeFacts() + case KindJsxAttribute: + return n.data.(*JsxAttribute).computeSubtreeFacts() + case KindJsxSpreadAttribute: + return n.data.(*JsxSpreadAttribute).computeSubtreeFacts() + case KindJsxClosingElement: + return n.data.(*JsxClosingElement).computeSubtreeFacts() + case KindJsxExpression: + return n.data.(*JsxExpression).computeSubtreeFacts() + case KindSyntaxList: + return n.data.(*SyntaxList).computeSubtreeFacts() + case KindJSDoc: + return n.data.(*JSDoc).computeSubtreeFacts() + case KindJSDocTypeExpression: + return n.data.(*JSDocTypeExpression).computeSubtreeFacts() + case KindJSDocNonNullableType: + return n.data.(*JSDocNonNullableType).computeSubtreeFacts() + case KindJSDocNullableType: + return n.data.(*JSDocNullableType).computeSubtreeFacts() + case KindJSDocAllType: + return n.data.(*JSDocAllType).computeSubtreeFacts() + case KindJSDocVariadicType: + return n.data.(*JSDocVariadicType).computeSubtreeFacts() + case KindJSDocOptionalType: + return n.data.(*JSDocOptionalType).computeSubtreeFacts() + case KindJSDocTypeTag: + return n.data.(*JSDocTypeTag).computeSubtreeFacts() + case KindJSDocUnknownTag: + return n.data.(*JSDocUnknownTag).computeSubtreeFacts() + case KindJSDocTemplateTag: + return n.data.(*JSDocTemplateTag).computeSubtreeFacts() + case KindJSDocReturnTag: + return n.data.(*JSDocReturnTag).computeSubtreeFacts() + case KindJSDocPublicTag: + return n.data.(*JSDocPublicTag).computeSubtreeFacts() + case KindJSDocPrivateTag: + return n.data.(*JSDocPrivateTag).computeSubtreeFacts() + case KindJSDocProtectedTag: + return n.data.(*JSDocProtectedTag).computeSubtreeFacts() + case KindJSDocReadonlyTag: + return n.data.(*JSDocReadonlyTag).computeSubtreeFacts() + case KindJSDocOverrideTag: + return n.data.(*JSDocOverrideTag).computeSubtreeFacts() + case KindJSDocDeprecatedTag: + return n.data.(*JSDocDeprecatedTag).computeSubtreeFacts() + case KindJSDocSeeTag: + return n.data.(*JSDocSeeTag).computeSubtreeFacts() + case KindJSDocImplementsTag: + return n.data.(*JSDocImplementsTag).computeSubtreeFacts() + case KindJSDocAugmentsTag: + return n.data.(*JSDocAugmentsTag).computeSubtreeFacts() + case KindJSDocSatisfiesTag: + return n.data.(*JSDocSatisfiesTag).computeSubtreeFacts() + case KindJSDocThrowsTag: + return n.data.(*JSDocThrowsTag).computeSubtreeFacts() + case KindJSDocThisTag: + return n.data.(*JSDocThisTag).computeSubtreeFacts() + case KindJSDocImportTag: + return n.data.(*JSDocImportTag).computeSubtreeFacts() + case KindJSDocCallbackTag: + return n.data.(*JSDocCallbackTag).computeSubtreeFacts() + case KindJSDocOverloadTag: + return n.data.(*JSDocOverloadTag).computeSubtreeFacts() + case KindJSDocTypedefTag: + return n.data.(*JSDocTypedefTag).computeSubtreeFacts() + case KindJSDocSignature: + return n.data.(*JSDocSignature).computeSubtreeFacts() + case KindJSDocNameReference: + return n.data.(*JSDocNameReference).computeSubtreeFacts() + case KindSourceFile: + return n.data.(*SourceFile).computeSubtreeFacts() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).computeSubtreeFacts() + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).computeSubtreeFacts() + case KindExportDeclaration: + return n.data.(*ExportDeclaration).computeSubtreeFacts() + case KindImportType: + return n.data.(*ImportTypeNode).computeSubtreeFacts() + case KindImportClause: + return n.data.(*ImportClause).computeSubtreeFacts() + case KindImportSpecifier: + return n.data.(*ImportSpecifier).computeSubtreeFacts() + case KindJSDocText: + return n.data.(*JSDocText).computeSubtreeFacts() + case KindJSDocLink: + return n.data.(*JSDocLink).computeSubtreeFacts() + case KindJSDocLinkPlain: + return n.data.(*JSDocLinkPlain).computeSubtreeFacts() + case KindJSDocLinkCode: + return n.data.(*JSDocLinkCode).computeSubtreeFacts() + case KindTypeParameter: + return n.data.(*TypeParameterDeclaration).computeSubtreeFacts() + case KindSyntheticReferenceExpression: + return n.data.(*SyntheticReferenceExpression).computeSubtreeFacts() + case KindJSDocTypeLiteral: + return n.data.(*JSDocTypeLiteral).computeSubtreeFacts() + case KindJSDocParameterTag, KindJSDocPropertyTag: + return n.data.(*JSDocParameterOrPropertyTag).computeSubtreeFacts() + default: + return SubtreeFactsNone + } +} + +func (n *Node) propagateSubtreeFacts() SubtreeFacts { + switch n.Kind { + case KindUnknown, KindEndOfFile, KindSingleLineCommentTrivia, KindMultiLineCommentTrivia, KindNewLineTrivia, KindWhitespaceTrivia, KindConflictMarkerTrivia, KindNonTextFileMarkerTrivia, KindJsxTextAllWhiteSpaces, KindOpenBraceToken, KindCloseBraceToken, KindOpenParenToken, KindCloseParenToken, KindOpenBracketToken, KindCloseBracketToken, KindDotToken, KindDotDotDotToken, KindSemicolonToken, KindCommaToken, KindQuestionDotToken, KindLessThanToken, KindLessThanSlashToken, KindGreaterThanToken, KindLessThanEqualsToken, KindGreaterThanEqualsToken, KindEqualsEqualsToken, KindExclamationEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindEqualsGreaterThanToken, KindPlusToken, KindMinusToken, KindAsteriskToken, KindAsteriskAsteriskToken, KindSlashToken, KindPercentToken, KindPlusPlusToken, KindMinusMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindExclamationToken, KindTildeToken, KindAmpersandAmpersandToken, KindBarBarToken, KindQuestionToken, KindColonToken, KindAtToken, KindQuestionQuestionToken, KindBacktickToken, KindHashToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskEqualsToken, KindAsteriskAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken, KindCaretEqualsToken, KindJSDocCommentTextToken, KindBreakKeyword, KindCaseKeyword, KindCatchKeyword, KindClassKeyword, KindConstKeyword, KindContinueKeyword, KindDebuggerKeyword, KindDefaultKeyword, KindDeleteKeyword, KindDoKeyword, KindElseKeyword, KindEnumKeyword, KindExportKeyword, KindExtendsKeyword, KindFinallyKeyword, KindForKeyword, KindFunctionKeyword, KindIfKeyword, KindInKeyword, KindInstanceOfKeyword, KindNewKeyword, KindReturnKeyword, KindSwitchKeyword, KindThrowKeyword, KindTryKeyword, KindTypeOfKeyword, KindVarKeyword, KindWhileKeyword, KindWithKeyword, KindImplementsKeyword, KindInterfaceKeyword, KindLetKeyword, KindPackageKeyword, KindPrivateKeyword, KindProtectedKeyword, KindPublicKeyword, KindStaticKeyword, KindYieldKeyword, KindAbstractKeyword, KindAccessorKeyword, KindAsKeyword, KindAssertsKeyword, KindAssertKeyword, KindAsyncKeyword, KindAwaitKeyword, KindConstructorKeyword, KindDeclareKeyword, KindGetKeyword, KindImmediateKeyword, KindInferKeyword, KindIsKeyword, KindKeyOfKeyword, KindModuleKeyword, KindNamespaceKeyword, KindOutKeyword, KindReadonlyKeyword, KindRequireKeyword, KindSatisfiesKeyword, KindSetKeyword, KindTypeKeyword, KindUniqueKeyword, KindUsingKeyword, KindFromKeyword, KindGlobalKeyword, KindOverrideKeyword, KindOfKeyword, KindDeferKeyword: + return n.data.(*Token).propagateSubtreeFacts() + case KindNumericLiteral: + return n.data.(*NumericLiteral).propagateSubtreeFacts() + case KindBigIntLiteral: + return n.data.(*BigIntLiteral).propagateSubtreeFacts() + case KindStringLiteral: + return n.data.(*StringLiteral).propagateSubtreeFacts() + case KindJsxText: + return n.data.(*JsxText).propagateSubtreeFacts() + case KindRegularExpressionLiteral: + return n.data.(*RegularExpressionLiteral).propagateSubtreeFacts() + case KindNoSubstitutionTemplateLiteral: + return n.data.(*NoSubstitutionTemplateLiteral).propagateSubtreeFacts() + case KindTemplateHead: + return n.data.(*TemplateHead).propagateSubtreeFacts() + case KindTemplateMiddle: + return n.data.(*TemplateMiddle).propagateSubtreeFacts() + case KindTemplateTail: + return n.data.(*TemplateTail).propagateSubtreeFacts() + case KindIdentifier: + return n.data.(*Identifier).propagateSubtreeFacts() + case KindPrivateIdentifier: + return n.data.(*PrivateIdentifier).propagateSubtreeFacts() + case KindFalseKeyword, KindImportKeyword, KindNullKeyword, KindSuperKeyword, KindThisKeyword, KindTrueKeyword: + return n.data.(*KeywordExpression).propagateSubtreeFacts() + case KindVoidKeyword, KindAnyKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindBigIntKeyword: + return n.data.(*KeywordTypeNode).propagateSubtreeFacts() + case KindQualifiedName: + return n.data.(*QualifiedName).propagateSubtreeFacts() + case KindComputedPropertyName: + return n.data.(*ComputedPropertyName).propagateSubtreeFacts() + case KindDecorator: + return n.data.(*Decorator).propagateSubtreeFacts() + case KindEmptyStatement: + return n.data.(*EmptyStatement).propagateSubtreeFacts() + case KindIfStatement: + return n.data.(*IfStatement).propagateSubtreeFacts() + case KindDoStatement: + return n.data.(*DoStatement).propagateSubtreeFacts() + case KindWhileStatement: + return n.data.(*WhileStatement).propagateSubtreeFacts() + case KindForStatement: + return n.data.(*ForStatement).propagateSubtreeFacts() + case KindForInStatement, KindForOfStatement: + return n.data.(*ForInOrOfStatement).propagateSubtreeFacts() + case KindBreakStatement: + return n.data.(*BreakStatement).propagateSubtreeFacts() + case KindContinueStatement: + return n.data.(*ContinueStatement).propagateSubtreeFacts() + case KindReturnStatement: + return n.data.(*ReturnStatement).propagateSubtreeFacts() + case KindWithStatement: + return n.data.(*WithStatement).propagateSubtreeFacts() + case KindSwitchStatement: + return n.data.(*SwitchStatement).propagateSubtreeFacts() + case KindCaseBlock: + return n.data.(*CaseBlock).propagateSubtreeFacts() + case KindCaseClause, KindDefaultClause: + return n.data.(*CaseOrDefaultClause).propagateSubtreeFacts() + case KindThrowStatement: + return n.data.(*ThrowStatement).propagateSubtreeFacts() + case KindTryStatement: + return n.data.(*TryStatement).propagateSubtreeFacts() + case KindCatchClause: + return n.data.(*CatchClause).propagateSubtreeFacts() + case KindDebuggerStatement: + return n.data.(*DebuggerStatement).propagateSubtreeFacts() + case KindLabeledStatement: + return n.data.(*LabeledStatement).propagateSubtreeFacts() + case KindExpressionStatement: + return n.data.(*ExpressionStatement).propagateSubtreeFacts() + case KindBlock: + return n.data.(*Block).propagateSubtreeFacts() + case KindVariableStatement: + return n.data.(*VariableStatement).propagateSubtreeFacts() + case KindVariableDeclaration: + return n.data.(*VariableDeclaration).propagateSubtreeFacts() + case KindVariableDeclarationList: + return n.data.(*VariableDeclarationList).propagateSubtreeFacts() + case KindObjectBindingPattern, KindArrayBindingPattern: + return n.data.(*BindingPattern).propagateSubtreeFacts() + case KindParameter: + return n.data.(*ParameterDeclaration).propagateSubtreeFacts() + case KindBindingElement: + return n.data.(*BindingElement).propagateSubtreeFacts() + case KindMissingDeclaration: + return n.data.(*MissingDeclaration).propagateSubtreeFacts() + case KindFunctionDeclaration: + return n.data.(*FunctionDeclaration).propagateSubtreeFacts() + case KindClassDeclaration: + return n.data.(*ClassDeclaration).propagateSubtreeFacts() + case KindClassExpression: + return n.data.(*ClassExpression).propagateSubtreeFacts() + case KindHeritageClause: + return n.data.(*HeritageClause).propagateSubtreeFacts() + case KindInterfaceDeclaration: + return n.data.(*InterfaceDeclaration).propagateSubtreeFacts() + case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: + return n.data.(*TypeAliasDeclaration).propagateSubtreeFacts() + case KindEnumMember: + return n.data.(*EnumMember).propagateSubtreeFacts() + case KindEnumDeclaration: + return n.data.(*EnumDeclaration).propagateSubtreeFacts() + case KindModuleBlock: + return n.data.(*ModuleBlock).propagateSubtreeFacts() + case KindNotEmittedStatement: + return n.data.(*NotEmittedStatement).propagateSubtreeFacts() + case KindNotEmittedTypeElement: + return n.data.(*NotEmittedTypeElement).propagateSubtreeFacts() + case KindImportDeclaration, KindJSImportDeclaration: + return n.data.(*ImportDeclaration).propagateSubtreeFacts() + case KindExternalModuleReference: + return n.data.(*ExternalModuleReference).propagateSubtreeFacts() + case KindNamespaceImport: + return n.data.(*NamespaceImport).propagateSubtreeFacts() + case KindNamedImports: + return n.data.(*NamedImports).propagateSubtreeFacts() + case KindExportAssignment: + return n.data.(*ExportAssignment).propagateSubtreeFacts() + case KindNamespaceExportDeclaration: + return n.data.(*NamespaceExportDeclaration).propagateSubtreeFacts() + case KindNamespaceExport: + return n.data.(*NamespaceExport).propagateSubtreeFacts() + case KindNamedExports: + return n.data.(*NamedExports).propagateSubtreeFacts() + case KindExportSpecifier: + return n.data.(*ExportSpecifier).propagateSubtreeFacts() + case KindCallSignature: + return n.data.(*CallSignatureDeclaration).propagateSubtreeFacts() + case KindConstructSignature: + return n.data.(*ConstructSignatureDeclaration).propagateSubtreeFacts() + case KindConstructor: + return n.data.(*ConstructorDeclaration).propagateSubtreeFacts() + case KindGetAccessor: + return n.data.(*GetAccessorDeclaration).propagateSubtreeFacts() + case KindSetAccessor: + return n.data.(*SetAccessorDeclaration).propagateSubtreeFacts() + case KindIndexSignature: + return n.data.(*IndexSignatureDeclaration).propagateSubtreeFacts() + case KindMethodSignature: + return n.data.(*MethodSignatureDeclaration).propagateSubtreeFacts() + case KindMethodDeclaration: + return n.data.(*MethodDeclaration).propagateSubtreeFacts() + case KindPropertySignature: + return n.data.(*PropertySignatureDeclaration).propagateSubtreeFacts() + case KindPropertyDeclaration: + return n.data.(*PropertyDeclaration).propagateSubtreeFacts() + case KindSemicolonClassElement: + return n.data.(*SemicolonClassElement).propagateSubtreeFacts() + case KindClassStaticBlockDeclaration: + return n.data.(*ClassStaticBlockDeclaration).propagateSubtreeFacts() + case KindOmittedExpression: + return n.data.(*OmittedExpression).propagateSubtreeFacts() + case KindBinaryExpression: + return n.data.(*BinaryExpression).propagateSubtreeFacts() + case KindPrefixUnaryExpression: + return n.data.(*PrefixUnaryExpression).propagateSubtreeFacts() + case KindPostfixUnaryExpression: + return n.data.(*PostfixUnaryExpression).propagateSubtreeFacts() + case KindYieldExpression: + return n.data.(*YieldExpression).propagateSubtreeFacts() + case KindArrowFunction: + return n.data.(*ArrowFunction).propagateSubtreeFacts() + case KindFunctionExpression: + return n.data.(*FunctionExpression).propagateSubtreeFacts() + case KindAsExpression: + return n.data.(*AsExpression).propagateSubtreeFacts() + case KindSatisfiesExpression: + return n.data.(*SatisfiesExpression).propagateSubtreeFacts() + case KindConditionalExpression: + return n.data.(*ConditionalExpression).propagateSubtreeFacts() + case KindPropertyAccessExpression: + return n.data.(*PropertyAccessExpression).propagateSubtreeFacts() + case KindElementAccessExpression: + return n.data.(*ElementAccessExpression).propagateSubtreeFacts() + case KindCallExpression: + return n.data.(*CallExpression).propagateSubtreeFacts() + case KindNewExpression: + return n.data.(*NewExpression).propagateSubtreeFacts() + case KindMetaProperty: + return n.data.(*MetaProperty).propagateSubtreeFacts() + case KindNonNullExpression: + return n.data.(*NonNullExpression).propagateSubtreeFacts() + case KindSpreadElement: + return n.data.(*SpreadElement).propagateSubtreeFacts() + case KindTemplateExpression: + return n.data.(*TemplateExpression).propagateSubtreeFacts() + case KindTemplateSpan: + return n.data.(*TemplateSpan).propagateSubtreeFacts() + case KindTaggedTemplateExpression: + return n.data.(*TaggedTemplateExpression).propagateSubtreeFacts() + case KindParenthesizedExpression: + return n.data.(*ParenthesizedExpression).propagateSubtreeFacts() + case KindArrayLiteralExpression: + return n.data.(*ArrayLiteralExpression).propagateSubtreeFacts() + case KindObjectLiteralExpression: + return n.data.(*ObjectLiteralExpression).propagateSubtreeFacts() + case KindSpreadAssignment: + return n.data.(*SpreadAssignment).propagateSubtreeFacts() + case KindPropertyAssignment: + return n.data.(*PropertyAssignment).propagateSubtreeFacts() + case KindShorthandPropertyAssignment: + return n.data.(*ShorthandPropertyAssignment).propagateSubtreeFacts() + case KindDeleteExpression: + return n.data.(*DeleteExpression).propagateSubtreeFacts() + case KindTypeOfExpression: + return n.data.(*TypeOfExpression).propagateSubtreeFacts() + case KindVoidExpression: + return n.data.(*VoidExpression).propagateSubtreeFacts() + case KindAwaitExpression: + return n.data.(*AwaitExpression).propagateSubtreeFacts() + case KindTypeAssertionExpression: + return n.data.(*TypeAssertion).propagateSubtreeFacts() + case KindUnionType: + return n.data.(*UnionTypeNode).propagateSubtreeFacts() + case KindIntersectionType: + return n.data.(*IntersectionTypeNode).propagateSubtreeFacts() + case KindConditionalType: + return n.data.(*ConditionalTypeNode).propagateSubtreeFacts() + case KindTypeOperator: + return n.data.(*TypeOperatorNode).propagateSubtreeFacts() + case KindInferType: + return n.data.(*InferTypeNode).propagateSubtreeFacts() + case KindArrayType: + return n.data.(*ArrayTypeNode).propagateSubtreeFacts() + case KindIndexedAccessType: + return n.data.(*IndexedAccessTypeNode).propagateSubtreeFacts() + case KindTypeReference: + return n.data.(*TypeReferenceNode).propagateSubtreeFacts() + case KindExpressionWithTypeArguments: + return n.data.(*ExpressionWithTypeArguments).propagateSubtreeFacts() + case KindLiteralType: + return n.data.(*LiteralTypeNode).propagateSubtreeFacts() + case KindThisType: + return n.data.(*ThisTypeNode).propagateSubtreeFacts() + case KindTypePredicate: + return n.data.(*TypePredicateNode).propagateSubtreeFacts() + case KindImportAttribute: + return n.data.(*ImportAttribute).propagateSubtreeFacts() + case KindImportAttributes: + return n.data.(*ImportAttributes).propagateSubtreeFacts() + case KindTypeQuery: + return n.data.(*TypeQueryNode).propagateSubtreeFacts() + case KindMappedType: + return n.data.(*MappedTypeNode).propagateSubtreeFacts() + case KindTypeLiteral: + return n.data.(*TypeLiteralNode).propagateSubtreeFacts() + case KindTupleType: + return n.data.(*TupleTypeNode).propagateSubtreeFacts() + case KindNamedTupleMember: + return n.data.(*NamedTupleMember).propagateSubtreeFacts() + case KindOptionalType: + return n.data.(*OptionalTypeNode).propagateSubtreeFacts() + case KindRestType: + return n.data.(*RestTypeNode).propagateSubtreeFacts() + case KindParenthesizedType: + return n.data.(*ParenthesizedTypeNode).propagateSubtreeFacts() + case KindFunctionType: + return n.data.(*FunctionTypeNode).propagateSubtreeFacts() + case KindConstructorType: + return n.data.(*ConstructorTypeNode).propagateSubtreeFacts() + case KindTemplateLiteralType: + return n.data.(*TemplateLiteralTypeNode).propagateSubtreeFacts() + case KindTemplateLiteralTypeSpan: + return n.data.(*TemplateLiteralTypeSpan).propagateSubtreeFacts() + case KindSyntheticExpression: + return n.data.(*SyntheticExpression).propagateSubtreeFacts() + case KindPartiallyEmittedExpression: + return n.data.(*PartiallyEmittedExpression).propagateSubtreeFacts() + case KindJsxElement: + return n.data.(*JsxElement).propagateSubtreeFacts() + case KindJsxAttributes: + return n.data.(*JsxAttributes).propagateSubtreeFacts() + case KindJsxNamespacedName: + return n.data.(*JsxNamespacedName).propagateSubtreeFacts() + case KindJsxOpeningElement: + return n.data.(*JsxOpeningElement).propagateSubtreeFacts() + case KindJsxSelfClosingElement: + return n.data.(*JsxSelfClosingElement).propagateSubtreeFacts() + case KindJsxFragment: + return n.data.(*JsxFragment).propagateSubtreeFacts() + case KindJsxOpeningFragment: + return n.data.(*JsxOpeningFragment).propagateSubtreeFacts() + case KindJsxClosingFragment: + return n.data.(*JsxClosingFragment).propagateSubtreeFacts() + case KindJsxAttribute: + return n.data.(*JsxAttribute).propagateSubtreeFacts() + case KindJsxSpreadAttribute: + return n.data.(*JsxSpreadAttribute).propagateSubtreeFacts() + case KindJsxClosingElement: + return n.data.(*JsxClosingElement).propagateSubtreeFacts() + case KindJsxExpression: + return n.data.(*JsxExpression).propagateSubtreeFacts() + case KindSyntaxList: + return n.data.(*SyntaxList).propagateSubtreeFacts() + case KindJSDoc: + return n.data.(*JSDoc).propagateSubtreeFacts() + case KindJSDocTypeExpression: + return n.data.(*JSDocTypeExpression).propagateSubtreeFacts() + case KindJSDocNonNullableType: + return n.data.(*JSDocNonNullableType).propagateSubtreeFacts() + case KindJSDocNullableType: + return n.data.(*JSDocNullableType).propagateSubtreeFacts() + case KindJSDocAllType: + return n.data.(*JSDocAllType).propagateSubtreeFacts() + case KindJSDocVariadicType: + return n.data.(*JSDocVariadicType).propagateSubtreeFacts() + case KindJSDocOptionalType: + return n.data.(*JSDocOptionalType).propagateSubtreeFacts() + case KindJSDocTypeTag: + return n.data.(*JSDocTypeTag).propagateSubtreeFacts() + case KindJSDocUnknownTag: + return n.data.(*JSDocUnknownTag).propagateSubtreeFacts() + case KindJSDocTemplateTag: + return n.data.(*JSDocTemplateTag).propagateSubtreeFacts() + case KindJSDocReturnTag: + return n.data.(*JSDocReturnTag).propagateSubtreeFacts() + case KindJSDocPublicTag: + return n.data.(*JSDocPublicTag).propagateSubtreeFacts() + case KindJSDocPrivateTag: + return n.data.(*JSDocPrivateTag).propagateSubtreeFacts() + case KindJSDocProtectedTag: + return n.data.(*JSDocProtectedTag).propagateSubtreeFacts() + case KindJSDocReadonlyTag: + return n.data.(*JSDocReadonlyTag).propagateSubtreeFacts() + case KindJSDocOverrideTag: + return n.data.(*JSDocOverrideTag).propagateSubtreeFacts() + case KindJSDocDeprecatedTag: + return n.data.(*JSDocDeprecatedTag).propagateSubtreeFacts() + case KindJSDocSeeTag: + return n.data.(*JSDocSeeTag).propagateSubtreeFacts() + case KindJSDocImplementsTag: + return n.data.(*JSDocImplementsTag).propagateSubtreeFacts() + case KindJSDocAugmentsTag: + return n.data.(*JSDocAugmentsTag).propagateSubtreeFacts() + case KindJSDocSatisfiesTag: + return n.data.(*JSDocSatisfiesTag).propagateSubtreeFacts() + case KindJSDocThrowsTag: + return n.data.(*JSDocThrowsTag).propagateSubtreeFacts() + case KindJSDocThisTag: + return n.data.(*JSDocThisTag).propagateSubtreeFacts() + case KindJSDocImportTag: + return n.data.(*JSDocImportTag).propagateSubtreeFacts() + case KindJSDocCallbackTag: + return n.data.(*JSDocCallbackTag).propagateSubtreeFacts() + case KindJSDocOverloadTag: + return n.data.(*JSDocOverloadTag).propagateSubtreeFacts() + case KindJSDocTypedefTag: + return n.data.(*JSDocTypedefTag).propagateSubtreeFacts() + case KindJSDocSignature: + return n.data.(*JSDocSignature).propagateSubtreeFacts() + case KindJSDocNameReference: + return n.data.(*JSDocNameReference).propagateSubtreeFacts() + case KindSourceFile: + return n.data.(*SourceFile).propagateSubtreeFacts() + case KindModuleDeclaration: + return n.data.(*ModuleDeclaration).propagateSubtreeFacts() + case KindImportEqualsDeclaration: + return n.data.(*ImportEqualsDeclaration).propagateSubtreeFacts() + case KindExportDeclaration: + return n.data.(*ExportDeclaration).propagateSubtreeFacts() + case KindImportType: + return n.data.(*ImportTypeNode).propagateSubtreeFacts() + case KindImportClause: + return n.data.(*ImportClause).propagateSubtreeFacts() + case KindImportSpecifier: + return n.data.(*ImportSpecifier).propagateSubtreeFacts() + case KindJSDocText: + return n.data.(*JSDocText).propagateSubtreeFacts() + case KindJSDocLink: + return n.data.(*JSDocLink).propagateSubtreeFacts() + case KindJSDocLinkPlain: + return n.data.(*JSDocLinkPlain).propagateSubtreeFacts() + case KindJSDocLinkCode: + return n.data.(*JSDocLinkCode).propagateSubtreeFacts() + case KindTypeParameter: + return n.data.(*TypeParameterDeclaration).propagateSubtreeFacts() + case KindSyntheticReferenceExpression: + return n.data.(*SyntheticReferenceExpression).propagateSubtreeFacts() + case KindJSDocTypeLiteral: + return n.data.(*JSDocTypeLiteral).propagateSubtreeFacts() + case KindJSDocParameterTag, KindJSDocPropertyTag: + return n.data.(*JSDocParameterOrPropertyTag).propagateSubtreeFacts() + default: + return SubtreeFactsNone + } +} + +// ────────────────────────────────────────────────────────────────────── +// Node accessor dispatch // ────────────────────────────────────────────────────────────────────── func (n *Node) FlowNodeData() *FlowNodeBase { diff --git a/tsc/internal/ast/token_test.go b/tsc/internal/ast/token_test.go new file mode 100644 index 0000000000000..eeb88ab37f3b2 --- /dev/null +++ b/tsc/internal/ast/token_test.go @@ -0,0 +1,54 @@ +package ast + +import ( + "reflect" + "testing" +) + +func TestNewTokenUsesCanonicalDataType(t *testing.T) { + t.Parallel() + + factory := NewNodeFactory(NodeFactoryHooks{}) + for kind := KindFirstToken; kind <= KindLastToken; kind++ { + node := factory.NewToken(kind) + actual := reflect.TypeOf(node.data) + expected := canonicalTokenDataType(kind) + if actual != expected { + t.Errorf("NewToken(%s) data type = %v, want %v", kind, actual, expected) + } + } +} + +func canonicalTokenDataType(kind Kind) reflect.Type { + switch kind { + case KindNumericLiteral: + return reflect.TypeFor[*NumericLiteral]() + case KindBigIntLiteral: + return reflect.TypeFor[*BigIntLiteral]() + case KindStringLiteral: + return reflect.TypeFor[*StringLiteral]() + case KindJsxText: + return reflect.TypeFor[*JsxText]() + case KindRegularExpressionLiteral: + return reflect.TypeFor[*RegularExpressionLiteral]() + case KindNoSubstitutionTemplateLiteral: + return reflect.TypeFor[*NoSubstitutionTemplateLiteral]() + case KindTemplateHead: + return reflect.TypeFor[*TemplateHead]() + case KindTemplateMiddle: + return reflect.TypeFor[*TemplateMiddle]() + case KindTemplateTail: + return reflect.TypeFor[*TemplateTail]() + case KindIdentifier: + return reflect.TypeFor[*Identifier]() + case KindPrivateIdentifier: + return reflect.TypeFor[*PrivateIdentifier]() + case KindFalseKeyword, KindImportKeyword, KindNullKeyword, KindSuperKeyword, KindThisKeyword, KindTrueKeyword: + return reflect.TypeFor[*KeywordExpression]() + case KindVoidKeyword, KindAnyKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, + KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindBigIntKeyword: + return reflect.TypeFor[*KeywordTypeNode]() + default: + return reflect.TypeFor[*Token]() + } +} From ca6276d69cec1d7c89dc3e9f691d9e2d0d81c87f Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 27 Aug 2026 22:50:14 -0700 Subject: [PATCH 07/13] Handle synthetic flow node dispatch --- tools/scripts/tsc/generate-go-ast.ts | 8 ++++++++ tsc/internal/ast/ast_generated.go | 4 ++++ tsc/internal/ast/flow.go | 9 +++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/scripts/tsc/generate-go-ast.ts b/tools/scripts/tsc/generate-go-ast.ts index 2bc609f2e9629..0b70931310b64 100644 --- a/tools/scripts/tsc/generate-go-ast.ts +++ b/tools/scripts/tsc/generate-go-ast.ts @@ -686,6 +686,10 @@ function generateCloneDispatch(w: CodeWriter) { w.write("func (n *Node) Clone(f NodeFactoryCoercible) *Node {"); w.push(); w.write("switch n.Kind {"); + w.write("case kindFlowSwitchClauseData, kindFlowReduceLabelData:"); + w.push(); + w.write("return nil"); + w.pop(); for (const [node, kinds] of canonicalNodesByKind()) { w.write(`case ${kinds.join(", ")}:`); w.push(); @@ -706,6 +710,10 @@ function generateSubtreeFactsDispatch(w: CodeWriter) { w.write("func (n *Node) SubtreeFacts() SubtreeFacts {"); w.push(); w.write("switch n.Kind {"); + w.write("case kindFlowSwitchClauseData, kindFlowReduceLabelData:"); + w.push(); + w.write("return SubtreeFactsNone"); + w.pop(); for (const [node, kinds] of canonicalNodesByKind()) { w.write(`case ${kinds.join(", ")}:`); w.push(); diff --git a/tsc/internal/ast/ast_generated.go b/tsc/internal/ast/ast_generated.go index a5a34240e17ef..09a70ce9799a8 100644 --- a/tsc/internal/ast/ast_generated.go +++ b/tsc/internal/ast/ast_generated.go @@ -9417,6 +9417,8 @@ func (n *Node) VisitEachChild(v *NodeVisitor) *Node { func (n *Node) Clone(f NodeFactoryCoercible) *Node { switch n.Kind { + case kindFlowSwitchClauseData, kindFlowReduceLabelData: + return nil case KindUnknown, KindEndOfFile, KindSingleLineCommentTrivia, KindMultiLineCommentTrivia, KindNewLineTrivia, KindWhitespaceTrivia, KindConflictMarkerTrivia, KindNonTextFileMarkerTrivia, KindJsxTextAllWhiteSpaces, KindOpenBraceToken, KindCloseBraceToken, KindOpenParenToken, KindCloseParenToken, KindOpenBracketToken, KindCloseBracketToken, KindDotToken, KindDotDotDotToken, KindSemicolonToken, KindCommaToken, KindQuestionDotToken, KindLessThanToken, KindLessThanSlashToken, KindGreaterThanToken, KindLessThanEqualsToken, KindGreaterThanEqualsToken, KindEqualsEqualsToken, KindExclamationEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindEqualsGreaterThanToken, KindPlusToken, KindMinusToken, KindAsteriskToken, KindAsteriskAsteriskToken, KindSlashToken, KindPercentToken, KindPlusPlusToken, KindMinusMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindExclamationToken, KindTildeToken, KindAmpersandAmpersandToken, KindBarBarToken, KindQuestionToken, KindColonToken, KindAtToken, KindQuestionQuestionToken, KindBacktickToken, KindHashToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskEqualsToken, KindAsteriskAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken, KindCaretEqualsToken, KindJSDocCommentTextToken, KindBreakKeyword, KindCaseKeyword, KindCatchKeyword, KindClassKeyword, KindConstKeyword, KindContinueKeyword, KindDebuggerKeyword, KindDefaultKeyword, KindDeleteKeyword, KindDoKeyword, KindElseKeyword, KindEnumKeyword, KindExportKeyword, KindExtendsKeyword, KindFinallyKeyword, KindForKeyword, KindFunctionKeyword, KindIfKeyword, KindInKeyword, KindInstanceOfKeyword, KindNewKeyword, KindReturnKeyword, KindSwitchKeyword, KindThrowKeyword, KindTryKeyword, KindTypeOfKeyword, KindVarKeyword, KindWhileKeyword, KindWithKeyword, KindImplementsKeyword, KindInterfaceKeyword, KindLetKeyword, KindPackageKeyword, KindPrivateKeyword, KindProtectedKeyword, KindPublicKeyword, KindStaticKeyword, KindYieldKeyword, KindAbstractKeyword, KindAccessorKeyword, KindAsKeyword, KindAssertsKeyword, KindAssertKeyword, KindAsyncKeyword, KindAwaitKeyword, KindConstructorKeyword, KindDeclareKeyword, KindGetKeyword, KindImmediateKeyword, KindInferKeyword, KindIsKeyword, KindKeyOfKeyword, KindModuleKeyword, KindNamespaceKeyword, KindOutKeyword, KindReadonlyKeyword, KindRequireKeyword, KindSatisfiesKeyword, KindSetKeyword, KindTypeKeyword, KindUniqueKeyword, KindUsingKeyword, KindFromKeyword, KindGlobalKeyword, KindOverrideKeyword, KindOfKeyword, KindDeferKeyword: return n.data.(*Token).Clone(f) case KindNumericLiteral: @@ -9812,6 +9814,8 @@ func (n *Node) Clone(f NodeFactoryCoercible) *Node { func (n *Node) SubtreeFacts() SubtreeFacts { switch n.Kind { + case kindFlowSwitchClauseData, kindFlowReduceLabelData: + return SubtreeFactsNone case KindUnknown, KindEndOfFile, KindSingleLineCommentTrivia, KindMultiLineCommentTrivia, KindNewLineTrivia, KindWhitespaceTrivia, KindConflictMarkerTrivia, KindNonTextFileMarkerTrivia, KindJsxTextAllWhiteSpaces, KindOpenBraceToken, KindCloseBraceToken, KindOpenParenToken, KindCloseParenToken, KindOpenBracketToken, KindCloseBracketToken, KindDotToken, KindDotDotDotToken, KindSemicolonToken, KindCommaToken, KindQuestionDotToken, KindLessThanToken, KindLessThanSlashToken, KindGreaterThanToken, KindLessThanEqualsToken, KindGreaterThanEqualsToken, KindEqualsEqualsToken, KindExclamationEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindEqualsGreaterThanToken, KindPlusToken, KindMinusToken, KindAsteriskToken, KindAsteriskAsteriskToken, KindSlashToken, KindPercentToken, KindPlusPlusToken, KindMinusMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindExclamationToken, KindTildeToken, KindAmpersandAmpersandToken, KindBarBarToken, KindQuestionToken, KindColonToken, KindAtToken, KindQuestionQuestionToken, KindBacktickToken, KindHashToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskEqualsToken, KindAsteriskAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken, KindCaretEqualsToken, KindJSDocCommentTextToken, KindBreakKeyword, KindCaseKeyword, KindCatchKeyword, KindClassKeyword, KindConstKeyword, KindContinueKeyword, KindDebuggerKeyword, KindDefaultKeyword, KindDeleteKeyword, KindDoKeyword, KindElseKeyword, KindEnumKeyword, KindExportKeyword, KindExtendsKeyword, KindFinallyKeyword, KindForKeyword, KindFunctionKeyword, KindIfKeyword, KindInKeyword, KindInstanceOfKeyword, KindNewKeyword, KindReturnKeyword, KindSwitchKeyword, KindThrowKeyword, KindTryKeyword, KindTypeOfKeyword, KindVarKeyword, KindWhileKeyword, KindWithKeyword, KindImplementsKeyword, KindInterfaceKeyword, KindLetKeyword, KindPackageKeyword, KindPrivateKeyword, KindProtectedKeyword, KindPublicKeyword, KindStaticKeyword, KindYieldKeyword, KindAbstractKeyword, KindAccessorKeyword, KindAsKeyword, KindAssertsKeyword, KindAssertKeyword, KindAsyncKeyword, KindAwaitKeyword, KindConstructorKeyword, KindDeclareKeyword, KindGetKeyword, KindImmediateKeyword, KindInferKeyword, KindIsKeyword, KindKeyOfKeyword, KindModuleKeyword, KindNamespaceKeyword, KindOutKeyword, KindReadonlyKeyword, KindRequireKeyword, KindSatisfiesKeyword, KindSetKeyword, KindTypeKeyword, KindUniqueKeyword, KindUsingKeyword, KindFromKeyword, KindGlobalKeyword, KindOverrideKeyword, KindOfKeyword, KindDeferKeyword: return n.computeSubtreeFacts() case KindNumericLiteral: diff --git a/tsc/internal/ast/flow.go b/tsc/internal/ast/flow.go index 3ca4b9033c335..ee95f565d4e76 100644 --- a/tsc/internal/ast/flow.go +++ b/tsc/internal/ast/flow.go @@ -38,6 +38,11 @@ type FlowList struct { type FlowLabel = FlowNode +const ( + kindFlowSwitchClauseData Kind = KindCount + iota + kindFlowReduceLabelData +) + // FlowSwitchClauseData (synthetic AST node for FlowFlagsSwitchClause) type FlowSwitchClauseData struct { @@ -52,7 +57,7 @@ func NewFlowSwitchClauseData(switchStatement *Node, clauseStart int, clauseEnd i node.SwitchStatement = switchStatement node.ClauseStart = int32(clauseStart) node.ClauseEnd = int32(clauseEnd) - return newNode(KindUnknown, node.AsNode(), node, NodeFactoryHooks{}) + return newNode(kindFlowSwitchClauseData, node.AsNode(), node, NodeFactoryHooks{}) } func (node *FlowSwitchClauseData) IsEmpty() bool { @@ -71,5 +76,5 @@ func NewFlowReduceLabelData(target *FlowLabel, antecedents *FlowList) *Node { node := &FlowReduceLabelData{} node.Target = target node.Antecedents = antecedents - return newNode(KindUnknown, node.AsNode(), node, NodeFactoryHooks{}) + return newNode(kindFlowReduceLabelData, node.AsNode(), node, NodeFactoryHooks{}) } From 6543bbdae5957b9a3c36c24458432ba7fb847276 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 27 Aug 2026 22:57:54 -0700 Subject: [PATCH 08/13] Regenerate Kind stringer --- tsc/internal/ast/kind_stringer_generated.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tsc/internal/ast/kind_stringer_generated.go b/tsc/internal/ast/kind_stringer_generated.go index b80f1ba531982..0548cb34a4763 100644 --- a/tsc/internal/ast/kind_stringer_generated.go +++ b/tsc/internal/ast/kind_stringer_generated.go @@ -8,6 +8,8 @@ func _() { // An "invalid array index" compiler error signifies that the constant values have changed. // Re-run the stringer command to generate them again. var x [1]struct{} + _ = x[kindFlowSwitchClauseData-351] + _ = x[kindFlowReduceLabelData-352] _ = x[KindUnknown-0] _ = x[KindEndOfFile-1] _ = x[KindSingleLineCommentTrivia-2] @@ -362,9 +364,9 @@ func _() { _ = x[KindCount-351] } -const _Kind_name = "KindUnknownKindEndOfFileKindSingleLineCommentTriviaKindMultiLineCommentTriviaKindNewLineTriviaKindWhitespaceTriviaKindConflictMarkerTriviaKindNonTextFileMarkerTriviaKindNumericLiteralKindBigIntLiteralKindStringLiteralKindJsxTextKindJsxTextAllWhiteSpacesKindRegularExpressionLiteralKindNoSubstitutionTemplateLiteralKindTemplateHeadKindTemplateMiddleKindTemplateTailKindOpenBraceTokenKindCloseBraceTokenKindOpenParenTokenKindCloseParenTokenKindOpenBracketTokenKindCloseBracketTokenKindDotTokenKindDotDotDotTokenKindSemicolonTokenKindCommaTokenKindQuestionDotTokenKindLessThanTokenKindLessThanSlashTokenKindGreaterThanTokenKindLessThanEqualsTokenKindGreaterThanEqualsTokenKindEqualsEqualsTokenKindExclamationEqualsTokenKindEqualsEqualsEqualsTokenKindExclamationEqualsEqualsTokenKindEqualsGreaterThanTokenKindPlusTokenKindMinusTokenKindAsteriskTokenKindAsteriskAsteriskTokenKindSlashTokenKindPercentTokenKindPlusPlusTokenKindMinusMinusTokenKindLessThanLessThanTokenKindGreaterThanGreaterThanTokenKindGreaterThanGreaterThanGreaterThanTokenKindAmpersandTokenKindBarTokenKindCaretTokenKindExclamationTokenKindTildeTokenKindAmpersandAmpersandTokenKindBarBarTokenKindQuestionTokenKindColonTokenKindAtTokenKindQuestionQuestionTokenKindBacktickTokenKindHashTokenKindEqualsTokenKindPlusEqualsTokenKindMinusEqualsTokenKindAsteriskEqualsTokenKindAsteriskAsteriskEqualsTokenKindSlashEqualsTokenKindPercentEqualsTokenKindLessThanLessThanEqualsTokenKindGreaterThanGreaterThanEqualsTokenKindGreaterThanGreaterThanGreaterThanEqualsTokenKindAmpersandEqualsTokenKindBarEqualsTokenKindBarBarEqualsTokenKindAmpersandAmpersandEqualsTokenKindQuestionQuestionEqualsTokenKindCaretEqualsTokenKindIdentifierKindPrivateIdentifierKindJSDocCommentTextTokenKindBreakKeywordKindCaseKeywordKindCatchKeywordKindClassKeywordKindConstKeywordKindContinueKeywordKindDebuggerKeywordKindDefaultKeywordKindDeleteKeywordKindDoKeywordKindElseKeywordKindEnumKeywordKindExportKeywordKindExtendsKeywordKindFalseKeywordKindFinallyKeywordKindForKeywordKindFunctionKeywordKindIfKeywordKindImportKeywordKindInKeywordKindInstanceOfKeywordKindNewKeywordKindNullKeywordKindReturnKeywordKindSuperKeywordKindSwitchKeywordKindThisKeywordKindThrowKeywordKindTrueKeywordKindTryKeywordKindTypeOfKeywordKindVarKeywordKindVoidKeywordKindWhileKeywordKindWithKeywordKindImplementsKeywordKindInterfaceKeywordKindLetKeywordKindPackageKeywordKindPrivateKeywordKindProtectedKeywordKindPublicKeywordKindStaticKeywordKindYieldKeywordKindAbstractKeywordKindAccessorKeywordKindAsKeywordKindAssertsKeywordKindAssertKeywordKindAnyKeywordKindAsyncKeywordKindAwaitKeywordKindBooleanKeywordKindConstructorKeywordKindDeclareKeywordKindGetKeywordKindImmediateKeywordKindInferKeywordKindIntrinsicKeywordKindIsKeywordKindKeyOfKeywordKindModuleKeywordKindNamespaceKeywordKindNeverKeywordKindOutKeywordKindReadonlyKeywordKindRequireKeywordKindNumberKeywordKindObjectKeywordKindSatisfiesKeywordKindSetKeywordKindStringKeywordKindSymbolKeywordKindTypeKeywordKindUndefinedKeywordKindUniqueKeywordKindUnknownKeywordKindUsingKeywordKindFromKeywordKindGlobalKeywordKindBigIntKeywordKindOverrideKeywordKindOfKeywordKindDeferKeywordKindQualifiedNameKindComputedPropertyNameKindTypeParameterKindParameterKindDecoratorKindPropertySignatureKindPropertyDeclarationKindMethodSignatureKindMethodDeclarationKindClassStaticBlockDeclarationKindConstructorKindGetAccessorKindSetAccessorKindCallSignatureKindConstructSignatureKindIndexSignatureKindTypePredicateKindTypeReferenceKindFunctionTypeKindConstructorTypeKindTypeQueryKindTypeLiteralKindArrayTypeKindTupleTypeKindOptionalTypeKindRestTypeKindUnionTypeKindIntersectionTypeKindConditionalTypeKindInferTypeKindParenthesizedTypeKindThisTypeKindTypeOperatorKindIndexedAccessTypeKindMappedTypeKindLiteralTypeKindNamedTupleMemberKindTemplateLiteralTypeKindTemplateLiteralTypeSpanKindImportTypeKindObjectBindingPatternKindArrayBindingPatternKindBindingElementKindArrayLiteralExpressionKindObjectLiteralExpressionKindPropertyAccessExpressionKindElementAccessExpressionKindCallExpressionKindNewExpressionKindTaggedTemplateExpressionKindTypeAssertionExpressionKindParenthesizedExpressionKindFunctionExpressionKindArrowFunctionKindDeleteExpressionKindTypeOfExpressionKindVoidExpressionKindAwaitExpressionKindPrefixUnaryExpressionKindPostfixUnaryExpressionKindBinaryExpressionKindConditionalExpressionKindTemplateExpressionKindYieldExpressionKindSpreadElementKindClassExpressionKindOmittedExpressionKindExpressionWithTypeArgumentsKindAsExpressionKindNonNullExpressionKindMetaPropertyKindSyntheticExpressionKindSatisfiesExpressionKindTemplateSpanKindSemicolonClassElementKindBlockKindEmptyStatementKindVariableStatementKindExpressionStatementKindIfStatementKindDoStatementKindWhileStatementKindForStatementKindForInStatementKindForOfStatementKindContinueStatementKindBreakStatementKindReturnStatementKindWithStatementKindSwitchStatementKindLabeledStatementKindThrowStatementKindTryStatementKindDebuggerStatementKindVariableDeclarationKindVariableDeclarationListKindFunctionDeclarationKindClassDeclarationKindInterfaceDeclarationKindTypeAliasDeclarationKindEnumDeclarationKindModuleDeclarationKindModuleBlockKindCaseBlockKindNamespaceExportDeclarationKindImportEqualsDeclarationKindImportDeclarationKindImportClauseKindNamespaceImportKindNamedImportsKindImportSpecifierKindExportAssignmentKindExportDeclarationKindNamedExportsKindNamespaceExportKindExportSpecifierKindMissingDeclarationKindExternalModuleReferenceKindJsxElementKindJsxSelfClosingElementKindJsxOpeningElementKindJsxClosingElementKindJsxFragmentKindJsxOpeningFragmentKindJsxClosingFragmentKindJsxAttributeKindJsxAttributesKindJsxSpreadAttributeKindJsxExpressionKindJsxNamespacedNameKindCaseClauseKindDefaultClauseKindHeritageClauseKindCatchClauseKindImportAttributesKindImportAttributeKindPropertyAssignmentKindShorthandPropertyAssignmentKindSpreadAssignmentKindEnumMemberKindSourceFileKindJSDocTypeExpressionKindJSDocNameReferenceKindJSDocAllTypeKindJSDocNullableTypeKindJSDocNonNullableTypeKindJSDocOptionalTypeKindJSDocVariadicTypeKindJSDocKindJSDocTextKindJSDocTypeLiteralKindJSDocSignatureKindJSDocLinkKindJSDocLinkCodeKindJSDocLinkPlainKindJSDocUnknownTagKindJSDocAugmentsTagKindJSDocImplementsTagKindJSDocDeprecatedTagKindJSDocPublicTagKindJSDocPrivateTagKindJSDocProtectedTagKindJSDocReadonlyTagKindJSDocOverrideTagKindJSDocCallbackTagKindJSDocOverloadTagKindJSDocParameterTagKindJSDocReturnTagKindJSDocThisTagKindJSDocTypeTagKindJSDocTemplateTagKindJSDocTypedefTagKindJSDocSeeTagKindJSDocPropertyTagKindJSDocThrowsTagKindJSDocSatisfiesTagKindJSDocImportTagKindSyntaxListKindJSTypeAliasDeclarationKindJSImportDeclarationKindNotEmittedStatementKindPartiallyEmittedExpressionKindSyntheticReferenceExpressionKindNotEmittedTypeElementKindCount" +const _Kind_name = "KindUnknownKindEndOfFileKindSingleLineCommentTriviaKindMultiLineCommentTriviaKindNewLineTriviaKindWhitespaceTriviaKindConflictMarkerTriviaKindNonTextFileMarkerTriviaKindNumericLiteralKindBigIntLiteralKindStringLiteralKindJsxTextKindJsxTextAllWhiteSpacesKindRegularExpressionLiteralKindNoSubstitutionTemplateLiteralKindTemplateHeadKindTemplateMiddleKindTemplateTailKindOpenBraceTokenKindCloseBraceTokenKindOpenParenTokenKindCloseParenTokenKindOpenBracketTokenKindCloseBracketTokenKindDotTokenKindDotDotDotTokenKindSemicolonTokenKindCommaTokenKindQuestionDotTokenKindLessThanTokenKindLessThanSlashTokenKindGreaterThanTokenKindLessThanEqualsTokenKindGreaterThanEqualsTokenKindEqualsEqualsTokenKindExclamationEqualsTokenKindEqualsEqualsEqualsTokenKindExclamationEqualsEqualsTokenKindEqualsGreaterThanTokenKindPlusTokenKindMinusTokenKindAsteriskTokenKindAsteriskAsteriskTokenKindSlashTokenKindPercentTokenKindPlusPlusTokenKindMinusMinusTokenKindLessThanLessThanTokenKindGreaterThanGreaterThanTokenKindGreaterThanGreaterThanGreaterThanTokenKindAmpersandTokenKindBarTokenKindCaretTokenKindExclamationTokenKindTildeTokenKindAmpersandAmpersandTokenKindBarBarTokenKindQuestionTokenKindColonTokenKindAtTokenKindQuestionQuestionTokenKindBacktickTokenKindHashTokenKindEqualsTokenKindPlusEqualsTokenKindMinusEqualsTokenKindAsteriskEqualsTokenKindAsteriskAsteriskEqualsTokenKindSlashEqualsTokenKindPercentEqualsTokenKindLessThanLessThanEqualsTokenKindGreaterThanGreaterThanEqualsTokenKindGreaterThanGreaterThanGreaterThanEqualsTokenKindAmpersandEqualsTokenKindBarEqualsTokenKindBarBarEqualsTokenKindAmpersandAmpersandEqualsTokenKindQuestionQuestionEqualsTokenKindCaretEqualsTokenKindIdentifierKindPrivateIdentifierKindJSDocCommentTextTokenKindBreakKeywordKindCaseKeywordKindCatchKeywordKindClassKeywordKindConstKeywordKindContinueKeywordKindDebuggerKeywordKindDefaultKeywordKindDeleteKeywordKindDoKeywordKindElseKeywordKindEnumKeywordKindExportKeywordKindExtendsKeywordKindFalseKeywordKindFinallyKeywordKindForKeywordKindFunctionKeywordKindIfKeywordKindImportKeywordKindInKeywordKindInstanceOfKeywordKindNewKeywordKindNullKeywordKindReturnKeywordKindSuperKeywordKindSwitchKeywordKindThisKeywordKindThrowKeywordKindTrueKeywordKindTryKeywordKindTypeOfKeywordKindVarKeywordKindVoidKeywordKindWhileKeywordKindWithKeywordKindImplementsKeywordKindInterfaceKeywordKindLetKeywordKindPackageKeywordKindPrivateKeywordKindProtectedKeywordKindPublicKeywordKindStaticKeywordKindYieldKeywordKindAbstractKeywordKindAccessorKeywordKindAsKeywordKindAssertsKeywordKindAssertKeywordKindAnyKeywordKindAsyncKeywordKindAwaitKeywordKindBooleanKeywordKindConstructorKeywordKindDeclareKeywordKindGetKeywordKindImmediateKeywordKindInferKeywordKindIntrinsicKeywordKindIsKeywordKindKeyOfKeywordKindModuleKeywordKindNamespaceKeywordKindNeverKeywordKindOutKeywordKindReadonlyKeywordKindRequireKeywordKindNumberKeywordKindObjectKeywordKindSatisfiesKeywordKindSetKeywordKindStringKeywordKindSymbolKeywordKindTypeKeywordKindUndefinedKeywordKindUniqueKeywordKindUnknownKeywordKindUsingKeywordKindFromKeywordKindGlobalKeywordKindBigIntKeywordKindOverrideKeywordKindOfKeywordKindDeferKeywordKindQualifiedNameKindComputedPropertyNameKindTypeParameterKindParameterKindDecoratorKindPropertySignatureKindPropertyDeclarationKindMethodSignatureKindMethodDeclarationKindClassStaticBlockDeclarationKindConstructorKindGetAccessorKindSetAccessorKindCallSignatureKindConstructSignatureKindIndexSignatureKindTypePredicateKindTypeReferenceKindFunctionTypeKindConstructorTypeKindTypeQueryKindTypeLiteralKindArrayTypeKindTupleTypeKindOptionalTypeKindRestTypeKindUnionTypeKindIntersectionTypeKindConditionalTypeKindInferTypeKindParenthesizedTypeKindThisTypeKindTypeOperatorKindIndexedAccessTypeKindMappedTypeKindLiteralTypeKindNamedTupleMemberKindTemplateLiteralTypeKindTemplateLiteralTypeSpanKindImportTypeKindObjectBindingPatternKindArrayBindingPatternKindBindingElementKindArrayLiteralExpressionKindObjectLiteralExpressionKindPropertyAccessExpressionKindElementAccessExpressionKindCallExpressionKindNewExpressionKindTaggedTemplateExpressionKindTypeAssertionExpressionKindParenthesizedExpressionKindFunctionExpressionKindArrowFunctionKindDeleteExpressionKindTypeOfExpressionKindVoidExpressionKindAwaitExpressionKindPrefixUnaryExpressionKindPostfixUnaryExpressionKindBinaryExpressionKindConditionalExpressionKindTemplateExpressionKindYieldExpressionKindSpreadElementKindClassExpressionKindOmittedExpressionKindExpressionWithTypeArgumentsKindAsExpressionKindNonNullExpressionKindMetaPropertyKindSyntheticExpressionKindSatisfiesExpressionKindTemplateSpanKindSemicolonClassElementKindBlockKindEmptyStatementKindVariableStatementKindExpressionStatementKindIfStatementKindDoStatementKindWhileStatementKindForStatementKindForInStatementKindForOfStatementKindContinueStatementKindBreakStatementKindReturnStatementKindWithStatementKindSwitchStatementKindLabeledStatementKindThrowStatementKindTryStatementKindDebuggerStatementKindVariableDeclarationKindVariableDeclarationListKindFunctionDeclarationKindClassDeclarationKindInterfaceDeclarationKindTypeAliasDeclarationKindEnumDeclarationKindModuleDeclarationKindModuleBlockKindCaseBlockKindNamespaceExportDeclarationKindImportEqualsDeclarationKindImportDeclarationKindImportClauseKindNamespaceImportKindNamedImportsKindImportSpecifierKindExportAssignmentKindExportDeclarationKindNamedExportsKindNamespaceExportKindExportSpecifierKindMissingDeclarationKindExternalModuleReferenceKindJsxElementKindJsxSelfClosingElementKindJsxOpeningElementKindJsxClosingElementKindJsxFragmentKindJsxOpeningFragmentKindJsxClosingFragmentKindJsxAttributeKindJsxAttributesKindJsxSpreadAttributeKindJsxExpressionKindJsxNamespacedNameKindCaseClauseKindDefaultClauseKindHeritageClauseKindCatchClauseKindImportAttributesKindImportAttributeKindPropertyAssignmentKindShorthandPropertyAssignmentKindSpreadAssignmentKindEnumMemberKindSourceFileKindJSDocTypeExpressionKindJSDocNameReferenceKindJSDocAllTypeKindJSDocNullableTypeKindJSDocNonNullableTypeKindJSDocOptionalTypeKindJSDocVariadicTypeKindJSDocKindJSDocTextKindJSDocTypeLiteralKindJSDocSignatureKindJSDocLinkKindJSDocLinkCodeKindJSDocLinkPlainKindJSDocUnknownTagKindJSDocAugmentsTagKindJSDocImplementsTagKindJSDocDeprecatedTagKindJSDocPublicTagKindJSDocPrivateTagKindJSDocProtectedTagKindJSDocReadonlyTagKindJSDocOverrideTagKindJSDocCallbackTagKindJSDocOverloadTagKindJSDocParameterTagKindJSDocReturnTagKindJSDocThisTagKindJSDocTypeTagKindJSDocTemplateTagKindJSDocTypedefTagKindJSDocSeeTagKindJSDocPropertyTagKindJSDocThrowsTagKindJSDocSatisfiesTagKindJSDocImportTagKindSyntaxListKindJSTypeAliasDeclarationKindJSImportDeclarationKindNotEmittedStatementKindPartiallyEmittedExpressionKindSyntheticReferenceExpressionKindNotEmittedTypeElementkindFlowSwitchClauseDatakindFlowReduceLabelData" -var _Kind_index = [...]uint16{0, 11, 24, 51, 77, 94, 114, 138, 165, 183, 200, 217, 228, 253, 281, 314, 330, 348, 364, 382, 401, 419, 438, 458, 479, 491, 509, 527, 541, 561, 578, 600, 620, 643, 669, 690, 716, 743, 775, 801, 814, 828, 845, 870, 884, 900, 917, 936, 961, 992, 1034, 1052, 1064, 1078, 1098, 1112, 1139, 1154, 1171, 1185, 1196, 1221, 1238, 1251, 1266, 1285, 1305, 1328, 1359, 1379, 1401, 1432, 1469, 1517, 1541, 1559, 1580, 1613, 1644, 1664, 1678, 1699, 1724, 1740, 1755, 1771, 1787, 1803, 1822, 1841, 1859, 1876, 1889, 1904, 1919, 1936, 1954, 1970, 1988, 2002, 2021, 2034, 2051, 2064, 2085, 2099, 2114, 2131, 2147, 2164, 2179, 2195, 2210, 2224, 2241, 2255, 2270, 2286, 2301, 2322, 2342, 2356, 2374, 2392, 2412, 2429, 2446, 2462, 2481, 2500, 2513, 2531, 2548, 2562, 2578, 2594, 2612, 2634, 2652, 2666, 2686, 2702, 2722, 2735, 2751, 2768, 2788, 2804, 2818, 2837, 2855, 2872, 2889, 2909, 2923, 2940, 2957, 2972, 2992, 3009, 3027, 3043, 3058, 3075, 3092, 3111, 3124, 3140, 3157, 3181, 3198, 3211, 3224, 3245, 3268, 3287, 3308, 3339, 3354, 3369, 3384, 3401, 3423, 3441, 3458, 3475, 3491, 3510, 3523, 3538, 3551, 3564, 3580, 3592, 3605, 3625, 3644, 3657, 3678, 3690, 3706, 3727, 3741, 3756, 3776, 3799, 3826, 3840, 3864, 3887, 3905, 3931, 3958, 3986, 4013, 4031, 4048, 4076, 4103, 4130, 4152, 4169, 4189, 4209, 4227, 4246, 4271, 4297, 4317, 4342, 4364, 4383, 4400, 4419, 4440, 4471, 4487, 4508, 4524, 4547, 4570, 4586, 4611, 4620, 4638, 4659, 4682, 4697, 4712, 4730, 4746, 4764, 4782, 4803, 4821, 4840, 4857, 4876, 4896, 4914, 4930, 4951, 4974, 5001, 5024, 5044, 5068, 5092, 5111, 5132, 5147, 5160, 5190, 5217, 5238, 5254, 5273, 5289, 5308, 5328, 5349, 5365, 5384, 5403, 5425, 5452, 5466, 5491, 5512, 5533, 5548, 5570, 5592, 5608, 5625, 5647, 5664, 5685, 5699, 5716, 5734, 5749, 5769, 5788, 5810, 5841, 5861, 5875, 5889, 5912, 5934, 5950, 5971, 5995, 6016, 6037, 6046, 6059, 6079, 6097, 6110, 6127, 6145, 6164, 6184, 6206, 6228, 6246, 6265, 6286, 6306, 6326, 6346, 6366, 6387, 6405, 6421, 6437, 6457, 6476, 6491, 6511, 6529, 6550, 6568, 6582, 6608, 6631, 6654, 6684, 6716, 6741, 6750} +var _Kind_index = [...]uint16{0, 11, 24, 51, 77, 94, 114, 138, 165, 183, 200, 217, 228, 253, 281, 314, 330, 348, 364, 382, 401, 419, 438, 458, 479, 491, 509, 527, 541, 561, 578, 600, 620, 643, 669, 690, 716, 743, 775, 801, 814, 828, 845, 870, 884, 900, 917, 936, 961, 992, 1034, 1052, 1064, 1078, 1098, 1112, 1139, 1154, 1171, 1185, 1196, 1221, 1238, 1251, 1266, 1285, 1305, 1328, 1359, 1379, 1401, 1432, 1469, 1517, 1541, 1559, 1580, 1613, 1644, 1664, 1678, 1699, 1724, 1740, 1755, 1771, 1787, 1803, 1822, 1841, 1859, 1876, 1889, 1904, 1919, 1936, 1954, 1970, 1988, 2002, 2021, 2034, 2051, 2064, 2085, 2099, 2114, 2131, 2147, 2164, 2179, 2195, 2210, 2224, 2241, 2255, 2270, 2286, 2301, 2322, 2342, 2356, 2374, 2392, 2412, 2429, 2446, 2462, 2481, 2500, 2513, 2531, 2548, 2562, 2578, 2594, 2612, 2634, 2652, 2666, 2686, 2702, 2722, 2735, 2751, 2768, 2788, 2804, 2818, 2837, 2855, 2872, 2889, 2909, 2923, 2940, 2957, 2972, 2992, 3009, 3027, 3043, 3058, 3075, 3092, 3111, 3124, 3140, 3157, 3181, 3198, 3211, 3224, 3245, 3268, 3287, 3308, 3339, 3354, 3369, 3384, 3401, 3423, 3441, 3458, 3475, 3491, 3510, 3523, 3538, 3551, 3564, 3580, 3592, 3605, 3625, 3644, 3657, 3678, 3690, 3706, 3727, 3741, 3756, 3776, 3799, 3826, 3840, 3864, 3887, 3905, 3931, 3958, 3986, 4013, 4031, 4048, 4076, 4103, 4130, 4152, 4169, 4189, 4209, 4227, 4246, 4271, 4297, 4317, 4342, 4364, 4383, 4400, 4419, 4440, 4471, 4487, 4508, 4524, 4547, 4570, 4586, 4611, 4620, 4638, 4659, 4682, 4697, 4712, 4730, 4746, 4764, 4782, 4803, 4821, 4840, 4857, 4876, 4896, 4914, 4930, 4951, 4974, 5001, 5024, 5044, 5068, 5092, 5111, 5132, 5147, 5160, 5190, 5217, 5238, 5254, 5273, 5289, 5308, 5328, 5349, 5365, 5384, 5403, 5425, 5452, 5466, 5491, 5512, 5533, 5548, 5570, 5592, 5608, 5625, 5647, 5664, 5685, 5699, 5716, 5734, 5749, 5769, 5788, 5810, 5841, 5861, 5875, 5889, 5912, 5934, 5950, 5971, 5995, 6016, 6037, 6046, 6059, 6079, 6097, 6110, 6127, 6145, 6164, 6184, 6206, 6228, 6246, 6265, 6286, 6306, 6326, 6346, 6366, 6387, 6405, 6421, 6437, 6457, 6476, 6491, 6511, 6529, 6550, 6568, 6582, 6608, 6631, 6654, 6684, 6716, 6741, 6765, 6788} func (i Kind) String() string { idx := int(i) - 0 From c3483efa3a071d82473b0d0529c59f64fcda6e35 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 27 Aug 2026 23:34:12 -0700 Subject: [PATCH 09/13] Revert "Reduce AST method promotion" This reverts commit 9baebcec1a4f1788c186591ef572f724dc4d1e2e. --- tools/scripts/tsc/generate-encoder.ts | 2 +- tools/scripts/tsc/generate-go-ast.ts | 27 ++-- tsc/internal/api/encoder/encoder.go | 2 +- tsc/internal/api/encoder/encoder_generated.go | 8 +- tsc/internal/ast/ast.go | 21 +-- tsc/internal/ast/ast_generated.go | 140 +++++++++--------- tsc/internal/ast/utilities.go | 4 +- tsc/internal/checker/grammarchecks.go | 10 +- tsc/internal/checker/nodebuilder_hover.go | 4 +- tsc/internal/ls/autoimport/fix.go | 10 +- tsc/internal/ls/completions.go | 2 +- tsc/internal/ls/lsutil/organizeimports.go | 2 +- tsc/internal/ls/organizeimports.go | 2 +- tsc/internal/ls/signaturehelp.go | 4 +- tsc/internal/parser/reparser.go | 4 +- tsc/internal/printer/printer_test.go | 6 +- tsc/internal/scanner/scanner_test.go | 34 ++--- .../transformers/declarations/transform.go | 2 +- .../estransforms/optionalchain.go | 2 +- .../moduletransforms/commonjsmodule.go | 4 +- .../tstransforms/legacydecorators.go | 2 +- .../tstransforms/runtimesyntax.go | 2 +- .../transformers/tstransforms/typeeraser.go | 2 +- 23 files changed, 138 insertions(+), 158 deletions(-) diff --git a/tools/scripts/tsc/generate-encoder.ts b/tools/scripts/tsc/generate-encoder.ts index bdbbaaaa4532a..6bf04ddbcb2d2 100644 --- a/tools/scripts/tsc/generate-encoder.ts +++ b/tools/scripts/tsc/generate-encoder.ts @@ -534,7 +534,7 @@ function generateGoRecordNodeStrings(w: CodeWriter) { const kinds = getGoKinds(node); const castName = goCastName(node); const textAccess = info.textMember.private - ? `node.${castName}().AsNode().${api.capitalize(info.textMember.name)}()` + ? `node.${castName}().${api.capitalize(info.textMember.name)}()` : `node.${castName}().${info.textMember.name}`; w.write(`case ${kinds.join(", ")}:`); diff --git a/tools/scripts/tsc/generate-go-ast.ts b/tools/scripts/tsc/generate-go-ast.ts index 0b70931310b64..29bf1183c446e 100644 --- a/tools/scripts/tsc/generate-go-ast.ts +++ b/tools/scripts/tsc/generate-go-ast.ts @@ -354,10 +354,6 @@ function isNodeFlagsMember(m: MemberInfo): boolean { return type.kind === "primitive" && type.name === "NodeFlags"; } -function concreteNodeMemberAccess(m: MemberInfo): string { - return isNodeFlagsMember(m) ? `node.AsNode().${m.name}` : `node.${m.name}`; -} - function canonicalNodesByKind(): Map { const nodeByKind = new Map(); for (const node of api.nodes()) { @@ -504,12 +500,11 @@ function generateUpdateFactory(w: CodeWriter, node: NodeType) { // Build comparison (all update members) const comparisons = updateMembers.map(m => { const type = m.type; - const access = concreteNodeMemberAccess(m); // Slices can't be compared with != in Go if (type.kind === "list" && type.listKind === "raw") { - return `!core.Same(${m.goParamName()}, ${access})`; + return `!core.Same(${m.goParamName()}, node.${m.name})`; } - return `${m.goParamName()} != ${access}`; + return `${m.goParamName()} != node.${m.name}`; }); w.write(`if ${comparisons.join(" || ")} {`); @@ -518,13 +513,13 @@ function generateUpdateFactory(w: CodeWriter, node: NodeType) { // Call New with all members (Kind from original, everything else from params) const newArgs = members.map(m => { if (m.isKindParam()) { - return "node.AsNode().Kind"; + return "node.Kind"; } return m.goParamName(); }).join(", "); if (node.kindAliases.length > 0) { - w.write("switch node.AsNode().Kind {"); + w.write("switch node.Kind {"); w.push(); w.write(`case ${api.kindType(`SyntaxKind.${node.syntaxKindName}`).formatGoConstant()}:`); w.push(); @@ -538,7 +533,7 @@ function generateUpdateFactory(w: CodeWriter, node: NodeType) { } w.write("default:"); w.push(); - w.write(`panic("unexpected kind in Update${node.name}: " + node.AsNode().Kind.String())`); + w.write(`panic("unexpected kind in Update${node.name}: " + node.Kind.String())`); w.pop(); w.pop(); w.write("}"); @@ -930,7 +925,7 @@ function generateVisitEachChild(w: CodeWriter, node: NodeType) { const args = updateMembers.map(m => { if (!m.isChild()) { - return concreteNodeMemberAccess(m); + return `node.${m.name}`; } // Raw list: use the local variable @@ -975,19 +970,19 @@ function generateClone(w: CodeWriter, node: NodeType) { // Clone is a struct method, so it can access private fields directly const args = members.map(m => { if (m.isKindParam()) { - return "node.AsNode().Kind"; + return "node.Kind"; } const type = m.declaredType; if (m.inherited && type?.kind === "alias" && type.name === "ModifierLike") { - return "node.AsNode().Modifiers()"; + return "node.Modifiers()"; } // Use direct field access (Clone is a struct method, can access private fields) - return concreteNodeMemberAccess(m); + return `node.${m.name}`; }).join(", "); if (node.kindAliases.length > 0) { - w.write("switch node.AsNode().Kind {"); + w.write("switch node.Kind {"); w.push(); w.write(`case ${api.kindType(`SyntaxKind.${node.syntaxKindName}`).formatGoConstant()}:`); w.push(); @@ -1001,7 +996,7 @@ function generateClone(w: CodeWriter, node: NodeType) { } w.write("default:"); w.push(); - w.write(`panic("unexpected kind in ${structName}.Clone: " + node.AsNode().Kind.String())`); + w.write(`panic("unexpected kind in ${structName}.Clone: " + node.Kind.String())`); w.pop(); w.pop(); w.write("}"); diff --git a/tsc/internal/api/encoder/encoder.go b/tsc/internal/api/encoder/encoder.go index 30043eb6ea531..f318a27c44547 100644 --- a/tsc/internal/api/encoder/encoder.go +++ b/tsc/internal/api/encoder/encoder.go @@ -660,7 +660,7 @@ const noStructuredData = 0xFFFFFFFF func recordExtendedData_SourceFile(node *ast.Node, strs *stringTable, positionMap *ast.PositionMap, extendedData *[]byte, structuredData *[]byte) { sf := node.AsSourceFile() - textIndex := strs.add(sf.Text(), sf.Kind, sf.AsNode().Pos(), sf.AsNode().End()) + textIndex := strs.add(sf.Text(), sf.Kind, sf.Pos(), sf.End()) originalTextIndex := textIndex if sf.OriginalText() != sf.Text() { originalTextIndex = strs.add(sf.OriginalText(), 0, 0, 0) diff --git a/tsc/internal/api/encoder/encoder_generated.go b/tsc/internal/api/encoder/encoder_generated.go index f3a68ff24400e..d3e7599e326c7 100644 --- a/tsc/internal/api/encoder/encoder_generated.go +++ b/tsc/internal/api/encoder/encoder_generated.go @@ -667,13 +667,13 @@ func recordNodeStrings(node *ast.Node, strs *stringTable) uint32 { case ast.KindJsxText: return strs.add(node.AsJsxText().Text, node.Kind, node.Pos(), node.End()) case ast.KindJSDocText: - return strs.add(node.AsJSDocText().AsNode().Text(), node.Kind, node.Pos(), node.End()) + return strs.add(node.AsJSDocText().Text(), node.Kind, node.Pos(), node.End()) case ast.KindJSDocLink: - return strs.add(node.AsJSDocLink().AsNode().Text(), node.Kind, node.Pos(), node.End()) + return strs.add(node.AsJSDocLink().Text(), node.Kind, node.Pos(), node.End()) case ast.KindJSDocLinkPlain: - return strs.add(node.AsJSDocLinkPlain().AsNode().Text(), node.Kind, node.Pos(), node.End()) + return strs.add(node.AsJSDocLinkPlain().Text(), node.Kind, node.Pos(), node.End()) case ast.KindJSDocLinkCode: - return strs.add(node.AsJSDocLinkCode().AsNode().Text(), node.Kind, node.Pos(), node.End()) + return strs.add(node.AsJSDocLinkCode().Text(), node.Kind, node.Pos(), node.End()) default: panic(fmt.Sprintf("Unexpected node kind %v", node.Kind)) } diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index 47150d2e03389..81a7b10b9f7ed 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -6,7 +6,6 @@ import ( "strings" "sync" "sync/atomic" - "unsafe" "github.com/microsoft/TypeScript/tsc/internal/collections" "github.com/microsoft/TypeScript/tsc/internal/core" @@ -176,7 +175,7 @@ func (list *ModifierList) Clone(f *NodeFactory) *ModifierList { // Interface values stored in AST nodes are never typed nil values. Construction code must ensure that // interface valued properties either store a true nil or a reference to a non-nil struct. -type nodeFields struct { +type Node struct { Kind Kind Flags NodeFlags Loc core.TextRange @@ -185,10 +184,6 @@ type nodeFields struct { data any } -type Node struct { - nodeFields -} - // Node accessors. Some accessors are implemented as methods on NodeData, others are implemented though // type switches. Either approach is fine. Interface methods are likely more performant, but have higher // code size costs because we have hundreds of implementations of the NodeData interface. @@ -1162,12 +1157,10 @@ func (n *Node) AsFlowReduceLabelData() *FlowReduceLabelData { // NodeDefault type NodeDefault struct { - nodeFields + Node } -func (node *NodeDefault) AsNode() *Node { return (*Node)(unsafe.Pointer(&node.nodeFields)) } -func (node *NodeDefault) Pos() int { return node.Loc.Pos() } -func (node *NodeDefault) End() int { return node.Loc.End() } +func (node *NodeDefault) AsNode() *Node { return &node.Node } func (node *NodeDefault) ForEachChild(v Visitor) bool { return false } func (node *NodeDefault) VisitEachChild(v *NodeVisitor) *Node { return node.AsNode() } @@ -1726,10 +1719,10 @@ func (node *BindingElement) computeSubtreeFacts() SubtreeFacts { } func (node *FunctionDeclaration) computeSubtreeFacts() SubtreeFacts { - if node.Body == nil || node.AsNode().ModifierFlags()&ModifierFlagsAmbient != 0 { + if node.Body == nil || node.ModifierFlags()&ModifierFlagsAmbient != 0 { return SubtreeContainsTypeScript } else { - isAsync := node.AsNode().ModifierFlags()&ModifierFlagsAsync != 0 + isAsync := node.ModifierFlags()&ModifierFlagsAsync != 0 isGenerator := node.AsteriskToken != nil return propagateModifierListSubtreeFacts(node.modifiers) | propagateSubtreeFacts(node.AsteriskToken) | @@ -1807,7 +1800,7 @@ func (node *EnumDeclaration) computeSubtreeFacts() SubtreeFacts { } func (node *ModuleDeclaration) computeSubtreeFacts() SubtreeFacts { - if node.AsNode().ModifierFlags()&ModifierFlagsAmbient != 0 { + if node.ModifierFlags()&ModifierFlagsAmbient != 0 { return SubtreeContainsTypeScript } else { return propagateModifierListSubtreeFacts(node.modifiers) | @@ -2024,7 +2017,7 @@ func (node *ArrowFunction) computeSubtreeFacts() SubtreeFacts { propagateEraseableSyntaxSubtreeFacts(node.Type) | propagateEraseableSyntaxSubtreeFacts(node.FullSignature) | propagateSubtreeFacts(node.Body) | - core.IfElse(node.AsNode().ModifierFlags()&ModifierFlagsAsync != 0, SubtreeContainsAnyAwait, SubtreeFactsNone) + core.IfElse(node.ModifierFlags()&ModifierFlagsAsync != 0, SubtreeContainsAnyAwait, SubtreeFactsNone) } func (node *ArrowFunction) propagateSubtreeFacts() SubtreeFacts { diff --git a/tsc/internal/ast/ast_generated.go b/tsc/internal/ast/ast_generated.go index 09a70ce9799a8..a8fa650601014 100644 --- a/tsc/internal/ast/ast_generated.go +++ b/tsc/internal/ast/ast_generated.go @@ -645,7 +645,7 @@ func (f *NodeFactory) NewToken(kind TokenSyntaxKind) *Node { } func (node *Token) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewToken(node.AsNode().Kind), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewToken(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsToken(node *Node) bool { @@ -1074,7 +1074,7 @@ func (f *NodeFactory) NewForInOrOfStatement(kind Kind, awaitModifier *AwaitKeywo func (f *NodeFactory) UpdateForInOrOfStatement(node *ForInOrOfStatement, awaitModifier *AwaitKeyword, initializer *ForInitializer, expression *Expression, statement *Statement) *Node { if awaitModifier != node.AwaitModifier || initializer != node.Initializer || expression != node.Expression || statement != node.Statement { - return updateNode(f.NewForInOrOfStatement(node.AsNode().Kind, awaitModifier, initializer, expression, statement), node.AsNode(), f.hooks) + return updateNode(f.NewForInOrOfStatement(node.Kind, awaitModifier, initializer, expression, statement), node.AsNode(), f.hooks) } return node.AsNode() } @@ -1091,7 +1091,7 @@ func (node *ForInOrOfStatement) VisitEachChild(v *NodeVisitor) *Node { } func (node *ForInOrOfStatement) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewForInOrOfStatement(node.AsNode().Kind, node.AwaitModifier, node.Initializer, node.Expression, node.Statement), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewForInOrOfStatement(node.Kind, node.AwaitModifier, node.Initializer, node.Expression, node.Statement), node.AsNode(), f.AsNodeFactory().hooks) } func IsForInStatement(node *Node) bool { @@ -1374,7 +1374,7 @@ func (f *NodeFactory) NewCaseOrDefaultClause(kind Kind, expression *Expression, func (f *NodeFactory) UpdateCaseOrDefaultClause(node *CaseOrDefaultClause, expression *Expression, statements *StatementList) *Node { if expression != node.Expression || statements != node.Statements { - return updateNode(f.NewCaseOrDefaultClause(node.AsNode().Kind, expression, statements), node.AsNode(), f.hooks) + return updateNode(f.NewCaseOrDefaultClause(node.Kind, expression, statements), node.AsNode(), f.hooks) } return node.AsNode() } @@ -1388,7 +1388,7 @@ func (node *CaseOrDefaultClause) VisitEachChild(v *NodeVisitor) *Node { } func (node *CaseOrDefaultClause) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewCaseOrDefaultClause(node.AsNode().Kind, node.Expression, node.Statements), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewCaseOrDefaultClause(node.Kind, node.Expression, node.Statements), node.AsNode(), f.AsNodeFactory().hooks) } func (node *CaseOrDefaultClause) computeSubtreeFacts() SubtreeFacts { @@ -1726,7 +1726,7 @@ func (node *VariableStatement) VisitEachChild(v *NodeVisitor) *Node { } func (node *VariableStatement) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewVariableStatement(node.AsNode().Modifiers(), node.DeclarationList), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewVariableStatement(node.Modifiers(), node.DeclarationList), node.AsNode(), f.AsNodeFactory().hooks) } func IsVariableStatement(node *Node) bool { @@ -1806,7 +1806,7 @@ func (f *NodeFactory) NewVariableDeclarationList(declarations *VariableDeclarati } func (f *NodeFactory) UpdateVariableDeclarationList(node *VariableDeclarationList, declarations *VariableDeclarationNodeList, flags NodeFlags) *Node { - if declarations != node.Declarations || flags != node.AsNode().Flags { + if declarations != node.Declarations || flags != node.Flags { return updateNode(f.NewVariableDeclarationList(declarations, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -1817,11 +1817,11 @@ func (node *VariableDeclarationList) ForEachChild(v Visitor) bool { } func (node *VariableDeclarationList) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateVariableDeclarationList(node, v.visitNodes(node.Declarations), node.AsNode().Flags) + return v.Factory.UpdateVariableDeclarationList(node, v.visitNodes(node.Declarations), node.Flags) } func (node *VariableDeclarationList) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewVariableDeclarationList(node.Declarations, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewVariableDeclarationList(node.Declarations, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsVariableDeclarationList(node *Node) bool { @@ -1846,7 +1846,7 @@ func (f *NodeFactory) NewBindingPattern(kind Kind, elements *BindingElementList) func (f *NodeFactory) UpdateBindingPattern(node *BindingPattern, elements *BindingElementList) *Node { if elements != node.Elements { - return updateNode(f.NewBindingPattern(node.AsNode().Kind, elements), node.AsNode(), f.hooks) + return updateNode(f.NewBindingPattern(node.Kind, elements), node.AsNode(), f.hooks) } return node.AsNode() } @@ -1860,7 +1860,7 @@ func (node *BindingPattern) VisitEachChild(v *NodeVisitor) *Node { } func (node *BindingPattern) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewBindingPattern(node.AsNode().Kind, node.Elements), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewBindingPattern(node.Kind, node.Elements), node.AsNode(), f.AsNodeFactory().hooks) } func IsObjectBindingPattern(node *Node) bool { @@ -1919,7 +1919,7 @@ func (node *ParameterDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ParameterDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewParameterDeclaration(node.AsNode().Modifiers(), node.DotDotDotToken, node.name, node.QuestionToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewParameterDeclaration(node.Modifiers(), node.DotDotDotToken, node.name, node.QuestionToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ParameterDeclaration) Name() *DeclarationName { @@ -2017,7 +2017,7 @@ func (node *MissingDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *MissingDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewMissingDeclaration(node.AsNode().Modifiers()), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewMissingDeclaration(node.Modifiers()), node.AsNode(), f.AsNodeFactory().hooks) } func IsMissingDeclaration(node *Node) bool { @@ -2075,7 +2075,7 @@ func (node *FunctionDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *FunctionDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewFunctionDeclaration(node.AsNode().Modifiers(), node.AsteriskToken, node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewFunctionDeclaration(node.Modifiers(), node.AsteriskToken, node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *FunctionDeclaration) Name() *DeclarationName { @@ -2126,7 +2126,7 @@ func (node *ClassDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ClassDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewClassDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewClassDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ClassDeclaration) Name() *DeclarationName { @@ -2177,7 +2177,7 @@ func (node *ClassExpression) VisitEachChild(v *NodeVisitor) *Node { } func (node *ClassExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewClassExpression(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewClassExpression(node.Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ClassExpression) Name() *DeclarationName { @@ -2275,7 +2275,7 @@ func (node *InterfaceDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *InterfaceDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewInterfaceDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewInterfaceDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.HeritageClauses, node.Members), node.AsNode(), f.AsNodeFactory().hooks) } func (node *InterfaceDeclaration) Name() *DeclarationName { @@ -2322,13 +2322,13 @@ func (f *NodeFactory) NewJSTypeAliasDeclaration(modifiers *ModifierList, name *I func (f *NodeFactory) UpdateTypeAliasDeclaration(node *TypeAliasDeclaration, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, typeNode *TypeNode) *Node { if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || typeNode != node.Type { - switch node.AsNode().Kind { + switch node.Kind { case KindTypeAliasDeclaration: return updateNode(f.NewTypeAliasDeclaration(modifiers, name, typeParameters, typeNode), node.AsNode(), f.hooks) case KindJSTypeAliasDeclaration: return updateNode(f.NewJSTypeAliasDeclaration(modifiers, name, typeParameters, typeNode), node.AsNode(), f.hooks) default: - panic("unexpected kind in UpdateTypeAliasDeclaration: " + node.AsNode().Kind.String()) + panic("unexpected kind in UpdateTypeAliasDeclaration: " + node.Kind.String()) } } return node.AsNode() @@ -2346,13 +2346,13 @@ func (node *TypeAliasDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *TypeAliasDeclaration) Clone(f NodeFactoryCoercible) *Node { - switch node.AsNode().Kind { + switch node.Kind { case KindTypeAliasDeclaration: - return cloneNode(f.AsNodeFactory().NewTypeAliasDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewTypeAliasDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) case KindJSTypeAliasDeclaration: - return cloneNode(f.AsNodeFactory().NewJSTypeAliasDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewJSTypeAliasDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) default: - panic("unexpected kind in TypeAliasDeclaration.Clone: " + node.AsNode().Kind.String()) + panic("unexpected kind in TypeAliasDeclaration.Clone: " + node.Kind.String()) } } @@ -2452,7 +2452,7 @@ func (node *EnumDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *EnumDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewEnumDeclaration(node.AsNode().Modifiers(), node.name, node.Members), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewEnumDeclaration(node.Modifiers(), node.name, node.Members), node.AsNode(), f.AsNodeFactory().hooks) } func (node *EnumDeclaration) Name() *DeclarationName { @@ -2583,13 +2583,13 @@ func (f *NodeFactory) NewJSImportDeclaration(modifiers *ModifierList, importClau func (f *NodeFactory) UpdateImportDeclaration(node *ImportDeclaration, modifiers *ModifierList, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node { if modifiers != node.modifiers || importClause != node.ImportClause || moduleSpecifier != node.ModuleSpecifier || attributes != node.Attributes { - switch node.AsNode().Kind { + switch node.Kind { case KindImportDeclaration: return updateNode(f.NewImportDeclaration(modifiers, importClause, moduleSpecifier, attributes), node.AsNode(), f.hooks) case KindJSImportDeclaration: return updateNode(f.NewJSImportDeclaration(modifiers, importClause, moduleSpecifier, attributes), node.AsNode(), f.hooks) default: - panic("unexpected kind in UpdateImportDeclaration: " + node.AsNode().Kind.String()) + panic("unexpected kind in UpdateImportDeclaration: " + node.Kind.String()) } } return node.AsNode() @@ -2607,13 +2607,13 @@ func (node *ImportDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ImportDeclaration) Clone(f NodeFactoryCoercible) *Node { - switch node.AsNode().Kind { + switch node.Kind { case KindImportDeclaration: - return cloneNode(f.AsNodeFactory().NewImportDeclaration(node.AsNode().Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewImportDeclaration(node.Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) case KindJSImportDeclaration: - return cloneNode(f.AsNodeFactory().NewJSImportDeclaration(node.AsNode().Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewJSImportDeclaration(node.Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) default: - panic("unexpected kind in ImportDeclaration.Clone: " + node.AsNode().Kind.String()) + panic("unexpected kind in ImportDeclaration.Clone: " + node.Kind.String()) } } @@ -2804,7 +2804,7 @@ func (node *ExportAssignment) VisitEachChild(v *NodeVisitor) *Node { } func (node *ExportAssignment) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewExportAssignment(node.AsNode().Modifiers(), node.IsExportEquals, node.Type, node.Expression), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewExportAssignment(node.Modifiers(), node.IsExportEquals, node.Type, node.Expression), node.AsNode(), f.AsNodeFactory().hooks) } func IsExportAssignment(node *Node) bool { @@ -2846,7 +2846,7 @@ func (node *NamespaceExportDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *NamespaceExportDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewNamespaceExportDeclaration(node.AsNode().Modifiers(), node.name), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewNamespaceExportDeclaration(node.Modifiers(), node.name), node.AsNode(), f.AsNodeFactory().hooks) } func (node *NamespaceExportDeclaration) Name() *DeclarationName { @@ -3128,7 +3128,7 @@ func (node *ConstructorDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ConstructorDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewConstructorDeclaration(node.AsNode().Modifiers(), node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewConstructorDeclaration(node.Modifiers(), node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func IsConstructorDeclaration(node *Node) bool { @@ -3177,7 +3177,7 @@ func (node *GetAccessorDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *GetAccessorDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewGetAccessorDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewGetAccessorDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *GetAccessorDeclaration) Name() *DeclarationName { @@ -3230,7 +3230,7 @@ func (node *SetAccessorDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *SetAccessorDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewSetAccessorDeclaration(node.AsNode().Modifiers(), node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewSetAccessorDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *SetAccessorDeclaration) Name() *DeclarationName { @@ -3279,7 +3279,7 @@ func (node *IndexSignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *IndexSignatureDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewIndexSignatureDeclaration(node.AsNode().Modifiers(), node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewIndexSignatureDeclaration(node.Modifiers(), node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) } func IsIndexSignatureDeclaration(node *Node) bool { @@ -3331,7 +3331,7 @@ func (node *MethodSignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *MethodSignatureDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewMethodSignatureDeclaration(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewMethodSignatureDeclaration(node.Modifiers(), node.name, node.PostfixToken, node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) } func (node *MethodSignatureDeclaration) Name() *DeclarationName { @@ -3395,7 +3395,7 @@ func (node *MethodDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *MethodDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewMethodDeclaration(node.AsNode().Modifiers(), node.AsteriskToken, node.name, node.PostfixToken, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewMethodDeclaration(node.Modifiers(), node.AsteriskToken, node.name, node.PostfixToken, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *MethodDeclaration) Name() *DeclarationName { @@ -3450,7 +3450,7 @@ func (node *PropertySignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *PropertySignatureDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewPropertySignatureDeclaration(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewPropertySignatureDeclaration(node.Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertySignatureDeclaration) Name() *DeclarationName { @@ -3505,7 +3505,7 @@ func (node *PropertyDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *PropertyDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewPropertyDeclaration(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewPropertyDeclaration(node.Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertyDeclaration) Name() *DeclarationName { @@ -3577,7 +3577,7 @@ func (node *ClassStaticBlockDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ClassStaticBlockDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewClassStaticBlockDeclaration(node.AsNode().Modifiers(), node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewClassStaticBlockDeclaration(node.Modifiers(), node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func IsClassStaticBlockDeclaration(node *Node) bool { @@ -3620,7 +3620,7 @@ func (f *NodeFactory) NewKeywordExpression(kind KeywordExpressionSyntaxKind) *No } func (node *KeywordExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewKeywordExpression(node.AsNode().Kind), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewKeywordExpression(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsKeywordExpression(node *Node) bool { @@ -3798,7 +3798,7 @@ func (node *BinaryExpression) VisitEachChild(v *NodeVisitor) *Node { } func (node *BinaryExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewBinaryExpression(node.AsNode().Modifiers(), node.Left, node.Type, node.OperatorToken, node.Right), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewBinaryExpression(node.Modifiers(), node.Left, node.Type, node.OperatorToken, node.Right), node.AsNode(), f.AsNodeFactory().hooks) } func IsBinaryExpression(node *Node) bool { @@ -3981,7 +3981,7 @@ func (node *ArrowFunction) VisitEachChild(v *NodeVisitor) *Node { } func (node *ArrowFunction) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewArrowFunction(node.AsNode().Modifiers(), node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.EqualsGreaterThanToken, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewArrowFunction(node.Modifiers(), node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.EqualsGreaterThanToken, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func IsArrowFunction(node *Node) bool { @@ -4039,7 +4039,7 @@ func (node *FunctionExpression) VisitEachChild(v *NodeVisitor) *Node { } func (node *FunctionExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewFunctionExpression(node.AsNode().Modifiers(), node.AsteriskToken, node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewFunctionExpression(node.Modifiers(), node.AsteriskToken, node.name, node.TypeParameters, node.Parameters, node.Type, node.FullSignature, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *FunctionExpression) Name() *DeclarationName { @@ -4213,7 +4213,7 @@ func (f *NodeFactory) NewPropertyAccessExpression(expression *Expression, questi } func (f *NodeFactory) UpdatePropertyAccessExpression(node *PropertyAccessExpression, expression *Expression, questionDotToken *QuestionDotToken, name *MemberName, flags NodeFlags) *Node { - if expression != node.Expression || questionDotToken != node.QuestionDotToken || name != node.name || flags != node.AsNode().Flags { + if expression != node.Expression || questionDotToken != node.QuestionDotToken || name != node.name || flags != node.Flags { return updateNode(f.NewPropertyAccessExpression(expression, questionDotToken, name, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4224,11 +4224,11 @@ func (node *PropertyAccessExpression) ForEachChild(v Visitor) bool { } func (node *PropertyAccessExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdatePropertyAccessExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNode(node.name), node.AsNode().Flags) + return v.Factory.UpdatePropertyAccessExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNode(node.name), node.Flags) } func (node *PropertyAccessExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewPropertyAccessExpression(node.Expression, node.QuestionDotToken, node.name, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewPropertyAccessExpression(node.Expression, node.QuestionDotToken, node.name, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertyAccessExpression) Name() *DeclarationName { @@ -4263,7 +4263,7 @@ func (f *NodeFactory) NewElementAccessExpression(expression *Expression, questio } func (f *NodeFactory) UpdateElementAccessExpression(node *ElementAccessExpression, expression *Expression, questionDotToken *QuestionDotToken, argumentExpression *Expression, flags NodeFlags) *Node { - if expression != node.Expression || questionDotToken != node.QuestionDotToken || argumentExpression != node.ArgumentExpression || flags != node.AsNode().Flags { + if expression != node.Expression || questionDotToken != node.QuestionDotToken || argumentExpression != node.ArgumentExpression || flags != node.Flags { return updateNode(f.NewElementAccessExpression(expression, questionDotToken, argumentExpression, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4274,11 +4274,11 @@ func (node *ElementAccessExpression) ForEachChild(v Visitor) bool { } func (node *ElementAccessExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateElementAccessExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNode(node.ArgumentExpression), node.AsNode().Flags) + return v.Factory.UpdateElementAccessExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNode(node.ArgumentExpression), node.Flags) } func (node *ElementAccessExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewElementAccessExpression(node.Expression, node.QuestionDotToken, node.ArgumentExpression, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewElementAccessExpression(node.Expression, node.QuestionDotToken, node.ArgumentExpression, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ElementAccessExpression) computeSubtreeFacts() SubtreeFacts { @@ -4317,7 +4317,7 @@ func (f *NodeFactory) NewCallExpression(expression *Expression, questionDotToken } func (f *NodeFactory) UpdateCallExpression(node *CallExpression, expression *Expression, questionDotToken *QuestionDotToken, typeArguments *TypeList, arguments *ElementList, flags NodeFlags) *Node { - if expression != node.Expression || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || arguments != node.Arguments || flags != node.AsNode().Flags { + if expression != node.Expression || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || arguments != node.Arguments || flags != node.Flags { return updateNode(f.NewCallExpression(expression, questionDotToken, typeArguments, arguments, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4331,11 +4331,11 @@ func (node *CallExpression) ForEachChild(v Visitor) bool { } func (node *CallExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateCallExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNodes(node.Arguments), node.AsNode().Flags) + return v.Factory.UpdateCallExpression(node, v.visitNode(node.Expression), v.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNodes(node.Arguments), node.Flags) } func (node *CallExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewCallExpression(node.Expression, node.QuestionDotToken, node.TypeArguments, node.Arguments, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewCallExpression(node.Expression, node.QuestionDotToken, node.TypeArguments, node.Arguments, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsCallExpression(node *Node) bool { @@ -4449,7 +4449,7 @@ func (f *NodeFactory) NewNonNullExpression(expression *Expression, flags NodeFla } func (f *NodeFactory) UpdateNonNullExpression(node *NonNullExpression, expression *Expression, flags NodeFlags) *Node { - if expression != node.Expression || flags != node.AsNode().Flags { + if expression != node.Expression || flags != node.Flags { return updateNode(f.NewNonNullExpression(expression, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4460,11 +4460,11 @@ func (node *NonNullExpression) ForEachChild(v Visitor) bool { } func (node *NonNullExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateNonNullExpression(node, v.visitNode(node.Expression), node.AsNode().Flags) + return v.Factory.UpdateNonNullExpression(node, v.visitNode(node.Expression), node.Flags) } func (node *NonNullExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewNonNullExpression(node.Expression, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewNonNullExpression(node.Expression, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsNonNullExpression(node *Node) bool { @@ -4625,7 +4625,7 @@ func (f *NodeFactory) NewTaggedTemplateExpression(tag *Expression, questionDotTo } func (f *NodeFactory) UpdateTaggedTemplateExpression(node *TaggedTemplateExpression, tag *Expression, questionDotToken *QuestionDotToken, typeArguments *TypeList, template *TemplateLiteral, flags NodeFlags) *Node { - if tag != node.Tag || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || template != node.Template || flags != node.AsNode().Flags { + if tag != node.Tag || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || template != node.Template || flags != node.Flags { return updateNode(f.NewTaggedTemplateExpression(tag, questionDotToken, typeArguments, template, flags), node.AsNode(), f.hooks) } return node.AsNode() @@ -4639,11 +4639,11 @@ func (node *TaggedTemplateExpression) ForEachChild(v Visitor) bool { } func (node *TaggedTemplateExpression) VisitEachChild(v *NodeVisitor) *Node { - return v.Factory.UpdateTaggedTemplateExpression(node, v.visitNode(node.Tag), v.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNode(node.Template), node.AsNode().Flags) + return v.Factory.UpdateTaggedTemplateExpression(node, v.visitNode(node.Tag), v.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNode(node.Template), node.Flags) } func (node *TaggedTemplateExpression) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewTaggedTemplateExpression(node.Tag, node.QuestionDotToken, node.TypeArguments, node.Template, node.AsNode().Flags), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewTaggedTemplateExpression(node.Tag, node.QuestionDotToken, node.TypeArguments, node.Template, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsTaggedTemplateExpression(node *Node) bool { @@ -4867,7 +4867,7 @@ func (node *PropertyAssignment) VisitEachChild(v *NodeVisitor) *Node { } func (node *PropertyAssignment) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewPropertyAssignment(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewPropertyAssignment(node.Modifiers(), node.name, node.PostfixToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertyAssignment) Name() *DeclarationName { @@ -4925,7 +4925,7 @@ func (node *ShorthandPropertyAssignment) VisitEachChild(v *NodeVisitor) *Node { } func (node *ShorthandPropertyAssignment) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewShorthandPropertyAssignment(node.AsNode().Modifiers(), node.name, node.PostfixToken, node.Type, node.EqualsToken, node.ObjectAssignmentInitializer), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewShorthandPropertyAssignment(node.Modifiers(), node.name, node.PostfixToken, node.Type, node.EqualsToken, node.ObjectAssignmentInitializer), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ShorthandPropertyAssignment) Name() *DeclarationName { @@ -5154,7 +5154,7 @@ func (f *NodeFactory) NewKeywordTypeNode(kind KeywordTypeSyntaxKind) *Node { } func (node *KeywordTypeNode) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewKeywordTypeNode(node.AsNode().Kind), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewKeywordTypeNode(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsKeywordTypeNode(node *Node) bool { @@ -6133,7 +6133,7 @@ func (node *ConstructorTypeNode) VisitEachChild(v *NodeVisitor) *Node { } func (node *ConstructorTypeNode) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewConstructorTypeNode(node.AsNode().Modifiers(), node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewConstructorTypeNode(node.Modifiers(), node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) } func IsConstructorTypeNode(node *Node) bool { @@ -8110,7 +8110,7 @@ func (node *ModuleDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ModuleDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewModuleDeclaration(node.AsNode().Modifiers(), node.Keyword, node.name, node.Body), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewModuleDeclaration(node.Modifiers(), node.Keyword, node.name, node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ModuleDeclaration) Name() *DeclarationName { @@ -8161,7 +8161,7 @@ func (node *ImportEqualsDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ImportEqualsDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewImportEqualsDeclaration(node.AsNode().Modifiers(), node.IsTypeOnly, node.name, node.ModuleReference), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewImportEqualsDeclaration(node.Modifiers(), node.IsTypeOnly, node.name, node.ModuleReference), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ImportEqualsDeclaration) Name() *DeclarationName { @@ -8216,7 +8216,7 @@ func (node *ExportDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *ExportDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewExportDeclaration(node.AsNode().Modifiers(), node.IsTypeOnly, node.ExportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewExportDeclaration(node.Modifiers(), node.IsTypeOnly, node.ExportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) } func IsExportDeclaration(node *Node) bool { @@ -8569,7 +8569,7 @@ func (node *TypeParameterDeclaration) VisitEachChild(v *NodeVisitor) *Node { } func (node *TypeParameterDeclaration) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewTypeParameterDeclaration(node.AsNode().Modifiers(), node.name, node.Constraint, node.Expression, node.DefaultType), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewTypeParameterDeclaration(node.Modifiers(), node.name, node.Constraint, node.Expression, node.DefaultType), node.AsNode(), f.AsNodeFactory().hooks) } func (node *TypeParameterDeclaration) Name() *DeclarationName { @@ -8692,7 +8692,7 @@ func (f *NodeFactory) NewJSDocParameterOrPropertyTag(kind Kind, tagName *Identif func (f *NodeFactory) UpdateJSDocParameterOrPropertyTag(node *JSDocParameterOrPropertyTag, tagName *IdentifierNode, name *EntityName, isBracketed bool, typeExpression *TypeNode, isNameFirst bool, comment *NodeList) *Node { if tagName != node.TagName || name != node.name || isBracketed != node.IsBracketed || typeExpression != node.TypeExpression || isNameFirst != node.IsNameFirst || comment != node.Comment { - return updateNode(f.NewJSDocParameterOrPropertyTag(node.AsNode().Kind, tagName, name, isBracketed, typeExpression, isNameFirst, comment), node.AsNode(), f.hooks) + return updateNode(f.NewJSDocParameterOrPropertyTag(node.Kind, tagName, name, isBracketed, typeExpression, isNameFirst, comment), node.AsNode(), f.hooks) } return node.AsNode() } @@ -8706,7 +8706,7 @@ func (node *JSDocParameterOrPropertyTag) VisitEachChild(v *NodeVisitor) *Node { } func (node *JSDocParameterOrPropertyTag) Clone(f NodeFactoryCoercible) *Node { - return cloneNode(f.AsNodeFactory().NewJSDocParameterOrPropertyTag(node.AsNode().Kind, node.TagName, node.name, node.IsBracketed, node.TypeExpression, node.IsNameFirst, node.Comment), node.AsNode(), f.AsNodeFactory().hooks) + return cloneNode(f.AsNodeFactory().NewJSDocParameterOrPropertyTag(node.Kind, node.TagName, node.name, node.IsBracketed, node.TypeExpression, node.IsNameFirst, node.Comment), node.AsNode(), f.AsNodeFactory().hooks) } func (node *JSDocParameterOrPropertyTag) Name() *DeclarationName { diff --git a/tsc/internal/ast/utilities.go b/tsc/internal/ast/utilities.go index 1dc5bdeca89da..42058ea2c399f 100644 --- a/tsc/internal/ast/utilities.go +++ b/tsc/internal/ast/utilities.go @@ -2951,11 +2951,11 @@ func IsExclusivelyTypeOnlyImportOrExport(node *Node) bool { return node.IsTypeOnly() case KindImportDeclaration, KindJSImportDeclaration: if importClause := node.ImportClause(); importClause != nil { - return importClause.AsImportClause().AsNode().IsTypeOnly() + return importClause.AsImportClause().IsTypeOnly() } case KindJSDocImportTag: if importClause := node.ImportClause(); importClause != nil { - return importClause.AsImportClause().AsNode().IsTypeOnly() + return importClause.AsImportClause().IsTypeOnly() } } return false diff --git a/tsc/internal/checker/grammarchecks.go b/tsc/internal/checker/grammarchecks.go index 320362b655e54..be8c0af0e6fcb 100644 --- a/tsc/internal/checker/grammarchecks.go +++ b/tsc/internal/checker/grammarchecks.go @@ -1519,7 +1519,7 @@ func (c *Checker) checkGrammarBindingElement(node *ast.BindingElement) bool { if node.DotDotDotToken != nil { elements := node.Parent.ElementList() if node.AsNode() != core.LastOrNil(elements.Nodes) { - return c.grammarErrorOnNode(node.AsNode(), diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern) + return c.grammarErrorOnNode(&node.Node, diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern) } c.checkGrammarForDisallowedTrailingComma(elements, diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma) @@ -2101,20 +2101,20 @@ func (c *Checker) checkGrammarImportClause(node *ast.ImportClause) bool { switch node.PhaseModifier { case ast.KindTypeKeyword: if node.Flags&ast.NodeFlagsJSDoc == 0 && node.Name() != nil && node.NamedBindings != nil { - return c.grammarErrorOnNode(node.AsNode(), diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both) + return c.grammarErrorOnNode(&node.Node, diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both) } if node.NamedBindings != nil && node.NamedBindings.Kind == ast.KindNamedImports { return c.checkGrammarTypeOnlyNamedImportsOrExports(node.NamedBindings) } case ast.KindDeferKeyword: if node.Name() != nil { - return c.grammarErrorOnNode(node.AsNode(), diagnostics.Default_imports_are_not_allowed_in_a_deferred_import) + return c.grammarErrorOnNode(&node.Node, diagnostics.Default_imports_are_not_allowed_in_a_deferred_import) } if node.NamedBindings != nil && node.NamedBindings.Kind == ast.KindNamedImports { - return c.grammarErrorOnNode(node.AsNode(), diagnostics.Named_imports_are_not_allowed_in_a_deferred_import) + return c.grammarErrorOnNode(&node.Node, diagnostics.Named_imports_are_not_allowed_in_a_deferred_import) } if c.moduleKind != core.ModuleKindESNext && c.moduleKind != core.ModuleKindPreserve { - return c.grammarErrorOnNode(node.AsNode(), diagnostics.Deferred_imports_are_only_supported_when_the_module_flag_is_set_to_esnext_or_preserve) + return c.grammarErrorOnNode(&node.Node, diagnostics.Deferred_imports_are_only_supported_when_the_module_flag_is_set_to_esnext_or_preserve) } } return false diff --git a/tsc/internal/checker/nodebuilder_hover.go b/tsc/internal/checker/nodebuilder_hover.go index ece5e3f649d80..fd5cd55f2b0a7 100644 --- a/tsc/internal/checker/nodebuilder_hover.go +++ b/tsc/internal/checker/nodebuilder_hover.go @@ -218,10 +218,10 @@ func typeElementsToClassElements(f *ast.NodeFactory, members []*ast.Node) []*ast switch m.Kind { case ast.KindPropertySignature: ps := m.AsPropertySignatureDeclaration() - members[i] = f.NewPropertyDeclaration(m.Modifiers(), ps.Name(), ps.AsNode().QuestionToken(), ps.Type, nil) + members[i] = f.NewPropertyDeclaration(m.Modifiers(), ps.Name(), ps.QuestionToken(), ps.Type, nil) case ast.KindMethodSignature: ms := m.AsMethodSignatureDeclaration() - members[i] = f.NewMethodDeclaration(m.Modifiers(), nil, ms.Name(), ms.AsNode().QuestionToken(), ms.TypeParameters, ms.Parameters, ms.Type, nil, nil) + members[i] = f.NewMethodDeclaration(m.Modifiers(), nil, ms.Name(), ms.QuestionToken(), ms.TypeParameters, ms.Parameters, ms.Type, nil, nil) } } return members diff --git a/tsc/internal/ls/autoimport/fix.go b/tsc/internal/ls/autoimport/fix.go index b1bed0a08d039..a035f305eaf1d 100644 --- a/tsc/internal/ls/autoimport/fix.go +++ b/tsc/internal/ls/autoimport/fix.go @@ -217,7 +217,7 @@ func addToExistingImport( importClause := importClauseOrBindingPattern.AsImportClause() // promoteFromTypeOnly = true if we need to promote the entire original clause from type only - promoteFromTypeOnly := importClause.AsNode().IsTypeOnly() && core.Some(append(namedImports, defaultImport), func(i *newImportBinding) bool { + promoteFromTypeOnly := importClause.IsTypeOnly() && core.Some(append(namedImports, defaultImport), func(i *newImportBinding) bool { if i == nil { return false } @@ -242,7 +242,7 @@ func addToExistingImport( identifier = ct.NodeFactory.NewIdentifier(namedImport.propertyName).AsIdentifier().AsNode() } return ct.NodeFactory.NewImportSpecifier( - (!importClause.AsNode().IsTypeOnly() || promoteFromTypeOnly) && shouldUseTypeOnly(namedImport.addAsTypeOnly, preferences), + (!importClause.IsTypeOnly() || promoteFromTypeOnly) && shouldUseTypeOnly(namedImport.addAsTypeOnly, preferences), identifier, ct.NodeFactory.NewIdentifier(namedImport.name), ) @@ -319,7 +319,7 @@ func addToExistingImport( } func getTypeKeywordOfTypeOnlyImport(importClause *ast.ImportClause, sourceFile *ast.SourceFile) *ast.Node { - debug.Assert(importClause.AsNode().IsTypeOnly(), "import clause must be type-only") + debug.Assert(importClause.IsTypeOnly(), "import clause must be type-only") // The first child of a type-only import clause is the 'type' keyword // import type { foo } from './bar' // ^^^^ @@ -753,7 +753,7 @@ func (v *View) tryAddToExistingImport( namedBindings := importClause.NamedBindings // A type-only import may not have both a default and named imports, so the only way a name can // be added to an existing type-only import is adding a named import to existing named bindings. - if importClause.AsNode().IsTypeOnly() && !(importKind == lsproto.ImportKindNamed && namedBindings != nil) { + if importClause.IsTypeOnly() && !(importKind == lsproto.ImportKindNamed && namedBindings != nil) { continue } @@ -779,7 +779,7 @@ func (v *View) tryAddToExistingImport( }, } - isTypeOnly := importClause.AsNode().IsTypeOnly() + isTypeOnly := importClause.IsTypeOnly() // Give preference to putting types in existing type-only imports and avoiding conversions // of import statements to/from type-only. if (addAsTypeOnly != lsproto.AddAsTypeOnlyNotAllowed && isTypeOnly) || diff --git a/tsc/internal/ls/completions.go b/tsc/internal/ls/completions.go index 2f59e9afb37c6..2aef35353d1b1 100644 --- a/tsc/internal/ls/completions.go +++ b/tsc/internal/ls/completions.go @@ -3124,7 +3124,7 @@ func shouldIncludeSymbol( symbolOrigin := checker.SkipAlias(symbol, typeChecker) // We only want to filter out the global keywords. // Auto Imports are not available for scripts so this conditional is always false. - if file.AsNode().AsSourceFile().ExternalModuleIndicator != nil && + if file.AsSourceFile().ExternalModuleIndicator != nil && compilerOptions.AllowUmdGlobalAccess != core.TSTrue && symbol != symbolOrigin && data.symbolToSortTextMap[ast.GetSymbolId(symbol)] == SortTextGlobalsOrKeywords && diff --git a/tsc/internal/ls/lsutil/organizeimports.go b/tsc/internal/ls/lsutil/organizeimports.go index 5a771176913e8..655cd800c8f53 100644 --- a/tsc/internal/ls/lsutil/organizeimports.go +++ b/tsc/internal/ls/lsutil/organizeimports.go @@ -347,7 +347,7 @@ func getImportKindOrder(s1 *ast.Statement) int { return importKindOrderSideEffect } importClause := importDecl.ImportClause.AsImportClause() - if importClause.AsNode().IsTypeOnly() { + if importClause.IsTypeOnly() { return importKindOrderTypeOnly } if importClause.NamedBindings != nil && importClause.NamedBindings.Kind == ast.KindNamespaceImport { diff --git a/tsc/internal/ls/organizeimports.go b/tsc/internal/ls/organizeimports.go index 96638bf85220e..f543d2c4b2f11 100644 --- a/tsc/internal/ls/organizeimports.go +++ b/tsc/internal/ls/organizeimports.go @@ -662,7 +662,7 @@ func getCategorizedImports(importDecls []*ast.Statement) categorizedImports { clause := importDecl.AsImportDeclaration().ImportClause.AsImportClause() group := ®ularImports - if clause.AsNode().IsTypeOnly() { + if clause.IsTypeOnly() { group = &typeOnlyImports } diff --git a/tsc/internal/ls/signaturehelp.go b/tsc/internal/ls/signaturehelp.go index 6727b7a15df98..25495583a9612 100644 --- a/tsc/internal/ls/signaturehelp.go +++ b/tsc/internal/ls/signaturehelp.go @@ -1246,13 +1246,13 @@ func getChildListThatStartsWithOpenerToken(parent *ast.Node, openerToken *ast.No if ast.IsCallExpression(parent) { parentCallExpression := parent.AsCallExpression() if openerToken.Kind == ast.KindLessThanToken { - return parentCallExpression.AsNode().TypeArgumentList() + return parentCallExpression.TypeArgumentList() } return parentCallExpression.Arguments } else if ast.IsNewExpression(parent) { parentNewExpression := parent.AsNewExpression() if openerToken.Kind == ast.KindLessThanToken { - return parentNewExpression.AsNode().TypeArgumentList() + return parentNewExpression.TypeArgumentList() } return parentNewExpression.Arguments } diff --git a/tsc/internal/parser/reparser.go b/tsc/internal/parser/reparser.go index 1abb0488bdd6e..fce97c480286c 100644 --- a/tsc/internal/parser/reparser.go +++ b/tsc/internal/parser/reparser.go @@ -370,7 +370,7 @@ func (p *Parser) reparseHosted(tag *ast.Node, parent *ast.Node, jsDoc *ast.Node) if parent.Expression().Kind == ast.KindBinaryExpression { bin := parent.Expression().AsBinaryExpression() if kind := ast.GetAssignmentDeclarationKind(bin.AsNode()); kind != ast.JSDeclarationKindNone && tag.TypeExpression() != nil { - bin.AsNode().AsMutable().SetType(p.addDeepCloneReparse(tag.TypeExpression().Type())) + bin.AsMutable().SetType(p.addDeepCloneReparse(tag.TypeExpression().Type())) p.finishMutatedNode(bin.AsNode()) return } @@ -474,7 +474,7 @@ func (p *Parser) reparseHosted(tag *ast.Node, parent *ast.Node, jsDoc *ast.Node) parameterTag := tag.AsJSDocParameterOrPropertyTag() if param, ok := findMatchingParameter(fun, parameterTag, jsDoc); ok { if param.Type == nil && parameterTag.TypeExpression != nil { - param.AsNode().AsParameterDeclaration().Type = p.reparseJSDocTypeLiteral(parameterTag.TypeExpression.Type()) + param.AsParameterDeclaration().Type = p.reparseJSDocTypeLiteral(parameterTag.TypeExpression.Type()) } if param.QuestionToken == nil { if question := p.makeQuestionIfOptional(parameterTag); question != nil { diff --git a/tsc/internal/printer/printer_test.go b/tsc/internal/printer/printer_test.go index 114f5e246c466..3b108fd1a79b1 100644 --- a/tsc/internal/printer/printer_test.go +++ b/tsc/internal/printer/printer_test.go @@ -2482,7 +2482,7 @@ func TestNoTrailingCommaAfterTransform(t *testing.T) { }) file = visitor.VisitSourceFile(file) - emittestutil.CheckEmit(t, emitContext, file.AsNode().AsSourceFile(), "[a];") + emittestutil.CheckEmit(t, emitContext, file.AsSourceFile(), "[a];") } func TestTrailingCommaAfterTransform(t *testing.T) { @@ -2503,7 +2503,7 @@ func TestTrailingCommaAfterTransform(t *testing.T) { }) file = visitor.VisitSourceFile(file) - emittestutil.CheckEmit(t, emitContext, file.AsNode().AsSourceFile(), "[a,];") + emittestutil.CheckEmit(t, emitContext, file.AsSourceFile(), "[a,];") } func TestPartiallyEmittedExpression(t *testing.T) { @@ -2518,7 +2518,7 @@ func TestPartiallyEmittedExpression(t *testing.T) { emitContext := printer.NewEmitContext() file = tstransforms.NewTypeEraserTransformer(&transformers.TransformOptions{CompilerOptions: compilerOptions, Context: emitContext}).TransformSourceFile(file) - emittestutil.CheckEmit(t, emitContext, file.AsNode().AsSourceFile(), `return container.parent + emittestutil.CheckEmit(t, emitContext, file.AsSourceFile(), `return container.parent .left .expression .expression;`) diff --git a/tsc/internal/scanner/scanner_test.go b/tsc/internal/scanner/scanner_test.go index 038a6d9866850..5c50a17fe0f59 100644 --- a/tsc/internal/scanner/scanner_test.go +++ b/tsc/internal/scanner/scanner_test.go @@ -49,29 +49,20 @@ func TestNormalizeJSDocTypeSourceText(t *testing.T) { func TestIsJSDocTypeExpressionOrChild(t *testing.T) { t.Parallel() - jsDocType := &ast.Node{} - jsDocType.Kind, jsDocType.Flags = ast.KindTypeReference, ast.NodeFlagsJSDoc - jsDocTypeChild := &ast.Node{} - jsDocTypeChild.Kind, jsDocTypeChild.Flags, jsDocTypeChild.Parent = ast.KindIdentifier, ast.NodeFlagsJSDoc, jsDocType - reparsedType := &ast.Node{} - reparsedType.Kind, reparsedType.Flags = ast.KindTypeLiteral, ast.NodeFlagsReparsed - reparsedTypeChild := &ast.Node{} - reparsedTypeChild.Kind, reparsedTypeChild.Flags, reparsedTypeChild.Parent = ast.KindIdentifier, ast.NodeFlagsReparsed, reparsedType - ordinaryType := &ast.Node{} - ordinaryType.Kind = ast.KindTypeReference - jsDocTag := &ast.Node{} - jsDocTag.Kind, jsDocTag.Flags = ast.KindJSDocParameterTag, ast.NodeFlagsJSDoc - jsDocTagChild := &ast.Node{} - jsDocTagChild.Kind, jsDocTagChild.Flags, jsDocTagChild.Parent = ast.KindIdentifier, ast.NodeFlagsJSDoc, jsDocTag - jsDocTypeExpression := &ast.Node{} - jsDocTypeExpression.Kind = ast.KindJSDocTypeExpression + jsDocType := &ast.Node{Kind: ast.KindTypeReference, Flags: ast.NodeFlagsJSDoc} + jsDocTypeChild := &ast.Node{Kind: ast.KindIdentifier, Flags: ast.NodeFlagsJSDoc, Parent: jsDocType} + reparsedType := &ast.Node{Kind: ast.KindTypeLiteral, Flags: ast.NodeFlagsReparsed} + reparsedTypeChild := &ast.Node{Kind: ast.KindIdentifier, Flags: ast.NodeFlagsReparsed, Parent: reparsedType} + ordinaryType := &ast.Node{Kind: ast.KindTypeReference} + jsDocTag := &ast.Node{Kind: ast.KindJSDocParameterTag, Flags: ast.NodeFlagsJSDoc} + jsDocTagChild := &ast.Node{Kind: ast.KindIdentifier, Flags: ast.NodeFlagsJSDoc, Parent: jsDocTag} tests := []struct { name string node *ast.Node expected bool }{ - {name: "type expression", node: jsDocTypeExpression, expected: true}, + {name: "type expression", node: &ast.Node{Kind: ast.KindJSDocTypeExpression}, expected: true}, {name: "JSDoc type", node: jsDocType, expected: true}, {name: "JSDoc type child", node: jsDocTypeChild, expected: true}, {name: "reparsed type", node: reparsedType, expected: true}, @@ -92,10 +83,11 @@ func TestGetTextOfNodeFromJSDocTypePreservesAsteriskType(t *testing.T) { t.Parallel() sourceText := strings.Join([]string{"", " * *"}, core.NewLineKindLF.GetNewLineCharacter()) - node := &ast.Node{} - node.Kind = ast.KindJSDocAllType - node.Flags = ast.NodeFlagsJSDoc - node.Loc = core.NewTextRange(0, len(sourceText)) + node := &ast.Node{ + Kind: ast.KindJSDocAllType, + Flags: ast.NodeFlagsJSDoc, + Loc: core.NewTextRange(0, len(sourceText)), + } assert.Equal(t, GetTextOfNodeFromSourceText(sourceText, node, false /*includeTrivia*/), "*") } diff --git a/tsc/internal/transformers/declarations/transform.go b/tsc/internal/transformers/declarations/transform.go index 3bf6758e0c855..08e26b96a82fd 100644 --- a/tsc/internal/transformers/declarations/transform.go +++ b/tsc/internal/transformers/declarations/transform.go @@ -2933,7 +2933,7 @@ func (tx *DeclarationTransformer) createFullExpandoBlock(id ast.NodeId) *ast.Nod var host []*ast.Node if n != nil && n.Kind == ast.KindSyntaxList { // find the first named syntax list element and use its' name & modifiers - for c := range n.AsSyntaxList().AsNode().IterChildren() { + for c := range n.AsSyntaxList().IterChildren() { if c.Name() != nil { name = c.Name().Clone(tx.Factory()) if c.Modifiers() != nil { diff --git a/tsc/internal/transformers/estransforms/optionalchain.go b/tsc/internal/transformers/estransforms/optionalchain.go index c4a4ab3d9ed4a..33b269280f594 100644 --- a/tsc/internal/transformers/estransforms/optionalchain.go +++ b/tsc/internal/transformers/estransforms/optionalchain.go @@ -91,7 +91,7 @@ func (ch *optionalChainTransformer) visitPropertyOrElementAccessExpression(node expression = ch.Factory().UpdatePropertyAccessExpression(p, expression, nil /*questionDotToken*/, ch.Visitor().VisitNode(p.Name()), p.Flags) } else { p := node.AsElementAccessExpression() - expression = ch.Factory().UpdateElementAccessExpression(p, expression, nil, ch.Visitor().VisitNode(p.AsNode().AsElementAccessExpression().ArgumentExpression), p.Flags) + expression = ch.Factory().UpdateElementAccessExpression(p, expression, nil, ch.Visitor().VisitNode(p.AsElementAccessExpression().ArgumentExpression), p.Flags) } if thisArg != nil { diff --git a/tsc/internal/transformers/moduletransforms/commonjsmodule.go b/tsc/internal/transformers/moduletransforms/commonjsmodule.go index 75ad72c619d66..9e7ca97dbe241 100644 --- a/tsc/internal/transformers/moduletransforms/commonjsmodule.go +++ b/tsc/internal/transformers/moduletransforms/commonjsmodule.go @@ -1811,7 +1811,7 @@ func (tx *CommonJSModuleTransformer) visitCallExpression(node *ast.CallExpressio return tx.visitImportCallExpression(node, needsRewrite) } if needsRewrite { - return tx.shimOrRewriteImportOrRequireCall(node.AsNode().AsCallExpression()) + return tx.shimOrRewriteImportOrRequireCall(node.AsCallExpression()) } if ast.IsIdentifier(node.Expression) { // given: @@ -2093,7 +2093,7 @@ func (tx *CommonJSModuleTransformer) visitExpressionIdentifier(node *ast.Identif return reference } if ast.IsImportSpecifier(importDeclaration) { - name := importDeclaration.AsImportSpecifier().AsNode().PropertyNameOrName() + name := importDeclaration.AsImportSpecifier().PropertyNameOrName() decl := ast.FindAncestor(importDeclaration, ast.IsImportDeclaration) target := tx.Factory().NewGeneratedNameForNode(core.Coalesce(decl, importDeclaration)) var reference *ast.Node diff --git a/tsc/internal/transformers/tstransforms/legacydecorators.go b/tsc/internal/transformers/tstransforms/legacydecorators.go index 91fe7d45961ad..8eaa45e5071ad 100644 --- a/tsc/internal/transformers/tstransforms/legacydecorators.go +++ b/tsc/internal/transformers/tstransforms/legacydecorators.go @@ -663,7 +663,7 @@ type allDecorators struct { * @internal */ func getAllDecoratorsOfClass(node *ast.ClassDeclaration, useLegacyDecorators bool) *allDecorators { - decorators := node.AsNode().Decorators() + decorators := node.Decorators() var parameters [][]*ast.Node if useLegacyDecorators { parameters = getDecoratorsOfParameters(ast.GetFirstConstructorWithBody(node.AsNode())) diff --git a/tsc/internal/transformers/tstransforms/runtimesyntax.go b/tsc/internal/transformers/tstransforms/runtimesyntax.go index 0a912376640c8..35c29262606b0 100644 --- a/tsc/internal/transformers/tstransforms/runtimesyntax.go +++ b/tsc/internal/transformers/tstransforms/runtimesyntax.go @@ -749,7 +749,7 @@ 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.AsNode().ParameterList(), tx.Visitor()) + parameters := tx.EmitContext().VisitParameters(node.ParameterList(), tx.Visitor()) body := tx.visitConstructorBody(node.Body.AsBlock(), node.AsNode()) return tx.Factory().UpdateConstructorDeclaration(node, modifiers, nil /*typeParameters*/, parameters, nil /*returnType*/, nil /*fullSignature*/, body) } diff --git a/tsc/internal/transformers/tstransforms/typeeraser.go b/tsc/internal/transformers/tstransforms/typeeraser.go index d185112fb31b9..0951065f645a4 100644 --- a/tsc/internal/transformers/tstransforms/typeeraser.go +++ b/tsc/internal/transformers/tstransforms/typeeraser.go @@ -310,7 +310,7 @@ func (tx *TypeEraserTransformer) visit(node *ast.Node) *ast.Node { case ast.KindImportClause: n := node.AsImportClause() - if n.AsNode().IsTypeOnly() { + if n.IsTypeOnly() { // Always elide type-only imports return nil } From 216ca65804ab5b5c450b238eb059bc756440c637 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 28 Aug 2026 09:02:38 -0700 Subject: [PATCH 10/13] Remove redundant NodeDefault methods --- tsc/internal/ast/ast.go | 35 +++-------------------------------- 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index 81a7b10b9f7ed..ecf63b70d5236 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -1154,40 +1154,13 @@ func (n *Node) AsFlowReduceLabelData() *FlowReduceLabelData { return n.data.(*FlowReduceLabelData) } -// NodeDefault - +// NodeDefault keeps Node methods one promotion level below fields such as Text, +// Body, TypeParameters, and Parameters supplied by bases embedded alongside +// NodeBase. Embedding Node directly in NodeBase makes those selectors ambiguous. type NodeDefault struct { Node } -func (node *NodeDefault) AsNode() *Node { return &node.Node } -func (node *NodeDefault) ForEachChild(v Visitor) bool { return false } - -func (node *NodeDefault) VisitEachChild(v *NodeVisitor) *Node { return node.AsNode() } -func (node *NodeDefault) Clone(v NodeFactoryCoercible) *Node { return nil } -func (node *NodeDefault) Name() *DeclarationName { return nil } -func (node *NodeDefault) Modifiers() *ModifierList { return nil } -func (node *NodeDefault) setModifiers(modifiers *ModifierList) {} -func (node *NodeDefault) FlowNodeData() *FlowNodeBase { return nil } -func (node *NodeDefault) DeclarationData() *DeclarationBase { return nil } -func (node *NodeDefault) ExportableData() *ExportableBase { return nil } -func (node *NodeDefault) LocalsContainerData() *LocalsContainerBase { return nil } -func (node *NodeDefault) FunctionLikeData() *FunctionLikeBase { return nil } -func (node *NodeDefault) ClassLikeData() *ClassLikeBase { return nil } -func (node *NodeDefault) BodyData() *BodyBase { return nil } -func (node *NodeDefault) LiteralLikeData() *LiteralLikeNodeBase { return nil } -func (node *NodeDefault) TemplateLiteralLikeData() *TemplateLiteralLikeNodeBase { return nil } -func (node *NodeDefault) SubtreeFacts() SubtreeFacts { - return node.AsNode().SubtreeFacts() -} - -func (node *NodeDefault) subtreeFactsWorker(self *Node) SubtreeFacts { - // To avoid excessive conditional checks, the default implementation of subtreeFactsWorker directly invokes - // computeSubtreeFacts. More complex nodes should implement CompositeNodeBase, which overrides this - // method to cache the result. - return self.computeSubtreeFacts() -} - func (node *NodeDefault) computeSubtreeFacts() SubtreeFacts { return SubtreeFactsNone } @@ -1196,8 +1169,6 @@ func (node *NodeDefault) propagateSubtreeFacts() SubtreeFacts { return node.AsNode().SubtreeFacts() & ^SubtreeExclusionsNode } -// NodeBase - type NodeBase struct { NodeDefault } From 1ab40990022802ca12a4a78a9e867ab4b44cdb9d Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 28 Aug 2026 11:11:25 -0700 Subject: [PATCH 11/13] Remove canonical token data test --- tsc/internal/ast/token_test.go | 54 ---------------------------------- 1 file changed, 54 deletions(-) delete mode 100644 tsc/internal/ast/token_test.go diff --git a/tsc/internal/ast/token_test.go b/tsc/internal/ast/token_test.go deleted file mode 100644 index eeb88ab37f3b2..0000000000000 --- a/tsc/internal/ast/token_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package ast - -import ( - "reflect" - "testing" -) - -func TestNewTokenUsesCanonicalDataType(t *testing.T) { - t.Parallel() - - factory := NewNodeFactory(NodeFactoryHooks{}) - for kind := KindFirstToken; kind <= KindLastToken; kind++ { - node := factory.NewToken(kind) - actual := reflect.TypeOf(node.data) - expected := canonicalTokenDataType(kind) - if actual != expected { - t.Errorf("NewToken(%s) data type = %v, want %v", kind, actual, expected) - } - } -} - -func canonicalTokenDataType(kind Kind) reflect.Type { - switch kind { - case KindNumericLiteral: - return reflect.TypeFor[*NumericLiteral]() - case KindBigIntLiteral: - return reflect.TypeFor[*BigIntLiteral]() - case KindStringLiteral: - return reflect.TypeFor[*StringLiteral]() - case KindJsxText: - return reflect.TypeFor[*JsxText]() - case KindRegularExpressionLiteral: - return reflect.TypeFor[*RegularExpressionLiteral]() - case KindNoSubstitutionTemplateLiteral: - return reflect.TypeFor[*NoSubstitutionTemplateLiteral]() - case KindTemplateHead: - return reflect.TypeFor[*TemplateHead]() - case KindTemplateMiddle: - return reflect.TypeFor[*TemplateMiddle]() - case KindTemplateTail: - return reflect.TypeFor[*TemplateTail]() - case KindIdentifier: - return reflect.TypeFor[*Identifier]() - case KindPrivateIdentifier: - return reflect.TypeFor[*PrivateIdentifier]() - case KindFalseKeyword, KindImportKeyword, KindNullKeyword, KindSuperKeyword, KindThisKeyword, KindTrueKeyword: - return reflect.TypeFor[*KeywordExpression]() - case KindVoidKeyword, KindAnyKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, - KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindBigIntKeyword: - return reflect.TypeFor[*KeywordTypeNode]() - default: - return reflect.TypeFor[*Token]() - } -} From e967be7b4e303bdb843e63c4f6852b71139c51b6 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 28 Aug 2026 11:15:11 -0700 Subject: [PATCH 12/13] Use promoted subtree facts method --- tsc/internal/ast/ast.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index ecf63b70d5236..f0345f86a0520 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -1166,7 +1166,7 @@ func (node *NodeDefault) computeSubtreeFacts() SubtreeFacts { } func (node *NodeDefault) propagateSubtreeFacts() SubtreeFacts { - return node.AsNode().SubtreeFacts() & ^SubtreeExclusionsNode + return node.SubtreeFacts() & ^SubtreeExclusionsNode } type NodeBase struct { From f183b4e275f6c78d488c3c82e4e89675b5cc1216 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 28 Aug 2026 11:39:59 -0700 Subject: [PATCH 13/13] Address AST dispatch review comments --- tsc/internal/ast/ast.go | 4 +--- tsc/internal/ast/flow.go | 2 +- tsc/internal/ast/kind_stringer_generated.go | 8 ++++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/tsc/internal/ast/ast.go b/tsc/internal/ast/ast.go index f0345f86a0520..0ff4670cd3ced 100644 --- a/tsc/internal/ast/ast.go +++ b/tsc/internal/ast/ast.go @@ -184,9 +184,7 @@ type Node struct { data any } -// Node accessors. Some accessors are implemented as methods on NodeData, others are implemented though -// type switches. Either approach is fine. Interface methods are likely more performant, but have higher -// code size costs because we have hundreds of implementations of the NodeData interface. +// Shared node accessors dispatch on Kind to the concrete payload stored in data. func (n *Node) AsNode() *Node { return n } func (n *Node) Pos() int { return n.Loc.Pos() } diff --git a/tsc/internal/ast/flow.go b/tsc/internal/ast/flow.go index ee95f565d4e76..9d333b3bce94d 100644 --- a/tsc/internal/ast/flow.go +++ b/tsc/internal/ast/flow.go @@ -39,7 +39,7 @@ type FlowList struct { type FlowLabel = FlowNode const ( - kindFlowSwitchClauseData Kind = KindCount + iota + kindFlowSwitchClauseData Kind = KindCount + 1 + iota kindFlowReduceLabelData ) diff --git a/tsc/internal/ast/kind_stringer_generated.go b/tsc/internal/ast/kind_stringer_generated.go index 0548cb34a4763..c7dd49986fca1 100644 --- a/tsc/internal/ast/kind_stringer_generated.go +++ b/tsc/internal/ast/kind_stringer_generated.go @@ -8,8 +8,8 @@ func _() { // An "invalid array index" compiler error signifies that the constant values have changed. // Re-run the stringer command to generate them again. var x [1]struct{} - _ = x[kindFlowSwitchClauseData-351] - _ = x[kindFlowReduceLabelData-352] + _ = x[kindFlowSwitchClauseData-352] + _ = x[kindFlowReduceLabelData-353] _ = x[KindUnknown-0] _ = x[KindEndOfFile-1] _ = x[KindSingleLineCommentTrivia-2] @@ -364,9 +364,9 @@ func _() { _ = x[KindCount-351] } -const _Kind_name = "KindUnknownKindEndOfFileKindSingleLineCommentTriviaKindMultiLineCommentTriviaKindNewLineTriviaKindWhitespaceTriviaKindConflictMarkerTriviaKindNonTextFileMarkerTriviaKindNumericLiteralKindBigIntLiteralKindStringLiteralKindJsxTextKindJsxTextAllWhiteSpacesKindRegularExpressionLiteralKindNoSubstitutionTemplateLiteralKindTemplateHeadKindTemplateMiddleKindTemplateTailKindOpenBraceTokenKindCloseBraceTokenKindOpenParenTokenKindCloseParenTokenKindOpenBracketTokenKindCloseBracketTokenKindDotTokenKindDotDotDotTokenKindSemicolonTokenKindCommaTokenKindQuestionDotTokenKindLessThanTokenKindLessThanSlashTokenKindGreaterThanTokenKindLessThanEqualsTokenKindGreaterThanEqualsTokenKindEqualsEqualsTokenKindExclamationEqualsTokenKindEqualsEqualsEqualsTokenKindExclamationEqualsEqualsTokenKindEqualsGreaterThanTokenKindPlusTokenKindMinusTokenKindAsteriskTokenKindAsteriskAsteriskTokenKindSlashTokenKindPercentTokenKindPlusPlusTokenKindMinusMinusTokenKindLessThanLessThanTokenKindGreaterThanGreaterThanTokenKindGreaterThanGreaterThanGreaterThanTokenKindAmpersandTokenKindBarTokenKindCaretTokenKindExclamationTokenKindTildeTokenKindAmpersandAmpersandTokenKindBarBarTokenKindQuestionTokenKindColonTokenKindAtTokenKindQuestionQuestionTokenKindBacktickTokenKindHashTokenKindEqualsTokenKindPlusEqualsTokenKindMinusEqualsTokenKindAsteriskEqualsTokenKindAsteriskAsteriskEqualsTokenKindSlashEqualsTokenKindPercentEqualsTokenKindLessThanLessThanEqualsTokenKindGreaterThanGreaterThanEqualsTokenKindGreaterThanGreaterThanGreaterThanEqualsTokenKindAmpersandEqualsTokenKindBarEqualsTokenKindBarBarEqualsTokenKindAmpersandAmpersandEqualsTokenKindQuestionQuestionEqualsTokenKindCaretEqualsTokenKindIdentifierKindPrivateIdentifierKindJSDocCommentTextTokenKindBreakKeywordKindCaseKeywordKindCatchKeywordKindClassKeywordKindConstKeywordKindContinueKeywordKindDebuggerKeywordKindDefaultKeywordKindDeleteKeywordKindDoKeywordKindElseKeywordKindEnumKeywordKindExportKeywordKindExtendsKeywordKindFalseKeywordKindFinallyKeywordKindForKeywordKindFunctionKeywordKindIfKeywordKindImportKeywordKindInKeywordKindInstanceOfKeywordKindNewKeywordKindNullKeywordKindReturnKeywordKindSuperKeywordKindSwitchKeywordKindThisKeywordKindThrowKeywordKindTrueKeywordKindTryKeywordKindTypeOfKeywordKindVarKeywordKindVoidKeywordKindWhileKeywordKindWithKeywordKindImplementsKeywordKindInterfaceKeywordKindLetKeywordKindPackageKeywordKindPrivateKeywordKindProtectedKeywordKindPublicKeywordKindStaticKeywordKindYieldKeywordKindAbstractKeywordKindAccessorKeywordKindAsKeywordKindAssertsKeywordKindAssertKeywordKindAnyKeywordKindAsyncKeywordKindAwaitKeywordKindBooleanKeywordKindConstructorKeywordKindDeclareKeywordKindGetKeywordKindImmediateKeywordKindInferKeywordKindIntrinsicKeywordKindIsKeywordKindKeyOfKeywordKindModuleKeywordKindNamespaceKeywordKindNeverKeywordKindOutKeywordKindReadonlyKeywordKindRequireKeywordKindNumberKeywordKindObjectKeywordKindSatisfiesKeywordKindSetKeywordKindStringKeywordKindSymbolKeywordKindTypeKeywordKindUndefinedKeywordKindUniqueKeywordKindUnknownKeywordKindUsingKeywordKindFromKeywordKindGlobalKeywordKindBigIntKeywordKindOverrideKeywordKindOfKeywordKindDeferKeywordKindQualifiedNameKindComputedPropertyNameKindTypeParameterKindParameterKindDecoratorKindPropertySignatureKindPropertyDeclarationKindMethodSignatureKindMethodDeclarationKindClassStaticBlockDeclarationKindConstructorKindGetAccessorKindSetAccessorKindCallSignatureKindConstructSignatureKindIndexSignatureKindTypePredicateKindTypeReferenceKindFunctionTypeKindConstructorTypeKindTypeQueryKindTypeLiteralKindArrayTypeKindTupleTypeKindOptionalTypeKindRestTypeKindUnionTypeKindIntersectionTypeKindConditionalTypeKindInferTypeKindParenthesizedTypeKindThisTypeKindTypeOperatorKindIndexedAccessTypeKindMappedTypeKindLiteralTypeKindNamedTupleMemberKindTemplateLiteralTypeKindTemplateLiteralTypeSpanKindImportTypeKindObjectBindingPatternKindArrayBindingPatternKindBindingElementKindArrayLiteralExpressionKindObjectLiteralExpressionKindPropertyAccessExpressionKindElementAccessExpressionKindCallExpressionKindNewExpressionKindTaggedTemplateExpressionKindTypeAssertionExpressionKindParenthesizedExpressionKindFunctionExpressionKindArrowFunctionKindDeleteExpressionKindTypeOfExpressionKindVoidExpressionKindAwaitExpressionKindPrefixUnaryExpressionKindPostfixUnaryExpressionKindBinaryExpressionKindConditionalExpressionKindTemplateExpressionKindYieldExpressionKindSpreadElementKindClassExpressionKindOmittedExpressionKindExpressionWithTypeArgumentsKindAsExpressionKindNonNullExpressionKindMetaPropertyKindSyntheticExpressionKindSatisfiesExpressionKindTemplateSpanKindSemicolonClassElementKindBlockKindEmptyStatementKindVariableStatementKindExpressionStatementKindIfStatementKindDoStatementKindWhileStatementKindForStatementKindForInStatementKindForOfStatementKindContinueStatementKindBreakStatementKindReturnStatementKindWithStatementKindSwitchStatementKindLabeledStatementKindThrowStatementKindTryStatementKindDebuggerStatementKindVariableDeclarationKindVariableDeclarationListKindFunctionDeclarationKindClassDeclarationKindInterfaceDeclarationKindTypeAliasDeclarationKindEnumDeclarationKindModuleDeclarationKindModuleBlockKindCaseBlockKindNamespaceExportDeclarationKindImportEqualsDeclarationKindImportDeclarationKindImportClauseKindNamespaceImportKindNamedImportsKindImportSpecifierKindExportAssignmentKindExportDeclarationKindNamedExportsKindNamespaceExportKindExportSpecifierKindMissingDeclarationKindExternalModuleReferenceKindJsxElementKindJsxSelfClosingElementKindJsxOpeningElementKindJsxClosingElementKindJsxFragmentKindJsxOpeningFragmentKindJsxClosingFragmentKindJsxAttributeKindJsxAttributesKindJsxSpreadAttributeKindJsxExpressionKindJsxNamespacedNameKindCaseClauseKindDefaultClauseKindHeritageClauseKindCatchClauseKindImportAttributesKindImportAttributeKindPropertyAssignmentKindShorthandPropertyAssignmentKindSpreadAssignmentKindEnumMemberKindSourceFileKindJSDocTypeExpressionKindJSDocNameReferenceKindJSDocAllTypeKindJSDocNullableTypeKindJSDocNonNullableTypeKindJSDocOptionalTypeKindJSDocVariadicTypeKindJSDocKindJSDocTextKindJSDocTypeLiteralKindJSDocSignatureKindJSDocLinkKindJSDocLinkCodeKindJSDocLinkPlainKindJSDocUnknownTagKindJSDocAugmentsTagKindJSDocImplementsTagKindJSDocDeprecatedTagKindJSDocPublicTagKindJSDocPrivateTagKindJSDocProtectedTagKindJSDocReadonlyTagKindJSDocOverrideTagKindJSDocCallbackTagKindJSDocOverloadTagKindJSDocParameterTagKindJSDocReturnTagKindJSDocThisTagKindJSDocTypeTagKindJSDocTemplateTagKindJSDocTypedefTagKindJSDocSeeTagKindJSDocPropertyTagKindJSDocThrowsTagKindJSDocSatisfiesTagKindJSDocImportTagKindSyntaxListKindJSTypeAliasDeclarationKindJSImportDeclarationKindNotEmittedStatementKindPartiallyEmittedExpressionKindSyntheticReferenceExpressionKindNotEmittedTypeElementkindFlowSwitchClauseDatakindFlowReduceLabelData" +const _Kind_name = "KindUnknownKindEndOfFileKindSingleLineCommentTriviaKindMultiLineCommentTriviaKindNewLineTriviaKindWhitespaceTriviaKindConflictMarkerTriviaKindNonTextFileMarkerTriviaKindNumericLiteralKindBigIntLiteralKindStringLiteralKindJsxTextKindJsxTextAllWhiteSpacesKindRegularExpressionLiteralKindNoSubstitutionTemplateLiteralKindTemplateHeadKindTemplateMiddleKindTemplateTailKindOpenBraceTokenKindCloseBraceTokenKindOpenParenTokenKindCloseParenTokenKindOpenBracketTokenKindCloseBracketTokenKindDotTokenKindDotDotDotTokenKindSemicolonTokenKindCommaTokenKindQuestionDotTokenKindLessThanTokenKindLessThanSlashTokenKindGreaterThanTokenKindLessThanEqualsTokenKindGreaterThanEqualsTokenKindEqualsEqualsTokenKindExclamationEqualsTokenKindEqualsEqualsEqualsTokenKindExclamationEqualsEqualsTokenKindEqualsGreaterThanTokenKindPlusTokenKindMinusTokenKindAsteriskTokenKindAsteriskAsteriskTokenKindSlashTokenKindPercentTokenKindPlusPlusTokenKindMinusMinusTokenKindLessThanLessThanTokenKindGreaterThanGreaterThanTokenKindGreaterThanGreaterThanGreaterThanTokenKindAmpersandTokenKindBarTokenKindCaretTokenKindExclamationTokenKindTildeTokenKindAmpersandAmpersandTokenKindBarBarTokenKindQuestionTokenKindColonTokenKindAtTokenKindQuestionQuestionTokenKindBacktickTokenKindHashTokenKindEqualsTokenKindPlusEqualsTokenKindMinusEqualsTokenKindAsteriskEqualsTokenKindAsteriskAsteriskEqualsTokenKindSlashEqualsTokenKindPercentEqualsTokenKindLessThanLessThanEqualsTokenKindGreaterThanGreaterThanEqualsTokenKindGreaterThanGreaterThanGreaterThanEqualsTokenKindAmpersandEqualsTokenKindBarEqualsTokenKindBarBarEqualsTokenKindAmpersandAmpersandEqualsTokenKindQuestionQuestionEqualsTokenKindCaretEqualsTokenKindIdentifierKindPrivateIdentifierKindJSDocCommentTextTokenKindBreakKeywordKindCaseKeywordKindCatchKeywordKindClassKeywordKindConstKeywordKindContinueKeywordKindDebuggerKeywordKindDefaultKeywordKindDeleteKeywordKindDoKeywordKindElseKeywordKindEnumKeywordKindExportKeywordKindExtendsKeywordKindFalseKeywordKindFinallyKeywordKindForKeywordKindFunctionKeywordKindIfKeywordKindImportKeywordKindInKeywordKindInstanceOfKeywordKindNewKeywordKindNullKeywordKindReturnKeywordKindSuperKeywordKindSwitchKeywordKindThisKeywordKindThrowKeywordKindTrueKeywordKindTryKeywordKindTypeOfKeywordKindVarKeywordKindVoidKeywordKindWhileKeywordKindWithKeywordKindImplementsKeywordKindInterfaceKeywordKindLetKeywordKindPackageKeywordKindPrivateKeywordKindProtectedKeywordKindPublicKeywordKindStaticKeywordKindYieldKeywordKindAbstractKeywordKindAccessorKeywordKindAsKeywordKindAssertsKeywordKindAssertKeywordKindAnyKeywordKindAsyncKeywordKindAwaitKeywordKindBooleanKeywordKindConstructorKeywordKindDeclareKeywordKindGetKeywordKindImmediateKeywordKindInferKeywordKindIntrinsicKeywordKindIsKeywordKindKeyOfKeywordKindModuleKeywordKindNamespaceKeywordKindNeverKeywordKindOutKeywordKindReadonlyKeywordKindRequireKeywordKindNumberKeywordKindObjectKeywordKindSatisfiesKeywordKindSetKeywordKindStringKeywordKindSymbolKeywordKindTypeKeywordKindUndefinedKeywordKindUniqueKeywordKindUnknownKeywordKindUsingKeywordKindFromKeywordKindGlobalKeywordKindBigIntKeywordKindOverrideKeywordKindOfKeywordKindDeferKeywordKindQualifiedNameKindComputedPropertyNameKindTypeParameterKindParameterKindDecoratorKindPropertySignatureKindPropertyDeclarationKindMethodSignatureKindMethodDeclarationKindClassStaticBlockDeclarationKindConstructorKindGetAccessorKindSetAccessorKindCallSignatureKindConstructSignatureKindIndexSignatureKindTypePredicateKindTypeReferenceKindFunctionTypeKindConstructorTypeKindTypeQueryKindTypeLiteralKindArrayTypeKindTupleTypeKindOptionalTypeKindRestTypeKindUnionTypeKindIntersectionTypeKindConditionalTypeKindInferTypeKindParenthesizedTypeKindThisTypeKindTypeOperatorKindIndexedAccessTypeKindMappedTypeKindLiteralTypeKindNamedTupleMemberKindTemplateLiteralTypeKindTemplateLiteralTypeSpanKindImportTypeKindObjectBindingPatternKindArrayBindingPatternKindBindingElementKindArrayLiteralExpressionKindObjectLiteralExpressionKindPropertyAccessExpressionKindElementAccessExpressionKindCallExpressionKindNewExpressionKindTaggedTemplateExpressionKindTypeAssertionExpressionKindParenthesizedExpressionKindFunctionExpressionKindArrowFunctionKindDeleteExpressionKindTypeOfExpressionKindVoidExpressionKindAwaitExpressionKindPrefixUnaryExpressionKindPostfixUnaryExpressionKindBinaryExpressionKindConditionalExpressionKindTemplateExpressionKindYieldExpressionKindSpreadElementKindClassExpressionKindOmittedExpressionKindExpressionWithTypeArgumentsKindAsExpressionKindNonNullExpressionKindMetaPropertyKindSyntheticExpressionKindSatisfiesExpressionKindTemplateSpanKindSemicolonClassElementKindBlockKindEmptyStatementKindVariableStatementKindExpressionStatementKindIfStatementKindDoStatementKindWhileStatementKindForStatementKindForInStatementKindForOfStatementKindContinueStatementKindBreakStatementKindReturnStatementKindWithStatementKindSwitchStatementKindLabeledStatementKindThrowStatementKindTryStatementKindDebuggerStatementKindVariableDeclarationKindVariableDeclarationListKindFunctionDeclarationKindClassDeclarationKindInterfaceDeclarationKindTypeAliasDeclarationKindEnumDeclarationKindModuleDeclarationKindModuleBlockKindCaseBlockKindNamespaceExportDeclarationKindImportEqualsDeclarationKindImportDeclarationKindImportClauseKindNamespaceImportKindNamedImportsKindImportSpecifierKindExportAssignmentKindExportDeclarationKindNamedExportsKindNamespaceExportKindExportSpecifierKindMissingDeclarationKindExternalModuleReferenceKindJsxElementKindJsxSelfClosingElementKindJsxOpeningElementKindJsxClosingElementKindJsxFragmentKindJsxOpeningFragmentKindJsxClosingFragmentKindJsxAttributeKindJsxAttributesKindJsxSpreadAttributeKindJsxExpressionKindJsxNamespacedNameKindCaseClauseKindDefaultClauseKindHeritageClauseKindCatchClauseKindImportAttributesKindImportAttributeKindPropertyAssignmentKindShorthandPropertyAssignmentKindSpreadAssignmentKindEnumMemberKindSourceFileKindJSDocTypeExpressionKindJSDocNameReferenceKindJSDocAllTypeKindJSDocNullableTypeKindJSDocNonNullableTypeKindJSDocOptionalTypeKindJSDocVariadicTypeKindJSDocKindJSDocTextKindJSDocTypeLiteralKindJSDocSignatureKindJSDocLinkKindJSDocLinkCodeKindJSDocLinkPlainKindJSDocUnknownTagKindJSDocAugmentsTagKindJSDocImplementsTagKindJSDocDeprecatedTagKindJSDocPublicTagKindJSDocPrivateTagKindJSDocProtectedTagKindJSDocReadonlyTagKindJSDocOverrideTagKindJSDocCallbackTagKindJSDocOverloadTagKindJSDocParameterTagKindJSDocReturnTagKindJSDocThisTagKindJSDocTypeTagKindJSDocTemplateTagKindJSDocTypedefTagKindJSDocSeeTagKindJSDocPropertyTagKindJSDocThrowsTagKindJSDocSatisfiesTagKindJSDocImportTagKindSyntaxListKindJSTypeAliasDeclarationKindJSImportDeclarationKindNotEmittedStatementKindPartiallyEmittedExpressionKindSyntheticReferenceExpressionKindNotEmittedTypeElementKindCountkindFlowSwitchClauseDatakindFlowReduceLabelData" -var _Kind_index = [...]uint16{0, 11, 24, 51, 77, 94, 114, 138, 165, 183, 200, 217, 228, 253, 281, 314, 330, 348, 364, 382, 401, 419, 438, 458, 479, 491, 509, 527, 541, 561, 578, 600, 620, 643, 669, 690, 716, 743, 775, 801, 814, 828, 845, 870, 884, 900, 917, 936, 961, 992, 1034, 1052, 1064, 1078, 1098, 1112, 1139, 1154, 1171, 1185, 1196, 1221, 1238, 1251, 1266, 1285, 1305, 1328, 1359, 1379, 1401, 1432, 1469, 1517, 1541, 1559, 1580, 1613, 1644, 1664, 1678, 1699, 1724, 1740, 1755, 1771, 1787, 1803, 1822, 1841, 1859, 1876, 1889, 1904, 1919, 1936, 1954, 1970, 1988, 2002, 2021, 2034, 2051, 2064, 2085, 2099, 2114, 2131, 2147, 2164, 2179, 2195, 2210, 2224, 2241, 2255, 2270, 2286, 2301, 2322, 2342, 2356, 2374, 2392, 2412, 2429, 2446, 2462, 2481, 2500, 2513, 2531, 2548, 2562, 2578, 2594, 2612, 2634, 2652, 2666, 2686, 2702, 2722, 2735, 2751, 2768, 2788, 2804, 2818, 2837, 2855, 2872, 2889, 2909, 2923, 2940, 2957, 2972, 2992, 3009, 3027, 3043, 3058, 3075, 3092, 3111, 3124, 3140, 3157, 3181, 3198, 3211, 3224, 3245, 3268, 3287, 3308, 3339, 3354, 3369, 3384, 3401, 3423, 3441, 3458, 3475, 3491, 3510, 3523, 3538, 3551, 3564, 3580, 3592, 3605, 3625, 3644, 3657, 3678, 3690, 3706, 3727, 3741, 3756, 3776, 3799, 3826, 3840, 3864, 3887, 3905, 3931, 3958, 3986, 4013, 4031, 4048, 4076, 4103, 4130, 4152, 4169, 4189, 4209, 4227, 4246, 4271, 4297, 4317, 4342, 4364, 4383, 4400, 4419, 4440, 4471, 4487, 4508, 4524, 4547, 4570, 4586, 4611, 4620, 4638, 4659, 4682, 4697, 4712, 4730, 4746, 4764, 4782, 4803, 4821, 4840, 4857, 4876, 4896, 4914, 4930, 4951, 4974, 5001, 5024, 5044, 5068, 5092, 5111, 5132, 5147, 5160, 5190, 5217, 5238, 5254, 5273, 5289, 5308, 5328, 5349, 5365, 5384, 5403, 5425, 5452, 5466, 5491, 5512, 5533, 5548, 5570, 5592, 5608, 5625, 5647, 5664, 5685, 5699, 5716, 5734, 5749, 5769, 5788, 5810, 5841, 5861, 5875, 5889, 5912, 5934, 5950, 5971, 5995, 6016, 6037, 6046, 6059, 6079, 6097, 6110, 6127, 6145, 6164, 6184, 6206, 6228, 6246, 6265, 6286, 6306, 6326, 6346, 6366, 6387, 6405, 6421, 6437, 6457, 6476, 6491, 6511, 6529, 6550, 6568, 6582, 6608, 6631, 6654, 6684, 6716, 6741, 6765, 6788} +var _Kind_index = [...]uint16{0, 11, 24, 51, 77, 94, 114, 138, 165, 183, 200, 217, 228, 253, 281, 314, 330, 348, 364, 382, 401, 419, 438, 458, 479, 491, 509, 527, 541, 561, 578, 600, 620, 643, 669, 690, 716, 743, 775, 801, 814, 828, 845, 870, 884, 900, 917, 936, 961, 992, 1034, 1052, 1064, 1078, 1098, 1112, 1139, 1154, 1171, 1185, 1196, 1221, 1238, 1251, 1266, 1285, 1305, 1328, 1359, 1379, 1401, 1432, 1469, 1517, 1541, 1559, 1580, 1613, 1644, 1664, 1678, 1699, 1724, 1740, 1755, 1771, 1787, 1803, 1822, 1841, 1859, 1876, 1889, 1904, 1919, 1936, 1954, 1970, 1988, 2002, 2021, 2034, 2051, 2064, 2085, 2099, 2114, 2131, 2147, 2164, 2179, 2195, 2210, 2224, 2241, 2255, 2270, 2286, 2301, 2322, 2342, 2356, 2374, 2392, 2412, 2429, 2446, 2462, 2481, 2500, 2513, 2531, 2548, 2562, 2578, 2594, 2612, 2634, 2652, 2666, 2686, 2702, 2722, 2735, 2751, 2768, 2788, 2804, 2818, 2837, 2855, 2872, 2889, 2909, 2923, 2940, 2957, 2972, 2992, 3009, 3027, 3043, 3058, 3075, 3092, 3111, 3124, 3140, 3157, 3181, 3198, 3211, 3224, 3245, 3268, 3287, 3308, 3339, 3354, 3369, 3384, 3401, 3423, 3441, 3458, 3475, 3491, 3510, 3523, 3538, 3551, 3564, 3580, 3592, 3605, 3625, 3644, 3657, 3678, 3690, 3706, 3727, 3741, 3756, 3776, 3799, 3826, 3840, 3864, 3887, 3905, 3931, 3958, 3986, 4013, 4031, 4048, 4076, 4103, 4130, 4152, 4169, 4189, 4209, 4227, 4246, 4271, 4297, 4317, 4342, 4364, 4383, 4400, 4419, 4440, 4471, 4487, 4508, 4524, 4547, 4570, 4586, 4611, 4620, 4638, 4659, 4682, 4697, 4712, 4730, 4746, 4764, 4782, 4803, 4821, 4840, 4857, 4876, 4896, 4914, 4930, 4951, 4974, 5001, 5024, 5044, 5068, 5092, 5111, 5132, 5147, 5160, 5190, 5217, 5238, 5254, 5273, 5289, 5308, 5328, 5349, 5365, 5384, 5403, 5425, 5452, 5466, 5491, 5512, 5533, 5548, 5570, 5592, 5608, 5625, 5647, 5664, 5685, 5699, 5716, 5734, 5749, 5769, 5788, 5810, 5841, 5861, 5875, 5889, 5912, 5934, 5950, 5971, 5995, 6016, 6037, 6046, 6059, 6079, 6097, 6110, 6127, 6145, 6164, 6184, 6206, 6228, 6246, 6265, 6286, 6306, 6326, 6346, 6366, 6387, 6405, 6421, 6437, 6457, 6476, 6491, 6511, 6529, 6550, 6568, 6582, 6608, 6631, 6654, 6684, 6716, 6741, 6750, 6774, 6797} func (i Kind) String() string { idx := int(i) - 0