package ast
import (
"fmt"
"iter"
"strings"
"sync"
"sync/atomic"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/collections"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/core"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/tspath"
)
// Visitor
type Visitor func(*Node) bool
func visit(v Visitor, node *Node) bool {
if node != nil {
return v(node)
}
return false
}
func visitNodes(v Visitor, nodes []*Node) bool {
for _, node := range nodes {
if v(node) {
return true
}
}
return false
}
func visitNodeList(v Visitor, nodeList *NodeList) bool {
if nodeList != nil {
return visitNodes(v, nodeList.Nodes)
}
return false
}
func visitModifiers(v Visitor, modifiers *ModifierList) bool {
if modifiers != nil {
return visitNodes(v, modifiers.Nodes)
}
return false
}
// NodeFactory
type NodeFactory struct {
hooks NodeFactoryHooks
arrayTypeNodePool core.Pool[ArrayTypeNode]
binaryExpressionPool core.Pool[BinaryExpression]
blockPool core.Pool[Block]
callExpressionPool core.Pool[CallExpression]
conditionalExpressionPool core.Pool[ConditionalExpression]
constructSignatureDeclarationPool core.Pool[ConstructSignatureDeclaration]
elementAccessExpressionPool core.Pool[ElementAccessExpression]
expressionStatementPool core.Pool[ExpressionStatement]
expressionWithTypeArgumentsPool core.Pool[ExpressionWithTypeArguments]
functionDeclarationPool core.Pool[FunctionDeclaration]
functionTypeNodePool core.Pool[FunctionTypeNode]
heritageClausePool core.Pool[HeritageClause]
identifierPool core.Pool[Identifier]
ifStatementPool core.Pool[IfStatement]
importSpecifierPool core.Pool[ImportSpecifier]
indexedAccessTypeNodePool core.Pool[IndexedAccessTypeNode]
interfaceDeclarationPool core.Pool[InterfaceDeclaration]
intersectionTypeNodePool core.Pool[IntersectionTypeNode]
jsdocDeprecatedTagPool core.Pool[JSDocDeprecatedTag]
jsdocParameterOrPropertyTagPool core.Pool[JSDocParameterOrPropertyTag]
jsdocPool core.Pool[JSDoc]
jsdocTextPool core.Pool[JSDocText]
jsdocUnknownTagPool core.Pool[JSDocUnknownTag]
keywordExpressionPool core.Pool[KeywordExpression]
keywordTypeNodePool core.Pool[KeywordTypeNode]
literalTypeNodePool core.Pool[LiteralTypeNode]
methodSignatureDeclarationPool core.Pool[MethodSignatureDeclaration]
modifierListPool core.Pool[ModifierList]
nodeListPool core.Pool[NodeList]
numericLiteralPool core.Pool[NumericLiteral]
parameterDeclarationPool core.Pool[ParameterDeclaration]
parenthesizedExpressionPool core.Pool[ParenthesizedExpression]
parenthesizedTypeNodePool core.Pool[ParenthesizedTypeNode]
prefixUnaryExpressionPool core.Pool[PrefixUnaryExpression]
propertyAccessExpressionPool core.Pool[PropertyAccessExpression]
propertyAssignmentPool core.Pool[PropertyAssignment]
propertySignatureDeclarationPool core.Pool[PropertySignatureDeclaration]
returnStatementPool core.Pool[ReturnStatement]
stringLiteralPool core.Pool[StringLiteral]
tokenPool core.Pool[Token]
typeAliasDeclarationPool core.Pool[TypeAliasDeclaration]
typeLiteralNodePool core.Pool[TypeLiteralNode]
typeOperatorNodePool core.Pool[TypeOperatorNode]
typeParameterDeclarationPool core.Pool[TypeParameterDeclaration]
typeReferenceNodePool core.Pool[TypeReferenceNode]
unionTypeNodePool core.Pool[UnionTypeNode]
variableDeclarationListPool core.Pool[VariableDeclarationList]
variableDeclarationPool core.Pool[VariableDeclaration]
variableStatementPool core.Pool[VariableStatement]
nodeCount int
textCount int
}
type NodeFactoryHooks struct {
OnCreate func(node *Node) // Hooks the creation of a node.
OnUpdate func(node *Node, original *Node) // Hooks the updating of a node.
OnClone func(node *Node, original *Node) // Hooks the cloning of a node.
}
type NodeFactoryCoercible interface {
AsNodeFactory() *NodeFactory
}
func NewNodeFactory(hooks NodeFactoryHooks) *NodeFactory {
return &NodeFactory{hooks: hooks}
}
func newNode(kind Kind, data nodeData, hooks NodeFactoryHooks) *Node {
n := data.AsNode()
n.Loc = core.UndefinedTextRange()
n.Kind = kind
n.data = data
if hooks.OnCreate != nil {
hooks.OnCreate(n)
}
return n
}
func (f *NodeFactory) newNode(kind Kind, data nodeData) *Node {
f.nodeCount++
return newNode(kind, data, f.hooks)
}
func (f *NodeFactory) NodeCount() int {
return f.nodeCount
}
func (f *NodeFactory) TextCount() int {
return f.textCount
}
func (f *NodeFactory) AsNodeFactory() *NodeFactory {
return f
}
func updateNode(updated *Node, original *Node, hooks NodeFactoryHooks) *Node {
if updated != original {
updated.Flags = original.Flags
updated.Loc = original.Loc
if hooks.OnUpdate != nil {
hooks.OnUpdate(updated, original)
}
}
return updated
}
func cloneNode(updated *Node, original *Node, hooks NodeFactoryHooks) *Node {
updateNode(updated, original, hooks)
if updated != original && hooks.OnClone != nil {
hooks.OnClone(updated, original)
}
return updated
}
// NodeList
type NodeList struct {
Loc core.TextRange
Nodes []*Node
}
func (f *NodeFactory) NewNodeList(nodes []*Node) *NodeList {
list := f.nodeListPool.New()
list.Loc = core.UndefinedTextRange()
list.Nodes = nodes
return list
}
func (list *NodeList) Pos() int { return list.Loc.Pos() }
func (list *NodeList) End() int { return list.Loc.End() }
func (list *NodeList) HasTrailingComma() bool {
if len(list.Nodes) == 0 {
return false
}
last := list.Nodes[len(list.Nodes)-1]
return last.End() < list.End()
}
func (list *NodeList) Clone(f NodeFactoryCoercible) *NodeList {
result := f.AsNodeFactory().NewNodeList(list.Nodes)
result.Loc = list.Loc
return result
}
// ModifierList
type ModifierList struct {
NodeList
ModifierFlags ModifierFlags
}
func (f *NodeFactory) NewModifierList(nodes []*Node) *ModifierList {
list := f.modifierListPool.New()
list.Loc = core.UndefinedTextRange()
list.Nodes = nodes
list.ModifierFlags = ModifiersToFlags(nodes)
return list
}
func (list *ModifierList) Clone(f *NodeFactory) *ModifierList {
res := f.modifierListPool.New()
res.Loc = list.Loc
res.Nodes = list.Nodes
res.ModifierFlags = list.ModifierFlags
return res
}
// AST Node
// 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 {
Kind Kind
Flags NodeFlags
Loc core.TextRange
id atomic.Uint64
Parent *Node
data nodeData
}
// 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.
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) ForEachChild(v Visitor) bool { return n.data.ForEachChild(v) }
func (n *Node) IterChildren() iter.Seq[*Node] { return n.data.IterChildren() }
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() *LiteralLikeBase { return n.data.LiteralLikeData() }
func (n *Node) TemplateLiteralLikeData() *TemplateLiteralLikeBase {
return n.data.TemplateLiteralLikeData()
}
func (n *Node) KindString() string { return n.Kind.String() }
func (n *Node) KindValue() int16 { return int16(n.Kind) }
type mutableNode Node
func (n *Node) AsMutable() *mutableNode { return (*mutableNode)(n) }
func (n *mutableNode) SetModifiers(modifiers *ModifierList) { n.data.setModifiers(modifiers) }
func (n *Node) Symbol() *Symbol {
data := n.DeclarationData()
if data != nil {
return data.Symbol
}
return nil
}
func (n *Node) LocalSymbol() *Symbol {
data := n.ExportableData()
if data != nil {
return data.LocalSymbol
}
return nil
}
func (n *Node) Locals() SymbolTable {
data := n.LocalsContainerData()
if data != nil {
return data.Locals
}
return nil
}
func (n *Node) Body() *Node {
data := n.BodyData()
if data != nil {
return data.Body
}
return nil
}
func (n *Node) Text() string {
switch n.Kind {
case KindIdentifier:
return n.AsIdentifier().Text
case KindPrivateIdentifier:
return n.AsPrivateIdentifier().Text
case KindStringLiteral:
return n.AsStringLiteral().Text
case KindNumericLiteral:
return n.AsNumericLiteral().Text
case KindBigIntLiteral:
return n.AsBigIntLiteral().Text
case KindMetaProperty:
return n.AsMetaProperty().Name().Text()
case KindNoSubstitutionTemplateLiteral:
return n.AsNoSubstitutionTemplateLiteral().Text
case KindTemplateHead:
return n.AsTemplateHead().Text
case KindTemplateMiddle:
return n.AsTemplateMiddle().Text
case KindTemplateTail:
return n.AsTemplateTail().Text
case KindJsxNamespacedName:
return n.AsJsxNamespacedName().Namespace.Text() + ":" + n.AsJsxNamespacedName().name.Text()
case KindRegularExpressionLiteral:
return n.AsRegularExpressionLiteral().Text
case KindJSDocText:
return strings.Join(n.AsJSDocText().text, "")
case KindJSDocLink:
return strings.Join(n.AsJSDocLink().text, "")
case KindJSDocLinkCode:
return strings.Join(n.AsJSDocLinkCode().text, "")
case KindJSDocLinkPlain:
return strings.Join(n.AsJSDocLinkPlain().text, "")
}
panic(fmt.Sprintf("Unhandled case in Node.Text: %T", n.data))
}
func (n *Node) Expression() *Node {
switch n.Kind {
case KindPropertyAccessExpression:
return n.AsPropertyAccessExpression().Expression
case KindElementAccessExpression:
return n.AsElementAccessExpression().Expression
case KindParenthesizedExpression:
return n.AsParenthesizedExpression().Expression
case KindCallExpression:
return n.AsCallExpression().Expression
case KindNewExpression:
return n.AsNewExpression().Expression
case KindExpressionWithTypeArguments:
return n.AsExpressionWithTypeArguments().Expression
case KindComputedPropertyName:
return n.AsComputedPropertyName().Expression
case KindNonNullExpression:
return n.AsNonNullExpression().Expression
case KindTypeAssertionExpression:
return n.AsTypeAssertion().Expression
case KindAsExpression:
return n.AsAsExpression().Expression
case KindSatisfiesExpression:
return n.AsSatisfiesExpression().Expression
case KindTypeOfExpression:
return n.AsTypeOfExpression().Expression
case KindSpreadAssignment:
return n.AsSpreadAssignment().Expression
case KindSpreadElement:
return n.AsSpreadElement().Expression
case KindTemplateSpan:
return n.AsTemplateSpan().Expression
case KindDeleteExpression:
return n.AsDeleteExpression().Expression
case KindVoidExpression:
return n.AsVoidExpression().Expression
case KindAwaitExpression:
return n.AsAwaitExpression().Expression
case KindYieldExpression:
return n.AsYieldExpression().Expression
case KindPartiallyEmittedExpression:
return n.AsPartiallyEmittedExpression().Expression
case KindIfStatement:
return n.AsIfStatement().Expression
case KindDoStatement:
return n.AsDoStatement().Expression
case KindWhileStatement:
return n.AsWhileStatement().Expression
case KindWithStatement:
return n.AsWithStatement().Expression
case KindForInStatement, KindForOfStatement:
return n.AsForInOrOfStatement().Expression
case KindSwitchStatement:
return n.AsSwitchStatement().Expression
case KindCaseClause:
return n.AsCaseOrDefaultClause().Expression
case KindExpressionStatement:
return n.AsExpressionStatement().Expression
case KindReturnStatement:
return n.AsReturnStatement().Expression
case KindThrowStatement:
return n.AsThrowStatement().Expression
case KindExternalModuleReference:
return n.AsExternalModuleReference().Expression
case KindExportAssignment, KindJSExportAssignment:
return n.AsExportAssignment().Expression
case KindDecorator:
return n.AsDecorator().Expression
case KindJsxExpression:
return n.AsJsxExpression().Expression
case KindJsxSpreadAttribute:
return n.AsJsxSpreadAttribute().Expression
}
panic("Unhandled case in Node.Expression: " + n.Kind.String())
}
func (m *mutableNode) SetExpression(expr *Node) {
n := (*Node)(m)
switch n.Kind {
case KindPropertyAccessExpression:
n.AsPropertyAccessExpression().Expression = expr
case KindElementAccessExpression:
n.AsElementAccessExpression().Expression = expr
case KindParenthesizedExpression:
n.AsParenthesizedExpression().Expression = expr
case KindCallExpression:
n.AsCallExpression().Expression = expr
case KindNewExpression:
n.AsNewExpression().Expression = expr
case KindExpressionWithTypeArguments:
n.AsExpressionWithTypeArguments().Expression = expr
case KindComputedPropertyName:
n.AsComputedPropertyName().Expression = expr
case KindNonNullExpression:
n.AsNonNullExpression().Expression = expr
case KindTypeAssertionExpression:
n.AsTypeAssertion().Expression = expr
case KindAsExpression:
n.AsAsExpression().Expression = expr
case KindSatisfiesExpression:
n.AsSatisfiesExpression().Expression = expr
case KindTypeOfExpression:
n.AsTypeOfExpression().Expression = expr
case KindSpreadAssignment:
n.AsSpreadAssignment().Expression = expr
case KindSpreadElement:
n.AsSpreadElement().Expression = expr
case KindTemplateSpan:
n.AsTemplateSpan().Expression = expr
case KindDeleteExpression:
n.AsDeleteExpression().Expression = expr
case KindVoidExpression:
n.AsVoidExpression().Expression = expr
case KindAwaitExpression:
n.AsAwaitExpression().Expression = expr
case KindYieldExpression:
n.AsYieldExpression().Expression = expr
case KindPartiallyEmittedExpression:
n.AsPartiallyEmittedExpression().Expression = expr
case KindIfStatement:
n.AsIfStatement().Expression = expr
case KindDoStatement:
n.AsDoStatement().Expression = expr
case KindWhileStatement:
n.AsWhileStatement().Expression = expr
case KindWithStatement:
n.AsWithStatement().Expression = expr
case KindForInStatement, KindForOfStatement:
n.AsForInOrOfStatement().Expression = expr
case KindSwitchStatement:
n.AsSwitchStatement().Expression = expr
case KindCaseClause:
n.AsCaseOrDefaultClause().Expression = expr
case KindExpressionStatement:
n.AsExpressionStatement().Expression = expr
case KindReturnStatement:
n.AsReturnStatement().Expression = expr
case KindThrowStatement:
n.AsThrowStatement().Expression = expr
case KindExternalModuleReference:
n.AsExternalModuleReference().Expression = expr
case KindExportAssignment, KindJSExportAssignment:
n.AsExportAssignment().Expression = expr
case KindDecorator:
n.AsDecorator().Expression = expr
case KindJsxExpression:
n.AsJsxExpression().Expression = expr
case KindJsxSpreadAttribute:
n.AsJsxSpreadAttribute().Expression = expr
default:
panic("Unhandled case in mutableNode.SetExpression: " + n.Kind.String())
}
}
func (n *Node) ArgumentList() *NodeList {
switch n.Kind {
case KindCallExpression:
return n.AsCallExpression().Arguments
case KindNewExpression:
return n.AsNewExpression().Arguments
}
panic("Unhandled case in Node.Arguments: " + n.Kind.String())
}
func (n *Node) Arguments() []*Node {
list := n.ArgumentList()
if list != nil {
return list.Nodes
}
return nil
}
func (n *Node) TypeArgumentList() *NodeList {
switch n.Kind {
case KindCallExpression:
return n.AsCallExpression().TypeArguments
case KindNewExpression:
return n.AsNewExpression().TypeArguments
case KindTaggedTemplateExpression:
return n.AsTaggedTemplateExpression().TypeArguments
case KindTypeReference:
return n.AsTypeReference().TypeArguments
case KindExpressionWithTypeArguments:
return n.AsExpressionWithTypeArguments().TypeArguments
case KindImportType:
return n.AsImportTypeNode().TypeArguments
case KindTypeQuery:
return n.AsTypeQueryNode().TypeArguments
case KindJsxOpeningElement:
return n.AsJsxOpeningElement().TypeArguments
case KindJsxSelfClosingElement:
return n.AsJsxSelfClosingElement().TypeArguments
}
panic("Unhandled case in Node.TypeArguments")
}
func (n *Node) TypeArguments() []*Node {
list := n.TypeArgumentList()
if list != nil {
return list.Nodes
}
return nil
}
func (n *Node) TypeParameterList() *NodeList {
switch n.Kind {
case KindClassDeclaration:
return n.AsClassDeclaration().TypeParameters
case KindClassExpression:
return n.AsClassExpression().TypeParameters
case KindInterfaceDeclaration:
return n.AsInterfaceDeclaration().TypeParameters
case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration:
return n.AsTypeAliasDeclaration().TypeParameters
case KindJSDocTemplateTag:
return n.AsJSDocTemplateTag().TypeParameters
default:
funcLike := n.FunctionLikeData()
if funcLike != nil {
return funcLike.TypeParameters
}
}
panic("Unhandled case in Node.TypeParameterList")
}
func (n *Node) TypeParameters() []*Node {
list := n.TypeParameterList()
if list != nil {
return list.Nodes
}
return nil
}
func (n *Node) MemberList() *NodeList {
switch n.Kind {
case KindClassDeclaration:
return n.AsClassDeclaration().Members
case KindClassExpression:
return n.AsClassExpression().Members
case KindInterfaceDeclaration:
return n.AsInterfaceDeclaration().Members
case KindEnumDeclaration:
return n.AsEnumDeclaration().Members
case KindTypeLiteral:
return n.AsTypeLiteralNode().Members
case KindMappedType:
return n.AsMappedTypeNode().Members
}
panic("Unhandled case in Node.MemberList: " + n.Kind.String())
}
func (n *Node) Members() []*Node {
list := n.MemberList()
if list != nil {
return list.Nodes
}
return nil
}
func (n *Node) StatementList() *NodeList {
switch n.Kind {
case KindSourceFile:
return n.AsSourceFile().Statements
case KindBlock:
return n.AsBlock().Statements
case KindModuleBlock:
return n.AsModuleBlock().Statements
}
panic("Unhandled case in Node.StatementList: " + n.Kind.String())
}
func (n *Node) Statements() []*Node {
list := n.StatementList()
if list != nil {
return list.Nodes
}
return nil
}
func (n *Node) ModifierFlags() ModifierFlags {
modifiers := n.Modifiers()
if modifiers != nil {
return modifiers.ModifierFlags
}
return ModifierFlagsNone
}
func (n *Node) ModifierNodes() []*Node {
modifiers := n.Modifiers()
if modifiers != nil {
return modifiers.Nodes
}
return nil
}
func (n *Node) Type() *Node {
switch n.Kind {
case KindVariableDeclaration:
return n.AsVariableDeclaration().Type
case KindParameter:
return n.AsParameterDeclaration().Type
case KindPropertySignature:
return n.AsPropertySignatureDeclaration().Type
case KindPropertyDeclaration:
return n.AsPropertyDeclaration().Type
case KindPropertyAssignment:
return n.AsPropertyAssignment().Type
case KindShorthandPropertyAssignment:
return n.AsShorthandPropertyAssignment().Type
case KindTypePredicate:
return n.AsTypePredicateNode().Type
case KindParenthesizedType:
return n.AsParenthesizedTypeNode().Type
case KindTypeOperator:
return n.AsTypeOperatorNode().Type
case KindMappedType:
return n.AsMappedTypeNode().Type
case KindTypeAssertionExpression:
return n.AsTypeAssertion().Type
case KindAsExpression:
return n.AsAsExpression().Type
case KindSatisfiesExpression:
return n.AsSatisfiesExpression().Type
case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration:
return n.AsTypeAliasDeclaration().Type
case KindNamedTupleMember:
return n.AsNamedTupleMember().Type
case KindOptionalType:
return n.AsOptionalTypeNode().Type
case KindRestType:
return n.AsRestTypeNode().Type
case KindTemplateLiteralTypeSpan:
return n.AsTemplateLiteralTypeSpan().Type
case KindJSDocTypeExpression:
return n.AsJSDocTypeExpression().Type
case KindJSDocParameterTag, KindJSDocPropertyTag:
return n.AsJSDocParameterOrPropertyTag().TypeExpression
case KindJSDocNullableType:
return n.AsJSDocNullableType().Type
case KindJSDocNonNullableType:
return n.AsJSDocNonNullableType().Type
case KindJSDocOptionalType:
return n.AsJSDocOptionalType().Type
case KindExportAssignment, KindJSExportAssignment:
return n.AsExportAssignment().Type
case KindCommonJSExport:
return n.AsCommonJSExport().Type
case KindBinaryExpression:
return n.AsBinaryExpression().Type
default:
if funcLike := n.FunctionLikeData(); funcLike != nil {
return funcLike.Type
}
}
return nil
}
func (m *mutableNode) SetType(t *Node) {
n := (*Node)(m)
switch m.Kind {
case KindVariableDeclaration:
n.AsVariableDeclaration().Type = t
case KindParameter:
n.AsParameterDeclaration().Type = t
case KindPropertySignature:
n.AsPropertySignatureDeclaration().Type = t
case KindPropertyDeclaration:
n.AsPropertyDeclaration().Type = t
case KindPropertyAssignment:
n.AsPropertyAssignment().Type = t
case KindShorthandPropertyAssignment:
n.AsShorthandPropertyAssignment().Type = t
case KindTypePredicate:
n.AsTypePredicateNode().Type = t
case KindParenthesizedType:
n.AsParenthesizedTypeNode().Type = t
case KindTypeOperator:
n.AsTypeOperatorNode().Type = t
case KindMappedType:
n.AsMappedTypeNode().Type = t
case KindTypeAssertionExpression:
n.AsTypeAssertion().Type = t
case KindAsExpression:
n.AsAsExpression().Type = t
case KindSatisfiesExpression:
n.AsSatisfiesExpression().Type = t
case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration:
n.AsTypeAliasDeclaration().Type = t
case KindNamedTupleMember:
n.AsNamedTupleMember().Type = t
case KindOptionalType:
n.AsOptionalTypeNode().Type = t
case KindRestType:
n.AsRestTypeNode().Type = t
case KindTemplateLiteralTypeSpan:
n.AsTemplateLiteralTypeSpan().Type = t
case KindJSDocTypeExpression:
n.AsJSDocTypeExpression().Type = t
case KindJSDocParameterTag, KindJSDocPropertyTag:
n.AsJSDocParameterOrPropertyTag().TypeExpression = t
case KindJSDocNullableType:
n.AsJSDocNullableType().Type = t
case KindJSDocNonNullableType:
n.AsJSDocNonNullableType().Type = t
case KindJSDocOptionalType:
n.AsJSDocOptionalType().Type = t
case KindExportAssignment, KindJSExportAssignment:
n.AsExportAssignment().Type = t
case KindCommonJSExport:
n.AsCommonJSExport().Type = t
case KindBinaryExpression:
n.AsBinaryExpression().Type = t
default:
if funcLike := n.FunctionLikeData(); funcLike != nil {
funcLike.Type = t
} else {
panic("Unhandled case in mutableNode.SetType: " + n.Kind.String())
}
}
}
func (n *Node) Initializer() *Node {
switch n.Kind {
case KindVariableDeclaration:
return n.AsVariableDeclaration().Initializer
case KindParameter:
return n.AsParameterDeclaration().Initializer
case KindBindingElement:
return n.AsBindingElement().Initializer
case KindPropertyDeclaration:
return n.AsPropertyDeclaration().Initializer
case KindPropertySignature:
return n.AsPropertySignatureDeclaration().Initializer
case KindPropertyAssignment:
return n.AsPropertyAssignment().Initializer
case KindEnumMember:
return n.AsEnumMember().Initializer
case KindForStatement:
return n.AsForStatement().Initializer
case KindForInStatement, KindForOfStatement:
return n.AsForInOrOfStatement().Initializer
case KindJsxAttribute:
return n.AsJsxAttribute().Initializer
case KindCommonJSExport:
return n.AsCommonJSExport().Initializer
}
panic("Unhandled case in Node.Initializer")
}
func (m *mutableNode) SetInitializer(initializer *Node) {
n := (*Node)(m)
switch n.Kind {
case KindVariableDeclaration:
n.AsVariableDeclaration().Initializer = initializer
case KindParameter:
n.AsParameterDeclaration().Initializer = initializer
case KindBindingElement:
n.AsBindingElement().Initializer = initializer
case KindPropertyDeclaration:
n.AsPropertyDeclaration().Initializer = initializer
case KindPropertySignature:
n.AsPropertySignatureDeclaration().Initializer = initializer
case KindPropertyAssignment:
n.AsPropertyAssignment().Initializer = initializer
case KindEnumMember:
n.AsEnumMember().Initializer = initializer
case KindForStatement:
n.AsForStatement().Initializer = initializer
case KindForInStatement, KindForOfStatement:
n.AsForInOrOfStatement().Initializer = initializer
case KindJsxAttribute:
n.AsJsxAttribute().Initializer = initializer
case KindCommonJSExport:
n.AsCommonJSExport().Initializer = initializer
default:
panic("Unhandled case in mutableNode.SetInitializer")
}
}
func (n *Node) TagName() *Node {
switch n.Kind {
case KindJsxOpeningElement:
return n.AsJsxOpeningElement().TagName
case KindJsxClosingElement:
return n.AsJsxClosingElement().TagName
case KindJsxSelfClosingElement:
return n.AsJsxSelfClosingElement().TagName
case KindJSDocTag:
return n.AsJSDocUnknownTag().TagName
case KindJSDocAugmentsTag:
return n.AsJSDocAugmentsTag().TagName
case KindJSDocImplementsTag:
return n.AsJSDocImplementsTag().TagName
case KindJSDocDeprecatedTag:
return n.AsJSDocDeprecatedTag().TagName
case KindJSDocPublicTag:
return n.AsJSDocPublicTag().TagName
case KindJSDocPrivateTag:
return n.AsJSDocPrivateTag().TagName
case KindJSDocProtectedTag:
return n.AsJSDocProtectedTag().TagName
case KindJSDocReadonlyTag:
return n.AsJSDocReadonlyTag().TagName
case KindJSDocOverrideTag:
return n.AsJSDocOverrideTag().TagName
case KindJSDocCallbackTag:
return n.AsJSDocCallbackTag().TagName
case KindJSDocOverloadTag:
return n.AsJSDocOverloadTag().TagName
case KindJSDocParameterTag, KindJSDocPropertyTag:
return n.AsJSDocParameterOrPropertyTag().TagName
case KindJSDocReturnTag:
return n.AsJSDocReturnTag().TagName
case KindJSDocThisTag:
return n.AsJSDocThisTag().TagName
case KindJSDocTypeTag:
return n.AsJSDocTypeTag().TagName
case KindJSDocTemplateTag:
return n.AsJSDocTemplateTag().TagName
case KindJSDocTypedefTag:
return n.AsJSDocTypedefTag().TagName
case KindJSDocSeeTag:
return n.AsJSDocSeeTag().TagName
case KindJSDocSatisfiesTag:
return n.AsJSDocSatisfiesTag().TagName
case KindJSDocImportTag:
return n.AsJSDocImportTag().TagName
}
panic("Unhandled case in Node.TagName: " + n.Kind.String())
}
func (n *Node) PropertyName() *Node {
switch n.Kind {
case KindImportSpecifier:
return n.AsImportSpecifier().PropertyName
case KindExportSpecifier:
return n.AsExportSpecifier().PropertyName
case KindBindingElement:
return n.AsBindingElement().PropertyName
}
return nil
}
func (n *Node) PropertyNameOrName() *Node {
name := n.PropertyName()
if name == nil {
name = n.Name()
}
return name
}
func (n *Node) IsTypeOnly() bool {
switch n.Kind {
case KindImportEqualsDeclaration:
return n.AsImportEqualsDeclaration().IsTypeOnly
case KindImportSpecifier:
return n.AsImportSpecifier().IsTypeOnly
case KindImportClause:
return n.AsImportClause().PhaseModifier == KindTypeKeyword
case KindExportDeclaration:
return n.AsExportDeclaration().IsTypeOnly
case KindExportSpecifier:
return n.AsExportSpecifier().IsTypeOnly
}
return false
}
// If updating this function, also update `hasComment`.
func (n *Node) CommentList() *NodeList {
switch n.Kind {
case KindJSDoc:
return n.AsJSDoc().Comment
case KindJSDocTag:
return n.AsJSDocUnknownTag().Comment
case KindJSDocAugmentsTag:
return n.AsJSDocAugmentsTag().Comment
case KindJSDocImplementsTag:
return n.AsJSDocImplementsTag().Comment
case KindJSDocDeprecatedTag:
return n.AsJSDocDeprecatedTag().Comment
case KindJSDocPublicTag:
return n.AsJSDocPublicTag().Comment
case KindJSDocPrivateTag:
return n.AsJSDocPrivateTag().Comment
case KindJSDocProtectedTag:
return n.AsJSDocProtectedTag().Comment
case KindJSDocReadonlyTag:
return n.AsJSDocReadonlyTag().Comment
case KindJSDocOverrideTag:
return n.AsJSDocOverrideTag().Comment
case KindJSDocCallbackTag:
return n.AsJSDocCallbackTag().Comment
case KindJSDocOverloadTag:
return n.AsJSDocOverloadTag().Comment
case KindJSDocParameterTag, KindJSDocPropertyTag:
return n.AsJSDocParameterOrPropertyTag().Comment
case KindJSDocReturnTag:
return n.AsJSDocReturnTag().Comment
case KindJSDocThisTag:
return n.AsJSDocThisTag().Comment
case KindJSDocTypeTag:
return n.AsJSDocTypeTag().Comment
case KindJSDocTemplateTag:
return n.AsJSDocTemplateTag().Comment
case KindJSDocTypedefTag:
return n.AsJSDocTypedefTag().Comment
case KindJSDocSeeTag:
return n.AsJSDocSeeTag().Comment
case KindJSDocSatisfiesTag:
return n.AsJSDocSatisfiesTag().Comment
case KindJSDocImportTag:
return n.AsJSDocImportTag().Comment
}
panic("Unhandled case in Node.CommentList: " + n.Kind.String())
}
func (n *Node) Comments() []*Node {
list := n.CommentList()
if list != nil {
return list.Nodes
}
return nil
}
func (n *Node) Label() *Node {
switch n.Kind {
case KindLabeledStatement:
return n.AsLabeledStatement().Label
case KindBreakStatement:
return n.AsBreakStatement().Label
case KindContinueStatement:
return n.AsContinueStatement().Label
}
panic("Unhandled case in Node.Label: " + n.Kind.String())
}
func (n *Node) Attributes() *Node {
switch n.Kind {
case KindJsxOpeningElement:
return n.AsJsxOpeningElement().Attributes
case KindJsxSelfClosingElement:
return n.AsJsxSelfClosingElement().Attributes
}
panic("Unhandled case in Node.Attributes: " + n.Kind.String())
}
func (n *Node) Children() *NodeList {
switch n.Kind {
case KindJsxElement:
return n.AsJsxElement().Children
case KindJsxFragment:
return n.AsJsxFragment().Children
}
panic("Unhandled case in Node.Children: " + n.Kind.String())
}
func (n *Node) ModuleSpecifier() *Expression {
switch n.Kind {
case KindImportDeclaration, KindJSImportDeclaration:
return n.AsImportDeclaration().ModuleSpecifier
case KindExportDeclaration:
return n.AsExportDeclaration().ModuleSpecifier
case KindJSDocImportTag:
return n.AsJSDocImportTag().ModuleSpecifier
}
panic("Unhandled case in Node.ModuleSpecifier: " + n.Kind.String())
}
func (n *Node) ImportClause() *Node {
switch n.Kind {
case KindImportDeclaration, KindJSImportDeclaration:
return n.AsImportDeclaration().ImportClause
case KindJSDocImportTag:
return n.AsJSDocImportTag().ImportClause
}
panic("Unhandled case in Node.ImportClause: " + n.Kind.String())
}
func (n *Node) Statement() *Statement {
switch n.Kind {
case KindDoStatement:
return n.AsDoStatement().Statement
case KindWhileStatement:
return n.AsWhileStatement().Statement
case KindForStatement:
return n.AsForStatement().Statement
case KindForInStatement, KindForOfStatement:
return n.AsForInOrOfStatement().Statement
}
panic("Unhandled case in Node.Statement: " + n.Kind.String())
}
func (n *Node) PropertyList() *NodeList {
switch n.Kind {
case KindObjectLiteralExpression:
return n.AsObjectLiteralExpression().Properties
case KindJsxAttributes:
return n.AsJsxAttributes().Properties
}
panic("Unhandled case in Node.PropertyList: " + n.Kind.String())
}
func (n *Node) Properties() []*Node {
list := n.PropertyList()
if list != nil {
return list.Nodes
}
return nil
}
func (n *Node) ElementList() *NodeList {
switch n.Kind {
case KindNamedImports:
return n.AsNamedImports().Elements
case KindNamedExports:
return n.AsNamedExports().Elements
case KindObjectBindingPattern, KindArrayBindingPattern:
return n.AsBindingPattern().Elements
}
panic("Unhandled case in Node.ElementList: " + n.Kind.String())
}
func (n *Node) Elements() []*Node {
list := n.ElementList()
if list != nil {
return list.Nodes
}
return nil
}
func (n *Node) postfixToken() *Node {
switch n.Kind {
case KindEnumMember:
return n.AsEnumMember().PostfixToken
case KindPropertyAssignment:
return n.AsPropertyAssignment().PostfixToken
case KindShorthandPropertyAssignment:
return n.AsShorthandPropertyAssignment().PostfixToken
case KindPropertySignature:
return n.AsPropertySignatureDeclaration().PostfixToken
case KindPropertyDeclaration:
return n.AsPropertyDeclaration().PostfixToken
case KindMethodSignature:
return n.AsMethodSignatureDeclaration().PostfixToken
case KindMethodDeclaration:
return n.AsMethodDeclaration().PostfixToken
case KindGetAccessor:
return n.AsGetAccessorDeclaration().PostfixToken
case KindSetAccessor:
return n.AsSetAccessorDeclaration().PostfixToken
}
return nil
}
func (n *Node) QuestionToken() *TokenNode {
switch n.Kind {
case KindParameter:
return n.AsParameterDeclaration().QuestionToken
case KindConditionalExpression:
return n.AsConditionalExpression().QuestionToken
case KindMappedType:
return n.AsMappedTypeNode().QuestionToken
case KindNamedTupleMember:
return n.AsNamedTupleMember().QuestionToken
}
postfix := n.postfixToken()
if postfix != nil && postfix.Kind == KindQuestionToken {
return postfix
}
return nil
}
func (n *Node) QuestionDotToken() *Node {
switch n.Kind {
case KindElementAccessExpression:
return n.AsElementAccessExpression().QuestionDotToken
case KindPropertyAccessExpression:
return n.AsPropertyAccessExpression().QuestionDotToken
case KindCallExpression:
return n.AsCallExpression().QuestionDotToken
case KindTaggedTemplateExpression:
return n.AsTaggedTemplateExpression().QuestionDotToken
}
panic("Unhandled case in Node.QuestionDotToken: " + n.Kind.String())
}
func (n *Node) TypeExpression() *Node {
switch n.Kind {
case KindJSDocPropertyTag, KindJSDocParameterTag:
return n.AsJSDocParameterOrPropertyTag().TypeExpression
case KindJSDocReturnTag:
return n.AsJSDocReturnTag().TypeExpression
case KindJSDocTypeTag:
return n.AsJSDocTypeTag().TypeExpression
case KindJSDocTypedefTag:
return n.AsJSDocTypedefTag().TypeExpression
case KindJSDocSatisfiesTag:
return n.AsJSDocSatisfiesTag().TypeExpression
}
panic("Unhandled case in Node.TypeExpression: " + n.Kind.String())
}
func (n *Node) ClassName() *Node {
switch n.Kind {
case KindJSDocAugmentsTag:
return n.AsJSDocAugmentsTag().ClassName
case KindJSDocImplementsTag:
return n.AsJSDocImplementsTag().ClassName
}
panic("Unhandled case in Node.ClassName: " + n.Kind.String())
}
func (n *Node) PostfixToken() *Node {
switch n.Kind {
case KindParameter:
return n.AsParameterDeclaration().QuestionToken
case KindMethodDeclaration:
return n.AsMethodDeclaration().PostfixToken
case KindShorthandPropertyAssignment:
return n.AsShorthandPropertyAssignment().PostfixToken
case KindMethodSignature:
return n.AsMethodSignatureDeclaration().PostfixToken
case KindPropertySignature:
return n.AsPropertySignatureDeclaration().PostfixToken
case KindPropertyAssignment:
return n.AsPropertyAssignment().PostfixToken
case KindPropertyDeclaration:
return n.AsPropertyDeclaration().PostfixToken
}
return nil
}
// Determines if `n` contains `descendant` by walking up the `Parent` pointers from `descendant`. This method panics if
// `descendant` or one of its ancestors is not parented except when that node is a `SourceFile`.
func (n *Node) Contains(descendant *Node) bool {
for descendant != nil {
if descendant == n {
return true
}
parent := descendant.Parent
if parent == nil && !IsSourceFile(descendant) {
panic("descendant is not parented")
}
descendant = parent
}
return false
}
// Node casts
func (n *Node) AsIdentifier() *Identifier {
return n.data.(*Identifier)
}
func (n *Node) AsPrivateIdentifier() *PrivateIdentifier {
return n.data.(*PrivateIdentifier)
}
func (n *Node) AsQualifiedName() *QualifiedName {
return n.data.(*QualifiedName)
}
func (n *Node) AsSourceFile() *SourceFile {
return n.data.(*SourceFile)
}
func (n *Node) AsPrefixUnaryExpression() *PrefixUnaryExpression {
return n.data.(*PrefixUnaryExpression)
}
func (n *Node) AsPostfixUnaryExpression() *PostfixUnaryExpression {
return n.data.(*PostfixUnaryExpression)
}
func (n *Node) AsParenthesizedExpression() *ParenthesizedExpression {
return n.data.(*ParenthesizedExpression)
}
func (n *Node) AsTypeAssertion() *TypeAssertion {
return n.data.(*TypeAssertion)
}
func (n *Node) AsAsExpression() *AsExpression {
return n.data.(*AsExpression)
}
func (n *Node) AsSatisfiesExpression() *SatisfiesExpression {
return n.data.(*SatisfiesExpression)
}
func (n *Node) AsExpressionWithTypeArguments() *ExpressionWithTypeArguments {
return n.data.(*ExpressionWithTypeArguments)
}
func (n *Node) AsNonNullExpression() *NonNullExpression {
return n.data.(*NonNullExpression)
}
func (n *Node) AsBindingElement() *BindingElement {
return n.data.(*BindingElement)
}
func (n *Node) AsMissingDeclaration() *MissingDeclaration {
return n.data.(*MissingDeclaration)
}
func (n *Node) AsImportSpecifier() *ImportSpecifier {
return n.data.(*ImportSpecifier)
}
func (n *Node) AsArrowFunction() *ArrowFunction {
return n.data.(*ArrowFunction)
}
func (n *Node) AsCallExpression() *CallExpression {
return n.data.(*CallExpression)
}
func (n *Node) AsPropertyAccessExpression() *PropertyAccessExpression {
return n.data.(*PropertyAccessExpression)
}
func (n *Node) AsElementAccessExpression() *ElementAccessExpression {
return n.data.(*ElementAccessExpression)
}
func (n *Node) AsComputedPropertyName() *ComputedPropertyName {
return n.data.(*ComputedPropertyName)
}
func (n *Node) AsBinaryExpression() *BinaryExpression {
return n.data.(*BinaryExpression)
}
func (n *Node) AsModuleDeclaration() *ModuleDeclaration {
return n.data.(*ModuleDeclaration)
}
func (n *Node) AsStringLiteral() *StringLiteral {
return n.data.(*StringLiteral)
}
func (n *Node) AsNumericLiteral() *NumericLiteral {
return n.data.(*NumericLiteral)
}
func (n *Node) AsBigIntLiteral() *BigIntLiteral {
return n.data.(*BigIntLiteral)
}
func (n *Node) AsNoSubstitutionTemplateLiteral() *NoSubstitutionTemplateLiteral {
return n.data.(*NoSubstitutionTemplateLiteral)
}
func (n *Node) AsRegularExpressionLiteral() *RegularExpressionLiteral {
return n.data.(*RegularExpressionLiteral)
}
func (n *Node) AsTemplateHead() *TemplateHead {
return n.data.(*TemplateHead)
}
func (n *Node) AsTemplateMiddle() *TemplateMiddle {
return n.data.(*TemplateMiddle)
}
func (n *Node) AsTemplateTail() *TemplateTail {
return n.data.(*TemplateTail)
}
func (n *Node) AsVariableDeclaration() *VariableDeclaration {
return n.data.(*VariableDeclaration)
}
func (n *Node) AsExportAssignment() *ExportAssignment {
return n.data.(*ExportAssignment)
}
func (n *Node) AsCommonJSExport() *CommonJSExport {
return n.data.(*CommonJSExport)
}
func (n *Node) AsObjectLiteralExpression() *ObjectLiteralExpression {
return n.data.(*ObjectLiteralExpression)
}
func (n *Node) AsIfStatement() *IfStatement {
return n.data.(*IfStatement)
}
func (n *Node) AsWhileStatement() *WhileStatement {
return n.data.(*WhileStatement)
}
func (n *Node) AsDoStatement() *DoStatement {
return n.data.(*DoStatement)
}
func (n *Node) AsForStatement() *ForStatement {
return n.data.(*ForStatement)
}
func (n *Node) AsConditionalExpression() *ConditionalExpression {
return n.data.(*ConditionalExpression)
}
func (n *Node) AsForInOrOfStatement() *ForInOrOfStatement {
return n.data.(*ForInOrOfStatement)
}
func (n *Node) AsShorthandPropertyAssignment() *ShorthandPropertyAssignment {
return n.data.(*ShorthandPropertyAssignment)
}
func (n *Node) AsPropertyAssignment() *PropertyAssignment {
return n.data.(*PropertyAssignment)
}
func (n *Node) AsExpressionStatement() *ExpressionStatement {
return n.data.(*ExpressionStatement)
}
func (n *Node) AsBlock() *Block {
return n.data.(*Block)
}
func (n *Node) AsModuleBlock() *ModuleBlock {
return n.data.(*ModuleBlock)
}
func (n *Node) AsVariableStatement() *VariableStatement {
return n.data.(*VariableStatement)
}
func (n *Node) AsVariableDeclarationList() *VariableDeclarationList {
return n.data.(*VariableDeclarationList)
}
func (n *Node) AsMetaProperty() *MetaProperty {
return n.data.(*MetaProperty)
}
func (n *Node) AsTypeReference() *TypeReferenceNode {
return n.data.(*TypeReferenceNode)
}
func (n *Node) AsConstructorDeclaration() *ConstructorDeclaration {
return n.data.(*ConstructorDeclaration)
}
func (n *Node) AsConditionalTypeNode() *ConditionalTypeNode {
return n.data.(*ConditionalTypeNode)
}
func (n *Node) AsClassExpression() *ClassExpression {
return n.data.(*ClassExpression)
}
func (n *Node) AsHeritageClause() *HeritageClause {
return n.data.(*HeritageClause)
}
func (n *Node) AsFunctionExpression() *FunctionExpression {
return n.data.(*FunctionExpression)
}
func (n *Node) AsParameterDeclaration() *ParameterDeclaration {
return n.data.(*ParameterDeclaration)
}
func (n *Node) AsDecorator() *Decorator {
return n.data.(*Decorator)
}
func (n *Node) AsInferTypeNode() *InferTypeNode {
return n.data.(*InferTypeNode)
}
func (n *Node) AsTypeParameter() *TypeParameterDeclaration {
return n.data.(*TypeParameterDeclaration)
}
func (n *Node) AsExportSpecifier() *ExportSpecifier {
return n.data.(*ExportSpecifier)
}
func (n *Node) AsExportDeclaration() *ExportDeclaration {
return n.data.(*ExportDeclaration)
}
func (n *Node) AsPropertyDeclaration() *PropertyDeclaration {
return n.data.(*PropertyDeclaration)
}
func (n *Node) AsImportClause() *ImportClause {
return n.data.(*ImportClause)
}
func (n *Node) AsImportEqualsDeclaration() *ImportEqualsDeclaration {
return n.data.(*ImportEqualsDeclaration)
}
func (n *Node) AsNamespaceImport() *NamespaceImport {
return n.data.(*NamespaceImport)
}
func (n *Node) AsPropertySignatureDeclaration() *PropertySignatureDeclaration {
return n.data.(*PropertySignatureDeclaration)
}
func (n *Node) AsEnumMember() *EnumMember {
return n.data.(*EnumMember)
}
func (n *Node) AsReturnStatement() *ReturnStatement {
return n.data.(*ReturnStatement)
}
func (n *Node) AsWithStatement() *WithStatement {
return n.data.(*WithStatement)
}
func (n *Node) AsSwitchStatement() *SwitchStatement {
return n.data.(*SwitchStatement)
}
func (n *Node) AsCaseOrDefaultClause() *CaseOrDefaultClause {
return n.data.(*CaseOrDefaultClause)
}
func (n *Node) AsThrowStatement() *ThrowStatement {
return n.data.(*ThrowStatement)
}
func (n *Node) AsTemplateSpan() *TemplateSpan {
return n.data.(*TemplateSpan)
}
func (n *Node) AsImportTypeNode() *ImportTypeNode {
return n.data.(*ImportTypeNode)
}
func (n *Node) AsNewExpression() *NewExpression {
return n.data.(*NewExpression)
}
func (n *Node) AsTaggedTemplateExpression() *TaggedTemplateExpression {
return n.data.(*TaggedTemplateExpression)
}
func (n *Node) AsJsxOpeningElement() *JsxOpeningElement {
return n.data.(*JsxOpeningElement)
}
func (n *Node) AsJsxSelfClosingElement() *JsxSelfClosingElement {
return n.data.(*JsxSelfClosingElement)
}
func (n *Node) AsJsxClosingElement() *JsxClosingElement {
return n.data.(*JsxClosingElement)
}
func (n *Node) AsJsxOpeningFragment() *JsxOpeningFragment {
return n.data.(*JsxOpeningFragment)
}
func (n *Node) AsJsxClosingFragment() *JsxClosingFragment {
return n.data.(*JsxClosingFragment)
}
func (n *Node) AsImportDeclaration() *ImportDeclaration {
return n.data.(*ImportDeclaration)
}
func (n *Node) AsExternalModuleReference() *ExternalModuleReference {
return n.data.(*ExternalModuleReference)
}
func (n *Node) AsLiteralTypeNode() *LiteralTypeNode {
return n.data.(*LiteralTypeNode)
}
func (n *Node) AsJsxNamespacedName() *JsxNamespacedName {
return n.data.(*JsxNamespacedName)
}
func (n *Node) AsClassDeclaration() *ClassDeclaration {
return n.data.(*ClassDeclaration)
}
func (n *Node) AsInterfaceDeclaration() *InterfaceDeclaration {
return n.data.(*InterfaceDeclaration)
}
func (n *Node) AsTypeAliasDeclaration() *TypeAliasDeclaration {
return n.data.(*TypeAliasDeclaration)
}
func (n *Node) AsJsxAttribute() *JsxAttribute {
return n.data.(*JsxAttribute)
}
func (n *Node) AsJsxAttributes() *JsxAttributes {
return n.data.(*JsxAttributes)
}
func (n *Node) AsJsxSpreadAttribute() *JsxSpreadAttribute {
return n.data.(*JsxSpreadAttribute)
}
func (n *Node) AsJsxExpression() *JsxExpression {
return n.data.(*JsxExpression)
}
func (n *Node) AsJsxText() *JsxText {
return n.data.(*JsxText)
}
func (n *Node) AsKeywordTypeNode() *KeywordTypeNode {
return n.data.(*KeywordTypeNode)
}
func (n *Node) AsThisTypeNode() *ThisTypeNode {
return n.data.(*ThisTypeNode)
}
func (n *Node) AsParenthesizedTypeNode() *ParenthesizedTypeNode {
return n.data.(*ParenthesizedTypeNode)
}
func (n *Node) AsTypePredicateNode() *TypePredicateNode {
return n.data.(*TypePredicateNode)
}
func (n *Node) AsTypeOperatorNode() *TypeOperatorNode {
return n.data.(*TypeOperatorNode)
}
func (n *Node) AsMappedTypeNode() *MappedTypeNode {
return n.data.(*MappedTypeNode)
}
func (n *Node) AsArrayLiteralExpression() *ArrayLiteralExpression {
return n.data.(*ArrayLiteralExpression)
}
func (n *Node) AsMethodDeclaration() *MethodDeclaration {
return n.data.(*MethodDeclaration)
}
func (n *Node) AsMethodSignatureDeclaration() *MethodSignatureDeclaration {
return n.data.(*MethodSignatureDeclaration)
}
func (n *Node) AsTemplateLiteralTypeSpan() *TemplateLiteralTypeSpan {
return n.data.(*TemplateLiteralTypeSpan)
}
func (n *Node) AsJsxElement() *JsxElement {
return n.data.(*JsxElement)
}
func (n *Node) AsJsxFragment() *JsxFragment {
return n.data.(*JsxFragment)
}
func (n *Node) AsKeywordExpression() *KeywordExpression {
return n.data.(*KeywordExpression)
}
func (n *Node) AsCatchClause() *CatchClause {
return n.data.(*CatchClause)
}
func (n *Node) AsDeleteExpression() *DeleteExpression {
return n.data.(*DeleteExpression)
}
func (n *Node) AsLabeledStatement() *LabeledStatement {
return n.data.(*LabeledStatement)
}
func (n *Node) AsNamespaceExportDeclaration() *NamespaceExportDeclaration {
return n.data.(*NamespaceExportDeclaration)
}
func (n *Node) AsNamedImports() *NamedImports {
return n.data.(*NamedImports)
}
func (n *Node) AsNamedExports() *NamedExports {
return n.data.(*NamedExports)
}
func (n *Node) AsBreakStatement() *BreakStatement {
return n.data.(*BreakStatement)
}
func (n *Node) AsContinueStatement() *ContinueStatement {
return n.data.(*ContinueStatement)
}
func (n *Node) AsCaseBlock() *CaseBlock {
return n.data.(*CaseBlock)
}
func (n *Node) AsTryStatement() *TryStatement {
return n.data.(*TryStatement)
}
func (n *Node) AsBindingPattern() *BindingPattern {
return n.data.(*BindingPattern)
}
func (n *Node) AsFunctionDeclaration() *FunctionDeclaration {
return n.data.(*FunctionDeclaration)
}
func (n *Node) AsTypeOfExpression() *TypeOfExpression {
return n.data.(*TypeOfExpression)
}
func (n *Node) AsVoidExpression() *VoidExpression {
return n.data.(*VoidExpression)
}
func (n *Node) AsAwaitExpression() *AwaitExpression {
return n.data.(*AwaitExpression)
}
func (n *Node) AsTemplateExpression() *TemplateExpression {
return n.data.(*TemplateExpression)
}
func (n *Node) AsYieldExpression() *YieldExpression {
return n.data.(*YieldExpression)
}
func (n *Node) AsPartiallyEmittedExpression() *PartiallyEmittedExpression {
return n.data.(*PartiallyEmittedExpression)
}
func (n *Node) AsSpreadElement() *SpreadElement {
return n.data.(*SpreadElement)
}
func (n *Node) AsSpreadAssignment() *SpreadAssignment {
return n.data.(*SpreadAssignment)
}
func (n *Node) AsArrayTypeNode() *ArrayTypeNode {
return n.data.(*ArrayTypeNode)
}
func (n *Node) AsTupleTypeNode() *TupleTypeNode {
return n.data.(*TupleTypeNode)
}
func (n *Node) AsUnionTypeNode() *UnionTypeNode {
return n.data.(*UnionTypeNode)
}
func (n *Node) AsIntersectionTypeNode() *IntersectionTypeNode {
return n.data.(*IntersectionTypeNode)
}
func (n *Node) AsRestTypeNode() *RestTypeNode {
return n.data.(*RestTypeNode)
}
func (n *Node) AsNamedTupleMember() *NamedTupleMember {
return n.data.(*NamedTupleMember)
}
func (n *Node) AsOptionalTypeNode() *OptionalTypeNode {
return n.data.(*OptionalTypeNode)
}
func (n *Node) AsTemplateLiteralTypeNode() *TemplateLiteralTypeNode {
return n.data.(*TemplateLiteralTypeNode)
}
func (n *Node) AsTypeReferenceNode() *TypeReferenceNode {
return n.data.(*TypeReferenceNode)
}
func (n *Node) AsFunctionTypeNode() *FunctionTypeNode {
return n.data.(*FunctionTypeNode)
}
func (n *Node) AsConstructorTypeNode() *ConstructorTypeNode {
return n.data.(*ConstructorTypeNode)
}
func (n *Node) AsTypeQueryNode() *TypeQueryNode {
return n.data.(*TypeQueryNode)
}
func (n *Node) AsTypeLiteralNode() *TypeLiteralNode {
return n.data.(*TypeLiteralNode)
}
func (n *Node) AsIndexedAccessTypeNode() *IndexedAccessTypeNode {
return n.data.(*IndexedAccessTypeNode)
}
func (n *Node) AsGetAccessorDeclaration() *GetAccessorDeclaration {
return n.data.(*GetAccessorDeclaration)
}
func (n *Node) AsSetAccessorDeclaration() *SetAccessorDeclaration {
return n.data.(*SetAccessorDeclaration)
}
func (n *Node) AsClassStaticBlockDeclaration() *ClassStaticBlockDeclaration {
return n.data.(*ClassStaticBlockDeclaration)
}
func (n *Node) AsSemicolonClassElement() *SemicolonClassElement {
return n.data.(*SemicolonClassElement)
}
func (n *Node) AsCallSignatureDeclaration() *CallSignatureDeclaration {
return n.data.(*CallSignatureDeclaration)
}
func (n *Node) AsConstructSignatureDeclaration() *ConstructSignatureDeclaration {
return n.data.(*ConstructSignatureDeclaration)
}
func (n *Node) AsIndexSignatureDeclaration() *IndexSignatureDeclaration {
return n.data.(*IndexSignatureDeclaration)
}
func (n *Node) AsDebuggerStatement() *DebuggerStatement {
return n.data.(*DebuggerStatement)
}
func (n *Node) AsEmptyStatement() *EmptyStatement {
return n.data.(*EmptyStatement)
}
func (n *Node) AsEnumDeclaration() *EnumDeclaration {
return n.data.(*EnumDeclaration)
}
func (n *Node) AsNotEmittedStatement() *NotEmittedStatement {
return n.data.(*NotEmittedStatement)
}
func (n *Node) AsNotEmittedTypeElement() *NotEmittedTypeElement {
return n.data.(*NotEmittedTypeElement)
}
func (n *Node) AsJSDoc() *JSDoc {
return n.data.(*JSDoc)
}
func (n *Node) AsJSDocTagBase() *JSDocTagBase {
return n.data.(*JSDocTagBase)
}
func (n *Node) AsJSDocCommentBase() *JSDocCommentBase {
return n.data.(*JSDocCommentBase)
}
func (n *Node) AsJSDocText() *JSDocText {
return n.data.(*JSDocText)
}
func (n *Node) AsJSDocLink() *JSDocLink {
return n.data.(*JSDocLink)
}
func (n *Node) AsJSDocLinkPlain() *JSDocLinkPlain {
return n.data.(*JSDocLinkPlain)
}
func (n *Node) AsJSDocLinkCode() *JSDocLinkCode {
return n.data.(*JSDocLinkCode)
}
func (n *Node) AsJSDocTypeExpression() *JSDocTypeExpression {
return n.data.(*JSDocTypeExpression)
}
func (n *Node) AsJSDocNonNullableType() *JSDocNonNullableType {
return n.data.(*JSDocNonNullableType)
}
func (n *Node) AsJSDocNullableType() *JSDocNullableType {
return n.data.(*JSDocNullableType)
}
func (n *Node) AsJSDocAllType() *JSDocAllType {
return n.data.(*JSDocAllType)
}
func (n *Node) AsJSDocVariadicType() *JSDocVariadicType {
return n.data.(*JSDocVariadicType)
}
func (n *Node) AsJSDocOptionalType() *JSDocOptionalType {
return n.data.(*JSDocOptionalType)
}
func (n *Node) AsJSDocTypeTag() *JSDocTypeTag {
return n.data.(*JSDocTypeTag)
}
func (n *Node) AsJSDocUnknownTag() *JSDocUnknownTag {
return n.data.(*JSDocUnknownTag)
}
func (n *Node) AsJSDocTemplateTag() *JSDocTemplateTag {
return n.data.(*JSDocTemplateTag)
}
func (n *Node) AsJSDocParameterOrPropertyTag() *JSDocParameterOrPropertyTag {
return n.data.(*JSDocParameterOrPropertyTag)
}
func (n *Node) AsJSDocReturnTag() *JSDocReturnTag {
return n.data.(*JSDocReturnTag)
}
func (n *Node) AsJSDocPublicTag() *JSDocPublicTag {
return n.data.(*JSDocPublicTag)
}
func (n *Node) AsJSDocPrivateTag() *JSDocPrivateTag {
return n.data.(*JSDocPrivateTag)
}
func (n *Node) AsJSDocProtectedTag() *JSDocProtectedTag {
return n.data.(*JSDocProtectedTag)
}
func (n *Node) AsJSDocReadonlyTag() *JSDocReadonlyTag {
return n.data.(*JSDocReadonlyTag)
}
func (n *Node) AsJSDocOverrideTag() *JSDocOverrideTag {
return n.data.(*JSDocOverrideTag)
}
func (n *Node) AsJSDocDeprecatedTag() *JSDocDeprecatedTag {
return n.data.(*JSDocDeprecatedTag)
}
func (n *Node) AsJSDocSeeTag() *JSDocSeeTag {
return n.data.(*JSDocSeeTag)
}
func (n *Node) AsJSDocImplementsTag() *JSDocImplementsTag {
return n.data.(*JSDocImplementsTag)
}
func (n *Node) AsJSDocAugmentsTag() *JSDocAugmentsTag {
return n.data.(*JSDocAugmentsTag)
}
func (n *Node) AsJSDocSatisfiesTag() *JSDocSatisfiesTag {
return n.data.(*JSDocSatisfiesTag)
}
func (n *Node) AsJSDocThisTag() *JSDocThisTag {
return n.data.(*JSDocThisTag)
}
func (n *Node) AsJSDocImportTag() *JSDocImportTag {
return n.data.(*JSDocImportTag)
}
func (n *Node) AsJSDocCallbackTag() *JSDocCallbackTag {
return n.data.(*JSDocCallbackTag)
}
func (n *Node) AsJSDocOverloadTag() *JSDocOverloadTag {
return n.data.(*JSDocOverloadTag)
}
func (n *Node) AsJSDocTypedefTag() *JSDocTypedefTag {
return n.data.(*JSDocTypedefTag)
}
func (n *Node) AsJSDocTypeLiteral() *JSDocTypeLiteral {
return n.data.(*JSDocTypeLiteral)
}
func (n *Node) AsJSDocSignature() *JSDocSignature {
return n.data.(*JSDocSignature)
}
func (n *Node) AsJSDocNameReference() *JSDocNameReference {
return n.data.(*JSDocNameReference)
}
func (n *Node) AsNamespaceExport() *NamespaceExport {
return n.data.(*NamespaceExport)
}
func (n *Node) AsImportAttribute() *ImportAttribute {
return n.data.(*ImportAttribute)
}
func (n *Node) AsImportAttributes() *ImportAttributes {
return n.data.(*ImportAttributes)
}
func (n *Node) AsFlowSwitchClauseData() *FlowSwitchClauseData {
return n.data.(*FlowSwitchClauseData)
}
func (n *Node) AsFlowReduceLabelData() *FlowReduceLabelData {
return n.data.(*FlowReduceLabelData)
}
func (n *Node) AsSyntheticExpression() *SyntheticExpression {
return n.data.(*SyntheticExpression)
}
func (n *Node) AsSyntaxList() *SyntaxList {
return n.data.(*SyntaxList)
}
func (n *Node) AsSyntheticReferenceExpression() *SyntheticReferenceExpression {
return n.data.(*SyntheticReferenceExpression)
}
// NodeData
type nodeData interface {
AsNode() *Node
ForEachChild(v Visitor) bool
IterChildren() iter.Seq[*Node]
VisitEachChild(v *NodeVisitor) *Node
Clone(v NodeFactoryCoercible) *Node
Name() *DeclarationName
Modifiers() *ModifierList
setModifiers(modifiers *ModifierList)
FlowNodeData() *FlowNodeBase
DeclarationData() *DeclarationBase
ExportableData() *ExportableBase
LocalsContainerData() *LocalsContainerBase
FunctionLikeData() *FunctionLikeBase
ClassLikeData() *ClassLikeBase
BodyData() *BodyBase
LiteralLikeData() *LiteralLikeBase
TemplateLiteralLikeData() *TemplateLiteralLikeBase
SubtreeFacts() SubtreeFacts
computeSubtreeFacts() SubtreeFacts
subtreeFactsWorker(self nodeData) SubtreeFacts
propagateSubtreeFacts() SubtreeFacts
}
// NodeDefault
type NodeDefault struct {
Node
}
func invert(yield func(v *Node) bool) Visitor {
return func(n *Node) bool {
return !yield(n)
}
}
func (node *NodeDefault) AsNode() *Node { return &node.Node }
func (node *NodeDefault) ForEachChild(v Visitor) bool { return false }
func (node *NodeDefault) forEachChildIter(yield func(v *Node) bool) {
node.data.ForEachChild(invert(yield)) // `true` is return early for a ts visitor, `false` is return early for a go iterator yield function
}
func (node *NodeDefault) IterChildren() iter.Seq[*Node] {
return node.forEachChildIter
}
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() *LiteralLikeBase { return nil }
func (node *NodeDefault) TemplateLiteralLikeData() *TemplateLiteralLikeBase { return nil }
func (node *NodeDefault) SubtreeFacts() SubtreeFacts {
return node.data.subtreeFactsWorker(node.data)
}
func (node *NodeDefault) subtreeFactsWorker(self nodeData) 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`.
return self.computeSubtreeFacts()
}
func (node *NodeDefault) computeSubtreeFacts() SubtreeFacts {
return SubtreeFactsNone
}
func (node *NodeDefault) propagateSubtreeFacts() SubtreeFacts {
return node.data.SubtreeFacts() & ^SubtreeExclusionsNode
}
// NodeBase
type NodeBase struct {
NodeDefault
}
// Aliases for Node unions
type (
Statement = Node // Node with StatementBase
Declaration = Node // Node with DeclarationBase
Expression = Node // Node with ExpressionBase
TypeNode = Node // Node with TypeNodeBase
TypeElement = Node // Node with TypeElementBase
ClassElement = Node // Node with ClassElementBase
NamedMember = Node // Node with NamedMemberBase
ObjectLiteralElement = Node // Node with ObjectLiteralElementBase
BlockOrExpression = Node // Block | Expression
AccessExpression = Node // PropertyAccessExpression | ElementAccessExpression
DeclarationName = Node // Identifier | PrivateIdentifier | StringLiteral | NumericLiteral | BigIntLiteral | NoSubstitutionTemplateLiteral | ComputedPropertyName | BindingPattern | ElementAccessExpression
ModuleName = Node // Identifier | StringLiteral
ModuleExportName = Node // Identifier | StringLiteral
PropertyName = Node // Identifier | StringLiteral | NoSubstitutionTemplateLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier | BigIntLiteral
ModuleBody = Node // ModuleBlock | ModuleDeclaration
ForInitializer = Node // Expression | MissingDeclaration | VariableDeclarationList
ModuleReference = Node // Identifier | QualifiedName | ExternalModuleReference
NamedImportBindings = Node // NamespaceImport | NamedImports
NamedExportBindings = Node // NamespaceExport | NamedExports
MemberName = Node // Identifier | PrivateIdentifier
EntityName = Node // Identifier | QualifiedName
BindingName = Node // Identifier | BindingPattern
ModifierLike = Node // Modifier | Decorator
JsxChild = Node // JsxText | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment
JsxAttributeLike = Node // JsxAttribute | JsxSpreadAttribute
JsxAttributeName = Node // Identifier | JsxNamespacedName
JsxAttributeValue = Node // StringLiteral | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment
JsxTagNameExpression = Node // IdentifierReference | KeywordExpression | JsxTagNamePropertyAccess | JsxNamespacedName
ClassLikeDeclaration = Node // ClassDeclaration | ClassExpression
AccessorDeclaration = Node // GetAccessorDeclaration | SetAccessorDeclaration
LiteralLikeNode = Node // StringLiteral | NumericLiteral | BigIntLiteral | RegularExpressionLiteral | TemplateLiteralLikeNode | JsxText
LiteralExpression = Node // StringLiteral | NumericLiteral | BigIntLiteral | RegularExpressionLiteral | NoSubstitutionTemplateLiteral
UnionOrIntersectionTypeNode = Node // UnionTypeNode | IntersectionTypeNode
TemplateLiteralLikeNode = Node // TemplateHead | TemplateMiddle | TemplateTail
TemplateMiddleOrTail = Node // TemplateMiddle | TemplateTail
TemplateLiteral = Node // TemplateExpression | NoSubstitutionTemplateLiteral
TypePredicateParameterName = Node // Identifier | ThisTypeNode
ImportAttributeName = Node // Identifier | StringLiteral
LeftHandSideExpression = Node // subset of Expression
JSDocComment = Node // JSDocText | JSDocLink | JSDocLinkCode | JSDocLinkPlain;
JSDocTag = Node // Node with JSDocTagBase
SignatureDeclaration = Node // CallSignatureDeclaration | ConstructSignatureDeclaration | MethodSignature | IndexSignatureDeclaration | FunctionTypeNode | ConstructorTypeNode | FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | AccessorDeclaration | FunctionExpression | ArrowFunction;
StringLiteralLike = Node // StringLiteral | NoSubstitutionTemplateLiteral
AnyValidImportOrReExport = Node // (ImportDeclaration | ExportDeclaration | JSDocImportTag) & { moduleSpecifier: StringLiteral } | ImportEqualsDeclaration & { moduleReference: ExternalModuleReference & { expression: StringLiteral }} | RequireOrImportCall | ValidImportTypeNode
ValidImportTypeNode = Node // ImportTypeNode & { argument: LiteralTypeNode & { literal: StringLiteral } }
NumericOrStringLikeLiteral = Node // StringLiteralLike | NumericLiteral
TypeOnlyImportDeclaration = Node // ImportClause | ImportEqualsDeclaration | ImportSpecifier | NamespaceImport with isTypeOnly: true
ObjectLiteralLike = Node // ObjectLiteralExpression | ObjectBindingPattern
ObjectTypeDeclaration = Node // ClassLikeDeclaration | InterfaceDeclaration | TypeLiteralNode
JsxOpeningLikeElement = Node // JsxOpeningElement | JsxSelfClosingElement
NamedImportsOrExports = Node // NamedImports | NamedExports
BreakOrContinueStatement = Node // BreakStatement | ContinueStatement
CallLikeExpression = Node // CallExpression | NewExpression | TaggedTemplateExpression | Decorator | JsxCallLike | InstanceofExpression
)
// Aliases for node singletons
type (
IdentifierNode = Node
PrivateIdentifierNode = Node
TokenNode = Node
StringLiteralNode = Node
TemplateHeadNode = Node
TemplateMiddleNode = Node
TemplateTailNode = Node
TemplateSpanNode = Node
TemplateLiteralTypeSpanNode = Node
BlockNode = Node
CatchClauseNode = Node
CaseBlockNode = Node
CaseOrDefaultClauseNode = Node
CaseClauseNode = Node
VariableDeclarationNode = Node
VariableDeclarationListNode = Node
BindingElementNode = Node
TypeParameterDeclarationNode = Node
ParameterDeclarationNode = Node
HeritageClauseNode = Node
ExpressionWithTypeArgumentsNode = Node
EnumDeclarationNode = Node
EnumMemberNode = Node
ModuleDeclarationNode = Node
FunctionDeclarationNode = Node
ImportClauseNode = Node
ImportAttributesNode = Node
ImportAttributeNode = Node
ImportSpecifierNode = Node
ExportSpecifierNode = Node
JsxAttributesNode = Node
JsxOpeningElementNode = Node
JsxClosingElementNode = Node
JsxOpeningFragmentNode = Node
JsxClosingFragmentNode = Node
SourceFileNode = Node
PropertyAccessExpressionNode = Node
TypeLiteral = Node
ObjectLiteralExpressionNode = Node
ConstructorDeclarationNode = Node
NamedExportsNode = Node
UnionType = Node
LiteralType = Node
JSDocNode = Node
BindingPatternNode = Node
)
type (
StatementList = NodeList // NodeList[*Statement]
CaseClausesList = NodeList // NodeList[*CaseOrDefaultClause]
VariableDeclarationNodeList = NodeList // NodeList[*VariableDeclaration]
BindingElementList = NodeList // NodeList[*BindingElement]
TypeParameterList = NodeList // NodeList[*TypeParameterDeclaration]
ParameterList = NodeList // NodeList[*ParameterDeclaration]
HeritageClauseList = NodeList // NodeList[*HeritageClause]
ClassElementList = NodeList // NodeList[*ClassElement]
TypeElementList = NodeList // NodeList[*TypeElement]
ExpressionWithTypeArgumentsList = NodeList // NodeList[*ExpressionWithTypeArguments]
EnumMemberList = NodeList // NodeList[*EnumMember]
ImportSpecifierList = NodeList // NodeList[*ImportSpecifier]
ExportSpecifierList = NodeList // NodeList[*ExportSpecifier]
TypeArgumentList = NodeList // NodeList[*TypeNode]
ArgumentList = NodeList // NodeList[*Expression]
TemplateSpanList = NodeList // NodeList[*TemplateSpan]
ElementList = NodeList // NodeList[*Expression]
PropertyDefinitionList = NodeList // NodeList[*ObjectLiteralElement]
TypeList = NodeList // NodeList[*TypeNode]
ImportAttributeList = NodeList // NodeList[*ImportAttributeNode]
TemplateLiteralTypeSpanList = NodeList // NodeList[*TemplateLiteralTypeSpan]
JsxChildList = NodeList // NodeList[*JsxChild]
JsxAttributeList = NodeList // NodeList[*JsxAttributeLike]
)
func IsWriteOnlyAccess(node *Node) bool {
return accessKind(node) == AccessKindWrite
}
func IsWriteAccess(node *Node) bool {
return accessKind(node) != AccessKindRead
}
func IsWriteAccessForReference(node *Node) bool {
decl := getDeclarationFromName(node)
return (decl != nil && declarationIsWriteAccess(decl)) || node.Kind == KindDefaultKeyword || IsWriteAccess(node)
}
func getDeclarationFromName(name *Node) *Declaration {
if name == nil || name.Parent == nil {
return nil
}
parent := name.Parent
switch name.Kind {
case KindStringLiteral, KindNoSubstitutionTemplateLiteral, KindNumericLiteral:
if IsComputedPropertyName(parent) {
return parent.Parent
}
fallthrough
case KindIdentifier:
if IsDeclaration(parent) {
if parent.Name() == name {
return parent
}
return nil
}
if IsQualifiedName(parent) {
tag := parent.Parent
if IsJSDocParameterTag(tag) && tag.Name() == parent {
return tag
}
return nil
}
binExp := parent.Parent
if IsBinaryExpression(binExp) && GetAssignmentDeclarationKind(binExp.AsBinaryExpression()) != JSDeclarationKindNone {
// (binExp.left as BindableStaticNameExpression).symbol || binExp.symbol
leftHasSymbol := false
if binExp.AsBinaryExpression().Left != nil && binExp.AsBinaryExpression().Left.Symbol() != nil {
leftHasSymbol = true
}
if leftHasSymbol || binExp.Symbol() != nil {
if GetNameOfDeclaration(binExp.AsNode()) == name {
return binExp.AsNode()
}
}
}
case KindPrivateIdentifier:
if IsDeclaration(parent) && parent.Name() == name {
return parent
}
}
return nil
}
func declarationIsWriteAccess(decl *Node) bool {
if decl == nil {
return false
}
// Consider anything in an ambient declaration to be a write access since it may be coming from JS.
if decl.Flags&NodeFlagsAmbient != 0 {
return true
}
switch decl.Kind {
case KindBinaryExpression,
KindBindingElement,
KindClassDeclaration,
KindClassExpression,
KindDefaultKeyword,
KindEnumDeclaration,
KindEnumMember,
KindExportSpecifier,
KindImportClause, // default import
KindImportEqualsDeclaration,
KindImportSpecifier,
KindInterfaceDeclaration,
KindJSDocCallbackTag,
KindJSDocTypedefTag,
KindJsxAttribute,
KindModuleDeclaration,
KindNamespaceExportDeclaration,
KindNamespaceImport,
KindNamespaceExport,
KindParameter,
KindShorthandPropertyAssignment,
KindTypeAliasDeclaration,
KindTypeParameter:
return true
case KindPropertyAssignment:
// In `({ x: y } = 0);`, `x` is not a write access.
return !IsArrayLiteralOrObjectLiteralDestructuringPattern(decl.Parent)
case KindFunctionDeclaration, KindFunctionExpression, KindConstructor, KindMethodDeclaration, KindGetAccessor, KindSetAccessor:
// functions considered write if they provide a value (have a body)
switch decl.Kind {
case KindFunctionDeclaration:
return decl.AsFunctionDeclaration().Body != nil
case KindFunctionExpression:
return decl.AsFunctionExpression().Body != nil
case KindConstructor:
// constructor node stores body on the parent? treat same as others
return decl.AsConstructorDeclaration().Body != nil
case KindMethodDeclaration:
return decl.AsMethodDeclaration().Body != nil
case KindGetAccessor:
return decl.AsGetAccessorDeclaration().Body != nil
case KindSetAccessor:
return decl.AsSetAccessorDeclaration().Body != nil
}
return false
case KindVariableDeclaration, KindPropertyDeclaration:
// variable/property write if initializer present or is in catch clause
var hasInit bool
switch decl.Kind {
case KindVariableDeclaration:
hasInit = decl.AsVariableDeclaration().Initializer != nil
case KindPropertyDeclaration:
hasInit = decl.AsPropertyDeclaration().Initializer != nil
}
return hasInit || IsCatchClause(decl.Parent)
case KindMethodSignature, KindPropertySignature, KindJSDocPropertyTag, KindJSDocParameterTag:
return false
default:
// preserve TS behavior: crash on unexpected kinds
panic("Unhandled case in declarationIsWriteAccess")
}
}
func IsArrayLiteralOrObjectLiteralDestructuringPattern(node *Node) bool {
if !(IsArrayLiteralExpression(node) || IsObjectLiteralExpression(node)) {
return false
}
parent := node.Parent
// [a,b,c] from:
// [a, b, c] = someExpression;
if IsBinaryExpression(parent) && parent.AsBinaryExpression().Left == node && parent.AsBinaryExpression().OperatorToken.Kind == KindEqualsToken {
return true
}
// [a, b, c] from:
// for([a, b, c] of expression)
if IsForOfStatement(parent) && parent.Initializer() == node {
return true
}
// {x, a: {a, b, c} } = someExpression
if IsPropertyAssignment(parent) {
return IsArrayLiteralOrObjectLiteralDestructuringPattern(parent.Parent)
}
// [a, b, c] of
// [x, [a, b, c] ] = someExpression
return IsArrayLiteralOrObjectLiteralDestructuringPattern(parent)
}
func accessKind(node *Node) AccessKind {
parent := node.Parent
switch parent.Kind {
case KindParenthesizedExpression:
return accessKind(parent)
case KindPrefixUnaryExpression:
operator := parent.AsPrefixUnaryExpression().Operator
if operator == KindPlusPlusToken || operator == KindMinusMinusToken {
return AccessKindReadWrite
}
return AccessKindRead
case KindPostfixUnaryExpression:
operator := parent.AsPostfixUnaryExpression().Operator
if operator == KindPlusPlusToken || operator == KindMinusMinusToken {
return AccessKindReadWrite
}
return AccessKindRead
case KindBinaryExpression:
if parent.AsBinaryExpression().Left == node {
operator := parent.AsBinaryExpression().OperatorToken
if IsAssignmentOperator(operator.Kind) {
if operator.Kind == KindEqualsToken {
return AccessKindWrite
}
return AccessKindReadWrite
}
}
return AccessKindRead
case KindPropertyAccessExpression:
if parent.AsPropertyAccessExpression().Name() != node {
return AccessKindRead
}
return accessKind(parent)
case KindPropertyAssignment:
parentAccess := accessKind(parent.Parent)
// In `({ x: varname }) = { x: 1 }`, the left `x` is a read, the right `x` is a write.
if node == parent.AsPropertyAssignment().Name() {
return reverseAccessKind(parentAccess)
}
return parentAccess
case KindShorthandPropertyAssignment:
// Assume it's the local variable being accessed, since we don't check public properties for --noUnusedLocals.
if node == parent.AsShorthandPropertyAssignment().ObjectAssignmentInitializer {
return AccessKindRead
}
return accessKind(parent.Parent)
case KindArrayLiteralExpression:
return accessKind(parent)
case KindForInStatement, KindForOfStatement:
if node == parent.AsForInOrOfStatement().Initializer {
return AccessKindWrite
}
return AccessKindRead
}
return AccessKindRead
}
func reverseAccessKind(a AccessKind) AccessKind {
switch a {
case AccessKindRead:
return AccessKindWrite
case AccessKindWrite:
return AccessKindRead
case AccessKindReadWrite:
return AccessKindReadWrite
}
panic("Unhandled case in reverseAccessKind")
}
type AccessKind int32
const (
AccessKindRead AccessKind = iota // Only reads from a variable
AccessKindWrite // Only writes to a variable without ever reading it. E.g.: `x=1;`.
AccessKindReadWrite // Reads from and writes to a variable. E.g.: `f(x++);`, `x/=1`.
)
// DeclarationBase
type DeclarationBase struct {
Symbol *Symbol // Symbol declared by node (initialized by binding)
}
func (node *DeclarationBase) DeclarationData() *DeclarationBase { return node }
func IsDeclarationNode(node *Node) bool {
return node.DeclarationData() != nil
}
// ExportableBase
type ExportableBase struct {
LocalSymbol *Symbol // Local symbol declared by node (initialized by binding only for exported nodes)
}
func (node *ExportableBase) ExportableData() *ExportableBase { return node }
// ModifiersBase
type ModifiersBase struct {
modifiers *ModifierList
}
func (node *ModifiersBase) Modifiers() *ModifierList { return node.modifiers }
// LocalsContainerBase
type LocalsContainerBase struct {
Locals SymbolTable // Locals associated with node (initialized by binding)
NextContainer *Node // Next container in declaration order (initialized by binding)
}
func (node *LocalsContainerBase) LocalsContainerData() *LocalsContainerBase { return node }
func IsLocalsContainer(node *Node) bool {
return node.LocalsContainerData() != nil
}
// FunctionLikeBase
type FunctionLikeBase struct {
LocalsContainerBase
TypeParameters *NodeList // NodeList[*TypeParameterDeclarationNode]. Optional
Parameters *NodeList // NodeList[*ParameterDeclarationNode]
Type *TypeNode // Optional
FullSignature *TypeNode // Type that applies to the whole function; should not be set if Type is set or if Parameters have types set.
}
func (node *FunctionLikeBase) LocalsContainerData() *LocalsContainerBase {
return &node.LocalsContainerBase
}
func (node *FunctionLikeBase) FunctionLikeData() *FunctionLikeBase { return node }
// BodyBase
type BodyBase struct {
AsteriskToken *TokenNode
Body *BlockOrExpression // Optional, can be Expression only in arrow functions
EndFlowNode *FlowNode
}
func (node *BodyBase) BodyData() *BodyBase { return node }
// FunctionLikeWithBodyBase
type FunctionLikeWithBodyBase struct {
FunctionLikeBase
BodyBase
}
func (node *FunctionLikeWithBodyBase) LocalsContainerData() *LocalsContainerBase {
return &node.LocalsContainerBase
}
func (node *FunctionLikeWithBodyBase) FunctionLikeData() *FunctionLikeBase {
return &node.FunctionLikeBase
}
func (node *FunctionLikeWithBodyBase) BodyData() *BodyBase { return &node.BodyBase }
// FlowNodeBase
type FlowNodeBase struct {
FlowNode *FlowNode
}
func (node *FlowNodeBase) FlowNodeData() *FlowNodeBase { return node }
// if you provide nil for file, this code will walk to the root of the tree to find the file
func (node *Node) JSDoc(file *SourceFile) []*Node {
if node.Flags&NodeFlagsHasJSDoc == 0 {
return nil
}
if file == nil {
file = GetSourceFileOfNode(node)
if file == nil {
return nil
}
}
if jsdocs, ok := file.jsdocCache[node]; ok {
return jsdocs
}
return nil
}
// compositeNodeBase
// A composite node is a node that contains a complex subtree. This struct is intended to be
// embedded in a node that requires caching for its subtree facts.
type compositeNodeBase struct {
facts atomic.Uint32 // caches the SubtreeFacts for this node and its subtree
}
func (node *compositeNodeBase) subtreeFactsWorker(self nodeData) SubtreeFacts {
// computeSubtreeFacts() is expected to be idempotent, so races will only impact time, not correctness.
facts := SubtreeFacts(node.facts.Load())
if facts&SubtreeFactsComputed == 0 {
facts |= self.computeSubtreeFacts() | SubtreeFactsComputed
node.facts.Store(uint32(facts))
}
return facts &^ SubtreeFactsComputed
}
func (node *compositeNodeBase) computeSubtreeFacts() SubtreeFacts {
// This method must be implemented by the concrete node type.
panic("not implemented")
}
// typeSyntaxBase
// A "type-syntax" node is a node whose subtree may only consist of TypeScript syntax. This struct is intended to be
// embedded in a node that only ever returns `SubtreeContainsTypeScript` for its subtree facts.
type typeSyntaxBase struct{}
func (node *typeSyntaxBase) computeSubtreeFacts() SubtreeFacts { return SubtreeContainsTypeScript }
func (node *typeSyntaxBase) propagateSubtreeFacts() SubtreeFacts { return SubtreeContainsTypeScript }
// Token
type Token struct {
NodeBase
}
func (f *NodeFactory) NewToken(kind Kind) *Node {
return f.newNode(kind, f.tokenPool.New())
}
func (node *Token) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewToken(node.Kind), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *Token) computeSubtreeFacts() SubtreeFacts {
switch node.Kind {
case KindUsingKeyword:
return SubtreeContainsUsing
case KindPublicKeyword,
KindPrivateKeyword,
KindProtectedKeyword,
KindReadonlyKeyword,
KindAbstractKeyword,
KindDeclareKeyword,
KindConstKeyword,
KindAnyKeyword,
KindNumberKeyword,
KindBigIntKeyword,
KindNeverKeyword,
KindObjectKeyword,
KindInKeyword,
KindOutKeyword,
KindOverrideKeyword,
KindStringKeyword,
KindBooleanKeyword,
KindSymbolKeyword,
KindVoidKeyword,
KindUnknownKeyword,
KindUndefinedKeyword, // `undefined` is an Identifier in the expression case.
KindExportKeyword: // `export` is TypeScript syntax in a namespace
return SubtreeContainsTypeScript
case KindAccessorKeyword:
return SubtreeContainsClassFields
case KindAsteriskAsteriskToken, KindAsteriskAsteriskEqualsToken:
return SubtreeContainsExponentiationOperator
case KindQuestionQuestionToken:
return SubtreeContainsNullishCoalescing
case KindQuestionDotToken:
return SubtreeContainsOptionalChaining
case KindQuestionQuestionEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken:
return SubtreeContainsLogicalAssignments
}
return SubtreeFactsNone
}
// Identifier
type Identifier struct {
ExpressionBase
FlowNodeBase
Text string
}
func (f *NodeFactory) NewIdentifier(text string) *Node {
data := f.identifierPool.New()
data.Text = text
f.textCount++
return f.newNode(KindIdentifier, data)
}
func (node *Identifier) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewIdentifier(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *Identifier) SubtreeFacts() SubtreeFacts {
return SubtreeContainsIdentifier
}
func IsIdentifier(node *Node) bool {
return node.Kind == KindIdentifier
}
// PrivateIdentifier
type PrivateIdentifier struct {
ExpressionBase
Text string
}
func (f *NodeFactory) NewPrivateIdentifier(text string) *Node {
data := &PrivateIdentifier{}
data.Text = text
f.textCount++
return f.newNode(KindPrivateIdentifier, data)
}
func (node *PrivateIdentifier) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewPrivateIdentifier(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *PrivateIdentifier) computeSubtreeFacts() SubtreeFacts {
return SubtreeContainsClassFields
}
func IsPrivateIdentifier(node *Node) bool {
return node.Kind == KindPrivateIdentifier
}
// QualifiedName
type QualifiedName struct {
NodeBase
FlowNodeBase
compositeNodeBase
Left *EntityName // EntityName
Right *IdentifierNode // IdentifierNode
}
func (f *NodeFactory) NewQualifiedName(left *EntityName, right *IdentifierNode) *Node {
data := &QualifiedName{}
data.Left = left
data.Right = right
return f.newNode(KindQualifiedName, data)
}
func (f *NodeFactory) UpdateQualifiedName(node *QualifiedName, left *EntityName, right *IdentifierNode) *Node {
if left != node.Left || right != node.Right {
return updateNode(f.NewQualifiedName(left, right), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *QualifiedName) ForEachChild(v Visitor) bool {
return visit(v, node.Left) || visit(v, node.Right)
}
func (node *QualifiedName) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateQualifiedName(node, v.visitNode(node.Left), v.visitNode(node.Right))
}
func (node *QualifiedName) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewQualifiedName(node.Left, node.Right), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsQualifiedName(node *Node) bool {
return node.Kind == KindQualifiedName
}
func (node *QualifiedName) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Left) |
propagateSubtreeFacts(node.Right)
}
// TypeParameterDeclaration
type TypeParameterDeclaration struct {
NodeBase
DeclarationBase
ModifiersBase
typeSyntaxBase
name *IdentifierNode // IdentifierNode
Constraint *TypeNode // TypeNode. Optional
Expression *Expression // Expression. Optional, for error recovery purposes
DefaultType *TypeNode // TypeNode. Optional
}
func (f *NodeFactory) NewTypeParameterDeclaration(modifiers *ModifierList, name *IdentifierNode, constraint *TypeNode, defaultType *TypeNode) *Node {
data := f.typeParameterDeclarationPool.New()
data.modifiers = modifiers
data.name = name
data.Constraint = constraint
data.DefaultType = defaultType
return f.newNode(KindTypeParameter, data)
}
func (f *NodeFactory) UpdateTypeParameterDeclaration(node *TypeParameterDeclaration, modifiers *ModifierList, name *IdentifierNode, constraint *TypeNode, defaultType *TypeNode) *Node {
if modifiers != node.modifiers || name != node.name || constraint != node.Constraint || defaultType != node.DefaultType {
return updateNode(f.NewTypeParameterDeclaration(modifiers, name, constraint, defaultType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypeParameterDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.Constraint) || visit(v, node.Expression) || visit(v, node.DefaultType)
}
func (node *TypeParameterDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypeParameterDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNode(node.Constraint), v.visitNode(node.DefaultType))
}
func (node *TypeParameterDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTypeParameterDeclaration(node.Modifiers(), node.Name(), node.Constraint, node.DefaultType), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *TypeParameterDeclaration) Name() *DeclarationName {
return node.name
}
func IsTypeParameterDeclaration(node *Node) bool {
return node.Kind == KindTypeParameter
}
// ComputedPropertyName
type ComputedPropertyName struct {
NodeBase
compositeNodeBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewComputedPropertyName(expression *Expression) *Node {
data := &ComputedPropertyName{}
data.Expression = expression
return f.newNode(KindComputedPropertyName, data)
}
func (f *NodeFactory) UpdateComputedPropertyName(node *ComputedPropertyName, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewComputedPropertyName(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ComputedPropertyName) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *ComputedPropertyName) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateComputedPropertyName(node, v.visitNode(node.Expression))
}
func (node *ComputedPropertyName) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewComputedPropertyName(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ComputedPropertyName) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func IsComputedPropertyName(node *Node) bool {
return node.Kind == KindComputedPropertyName
}
// Modifier
func (f *NodeFactory) NewModifier(kind Kind) *Node {
return f.NewToken(kind)
}
// Decorator
type Decorator struct {
NodeBase
compositeNodeBase
Expression *LeftHandSideExpression // LeftHandSideExpression
}
func (f *NodeFactory) NewDecorator(expression *LeftHandSideExpression) *Node {
data := &Decorator{}
data.Expression = expression
return f.newNode(KindDecorator, data)
}
func (f *NodeFactory) UpdateDecorator(node *Decorator, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewDecorator(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *Decorator) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *Decorator) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateDecorator(node, v.visitNode(node.Expression))
}
func (node *Decorator) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewDecorator(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *Decorator) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) |
SubtreeContainsTypeScript | // Decorator metadata
SubtreeContainsDecorators // legacy or ES decorators
}
func IsDecorator(node *Node) bool {
return node.Kind == KindDecorator
}
// StatementBase
type StatementBase struct {
NodeBase
FlowNodeBase
}
// EmptyStatement
type EmptyStatement struct {
StatementBase
}
func (f *NodeFactory) NewEmptyStatement() *Node {
return f.newNode(KindEmptyStatement, &EmptyStatement{})
}
func (node *EmptyStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewEmptyStatement(), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsEmptyStatement(node *Node) bool {
return node.Kind == KindEmptyStatement
}
// IfStatement
type IfStatement struct {
StatementBase
compositeNodeBase
Expression *Expression // Expression
ThenStatement *Statement // Statement
ElseStatement *Statement // Statement. Optional
}
func (f *NodeFactory) NewIfStatement(expression *Expression, thenStatement *Statement, elseStatement *Statement) *Node {
data := f.ifStatementPool.New()
data.Expression = expression
data.ThenStatement = thenStatement
data.ElseStatement = elseStatement
return f.newNode(KindIfStatement, data)
}
func (f *NodeFactory) UpdateIfStatement(node *IfStatement, expression *Expression, thenStatement *Statement, elseStatement *Statement) *Node {
if expression != node.Expression || thenStatement != node.ThenStatement || elseStatement != node.ElseStatement {
return updateNode(f.NewIfStatement(expression, thenStatement, elseStatement), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *IfStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.ThenStatement) || visit(v, node.ElseStatement)
}
func (node *IfStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateIfStatement(node, v.visitNode(node.Expression), v.visitEmbeddedStatement(node.ThenStatement), v.visitEmbeddedStatement(node.ElseStatement))
}
func (node *IfStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewIfStatement(node.Expression, node.ThenStatement, node.ElseStatement), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *IfStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) |
propagateSubtreeFacts(node.ThenStatement) |
propagateSubtreeFacts(node.ElseStatement)
}
func IsIfStatement(node *Node) bool {
return node.Kind == KindIfStatement
}
// DoStatement
type DoStatement struct {
StatementBase
compositeNodeBase
Statement *Statement // Statement
Expression *Expression // Expression
}
func (f *NodeFactory) NewDoStatement(statement *Statement, expression *Expression) *Node {
data := &DoStatement{}
data.Statement = statement
data.Expression = expression
return f.newNode(KindDoStatement, data)
}
func (f *NodeFactory) UpdateDoStatement(node *DoStatement, statement *Statement, expression *Expression) *Node {
if statement != node.Statement || expression != node.Expression {
return updateNode(f.NewDoStatement(statement, expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *DoStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateDoStatement(node, v.visitIterationBody(node.Statement), v.visitNode(node.Expression))
}
func (node *DoStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Statement) || visit(v, node.Expression)
}
func (node *DoStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewDoStatement(node.Statement, node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *DoStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Statement) |
propagateSubtreeFacts(node.Expression)
}
// WhileStatement
type WhileStatement struct {
StatementBase
compositeNodeBase
Expression *Expression // Expression
Statement *Statement // Statement
}
func (f *NodeFactory) NewWhileStatement(expression *Expression, statement *Statement) *Node {
data := &WhileStatement{}
data.Expression = expression
data.Statement = statement
return f.newNode(KindWhileStatement, data)
}
func (f *NodeFactory) UpdateWhileStatement(node *WhileStatement, expression *Expression, statement *Statement) *Node {
if expression != node.Expression || statement != node.Statement {
return updateNode(f.NewWhileStatement(expression, statement), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *WhileStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.Statement)
}
func (node *WhileStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateWhileStatement(node, v.visitNode(node.Expression), v.visitIterationBody(node.Statement))
}
func (node *WhileStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewWhileStatement(node.Expression, node.Statement), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *WhileStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | propagateSubtreeFacts(node.Statement)
}
// ForStatement
type ForStatement struct {
StatementBase
LocalsContainerBase
compositeNodeBase
Initializer *ForInitializer // ForInitializer. Optional
Condition *Expression // Expression. Optional
Incrementor *Expression // Expression. Optional
Statement *Statement // Statement
}
func (f *NodeFactory) NewForStatement(initializer *ForInitializer, condition *Expression, incrementor *Expression, statement *Statement) *Node {
data := &ForStatement{}
data.Initializer = initializer
data.Condition = condition
data.Incrementor = incrementor
data.Statement = statement
return f.newNode(KindForStatement, data)
}
func (f *NodeFactory) UpdateForStatement(node *ForStatement, initializer *ForInitializer, condition *Expression, incrementor *Expression, statement *Statement) *Node {
if initializer != node.Initializer || condition != node.Condition || incrementor != node.Incrementor || statement != node.Statement {
return updateNode(f.NewForStatement(initializer, condition, incrementor, statement), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ForStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Initializer) || visit(v, node.Condition) || visit(v, node.Incrementor) || visit(v, node.Statement)
}
func (node *ForStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateForStatement(node, v.visitNode(node.Initializer), v.visitNode(node.Condition), v.visitNode(node.Incrementor), v.visitIterationBody(node.Statement))
}
func (node *ForStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewForStatement(node.Initializer, node.Expression(), node.Incrementor, node.Statement), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ForStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Initializer) |
propagateSubtreeFacts(node.Condition) |
propagateSubtreeFacts(node.Incrementor) |
propagateSubtreeFacts(node.Statement)
}
func IsForStatement(node *Node) bool {
return node.Kind == KindForStatement
}
// ForInOrOfStatement
type ForInOrOfStatement struct {
StatementBase
LocalsContainerBase
compositeNodeBase
AwaitModifier *TokenNode // TokenNode. Optional
Initializer *ForInitializer // ForInitializer
Expression *Expression // Expression
Statement *Statement // Statement
}
func (f *NodeFactory) NewForInOrOfStatement(kind Kind, awaitModifier *TokenNode, initializer *ForInitializer, expression *Expression, statement *Statement) *Node {
data := &ForInOrOfStatement{}
data.AwaitModifier = awaitModifier
data.Initializer = initializer
data.Expression = expression
data.Statement = statement
return f.newNode(kind, data)
}
func (f *NodeFactory) UpdateForInOrOfStatement(node *ForInOrOfStatement, awaitModifier *TokenNode, 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 node.AsNode()
}
func (node *ForInOrOfStatement) ForEachChild(v Visitor) bool {
return visit(v, node.AwaitModifier) || visit(v, node.Initializer) || visit(v, node.Expression) || visit(v, node.Statement)
}
func (node *ForInOrOfStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateForInOrOfStatement(node, v.visitToken(node.AwaitModifier), v.visitNode(node.Initializer), v.visitNode(node.Expression), v.visitIterationBody(node.Statement))
}
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)
}
func (node *ForInOrOfStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Initializer) |
propagateSubtreeFacts(node.Expression) |
propagateSubtreeFacts(node.Statement) |
core.IfElse(node.AwaitModifier != nil, SubtreeContainsForAwaitOrAsyncGenerator, SubtreeFactsNone)
}
func IsForInStatement(node *Node) bool {
return node.Kind == KindForInStatement
}
func IsForOfStatement(node *Node) bool {
return node.Kind == KindForOfStatement
}
func IsForInOrOfStatement(node *Node) bool {
return IsForInStatement(node) || IsForOfStatement(node)
}
// BreakStatement
type BreakStatement struct {
StatementBase
Label *IdentifierNode // IdentifierNode. Optional
}
func (f *NodeFactory) NewBreakStatement(label *IdentifierNode) *Node {
data := &BreakStatement{}
data.Label = label
return f.newNode(KindBreakStatement, data)
}
func (f *NodeFactory) UpdateBreakStatement(node *BreakStatement, label *IdentifierNode) *Node {
if label != node.Label {
return updateNode(f.NewBreakStatement(label), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *BreakStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Label)
}
func (node *BreakStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateBreakStatement(node, v.visitNode(node.Label))
}
func (node *BreakStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewBreakStatement(node.Label), node.AsNode(), f.AsNodeFactory().hooks)
}
// ContinueStatement
type ContinueStatement struct {
StatementBase
Label *IdentifierNode // IdentifierNode. Optional
}
func (f *NodeFactory) NewContinueStatement(label *IdentifierNode) *Node {
data := &ContinueStatement{}
data.Label = label
return f.newNode(KindContinueStatement, data)
}
func (f *NodeFactory) UpdateContinueStatement(node *ContinueStatement, label *IdentifierNode) *Node {
if label != node.Label {
return updateNode(f.NewContinueStatement(label), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ContinueStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Label)
}
func (node *ContinueStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateContinueStatement(node, v.visitNode(node.Label))
}
func (node *ContinueStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewContinueStatement(node.Label), node.AsNode(), f.AsNodeFactory().hooks)
}
// ReturnStatement
type ReturnStatement struct {
StatementBase
compositeNodeBase
Expression *Expression // Expression. Optional
}
func (f *NodeFactory) NewReturnStatement(expression *Expression) *Node {
data := f.returnStatementPool.New()
data.Expression = expression
return f.newNode(KindReturnStatement, data)
}
func (f *NodeFactory) UpdateReturnStatement(node *ReturnStatement, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewReturnStatement(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ReturnStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *ReturnStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateReturnStatement(node, v.visitNode(node.Expression))
}
func (node *ReturnStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewReturnStatement(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ReturnStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func IsReturnStatement(node *Node) bool {
return node.Kind == KindReturnStatement
}
// WithStatement
type WithStatement struct {
StatementBase
compositeNodeBase
Expression *Expression // Expression
Statement *Statement // Statement
}
func (f *NodeFactory) NewWithStatement(expression *Expression, statement *Statement) *Node {
data := &WithStatement{}
data.Expression = expression
data.Statement = statement
return f.newNode(KindWithStatement, data)
}
func (f *NodeFactory) UpdateWithStatement(node *WithStatement, expression *Expression, statement *Statement) *Node {
if expression != node.Expression || statement != node.Statement {
return updateNode(f.NewWithStatement(expression, statement), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *WithStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.Statement)
}
func (node *WithStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateWithStatement(node, v.visitNode(node.Expression), v.visitEmbeddedStatement(node.Statement))
}
func (node *WithStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewWithStatement(node.Expression, node.Statement), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *WithStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | propagateSubtreeFacts(node.Statement)
}
// SwitchStatement
type SwitchStatement struct {
StatementBase
compositeNodeBase
Expression *Expression // Expression
CaseBlock *CaseBlockNode // CaseBlockNode
}
func (f *NodeFactory) NewSwitchStatement(expression *Expression, caseBlock *CaseBlockNode) *Node {
data := &SwitchStatement{}
data.Expression = expression
data.CaseBlock = caseBlock
return f.newNode(KindSwitchStatement, data)
}
func (f *NodeFactory) UpdateSwitchStatement(node *SwitchStatement, expression *Expression, caseBlock *CaseBlockNode) *Node {
if expression != node.Expression || caseBlock != node.CaseBlock {
return updateNode(f.NewSwitchStatement(expression, caseBlock), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *SwitchStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.CaseBlock)
}
func (node *SwitchStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateSwitchStatement(node, v.visitNode(node.Expression), v.visitNode(node.CaseBlock))
}
func (node *SwitchStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewSwitchStatement(node.Expression, node.CaseBlock), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *SwitchStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) |
propagateSubtreeFacts(node.CaseBlock)
}
func IsSwitchStatement(node *Node) bool {
return node.Kind == KindSwitchStatement
}
// CaseBlock
type CaseBlock struct {
NodeBase
LocalsContainerBase
compositeNodeBase
Clauses *NodeList // NodeList[*CaseOrDefaultClauseNode]
}
func (f *NodeFactory) NewCaseBlock(clauses *NodeList) *Node {
data := &CaseBlock{}
data.Clauses = clauses
return f.newNode(KindCaseBlock, data)
}
func (f *NodeFactory) UpdateCaseBlock(node *CaseBlock, clauses *CaseClausesList) *Node {
if clauses != node.Clauses {
return updateNode(f.NewCaseBlock(clauses), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *CaseBlock) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Clauses)
}
func (node *CaseBlock) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateCaseBlock(node, v.visitNodes(node.Clauses))
}
func (node *CaseBlock) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewCaseBlock(node.Clauses), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *CaseBlock) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Clauses, propagateSubtreeFacts)
}
// CaseOrDefaultClause
type CaseOrDefaultClause struct {
NodeBase
compositeNodeBase
Expression *Expression // Expression. nil in default clause
Statements *NodeList // NodeList[*Statement]
FallthroughFlowNode *FlowNode
}
func (f *NodeFactory) NewCaseOrDefaultClause(kind Kind, expression *Expression, statements *NodeList) *Node {
data := &CaseOrDefaultClause{}
data.Expression = expression
data.Statements = statements
return f.newNode(kind, data)
}
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 node.AsNode()
}
func (node *CaseOrDefaultClause) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visitNodeList(v, node.Statements)
}
func (node *CaseOrDefaultClause) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateCaseOrDefaultClause(node, v.visitNode(node.Expression), v.visitNodes(node.Statements))
}
func (node *CaseOrDefaultClause) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewCaseOrDefaultClause(node.Kind, node.Expression, node.Statements), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *CaseOrDefaultClause) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | propagateNodeListSubtreeFacts(node.Statements, propagateSubtreeFacts)
}
func IsCaseClause(node *Node) bool {
return node.Kind == KindCaseClause
}
func IsDefaultClause(node *Node) bool {
return node.Kind == KindDefaultClause
}
// ThrowStatement
type ThrowStatement struct {
StatementBase
compositeNodeBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewThrowStatement(expression *Expression) *Node {
data := &ThrowStatement{}
data.Expression = expression
return f.newNode(KindThrowStatement, data)
}
func (f *NodeFactory) UpdateThrowStatement(node *ThrowStatement, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewThrowStatement(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ThrowStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *ThrowStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateThrowStatement(node, v.visitNode(node.Expression))
}
func (node *ThrowStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewThrowStatement(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ThrowStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func IsThrowStatement(node *Node) bool {
return node.Kind == KindThrowStatement
}
// TryStatement
type TryStatement struct {
StatementBase
compositeNodeBase
TryBlock *BlockNode // BlockNode
CatchClause *CatchClauseNode // CatchClauseNode. Optional
FinallyBlock *BlockNode // BlockNode. Optional
}
func (f *NodeFactory) NewTryStatement(tryBlock *BlockNode, catchClause *CatchClauseNode, finallyBlock *BlockNode) *Node {
data := &TryStatement{}
data.TryBlock = tryBlock
data.CatchClause = catchClause
data.FinallyBlock = finallyBlock
return f.newNode(KindTryStatement, data)
}
func (f *NodeFactory) UpdateTryStatement(node *TryStatement, tryBlock *BlockNode, catchClause *CatchClauseNode, finallyBlock *BlockNode) *Node {
if tryBlock != node.TryBlock || catchClause != node.CatchClause || finallyBlock != node.FinallyBlock {
return updateNode(f.NewTryStatement(tryBlock, catchClause, finallyBlock), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TryStatement) ForEachChild(v Visitor) bool {
return visit(v, node.TryBlock) || visit(v, node.CatchClause) || visit(v, node.FinallyBlock)
}
func (node *TryStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTryStatement(node, v.visitNode(node.TryBlock), v.visitNode(node.CatchClause), v.visitNode(node.FinallyBlock))
}
func (node *TryStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTryStatement(node.TryBlock, node.CatchClause, node.FinallyBlock), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *TryStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.TryBlock) |
propagateSubtreeFacts(node.CatchClause) |
propagateSubtreeFacts(node.FinallyBlock)
}
func IsTryStatement(node *Node) bool {
return node.Kind == KindTryStatement
}
// CatchClause
type CatchClause struct {
NodeBase
LocalsContainerBase
compositeNodeBase
VariableDeclaration *VariableDeclarationNode // VariableDeclarationNode. Optional
Block *BlockNode // BlockNode
}
func (f *NodeFactory) NewCatchClause(variableDeclaration *VariableDeclarationNode, block *BlockNode) *Node {
data := &CatchClause{}
data.VariableDeclaration = variableDeclaration
data.Block = block
return f.newNode(KindCatchClause, data)
}
func (f *NodeFactory) UpdateCatchClause(node *CatchClause, variableDeclaration *VariableDeclarationNode, block *BlockNode) *Node {
if variableDeclaration != node.VariableDeclaration || block != node.Block {
return updateNode(f.NewCatchClause(variableDeclaration, block), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *CatchClause) ForEachChild(v Visitor) bool {
return visit(v, node.VariableDeclaration) || visit(v, node.Block)
}
func (node *CatchClause) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateCatchClause(node, v.visitNode(node.VariableDeclaration), v.visitNode(node.Block))
}
func (node *CatchClause) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewCatchClause(node.VariableDeclaration, node.Block), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *CatchClause) computeSubtreeFacts() SubtreeFacts {
res := propagateSubtreeFacts(node.VariableDeclaration) |
propagateSubtreeFacts(node.Block)
if node.VariableDeclaration == nil {
res |= SubtreeContainsMissingCatchClauseVariable
}
return res
}
func (node *CatchClause) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsCatchClause
}
func IsCatchClause(node *Node) bool {
return node.Kind == KindCatchClause
}
// DebuggerStatement
type DebuggerStatement struct {
StatementBase
}
func (f *NodeFactory) NewDebuggerStatement() *Node {
return f.newNode(KindDebuggerStatement, &DebuggerStatement{})
}
func (node *DebuggerStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewDebuggerStatement(), node.AsNode(), f.AsNodeFactory().hooks)
}
// LabeledStatement
type LabeledStatement struct {
StatementBase
Label *IdentifierNode // IdentifierNode
Statement *Statement // Statement
}
func (f *NodeFactory) NewLabeledStatement(label *IdentifierNode, statement *Statement) *Node {
data := &LabeledStatement{}
data.Label = label
data.Statement = statement
return f.newNode(KindLabeledStatement, data)
}
func (f *NodeFactory) UpdateLabeledStatement(node *LabeledStatement, label *IdentifierNode, statement *Statement) *Node {
if label != node.Label || statement != node.Statement {
return updateNode(f.NewLabeledStatement(label, statement), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *LabeledStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Label) || visit(v, node.Statement)
}
func (node *LabeledStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateLabeledStatement(node, v.visitNode(node.Label), v.visitEmbeddedStatement(node.Statement))
}
func (node *LabeledStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewLabeledStatement(node.Label, node.Statement), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *LabeledStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Statement)
}
func IsLabeledStatement(node *Node) bool {
return node.Kind == KindLabeledStatement
}
// ExpressionStatement
type ExpressionStatement struct {
StatementBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewExpressionStatement(expression *Expression) *Node {
data := f.expressionStatementPool.New()
data.Expression = expression
return f.newNode(KindExpressionStatement, data)
}
func (f *NodeFactory) UpdateExpressionStatement(node *ExpressionStatement, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewExpressionStatement(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ExpressionStatement) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *ExpressionStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateExpressionStatement(node, v.visitNode(node.Expression))
}
func (node *ExpressionStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewExpressionStatement(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ExpressionStatement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func IsExpressionStatement(node *Node) bool {
return node.Kind == KindExpressionStatement
}
// Block
type Block struct {
StatementBase
LocalsContainerBase
compositeNodeBase
Statements *NodeList // NodeList[*Statement]
Multiline bool
}
func (f *NodeFactory) NewBlock(statements *NodeList, multiline bool) *Node {
data := f.blockPool.New()
data.Statements = statements
data.Multiline = multiline
return f.newNode(KindBlock, data)
}
func (f *NodeFactory) UpdateBlock(node *Block, statements *StatementList) *Node {
if statements != node.Statements {
return updateNode(f.NewBlock(statements, node.Multiline), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *Block) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Statements)
}
func (node *Block) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateBlock(node, v.visitNodes(node.Statements))
}
func (node *Block) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewBlock(node.Statements, node.Multiline), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *Block) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Statements, propagateSubtreeFacts)
}
func IsBlock(node *Node) bool {
return node.Kind == KindBlock
}
// VariableStatement
type VariableStatement struct {
StatementBase
ModifiersBase
compositeNodeBase
DeclarationList *VariableDeclarationListNode // VariableDeclarationListNode
}
func (f *NodeFactory) NewVariableStatement(modifiers *ModifierList, declarationList *VariableDeclarationListNode) *Node {
data := f.variableStatementPool.New()
data.modifiers = modifiers
data.DeclarationList = declarationList
return f.newNode(KindVariableStatement, data)
}
func (f *NodeFactory) UpdateVariableStatement(node *VariableStatement, modifiers *ModifierList, declarationList *VariableDeclarationListNode) *Node {
if modifiers != node.modifiers || declarationList != node.DeclarationList {
return updateNode(f.NewVariableStatement(modifiers, declarationList), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *VariableStatement) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.DeclarationList)
}
func (node *VariableStatement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateVariableStatement(node, v.visitModifiers(node.modifiers), v.visitNode(node.DeclarationList))
}
func (node *VariableStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewVariableStatement(node.Modifiers(), node.DeclarationList), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *VariableStatement) computeSubtreeFacts() SubtreeFacts {
if node.modifiers != nil && node.modifiers.ModifierFlags&ModifierFlagsAmbient != 0 {
return SubtreeContainsTypeScript
} else {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.DeclarationList)
}
}
func IsVariableStatement(node *Node) bool {
return node.Kind == KindVariableStatement
}
// VariableDeclaration
type VariableDeclaration struct {
NodeBase
DeclarationBase
ExportableBase
compositeNodeBase
name *BindingName // BindingName
ExclamationToken *TokenNode // TokenNode. Optional
Type *TypeNode // TypeNode. Optional
Initializer *Expression // Expression. Optional
}
func (f *NodeFactory) NewVariableDeclaration(name *BindingName, exclamationToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
data := f.variableDeclarationPool.New()
data.name = name
data.ExclamationToken = exclamationToken
data.Type = typeNode
data.Initializer = initializer
return f.newNode(KindVariableDeclaration, data)
}
func (f *NodeFactory) UpdateVariableDeclaration(node *VariableDeclaration, name *BindingName, exclamationToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
if name != node.name || exclamationToken != node.ExclamationToken || typeNode != node.Type || initializer != node.Initializer {
return updateNode(f.NewVariableDeclaration(name, exclamationToken, typeNode, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *VariableDeclaration) ForEachChild(v Visitor) bool {
return visit(v, node.name) || visit(v, node.ExclamationToken) || visit(v, node.Type) || visit(v, node.Initializer)
}
func (node *VariableDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateVariableDeclaration(node, v.visitNode(node.name), v.visitToken(node.ExclamationToken), v.visitNode(node.Type), v.visitNode(node.Initializer))
}
func (node *VariableDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewVariableDeclaration(node.Name(), node.ExclamationToken, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *VariableDeclaration) Name() *DeclarationName {
return node.name
}
func (node *VariableDeclaration) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name) |
propagateEraseableSyntaxSubtreeFacts(node.ExclamationToken) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateSubtreeFacts(node.Initializer)
}
func IsVariableDeclaration(node *Node) bool {
return node.Kind == KindVariableDeclaration
}
// VariableDeclarationList
type VariableDeclarationList struct {
NodeBase
compositeNodeBase
Declarations *NodeList // NodeList[*VariableDeclarationNode]
}
func (f *NodeFactory) NewVariableDeclarationList(flags NodeFlags, declarations *NodeList) *Node {
data := f.variableDeclarationListPool.New()
data.Declarations = declarations
node := f.newNode(KindVariableDeclarationList, data)
node.Flags = flags
return node
}
func (f *NodeFactory) UpdateVariableDeclarationList(node *VariableDeclarationList, declarations *VariableDeclarationNodeList) *Node {
if declarations != node.Declarations {
return updateNode(f.NewVariableDeclarationList(node.Flags, declarations), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *VariableDeclarationList) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Declarations)
}
func (node *VariableDeclarationList) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateVariableDeclarationList(node, v.visitNodes(node.Declarations))
}
func (node *VariableDeclarationList) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewVariableDeclarationList(node.Flags, node.Declarations), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *VariableDeclarationList) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Declarations, propagateSubtreeFacts) |
core.IfElse(node.Flags&NodeFlagsUsing != 0, SubtreeContainsUsing, SubtreeFactsNone)
}
func (node *VariableDeclarationList) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsVariableDeclarationList
}
func IsVariableDeclarationList(node *Node) bool {
return node.Kind == KindVariableDeclarationList
}
// BindingPattern (SyntaxBindObjectBindingPattern | KindArrayBindingPattern)
type BindingPattern struct {
NodeBase
compositeNodeBase
Elements *NodeList // NodeList[*BindingElementNode]
}
func (f *NodeFactory) NewBindingPattern(kind Kind, elements *NodeList) *Node {
data := &BindingPattern{}
data.Elements = elements
return f.newNode(kind, data)
}
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 node.AsNode()
}
func (node *BindingPattern) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Elements)
}
func (node *BindingPattern) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateBindingPattern(node, v.visitNodes(node.Elements))
}
func (node *BindingPattern) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewBindingPattern(node.Kind, node.Elements), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *BindingPattern) computeSubtreeFacts() SubtreeFacts {
switch node.Kind {
case KindObjectBindingPattern:
return propagateNodeListSubtreeFacts(node.Elements, propagateObjectBindingElementSubtreeFacts)
case KindArrayBindingPattern:
return propagateNodeListSubtreeFacts(node.Elements, propagateBindingElementSubtreeFacts)
default:
return SubtreeFactsNone
}
}
func (node *BindingPattern) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsBindingPattern
}
func IsObjectBindingPattern(node *Node) bool {
return node.Kind == KindObjectBindingPattern
}
func IsArrayBindingPattern(node *Node) bool {
return node.Kind == KindArrayBindingPattern
}
func IsBindingPattern(node *Node) bool {
return node.Kind == KindArrayBindingPattern || node.Kind == KindObjectBindingPattern
}
// ParameterDeclaration
type ParameterDeclaration struct {
NodeBase
DeclarationBase
ModifiersBase
compositeNodeBase
DotDotDotToken *TokenNode // TokenNode. Present on rest parameter
name *BindingName // BindingName. Declared parameter name
QuestionToken *TokenNode // TokenNode. Present on optional parameter
Type *TypeNode // TypeNode. Optional
Initializer *Expression // Expression. Optional
}
func (f *NodeFactory) NewParameterDeclaration(modifiers *ModifierList, dotDotDotToken *TokenNode, name *BindingName, questionToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
data := f.parameterDeclarationPool.New()
data.modifiers = modifiers
data.DotDotDotToken = dotDotDotToken
data.name = name
data.QuestionToken = questionToken
data.Type = typeNode
data.Initializer = initializer
return f.newNode(KindParameter, data)
}
func (f *NodeFactory) UpdateParameterDeclaration(node *ParameterDeclaration, modifiers *ModifierList, dotDotDotToken *TokenNode, name *BindingName, questionToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
if modifiers != node.modifiers || dotDotDotToken != node.DotDotDotToken || name != node.name || questionToken != node.QuestionToken || typeNode != node.Type || initializer != node.Initializer {
return updateNode(f.NewParameterDeclaration(modifiers, dotDotDotToken, name, questionToken, typeNode, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ParameterDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.DotDotDotToken) || visit(v, node.name) ||
visit(v, node.QuestionToken) || visit(v, node.Type) || visit(v, node.Initializer)
}
func (node *ParameterDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateParameterDeclaration(node, v.visitModifiers(node.modifiers), v.visitToken(node.DotDotDotToken), v.visitNode(node.name), v.visitToken(node.QuestionToken), v.visitNode(node.Type), v.visitNode(node.Initializer))
}
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)
}
func (node *ParameterDeclaration) computeSubtreeFacts() SubtreeFacts {
if node.name != nil && IsThisIdentifier(node.name) {
return SubtreeContainsTypeScript
} else {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.name) |
propagateEraseableSyntaxSubtreeFacts(node.QuestionToken) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateSubtreeFacts(node.Initializer)
}
}
func (node *ParameterDeclaration) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsParameter
}
func (node *ParameterDeclaration) Name() *DeclarationName {
return node.name
}
func IsParameter(node *Node) bool {
return node.Kind == KindParameter
}
// BindingElement
type BindingElement struct {
NodeBase
DeclarationBase
ExportableBase
FlowNodeBase
compositeNodeBase
DotDotDotToken *TokenNode // TokenNode. Present on rest element (in object binding pattern)
PropertyName *PropertyName // PropertyName. Optional binding property name in object binding pattern
name *BindingName // BindingName. Optional (nil for missing element)
Initializer *Expression // Expression. Optional
}
func (f *NodeFactory) NewBindingElement(dotDotDotToken *TokenNode, propertyName *PropertyName, name *BindingName, initializer *Expression) *Node {
data := &BindingElement{}
data.DotDotDotToken = dotDotDotToken
data.PropertyName = propertyName
data.name = name
data.Initializer = initializer
return f.newNode(KindBindingElement, data)
}
func (f *NodeFactory) UpdateBindingElement(node *BindingElement, dotDotDotToken *TokenNode, propertyName *PropertyName, name *BindingName, initializer *Expression) *Node {
if dotDotDotToken != node.DotDotDotToken || propertyName != node.PropertyName || name != node.name || initializer != node.Initializer {
return updateNode(f.NewBindingElement(dotDotDotToken, propertyName, name, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *BindingElement) ForEachChild(v Visitor) bool {
return visit(v, node.DotDotDotToken) || visit(v, node.PropertyName) || visit(v, node.name) || visit(v, node.Initializer)
}
func (node *BindingElement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateBindingElement(node, v.visitToken(node.DotDotDotToken), v.visitNode(node.PropertyName), v.visitNode(node.name), v.visitNode(node.Initializer))
}
func (node *BindingElement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewBindingElement(node.DotDotDotToken, node.PropertyName, node.Name(), node.Initializer), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *BindingElement) Name() *DeclarationName {
return node.name
}
func (node *BindingElement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.PropertyName) |
propagateSubtreeFacts(node.name) |
propagateSubtreeFacts(node.Initializer) |
core.IfElse(node.DotDotDotToken != nil, SubtreeContainsRestOrSpread, SubtreeFactsNone)
}
func IsBindingElement(node *Node) bool {
return node.Kind == KindBindingElement
}
// MissingDeclaration
type MissingDeclaration struct {
StatementBase
DeclarationBase
ModifiersBase
}
func (f *NodeFactory) NewMissingDeclaration(modifiers *ModifierList) *Node {
data := &MissingDeclaration{}
data.modifiers = modifiers
return f.newNode(KindMissingDeclaration, data)
}
func (f *NodeFactory) UpdateMissingDeclaration(node *MissingDeclaration, modifiers *ModifierList) *Node {
if modifiers != node.modifiers {
return updateNode(f.NewMissingDeclaration(modifiers), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *MissingDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers)
}
func (node *MissingDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateMissingDeclaration(node, v.visitModifiers(node.modifiers))
}
func (node *MissingDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewMissingDeclaration(node.Modifiers()), node.AsNode(), f.AsNodeFactory().hooks)
}
// FunctionDeclaration
type FunctionDeclaration struct {
StatementBase
DeclarationBase
ExportableBase
ModifiersBase
FunctionLikeWithBodyBase
compositeNodeBase
name *IdentifierNode // IdentifierNode
ReturnFlowNode *FlowNode
}
func (f *NodeFactory) NewFunctionDeclaration(modifiers *ModifierList, asteriskToken *TokenNode, name *IdentifierNode, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
data := f.functionDeclarationPool.New()
data.modifiers = modifiers
data.AsteriskToken = asteriskToken
data.name = name
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
data.FullSignature = fullSignature
data.Body = body
return f.newNode(KindFunctionDeclaration, data)
}
func (f *NodeFactory) UpdateFunctionDeclaration(node *FunctionDeclaration, modifiers *ModifierList, asteriskToken *TokenNode, name *IdentifierNode, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
if modifiers != node.modifiers || asteriskToken != node.AsteriskToken || name != node.name || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type || fullSignature != node.FullSignature || body != node.Body {
return updateNode(f.NewFunctionDeclaration(modifiers, asteriskToken, name, typeParameters, parameters, returnType, fullSignature, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *FunctionDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.AsteriskToken) || visit(v, node.name) || visitNodeList(v, node.TypeParameters) ||
visitNodeList(v, node.Parameters) || visit(v, node.Type) || visit(v, node.FullSignature) || visit(v, node.Body)
}
func (node *FunctionDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateFunctionDeclaration(node, v.visitModifiers(node.modifiers), v.visitToken(node.AsteriskToken), v.visitNode(node.name), v.visitNodes(node.TypeParameters), v.visitParameters(node.Parameters), v.visitNode(node.Type), v.visitNode(node.FullSignature), v.visitFunctionBody(node.Body))
}
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)
}
func (node *FunctionDeclaration) Name() *DeclarationName {
return node.name
}
func (node *FunctionDeclaration) computeSubtreeFacts() SubtreeFacts {
if node.Body == nil || node.ModifierFlags()&ModifierFlagsAmbient != 0 {
return SubtreeContainsTypeScript
} else {
isAsync := node.ModifierFlags()&ModifierFlagsAsync != 0
isGenerator := node.AsteriskToken != nil
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.AsteriskToken) |
propagateSubtreeFacts(node.name) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeParameters) |
propagateNodeListSubtreeFacts(node.Parameters, propagateSubtreeFacts) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateEraseableSyntaxSubtreeFacts(node.FullSignature) |
propagateSubtreeFacts(node.Body) |
core.IfElse(isAsync && isGenerator, SubtreeContainsForAwaitOrAsyncGenerator, SubtreeFactsNone) |
core.IfElse(isAsync && !isGenerator, SubtreeContainsAnyAwait, SubtreeFactsNone)
}
}
func (node *FunctionDeclaration) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsFunction
}
func IsFunctionDeclaration(node *Node) bool {
return node.Kind == KindFunctionDeclaration
}
// ClassLikeDeclarationBase
type ClassLikeBase struct {
DeclarationBase
ExportableBase
ModifiersBase
LocalsContainerBase
compositeNodeBase
name *IdentifierNode // IdentifierNode
TypeParameters *NodeList // NodeList[*TypeParameterDeclarationNode]. Optional
HeritageClauses *NodeList // NodeList[*HeritageClauseNode]. Optional
Members *NodeList // NodeList[*ClassElement]
}
func (node *ClassLikeBase) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visitNodeList(v, node.TypeParameters) ||
visitNodeList(v, node.HeritageClauses) || visitNodeList(v, node.Members)
}
func (node *ClassLikeBase) Name() *DeclarationName { return node.name }
func (node *ClassLikeBase) ClassLikeData() *ClassLikeBase { return node }
func (node *ClassLikeBase) computeSubtreeFacts() SubtreeFacts {
if node.modifiers != nil && node.modifiers.ModifierFlags&ModifierFlagsAmbient != 0 {
return SubtreeContainsTypeScript
} else {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.name) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeParameters) |
propagateNodeListSubtreeFacts(node.HeritageClauses, propagateSubtreeFacts) |
propagateNodeListSubtreeFacts(node.Members, propagateSubtreeFacts)
}
}
// ClassDeclaration
type ClassDeclaration struct {
StatementBase
ClassLikeBase
}
func (f *NodeFactory) NewClassDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *NodeList, heritageClauses *NodeList, members *NodeList) *Node {
data := &ClassDeclaration{}
data.modifiers = modifiers
data.name = name
data.TypeParameters = typeParameters
data.HeritageClauses = heritageClauses
data.Members = members
return f.newNode(KindClassDeclaration, data)
}
func (f *NodeFactory) UpdateClassDeclaration(node *ClassDeclaration, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *ClassElementList) *Node {
if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || heritageClauses != node.HeritageClauses || members != node.Members {
return updateNode(f.NewClassDeclaration(modifiers, name, typeParameters, heritageClauses, members), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ClassDeclaration) VisitEachChild(v *NodeVisitor) *Node {
modifiers := v.visitModifiers(node.modifiers)
name := v.visitNode(node.name)
typeParameters := v.visitNodes(node.TypeParameters)
heritageClauses := v.visitNodes(node.HeritageClauses)
if heritageClauses != nil && len(heritageClauses.Nodes) == 0 {
heritageClauses = nil
}
members := v.visitNodes(node.Members)
return v.Factory.UpdateClassDeclaration(node, modifiers, name, typeParameters, heritageClauses, members)
}
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)
}
func (node *ClassDeclaration) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsClass
}
func IsClassDeclaration(node *Node) bool {
return node.Kind == KindClassDeclaration
}
// ClassExpression
type ClassExpression struct {
ExpressionBase
ClassLikeBase
}
func (f *NodeFactory) NewClassExpression(modifiers *ModifierList, name *IdentifierNode, typeParameters *NodeList, heritageClauses *NodeList, members *NodeList) *Node {
data := &ClassExpression{}
data.modifiers = modifiers
data.name = name
data.TypeParameters = typeParameters
data.HeritageClauses = heritageClauses
data.Members = members
return f.newNode(KindClassExpression, data)
}
func (f *NodeFactory) UpdateClassExpression(node *ClassExpression, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *ClassElementList) *Node {
if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || heritageClauses != node.HeritageClauses || members != node.Members {
return updateNode(f.NewClassExpression(modifiers, name, typeParameters, heritageClauses, members), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ClassExpression) VisitEachChild(v *NodeVisitor) *Node {
modifiers := v.visitModifiers(node.modifiers)
name := v.visitNode(node.name)
typeParameters := v.visitNodes(node.TypeParameters)
heritageClauses := v.visitNodes(node.HeritageClauses)
if heritageClauses != nil && len(heritageClauses.Nodes) == 0 {
heritageClauses = nil
}
members := v.visitNodes(node.Members)
return v.Factory.UpdateClassExpression(node, modifiers, name, typeParameters, heritageClauses, members)
}
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)
}
func (node *ClassExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsClass
}
func IsClassExpression(node *Node) bool {
return node.Kind == KindClassExpression
}
// HeritageClause
type HeritageClause struct {
NodeBase
compositeNodeBase
Token Kind
Types *NodeList // NodeList[*ExpressionWithTypeArgumentsNode]
}
func (f *NodeFactory) NewHeritageClause(token Kind, types *NodeList) *Node {
data := f.heritageClausePool.New()
data.Token = token
data.Types = types
return f.newNode(KindHeritageClause, data)
}
func (f *NodeFactory) UpdateHeritageClause(node *HeritageClause, types *ExpressionWithTypeArgumentsList) *Node {
if types != node.Types {
return updateNode(f.NewHeritageClause(node.Token, types), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *HeritageClause) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Types)
}
func (node *HeritageClause) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateHeritageClause(node, v.visitNodes(node.Types))
}
func (node *HeritageClause) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewHeritageClause(node.Kind, node.Types), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *HeritageClause) computeSubtreeFacts() SubtreeFacts {
switch node.Token {
case KindExtendsKeyword:
return propagateNodeListSubtreeFacts(node.Types, propagateSubtreeFacts)
case KindImplementsKeyword:
return SubtreeContainsTypeScript
default:
return SubtreeFactsNone
}
}
func IsHeritageClause(node *Node) bool {
return node.Kind == KindHeritageClause
}
// InterfaceDeclaration
type InterfaceDeclaration struct {
StatementBase
DeclarationBase
ExportableBase
ModifiersBase
typeSyntaxBase
name *IdentifierNode
TypeParameters *NodeList // NodeList[*TypeParameterDeclarationNode]. Optional
HeritageClauses *NodeList // NodeList[*HeritageClauseNode]. Optional
Members *NodeList // NodeList[*TypeElement]
}
func (f *NodeFactory) NewInterfaceDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *NodeList, heritageClauses *NodeList, members *NodeList) *Node {
data := f.interfaceDeclarationPool.New()
data.modifiers = modifiers
data.name = name
data.TypeParameters = typeParameters
data.HeritageClauses = heritageClauses
data.Members = members
return f.newNode(KindInterfaceDeclaration, data)
}
func (f *NodeFactory) UpdateInterfaceDeclaration(node *InterfaceDeclaration, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *TypeElementList) *Node {
if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || heritageClauses != node.HeritageClauses || members != node.Members {
return updateNode(f.NewInterfaceDeclaration(modifiers, name, typeParameters, heritageClauses, members), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *InterfaceDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visitNodeList(v, node.TypeParameters) ||
visitNodeList(v, node.HeritageClauses) || visitNodeList(v, node.Members)
}
func (node *InterfaceDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateInterfaceDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNodes(node.TypeParameters), v.visitNodes(node.HeritageClauses), v.visitNodes(node.Members))
}
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)
}
func (node *InterfaceDeclaration) Name() *DeclarationName { return node.name }
func IsInterfaceDeclaration(node *Node) bool {
return node.Kind == KindInterfaceDeclaration
}
// TypeAliasDeclaration
type TypeAliasDeclaration struct {
StatementBase
DeclarationBase
ExportableBase
ModifiersBase
LocalsContainerBase
typeSyntaxBase
name *IdentifierNode // IdentifierNode
TypeParameters *NodeList // NodeList[*TypeParameterDeclarationNode]. Optional
Type *TypeNode // TypeNode
}
func (f *NodeFactory) newTypeAliasOrJSTypeAliasDeclaration(kind Kind, modifiers *ModifierList, name *IdentifierNode, typeParameters *NodeList, typeNode *TypeNode) *Node {
data := f.typeAliasDeclarationPool.New()
data.modifiers = modifiers
data.name = name
data.TypeParameters = typeParameters
data.Type = typeNode
return f.newNode(kind, data)
}
func (f *NodeFactory) NewTypeAliasDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *NodeList, typeNode *TypeNode) *Node {
return f.newTypeAliasOrJSTypeAliasDeclaration(KindTypeAliasDeclaration, modifiers, name, typeParameters, typeNode)
}
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 {
return updateNode(f.newTypeAliasOrJSTypeAliasDeclaration(node.Kind, modifiers, name, typeParameters, typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypeAliasDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visitNodeList(v, node.TypeParameters) || visit(v, node.Type)
}
func (node *TypeAliasDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypeAliasDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNodes(node.TypeParameters), v.visitNode(node.Type))
}
func (node *TypeAliasDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().newTypeAliasOrJSTypeAliasDeclaration(node.Kind, node.Modifiers(), node.Name(), node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *TypeAliasDeclaration) Name() *DeclarationName { return node.name }
func IsTypeAliasDeclaration(node *Node) bool {
return node.Kind == KindTypeAliasDeclaration
}
func IsTypeOrJSTypeAliasDeclaration(node *Node) bool {
return node.Kind == KindTypeAliasDeclaration || node.Kind == KindJSTypeAliasDeclaration
}
func (f *NodeFactory) NewJSTypeAliasDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *NodeList, typeNode *TypeNode) *Node {
return f.newTypeAliasOrJSTypeAliasDeclaration(KindJSTypeAliasDeclaration, modifiers, name, typeParameters, typeNode)
}
func IsJSTypeAliasDeclaration(node *Node) bool {
return node.Kind == KindJSTypeAliasDeclaration
}
// EnumMember
type EnumMember struct {
NodeBase
NamedMemberBase
compositeNodeBase
Initializer *Expression // Expression. Optional
}
func (f *NodeFactory) NewEnumMember(name *PropertyName, initializer *Expression) *Node {
data := &EnumMember{}
data.name = name
data.Initializer = initializer
return f.newNode(KindEnumMember, data)
}
func (f *NodeFactory) UpdateEnumMember(node *EnumMember, name *PropertyName, initializer *Expression) *Node {
if name != node.name || initializer != node.Initializer {
return updateNode(f.NewEnumMember(name, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *EnumMember) ForEachChild(v Visitor) bool {
return visit(v, node.name) || visit(v, node.Initializer)
}
func (node *EnumMember) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateEnumMember(node, v.visitNode(node.name), v.visitNode(node.Initializer))
}
func (node *EnumMember) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewEnumMember(node.Name(), node.Initializer), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *EnumMember) Name() *DeclarationName {
return node.name
}
func (node *EnumMember) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name) |
propagateSubtreeFacts(node.Initializer) |
SubtreeContainsTypeScript
}
func IsEnumMember(node *Node) bool {
return node.Kind == KindEnumMember
}
// EnumDeclaration
type EnumDeclaration struct {
StatementBase
DeclarationBase
ExportableBase
ModifiersBase
compositeNodeBase
name *IdentifierNode // IdentifierNode
Members *NodeList // NodeList[*EnumMemberNode]
}
func (f *NodeFactory) NewEnumDeclaration(modifiers *ModifierList, name *IdentifierNode, members *NodeList) *Node {
data := &EnumDeclaration{}
data.modifiers = modifiers
data.name = name
data.Members = members
return f.newNode(KindEnumDeclaration, data)
}
func (f *NodeFactory) UpdateEnumDeclaration(node *EnumDeclaration, modifiers *ModifierList, name *IdentifierNode, members *EnumMemberList) *Node {
if modifiers != node.modifiers || name != node.name || members != node.Members {
return updateNode(f.NewEnumDeclaration(modifiers, name, members), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *EnumDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visitNodeList(v, node.Members)
}
func (node *EnumDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateEnumDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNodes(node.Members))
}
func (node *EnumDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewEnumDeclaration(node.Modifiers(), node.Name(), node.Members), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *EnumDeclaration) Name() *DeclarationName {
return node.name
}
func (node *EnumDeclaration) computeSubtreeFacts() SubtreeFacts {
if node.modifiers != nil && node.modifiers.ModifierFlags&ModifierFlagsAmbient != 0 {
return SubtreeContainsTypeScript
} else {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.name) |
propagateNodeListSubtreeFacts(node.Members, propagateSubtreeFacts) |
SubtreeContainsTypeScript
}
}
func IsEnumDeclaration(node *Node) bool {
return node.Kind == KindEnumDeclaration
}
// ModuleBlock
type ModuleBlock struct {
StatementBase
compositeNodeBase
Statements *NodeList // NodeList[*Statement]
}
func (f *NodeFactory) NewModuleBlock(statements *NodeList) *Node {
data := &ModuleBlock{}
data.Statements = statements
return f.newNode(KindModuleBlock, data)
}
func (f *NodeFactory) UpdateModuleBlock(node *ModuleBlock, statements *StatementList) *Node {
if statements != node.Statements {
return updateNode(f.NewModuleBlock(statements), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ModuleBlock) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Statements)
}
func (node *ModuleBlock) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateModuleBlock(node, v.visitNodes(node.Statements))
}
func (node *ModuleBlock) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewModuleBlock(node.Statements), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ModuleBlock) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Statements, propagateSubtreeFacts)
}
func IsModuleBlock(node *Node) bool {
return node.Kind == KindModuleBlock
}
// ModuleDeclaration
type ModuleDeclaration struct {
StatementBase
DeclarationBase
ExportableBase
ModifiersBase
LocalsContainerBase
BodyBase
compositeNodeBase
name *ModuleName // ModuleName
Keyword Kind // KindModuleKeyword, KindNamespaceKeyword, KindGlobalKeyword (global augmentation)
}
func (f *NodeFactory) NewModuleDeclaration(modifiers *ModifierList, keyword Kind, name *ModuleName, body *ModuleBody) *Node {
data := &ModuleDeclaration{}
data.modifiers = modifiers
data.Keyword = keyword
data.name = name
data.Body = body
node := f.newNode(KindModuleDeclaration, data)
return node
}
func (f *NodeFactory) UpdateModuleDeclaration(node *ModuleDeclaration, modifiers *ModifierList, keyword Kind, name *ModuleName, body *ModuleBody) *Node {
if modifiers != node.modifiers || keyword != node.Keyword || name != node.name || body != node.Body {
return updateNode(f.NewModuleDeclaration(modifiers, keyword, name, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ModuleDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.Body)
}
func (node *ModuleDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateModuleDeclaration(node, v.visitModifiers(node.modifiers), node.Keyword, v.visitNode(node.name), v.visitNode(node.Body))
}
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)
}
func (node *ModuleDeclaration) Name() *DeclarationName {
return node.name
}
func (node *ModuleDeclaration) computeSubtreeFacts() SubtreeFacts {
if node.ModifierFlags()&ModifierFlagsAmbient != 0 {
return SubtreeContainsTypeScript
} else {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.name) |
propagateSubtreeFacts(node.Body) |
SubtreeContainsTypeScript
}
}
func (node *ModuleDeclaration) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsModule
}
func IsModuleDeclaration(node *Node) bool {
return node.Kind == KindModuleDeclaration
}
// NotEmittedStatement
// Represents a statement that is elided as part of a transformation to emit comments on a
// not-emitted node.
type NotEmittedStatement struct {
StatementBase
}
func (f *NodeFactory) NewNotEmittedStatement() *Node {
data := &NotEmittedStatement{}
return newNode(KindNotEmittedStatement, data, f.hooks)
}
func (node *NotEmittedStatement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNotEmittedStatement(), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsNotEmittedStatement(node *Node) bool {
return node.Kind == KindNotEmittedStatement
}
// NotEmittedTypeElement
// Represents a type element that is elided as part of a transformation to emit comments on a
// not-emitted node.
type NotEmittedTypeElement struct {
NodeBase
TypeElementBase
}
func (f *NodeFactory) NewNotEmittedTypeElement() *Node {
data := &NotEmittedTypeElement{}
return newNode(KindNotEmittedTypeElement, data, f.hooks)
}
func (node *NotEmittedTypeElement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNotEmittedTypeElement(), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsNotEmittedTypeElement(node *Node) bool {
return node.Kind == KindNotEmittedTypeElement
}
// SyntheticReferenceExpression
// Used by optional chaining transform to shuffle a `this` arg expression between steps of a chain.
// While this does implement the full expected interface of a node, and is used in place of a node in transforms,
// it generally shouldn't be treated or visited like a normal node.
type SyntheticReferenceExpression struct {
ExpressionBase
Expression *Expression
ThisArg *Expression
}
func (f *NodeFactory) NewSyntheticReferenceExpression(expr *Expression, thisArg *Expression) *Node {
data := &SyntheticReferenceExpression{Expression: expr, ThisArg: thisArg}
return newNode(KindSyntheticReferenceExpression, data, f.hooks)
}
func (f *NodeFactory) UpdateSyntheticReferenceExpression(node *SyntheticReferenceExpression, expr *Expression, thisArg *Expression) *Node {
if expr != node.Expression || thisArg != node.ThisArg {
return updateNode(f.NewSyntheticReferenceExpression(expr, thisArg), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *SyntheticReferenceExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *SyntheticReferenceExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateSyntheticReferenceExpression(node, v.visitNode(node.Expression), node.ThisArg)
}
func (node *SyntheticReferenceExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewSyntheticReferenceExpression(node.Expression, node.ThisArg), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *SyntheticReferenceExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func (node *SyntheticReferenceExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts()
}
func IsSyntheticReferenceExpression(node *Node) bool {
return node.Kind == KindSyntheticReferenceExpression
}
// ImportEqualsDeclaration
type ImportEqualsDeclaration struct {
StatementBase
DeclarationBase
ExportableBase
ModifiersBase
compositeNodeBase
IsTypeOnly bool
name *IdentifierNode // IdentifierNode
// 'EntityName' for an internal module reference, 'ExternalModuleReference' for an external
// module reference.
ModuleReference *ModuleReference // ModuleReference
}
func (f *NodeFactory) NewImportEqualsDeclaration(modifiers *ModifierList, isTypeOnly bool, name *IdentifierNode, moduleReference *ModuleReference) *Node {
data := &ImportEqualsDeclaration{}
data.modifiers = modifiers
data.IsTypeOnly = isTypeOnly
data.name = name
data.ModuleReference = moduleReference
return f.newNode(KindImportEqualsDeclaration, data)
}
func (f *NodeFactory) UpdateImportEqualsDeclaration(node *ImportEqualsDeclaration, modifiers *ModifierList, isTypeOnly bool, name *IdentifierNode, moduleReference *ModuleReference) *Node {
if modifiers != node.modifiers || isTypeOnly != node.IsTypeOnly || name != node.name || moduleReference != node.ModuleReference {
return updateNode(f.NewImportEqualsDeclaration(modifiers, isTypeOnly, name, moduleReference), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ImportEqualsDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.ModuleReference)
}
func (node *ImportEqualsDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateImportEqualsDeclaration(node, v.visitModifiers(node.modifiers), node.IsTypeOnly, v.visitNode(node.name), v.visitNode(node.ModuleReference))
}
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)
}
func (node *ImportEqualsDeclaration) Name() *DeclarationName {
return node.name
}
func (node *ImportEqualsDeclaration) computeSubtreeFacts() SubtreeFacts {
if node.IsTypeOnly || !IsExternalModuleReference(node.ModuleReference) {
return SubtreeContainsTypeScript
} else {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.name) |
propagateSubtreeFacts(node.ModuleReference)
}
}
func IsImportEqualsDeclaration(node *Node) bool {
return node.Kind == KindImportEqualsDeclaration
}
// ImportDeclaration
type ImportDeclaration struct {
StatementBase
ModifiersBase
compositeNodeBase
ImportClause *ImportClauseNode // ImportClauseNode. Optional
ModuleSpecifier *Expression // Expression
Attributes *ImportAttributesNode // ImportAttributesNode. Optional
}
func (f *NodeFactory) newImportOrJSImportDeclaration(kind Kind, modifiers *ModifierList, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node {
data := &ImportDeclaration{}
data.modifiers = modifiers
data.ImportClause = importClause
data.ModuleSpecifier = moduleSpecifier
data.Attributes = attributes
return f.newNode(kind, data)
}
func (f *NodeFactory) NewImportDeclaration(modifiers *ModifierList, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node {
return f.newImportOrJSImportDeclaration(KindImportDeclaration, modifiers, importClause, moduleSpecifier, attributes)
}
func (f *NodeFactory) NewJSImportDeclaration(modifiers *ModifierList, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node {
return f.newImportOrJSImportDeclaration(KindJSImportDeclaration, modifiers, importClause, moduleSpecifier, attributes)
}
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 {
return updateNode(f.newImportOrJSImportDeclaration(node.Kind, modifiers, importClause, moduleSpecifier, attributes), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ImportDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.ImportClause) || visit(v, node.ModuleSpecifier) || visit(v, node.Attributes)
}
func (node *ImportDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateImportDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.ImportClause), v.visitNode(node.ModuleSpecifier), v.visitNode(node.Attributes))
}
func (node *ImportDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().newImportOrJSImportDeclaration(node.Kind, node.Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ImportDeclaration) computeSubtreeFacts() SubtreeFacts {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.ImportClause) |
propagateSubtreeFacts(node.ModuleSpecifier) |
propagateSubtreeFacts(node.Attributes)
}
func IsImportDeclaration(node *Node) bool {
return node.Kind == KindImportDeclaration
}
func IsImportDeclarationOrJSImportDeclaration(node *Node) bool {
return node.Kind == KindImportDeclaration || node.Kind == KindJSImportDeclaration
}
// ImportSpecifier
type ImportSpecifier struct {
NodeBase
DeclarationBase
ExportableBase
compositeNodeBase
IsTypeOnly bool
PropertyName *ModuleExportName // ModuleExportName. Optional
name *IdentifierNode // IdentifierNode
}
func (f *NodeFactory) NewImportSpecifier(isTypeOnly bool, propertyName *ModuleExportName, name *IdentifierNode) *Node {
data := f.importSpecifierPool.New()
data.IsTypeOnly = isTypeOnly
data.PropertyName = propertyName
data.name = name
return f.newNode(KindImportSpecifier, data)
}
func (f *NodeFactory) UpdateImportSpecifier(node *ImportSpecifier, isTypeOnly bool, propertyName *ModuleExportName, name *IdentifierNode) *Node {
if isTypeOnly != node.IsTypeOnly || propertyName != node.PropertyName || name != node.name {
return updateNode(f.NewImportSpecifier(isTypeOnly, propertyName, name), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ImportSpecifier) ForEachChild(v Visitor) bool {
return visit(v, node.PropertyName) || visit(v, node.name)
}
func (node *ImportSpecifier) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateImportSpecifier(node, node.IsTypeOnly, v.visitNode(node.PropertyName), v.visitNode(node.name))
}
func (node *ImportSpecifier) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewImportSpecifier(node.IsTypeOnly, node.PropertyName, node.Name()), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ImportSpecifier) Name() *DeclarationName {
return node.name
}
func (node *ImportSpecifier) computeSubtreeFacts() SubtreeFacts {
if node.IsTypeOnly {
return SubtreeContainsTypeScript
} else {
return propagateSubtreeFacts(node.PropertyName) |
propagateSubtreeFacts(node.name)
}
}
func IsImportSpecifier(node *Node) bool {
return node.Kind == KindImportSpecifier
}
// ExternalModuleReference
type ExternalModuleReference struct {
NodeBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewExternalModuleReference(expression *Expression) *Node {
data := &ExternalModuleReference{}
data.Expression = expression
return f.newNode(KindExternalModuleReference, data)
}
func (f *NodeFactory) UpdateExternalModuleReference(node *ExternalModuleReference, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewExternalModuleReference(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ExternalModuleReference) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *ExternalModuleReference) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateExternalModuleReference(node, v.visitNode(node.Expression))
}
func (node *ExternalModuleReference) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewExternalModuleReference(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ExternalModuleReference) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func IsExternalModuleReference(node *Node) bool {
return node.Kind == KindExternalModuleReference
}
// ImportClause
type ImportClause struct {
NodeBase
DeclarationBase
ExportableBase
compositeNodeBase
PhaseModifier Kind // KindTypeKeyword | KindDeferKeyword
NamedBindings *NamedImportBindings // NamedImportBindings. Optional, named bindings
name *IdentifierNode // IdentifierNode. Optional, default binding
}
func (f *NodeFactory) NewImportClause(phaseModifier Kind, name *IdentifierNode, namedBindings *NamedImportBindings) *Node {
data := &ImportClause{}
data.PhaseModifier = phaseModifier
data.name = name
data.NamedBindings = namedBindings
return f.newNode(KindImportClause, data)
}
func (f *NodeFactory) UpdateImportClause(node *ImportClause, phaseModifier Kind, name *IdentifierNode, namedBindings *NamedImportBindings) *Node {
if phaseModifier != node.PhaseModifier || name != node.name || namedBindings != node.NamedBindings {
return updateNode(f.NewImportClause(phaseModifier, name, namedBindings), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ImportClause) ForEachChild(v Visitor) bool {
return visit(v, node.name) || visit(v, node.NamedBindings)
}
func (node *ImportClause) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateImportClause(node, node.PhaseModifier, v.visitNode(node.name), v.visitNode(node.NamedBindings))
}
func (node *ImportClause) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewImportClause(node.PhaseModifier, node.Name(), node.NamedBindings), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ImportClause) Name() *DeclarationName {
return node.name
}
func (node *ImportClause) computeSubtreeFacts() SubtreeFacts {
if node.PhaseModifier == KindTypeKeyword {
return SubtreeContainsTypeScript
} else {
return propagateSubtreeFacts(node.name) |
propagateSubtreeFacts(node.NamedBindings)
}
}
func IsImportClause(node *Node) bool {
return node.Kind == KindImportClause
}
// NamespaceImport
type NamespaceImport struct {
NodeBase
DeclarationBase
ExportableBase
name *IdentifierNode // IdentifierNode
}
func (f *NodeFactory) NewNamespaceImport(name *IdentifierNode) *Node {
data := &NamespaceImport{}
data.name = name
return f.newNode(KindNamespaceImport, data)
}
func (f *NodeFactory) UpdateNamespaceImport(node *NamespaceImport, name *IdentifierNode) *Node {
if name != node.name {
return updateNode(f.NewNamespaceImport(name), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *NamespaceImport) ForEachChild(v Visitor) bool {
return visit(v, node.name)
}
func (node *NamespaceImport) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateNamespaceImport(node, v.visitNode(node.name))
}
func (node *NamespaceImport) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNamespaceImport(node.Name()), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *NamespaceImport) Name() *DeclarationName {
return node.name
}
func (node *NamespaceImport) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name)
}
func IsNamespaceImport(node *Node) bool {
return node.Kind == KindNamespaceImport
}
// NamedImports
type NamedImports struct {
NodeBase
compositeNodeBase
Elements *ImportSpecifierList // NodeList[*ImportSpecifierNode]
}
func (f *NodeFactory) NewNamedImports(elements *ImportSpecifierList) *Node {
data := &NamedImports{}
data.Elements = elements
return f.newNode(KindNamedImports, data)
}
func (f *NodeFactory) UpdateNamedImports(node *NamedImports, elements *ImportSpecifierList) *Node {
if elements != node.Elements {
return updateNode(f.NewNamedImports(elements), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *NamedImports) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Elements)
}
func (node *NamedImports) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateNamedImports(node, v.visitNodes(node.Elements))
}
func (node *NamedImports) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNamedImports(node.Elements), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *NamedImports) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Elements, propagateSubtreeFacts)
}
func IsNamedImports(node *Node) bool {
return node.Kind == KindNamedImports
}
// ExportAssignment
// This is either an `export =` or an `export default` declaration.
// Unless `isExportEquals` is set, this node was parsed as an `export default`.
// If Kind is KindJSExportAssignment, it is a synthetic declaration for `module.exports =`.
type ExportAssignment struct {
StatementBase
DeclarationBase
ModifiersBase
compositeNodeBase
IsExportEquals bool
Type *TypeNode // TypeNode. Only set by JSDoc @type tags.
Expression *Expression // Expression
}
func (f *NodeFactory) newExportOrJSExportAssignment(kind Kind, modifiers *ModifierList, isExportEquals bool, typeNode *TypeNode, expression *Expression) *Node {
data := &ExportAssignment{}
data.modifiers = modifiers
data.IsExportEquals = isExportEquals
data.Type = typeNode
data.Expression = expression
return f.newNode(kind, data)
}
func (f *NodeFactory) NewExportAssignment(modifiers *ModifierList, isExportEquals bool, typeNode *TypeNode, expression *Expression) *Node {
return f.newExportOrJSExportAssignment(KindExportAssignment, modifiers, isExportEquals, typeNode, expression)
}
func (f *NodeFactory) NewJSExportAssignment(t *TypeNode, expression *Expression) *Node {
return f.newExportOrJSExportAssignment(KindJSExportAssignment, nil /*modifiers*/, true, t, expression)
}
func (f *NodeFactory) UpdateExportAssignment(node *ExportAssignment, modifiers *ModifierList, typeNode *TypeNode, expression *Expression) *Node {
if modifiers != node.modifiers || typeNode != node.Type || expression != node.Expression {
return updateNode(f.newExportOrJSExportAssignment(node.Kind, modifiers, node.IsExportEquals, typeNode, expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ExportAssignment) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.Type) || visit(v, node.Expression)
}
func (node *ExportAssignment) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateExportAssignment(node, v.visitModifiers(node.modifiers), v.visitNode(node.Type), v.visitNode(node.Expression))
}
func (node *ExportAssignment) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().newExportOrJSExportAssignment(node.Kind, node.Modifiers(), node.IsExportEquals, node.Type, node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ExportAssignment) computeSubtreeFacts() SubtreeFacts {
return propagateModifierListSubtreeFacts(node.modifiers) | propagateSubtreeFacts(node.Type) | propagateSubtreeFacts(node.Expression)
}
func IsExportAssignment(node *Node) bool {
return node.Kind == KindExportAssignment
}
func IsJSExportAssignment(node *Node) bool {
return node.Kind == KindJSExportAssignment
}
func IsAnyExportAssignment(node *Node) bool {
return node.Kind == KindExportAssignment || node.Kind == KindJSExportAssignment
}
// CommonJSExport
type CommonJSExport struct {
StatementBase
DeclarationBase
ExportableBase
ModifiersBase
name *IdentifierNode
Type *TypeNode
Initializer *Expression
}
func (f *NodeFactory) NewCommonJSExport(modifiers *ModifierList, name *IdentifierNode, typeNode *TypeNode, initializer *Expression) *Node {
data := &CommonJSExport{}
data.modifiers = modifiers
data.name = name
data.Type = typeNode
data.Initializer = initializer
return newNode(KindCommonJSExport, data, f.hooks)
}
func (f *NodeFactory) UpdateCommonJSExport(node *CommonJSExport, modifiers *ModifierList, name *IdentifierNode, typeNode *TypeNode, initializer *Expression) *Node {
if modifiers != node.modifiers || initializer != node.Initializer || name != node.name || typeNode != node.Type {
return updateNode(f.NewCommonJSExport(node.modifiers, name, typeNode, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *CommonJSExport) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.Type) || visit(v, node.Initializer)
}
func (node *CommonJSExport) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateCommonJSExport(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNode(node.Type), v.visitNode(node.Initializer))
}
func (node *CommonJSExport) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewCommonJSExport(node.Modifiers(), node.name, node.Type, node.Initializer), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsCommonJSExport(node *Node) bool {
return node.Kind == KindCommonJSExport
}
func (node *CommonJSExport) Name() *DeclarationName {
return node.name
}
// NamespaceExportDeclaration
type NamespaceExportDeclaration struct {
StatementBase
DeclarationBase
ModifiersBase
typeSyntaxBase
name *IdentifierNode // IdentifierNode
}
func (f *NodeFactory) NewNamespaceExportDeclaration(modifiers *ModifierList, name *IdentifierNode) *Node {
data := &NamespaceExportDeclaration{}
data.modifiers = modifiers
data.name = name
return f.newNode(KindNamespaceExportDeclaration, data)
}
func (f *NodeFactory) UpdateNamespaceExportDeclaration(node *NamespaceExportDeclaration, modifiers *ModifierList, name *IdentifierNode) *Node {
if modifiers != node.modifiers || name != node.name {
return updateNode(f.NewNamespaceExportDeclaration(modifiers, name), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *NamespaceExportDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name)
}
func (node *NamespaceExportDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateNamespaceExportDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name))
}
func (node *NamespaceExportDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNamespaceExportDeclaration(node.Modifiers(), node.Name()), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *NamespaceExportDeclaration) Name() *DeclarationName {
return node.name
}
func IsNamespaceExportDeclaration(node *Node) bool {
return node.Kind == KindNamespaceExportDeclaration
}
// ExportDeclaration
type ExportDeclaration struct {
StatementBase
DeclarationBase
ModifiersBase
compositeNodeBase
IsTypeOnly bool
ExportClause *NamedExportBindings // NamedExportBindings. Optional
ModuleSpecifier *Expression // Expression. Optional
Attributes *ImportAttributesNode // ImportAttributesNode. Optional
}
func (f *NodeFactory) NewExportDeclaration(modifiers *ModifierList, isTypeOnly bool, exportClause *NamedExportBindings, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node {
data := &ExportDeclaration{}
data.modifiers = modifiers
data.IsTypeOnly = isTypeOnly
data.ExportClause = exportClause
data.ModuleSpecifier = moduleSpecifier
data.Attributes = attributes
return f.newNode(KindExportDeclaration, data)
}
func (f *NodeFactory) UpdateExportDeclaration(node *ExportDeclaration, modifiers *ModifierList, isTypeOnly bool, exportClause *NamedExportBindings, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node {
if modifiers != node.modifiers || exportClause != node.ExportClause || moduleSpecifier != node.ModuleSpecifier || attributes != node.Attributes {
return updateNode(f.NewExportDeclaration(modifiers, isTypeOnly, exportClause, moduleSpecifier, attributes), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ExportDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.ExportClause) || visit(v, node.ModuleSpecifier) || visit(v, node.Attributes)
}
func (node *ExportDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateExportDeclaration(node, v.visitModifiers(node.modifiers), node.IsTypeOnly, v.visitNode(node.ExportClause), v.visitNode(node.ModuleSpecifier), v.visitNode(node.Attributes))
}
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)
}
func (node *ExportDeclaration) computeSubtreeFacts() SubtreeFacts {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.ExportClause) |
propagateSubtreeFacts(node.ModuleSpecifier) |
propagateSubtreeFacts(node.Attributes) |
core.IfElse(node.IsTypeOnly, SubtreeContainsTypeScript, SubtreeFactsNone)
}
func IsExportDeclaration(node *Node) bool {
return node.Kind == KindExportDeclaration
}
// NamespaceExport
type NamespaceExport struct {
NodeBase
DeclarationBase
name *ModuleExportName // ModuleExportName
}
func (f *NodeFactory) NewNamespaceExport(name *ModuleExportName) *Node {
data := &NamespaceExport{}
data.name = name
return f.newNode(KindNamespaceExport, data)
}
func (f *NodeFactory) UpdateNamespaceExport(node *NamespaceExport, name *ModuleExportName) *Node {
if name != node.name {
return updateNode(f.NewNamespaceExport(name), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *NamespaceExport) ForEachChild(v Visitor) bool {
return visit(v, node.name)
}
func (node *NamespaceExport) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateNamespaceExport(node, v.visitNode(node.name))
}
func (node *NamespaceExport) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNamespaceExport(node.Name()), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *NamespaceExport) Name() *DeclarationName {
return node.name
}
func (node *NamespaceExport) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name)
}
func IsNamespaceExport(node *Node) bool {
return node.Kind == KindNamespaceExport
}
// NamedExports
type NamedExports struct {
NodeBase
compositeNodeBase
Elements *ExportSpecifierList // NodeList[*ExportSpecifierNode]
}
func (f *NodeFactory) NewNamedExports(elements *NodeList) *Node {
data := &NamedExports{}
data.Elements = elements
return f.newNode(KindNamedExports, data)
}
func (f *NodeFactory) UpdateNamedExports(node *NamedExports, elements *ExportSpecifierList) *Node {
if elements != node.Elements {
return updateNode(f.NewNamedExports(elements), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *NamedExports) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Elements)
}
func (node *NamedExports) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateNamedExports(node, v.visitNodes(node.Elements))
}
func (node *NamedExports) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNamedExports(node.Elements), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *NamedExports) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Elements, propagateSubtreeFacts)
}
func IsNamedExports(node *Node) bool {
return node.Kind == KindNamedExports
}
// ExportSpecifier
type ExportSpecifier struct {
NodeBase
DeclarationBase
ExportableBase
compositeNodeBase
IsTypeOnly bool
PropertyName *ModuleExportName // ModuleExportName. Optional, name preceding 'as' keyword
name *ModuleExportName // ModuleExportName
}
func (f *NodeFactory) NewExportSpecifier(isTypeOnly bool, propertyName *ModuleExportName, name *ModuleExportName) *Node {
data := &ExportSpecifier{}
data.IsTypeOnly = isTypeOnly
data.PropertyName = propertyName
data.name = name
return f.newNode(KindExportSpecifier, data)
}
func (f *NodeFactory) UpdateExportSpecifier(node *ExportSpecifier, isTypeOnly bool, propertyName *ModuleExportName, name *ModuleExportName) *Node {
if isTypeOnly != node.IsTypeOnly || propertyName != node.PropertyName || name != node.name {
return updateNode(f.NewExportSpecifier(isTypeOnly, propertyName, name), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ExportSpecifier) ForEachChild(v Visitor) bool {
return visit(v, node.PropertyName) || visit(v, node.name)
}
func (node *ExportSpecifier) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateExportSpecifier(node, node.IsTypeOnly, v.visitNode(node.PropertyName), v.visitNode(node.name))
}
func (node *ExportSpecifier) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewExportSpecifier(node.IsTypeOnly, node.PropertyName, node.Name()), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ExportSpecifier) Name() *DeclarationName {
return node.name
}
func (node *ExportSpecifier) computeSubtreeFacts() SubtreeFacts {
if node.IsTypeOnly {
return SubtreeContainsTypeScript
} else {
return propagateSubtreeFacts(node.PropertyName) |
propagateSubtreeFacts(node.name)
}
}
func IsExportSpecifier(node *Node) bool {
return node.Kind == KindExportSpecifier
}
// TypeElementBase
type TypeElementBase struct{}
// ClassElementBase
type ClassElementBase struct{}
// NamedMemberBase
type NamedMemberBase struct {
DeclarationBase
ModifiersBase
name *PropertyName // PropertyName
PostfixToken *TokenNode // TokenNode. Optional
}
func (node *NamedMemberBase) DeclarationData() *DeclarationBase { return &node.DeclarationBase }
func (node *NamedMemberBase) Modifiers() *ModifierList { return node.modifiers }
func (node *NamedMemberBase) setModifiers(modifiers *ModifierList) { node.modifiers = modifiers }
func (node *NamedMemberBase) Name() *DeclarationName { return node.name }
// CallSignatureDeclaration
type CallSignatureDeclaration struct {
NodeBase
DeclarationBase
FunctionLikeBase
TypeElementBase
typeSyntaxBase
}
func (f *NodeFactory) NewCallSignatureDeclaration(typeParameters *NodeList, parameters *NodeList, returnType *TypeNode) *Node {
data := &CallSignatureDeclaration{}
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
return f.newNode(KindCallSignature, data)
}
func (f *NodeFactory) UpdateCallSignatureDeclaration(node *CallSignatureDeclaration, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode) *Node {
if typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type {
return updateNode(f.NewCallSignatureDeclaration(typeParameters, parameters, returnType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *CallSignatureDeclaration) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) || visit(v, node.Type)
}
func (node *CallSignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateCallSignatureDeclaration(node, v.visitNodes(node.TypeParameters), v.visitNodes(node.Parameters), v.visitNode(node.Type))
}
func (node *CallSignatureDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewCallSignatureDeclaration(node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsCallSignatureDeclaration(node *Node) bool {
return node.Kind == KindCallSignature
}
// ConstructSignatureDeclaration
type ConstructSignatureDeclaration struct {
NodeBase
DeclarationBase
FunctionLikeBase
TypeElementBase
typeSyntaxBase
}
func (f *NodeFactory) NewConstructSignatureDeclaration(typeParameters *NodeList, parameters *NodeList, returnType *TypeNode) *Node {
data := f.constructSignatureDeclarationPool.New()
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
return f.newNode(KindConstructSignature, data)
}
func (f *NodeFactory) UpdateConstructSignatureDeclaration(node *ConstructSignatureDeclaration, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode) *Node {
if typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type {
return updateNode(f.NewConstructSignatureDeclaration(typeParameters, parameters, returnType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ConstructSignatureDeclaration) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) || visit(v, node.Type)
}
func (node *ConstructSignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateConstructSignatureDeclaration(node, v.visitNodes(node.TypeParameters), v.visitNodes(node.Parameters), v.visitNode(node.Type))
}
func (node *ConstructSignatureDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewConstructSignatureDeclaration(node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsConstructSignatureDeclaration(node *Node) bool {
return node.Kind == KindConstructSignature
}
// ConstructorDeclaration
type ConstructorDeclaration struct {
NodeBase
DeclarationBase
ModifiersBase
FunctionLikeWithBodyBase
ClassElementBase
compositeNodeBase
ReturnFlowNode *FlowNode
}
func (f *NodeFactory) NewConstructorDeclaration(modifiers *ModifierList, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
data := &ConstructorDeclaration{}
data.modifiers = modifiers
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
data.FullSignature = fullSignature
data.Body = body
return f.newNode(KindConstructor, data)
}
func (f *NodeFactory) UpdateConstructorDeclaration(node *ConstructorDeclaration, modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
if modifiers != node.modifiers || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type || fullSignature != node.FullSignature || body != node.Body {
return updateNode(f.NewConstructorDeclaration(modifiers, typeParameters, parameters, returnType, fullSignature, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ConstructorDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) || visit(v, node.Type) || visit(v, node.FullSignature) || visit(v, node.Body)
}
func (node *ConstructorDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateConstructorDeclaration(node, v.visitModifiers(node.modifiers), v.visitNodes(node.TypeParameters), v.visitParameters(node.Parameters), v.visitNode(node.Type), v.visitNode(node.FullSignature), v.visitFunctionBody(node.Body))
}
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)
}
func (node *ConstructorDeclaration) computeSubtreeFacts() SubtreeFacts {
if node.Body == nil {
return SubtreeContainsTypeScript
} else {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeParameters) |
propagateNodeListSubtreeFacts(node.Parameters, propagateSubtreeFacts) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateEraseableSyntaxSubtreeFacts(node.FullSignature) |
propagateSubtreeFacts(node.Body)
}
}
func (node *ConstructorDeclaration) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsConstructor
}
func IsConstructorDeclaration(node *Node) bool {
return node.Kind == KindConstructor
}
// AccessorDeclarationBase
type AccessorDeclarationBase struct {
NodeBase
NamedMemberBase
FunctionLikeWithBodyBase
FlowNodeBase
TypeElementBase
ClassElementBase
ObjectLiteralElementBase
compositeNodeBase
}
func (node *AccessorDeclarationBase) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) ||
visit(v, node.Type) || visit(v, node.FullSignature) || visit(v, node.Body)
}
func (node *AccessorDeclarationBase) IsAccessorDeclaration() {}
func (node *AccessorDeclarationBase) computeSubtreeFacts() SubtreeFacts {
if node.Body == nil {
return SubtreeContainsTypeScript
} else {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.name) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeParameters) |
propagateNodeListSubtreeFacts(node.Parameters, propagateSubtreeFacts) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateEraseableSyntaxSubtreeFacts(node.FullSignature) |
propagateSubtreeFacts(node.Body)
}
}
func (node *AccessorDeclarationBase) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsAccessor |
propagateSubtreeFacts(node.name)
}
// GetAccessorDeclaration
type GetAccessorDeclaration struct {
AccessorDeclarationBase
}
func (f *NodeFactory) NewGetAccessorDeclaration(modifiers *ModifierList, name *PropertyName, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
data := &GetAccessorDeclaration{}
data.modifiers = modifiers
data.name = name
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
data.FullSignature = fullSignature
data.Body = body
return f.newNode(KindGetAccessor, data)
}
func (f *NodeFactory) UpdateGetAccessorDeclaration(node *GetAccessorDeclaration, modifiers *ModifierList, name *PropertyName, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type || fullSignature != node.FullSignature || body != node.Body {
return updateNode(f.NewGetAccessorDeclaration(modifiers, name, typeParameters, parameters, returnType, fullSignature, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *GetAccessorDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateGetAccessorDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNodes(node.TypeParameters), v.visitParameters(node.Parameters), v.visitNode(node.Type), v.visitNode(node.FullSignature), v.visitFunctionBody(node.Body))
}
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)
}
func IsGetAccessorDeclaration(node *Node) bool {
return node.Kind == KindGetAccessor
}
// SetAccessorDeclaration
type SetAccessorDeclaration struct {
AccessorDeclarationBase
}
func (f *NodeFactory) NewSetAccessorDeclaration(modifiers *ModifierList, name *PropertyName, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
data := &SetAccessorDeclaration{}
data.modifiers = modifiers
data.name = name
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
data.FullSignature = fullSignature
data.Body = body
return f.newNode(KindSetAccessor, data)
}
func (f *NodeFactory) UpdateSetAccessorDeclaration(node *SetAccessorDeclaration, modifiers *ModifierList, name *PropertyName, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type || fullSignature != node.FullSignature || body != node.Body {
return updateNode(f.NewSetAccessorDeclaration(modifiers, name, typeParameters, parameters, returnType, fullSignature, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *SetAccessorDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateSetAccessorDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNodes(node.TypeParameters), v.visitParameters(node.Parameters), v.visitNode(node.Type), v.visitNode(node.FullSignature), v.visitFunctionBody(node.Body))
}
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)
}
func IsSetAccessorDeclaration(node *Node) bool {
return node.Kind == KindSetAccessor
}
// IndexSignatureDeclaration
type IndexSignatureDeclaration struct {
NodeBase
DeclarationBase
ModifiersBase
FunctionLikeBase
TypeElementBase
ClassElementBase
typeSyntaxBase
}
func (f *NodeFactory) NewIndexSignatureDeclaration(modifiers *ModifierList, parameters *NodeList, returnType *TypeNode) *Node {
data := &IndexSignatureDeclaration{}
data.modifiers = modifiers
data.Parameters = parameters
data.Type = returnType
return f.newNode(KindIndexSignature, data)
}
func (f *NodeFactory) UpdateIndexSignatureDeclaration(node *IndexSignatureDeclaration, modifiers *ModifierList, parameters *ParameterList, returnType *TypeNode) *Node {
if modifiers != node.modifiers || parameters != node.Parameters || returnType != node.Type {
return updateNode(f.NewIndexSignatureDeclaration(modifiers, parameters, returnType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *IndexSignatureDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visitNodeList(v, node.Parameters) || visit(v, node.Type)
}
func (node *IndexSignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateIndexSignatureDeclaration(node, v.visitModifiers(node.modifiers), v.visitNodes(node.Parameters), v.visitNode(node.Type))
}
func (node *IndexSignatureDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewIndexSignatureDeclaration(node.Modifiers(), node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsIndexSignatureDeclaration(node *Node) bool {
return node.Kind == KindIndexSignature
}
// MethodSignatureDeclaration
type MethodSignatureDeclaration struct {
NodeBase
NamedMemberBase
FunctionLikeBase
TypeElementBase
typeSyntaxBase
}
func (f *NodeFactory) NewMethodSignatureDeclaration(modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode) *Node {
data := f.methodSignatureDeclarationPool.New()
data.modifiers = modifiers
data.name = name
data.PostfixToken = postfixToken
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
return f.newNode(KindMethodSignature, data)
}
func (f *NodeFactory) UpdateMethodSignatureDeclaration(node *MethodSignatureDeclaration, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode) *Node {
if modifiers != node.modifiers || name != node.name || postfixToken != node.PostfixToken || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type {
return updateNode(f.NewMethodSignatureDeclaration(modifiers, name, postfixToken, typeParameters, parameters, returnType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *MethodSignatureDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.PostfixToken) || visitNodeList(v, node.TypeParameters) ||
visitNodeList(v, node.Parameters) || visit(v, node.Type)
}
func (node *MethodSignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateMethodSignatureDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitToken(node.PostfixToken), v.visitNodes(node.TypeParameters), v.visitNodes(node.Parameters), v.visitNode(node.Type))
}
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)
}
func IsMethodSignatureDeclaration(node *Node) bool {
return node.Kind == KindMethodSignature
}
// MethodSignatureDeclaration
type MethodDeclaration struct {
NodeBase
NamedMemberBase
FunctionLikeWithBodyBase
FlowNodeBase
ClassElementBase
ObjectLiteralElementBase
compositeNodeBase
}
func (f *NodeFactory) NewMethodDeclaration(modifiers *ModifierList, asteriskToken *TokenNode, name *PropertyName, postfixToken *TokenNode, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
data := &MethodDeclaration{}
data.modifiers = modifiers
data.AsteriskToken = asteriskToken
data.name = name
data.PostfixToken = postfixToken
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
data.FullSignature = fullSignature
data.Body = body
return f.newNode(KindMethodDeclaration, data)
}
func (f *NodeFactory) UpdateMethodDeclaration(node *MethodDeclaration, modifiers *ModifierList, asteriskToken *TokenNode, name *PropertyName, postfixToken *TokenNode, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
if modifiers != node.modifiers || asteriskToken != node.AsteriskToken || name != node.name || postfixToken != node.PostfixToken || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type || fullSignature != node.FullSignature || body != node.Body {
return updateNode(f.NewMethodDeclaration(modifiers, asteriskToken, name, postfixToken, typeParameters, parameters, returnType, fullSignature, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *MethodDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.AsteriskToken) || visit(v, node.name) || visit(v, node.PostfixToken) ||
visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) || visit(v, node.Type) || visit(v, node.FullSignature) || visit(v, node.Body)
}
func (node *MethodDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateMethodDeclaration(node, v.visitModifiers(node.modifiers), v.visitToken(node.AsteriskToken), v.visitNode(node.name), v.visitToken(node.PostfixToken), v.visitNodes(node.TypeParameters), v.visitParameters(node.Parameters), v.visitNode(node.Type), v.visitNode(node.FullSignature), v.visitFunctionBody(node.Body))
}
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)
}
func (node *MethodDeclaration) computeSubtreeFacts() SubtreeFacts {
if node.Body == nil {
return SubtreeContainsTypeScript
} else {
isAsync := node.modifiers != nil && node.modifiers.ModifierFlags&ModifierFlagsAsync != 0
isGenerator := node.AsteriskToken != nil
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.AsteriskToken) |
propagateSubtreeFacts(node.name) |
propagateEraseableSyntaxSubtreeFacts(node.PostfixToken) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeParameters) |
propagateNodeListSubtreeFacts(node.Parameters, propagateSubtreeFacts) |
propagateSubtreeFacts(node.Body) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateEraseableSyntaxSubtreeFacts(node.FullSignature) |
core.IfElse(isAsync && isGenerator, SubtreeContainsForAwaitOrAsyncGenerator, SubtreeFactsNone) |
core.IfElse(isAsync && !isGenerator, SubtreeContainsAnyAwait, SubtreeFactsNone)
}
}
func (node *MethodDeclaration) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsMethod |
propagateSubtreeFacts(node.name)
}
func IsMethodDeclaration(node *Node) bool {
return node.Kind == KindMethodDeclaration
}
// PropertySignatureDeclaration
type PropertySignatureDeclaration struct {
NodeBase
NamedMemberBase
TypeElementBase
typeSyntaxBase
Type *TypeNode // TypeNode
Initializer *Expression // Expression. For error reporting purposes
}
func (f *NodeFactory) NewPropertySignatureDeclaration(modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
data := f.propertySignatureDeclarationPool.New()
data.modifiers = modifiers
data.name = name
data.PostfixToken = postfixToken
data.Type = typeNode
data.Initializer = initializer
return f.newNode(KindPropertySignature, data)
}
func (f *NodeFactory) UpdatePropertySignatureDeclaration(node *PropertySignatureDeclaration, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
if modifiers != node.modifiers || name != node.name || postfixToken != node.PostfixToken || typeNode != node.Type || initializer != node.Initializer {
return updateNode(f.NewPropertySignatureDeclaration(modifiers, name, postfixToken, typeNode, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *PropertySignatureDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.PostfixToken) || visit(v, node.Type) || visit(v, node.Initializer)
}
func (node *PropertySignatureDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdatePropertySignatureDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitToken(node.PostfixToken), v.visitNode(node.Type), v.visitNode(node.Initializer))
}
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)
}
func IsPropertySignatureDeclaration(node *Node) bool {
return node.Kind == KindPropertySignature
}
// PropertyDeclaration
type PropertyDeclaration struct {
NodeBase
NamedMemberBase
ClassElementBase
compositeNodeBase
Type *TypeNode // TypeNode. Optional
Initializer *Expression // Expression. Optional
}
func (f *NodeFactory) NewPropertyDeclaration(modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
data := &PropertyDeclaration{}
data.modifiers = modifiers
data.name = name
data.PostfixToken = postfixToken
data.Type = typeNode
data.Initializer = initializer
return f.newNode(KindPropertyDeclaration, data)
}
func (f *NodeFactory) UpdatePropertyDeclaration(node *PropertyDeclaration, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
if modifiers != node.modifiers || name != node.name || postfixToken != node.PostfixToken || typeNode != node.Type || initializer != node.Initializer {
return updateNode(f.NewPropertyDeclaration(modifiers, name, postfixToken, typeNode, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *PropertyDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.PostfixToken) || visit(v, node.Type) || visit(v, node.Initializer)
}
func (node *PropertyDeclaration) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdatePropertyDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitToken(node.PostfixToken), v.visitNode(node.Type), v.visitNode(node.Initializer))
}
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)
}
func (node *PropertyDeclaration) computeSubtreeFacts() SubtreeFacts {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.name) |
propagateEraseableSyntaxSubtreeFacts(node.PostfixToken) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateSubtreeFacts(node.Initializer) |
SubtreeContainsClassFields
}
func (node *PropertyDeclaration) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsProperty |
propagateSubtreeFacts(node.name)
}
func IsPropertyDeclaration(node *Node) bool {
return node.Kind == KindPropertyDeclaration
}
// SemicolonClassElement
type SemicolonClassElement struct {
NodeBase
DeclarationBase
ClassElementBase
}
func (f *NodeFactory) NewSemicolonClassElement() *Node {
return f.newNode(KindSemicolonClassElement, &SemicolonClassElement{})
}
func (node *SemicolonClassElement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewSemicolonClassElement(), node.AsNode(), f.AsNodeFactory().hooks)
}
// ClassStaticBlockDeclaration
type ClassStaticBlockDeclaration struct {
NodeBase
DeclarationBase
ModifiersBase
LocalsContainerBase
ClassElementBase
compositeNodeBase
Body *BlockNode // BlockNode
ReturnFlowNode *FlowNode
}
func (f *NodeFactory) NewClassStaticBlockDeclaration(modifiers *ModifierList, body *BlockNode) *Node {
data := &ClassStaticBlockDeclaration{}
data.modifiers = modifiers
data.Body = body
return f.newNode(KindClassStaticBlockDeclaration, data)
}
func (f *NodeFactory) UpdateClassStaticBlockDeclaration(node *ClassStaticBlockDeclaration, modifiers *ModifierList, body *BlockNode) *Node {
if modifiers != node.modifiers || body != node.Body {
return updateNode(f.NewClassStaticBlockDeclaration(modifiers, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ClassStaticBlockDeclaration) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.Body)
}
func (node *ClassStaticBlockDeclaration) VisitEachChild(v *NodeVisitor) *Node {
// A `static {}` Block does not have parameters, but we must still ensure we enter the lexical scope
modifiers := v.visitModifiers(node.modifiers)
body := v.visitNode(node.Body)
return v.Factory.UpdateClassStaticBlockDeclaration(node, modifiers, body)
}
func (node *ClassStaticBlockDeclaration) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewClassStaticBlockDeclaration(node.Modifiers(), node.Body), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ClassStaticBlockDeclaration) computeSubtreeFacts() SubtreeFacts {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.Body) |
SubtreeContainsClassFields
}
func IsClassStaticBlockDeclaration(node *Node) bool {
return node.Kind == KindClassStaticBlockDeclaration
}
// ExpressionBase
type ExpressionBase struct {
NodeBase
}
// OmittedExpression
type OmittedExpression struct {
ExpressionBase
}
func (f *NodeFactory) NewOmittedExpression() *Node {
return f.newNode(KindOmittedExpression, &OmittedExpression{})
}
func (node *OmittedExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewOmittedExpression(), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsOmittedExpression(node *Node) bool {
return node.Kind == KindOmittedExpression
}
// KeywordExpression
type KeywordExpression struct {
ExpressionBase
FlowNodeBase // For 'this' and 'super' expressions
}
func (f *NodeFactory) NewKeywordExpression(kind Kind) *Node {
return f.newNode(kind, f.keywordExpressionPool.New())
}
func (node *KeywordExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewKeywordExpression(node.Kind), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *KeywordExpression) computeSubtreeFacts() SubtreeFacts {
switch node.Kind {
case KindThisKeyword:
return SubtreeContainsLexicalThis
case KindSuperKeyword:
return SubtreeContainsLexicalSuper
}
return SubtreeFactsNone
}
// LiteralLikeBase
type LiteralLikeBase struct {
Text string
TokenFlags TokenFlags
}
func (node *LiteralLikeBase) LiteralLikeData() *LiteralLikeBase { return node }
// StringLiteral
type StringLiteral struct {
ExpressionBase
LiteralLikeBase
}
func (f *NodeFactory) NewStringLiteral(text string) *Node {
data := f.stringLiteralPool.New()
data.Text = text
f.textCount++
return f.newNode(KindStringLiteral, data)
}
func (node *StringLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewStringLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsStringLiteral(node *Node) bool {
return node.Kind == KindStringLiteral
}
// NumericLiteral
type NumericLiteral struct {
ExpressionBase
LiteralLikeBase
}
func (f *NodeFactory) NewNumericLiteral(text string) *Node {
data := f.numericLiteralPool.New()
data.Text = text
f.textCount++
return f.newNode(KindNumericLiteral, data)
}
func (node *NumericLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNumericLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsNumericLiteral(node *Node) bool {
return node.Kind == KindNumericLiteral
}
// BigIntLiteral
type BigIntLiteral struct {
ExpressionBase
LiteralLikeBase
}
func (f *NodeFactory) NewBigIntLiteral(text string) *Node {
data := &BigIntLiteral{}
data.Text = text
f.textCount++
return f.newNode(KindBigIntLiteral, data)
}
func (node *BigIntLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewBigIntLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *BigIntLiteral) computeSubtreeFacts() SubtreeFacts {
return SubtreeFactsNone // `bigint` is not downleveled in any way
}
func IsBigIntLiteral(node *Node) bool {
return node.Kind == KindBigIntLiteral
}
// RegularExpressionLiteral
type RegularExpressionLiteral struct {
ExpressionBase
LiteralLikeBase
}
func (f *NodeFactory) NewRegularExpressionLiteral(text string) *Node {
data := &RegularExpressionLiteral{}
data.Text = text
f.textCount++
return f.newNode(KindRegularExpressionLiteral, data)
}
func (node *RegularExpressionLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewRegularExpressionLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsRegularExpressionLiteral(node *Node) bool {
return node.Kind == KindRegularExpressionLiteral
}
// NoSubstitutionTemplateLiteral
type NoSubstitutionTemplateLiteral struct {
ExpressionBase
TemplateLiteralLikeBase
}
func (f *NodeFactory) NewNoSubstitutionTemplateLiteral(text string) *Node {
data := &NoSubstitutionTemplateLiteral{}
data.Text = text
f.textCount++
return f.newNode(KindNoSubstitutionTemplateLiteral, data)
}
func (node *NoSubstitutionTemplateLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNoSubstitutionTemplateLiteral(node.Text), node.AsNode(), f.AsNodeFactory().hooks)
}
// BinaryExpression
type BinaryExpression struct {
ExpressionBase
DeclarationBase
ModifiersBase
compositeNodeBase
Left *Expression // Expression
Type *TypeNode // TypeNode. Only set by JSDoc @type tags.
OperatorToken *TokenNode // TokenNode
Right *Expression // Expression
}
func (f *NodeFactory) NewBinaryExpression(modifiers *ModifierList, left *Expression, typeNode *TypeNode, operatorToken *TokenNode, right *Expression) *Node {
if operatorToken == nil {
panic("operatorToken is required")
}
data := f.binaryExpressionPool.New()
data.modifiers = modifiers
data.Left = left
data.Type = typeNode
data.OperatorToken = operatorToken
data.Right = right
return f.newNode(KindBinaryExpression, data)
}
func (f *NodeFactory) UpdateBinaryExpression(node *BinaryExpression, modifiers *ModifierList, left *Expression, typeNode *TypeNode, operatorToken *TokenNode, right *Expression) *Node {
if left != node.Left || typeNode != node.Type || operatorToken != node.OperatorToken || right != node.Right {
return updateNode(f.NewBinaryExpression(modifiers, left, typeNode, operatorToken, right), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *BinaryExpression) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.Left) || visit(v, node.Type) || visit(v, node.OperatorToken) || visit(v, node.Right)
}
func (node *BinaryExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateBinaryExpression(node, v.visitModifiers(node.modifiers), v.visitNode(node.Left), v.visitNode(node.Type), v.visitToken(node.OperatorToken), v.visitNode(node.Right))
}
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)
}
func (node *BinaryExpression) computeSubtreeFacts() SubtreeFacts {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.Left) |
propagateSubtreeFacts(node.Type) |
propagateSubtreeFacts(node.OperatorToken) |
propagateSubtreeFacts(node.Right) |
core.IfElse(node.OperatorToken.Kind == KindInKeyword && IsPrivateIdentifier(node.Left), SubtreeContainsClassFields, SubtreeFactsNone)
}
func (node *BinaryExpression) setModifiers(modifiers *ModifierList) { node.modifiers = modifiers }
func IsBinaryExpression(node *Node) bool {
return node.Kind == KindBinaryExpression
}
// PrefixUnaryExpression
type PrefixUnaryExpression struct {
ExpressionBase
Operator Kind
Operand *Expression // Expression
}
func (f *NodeFactory) NewPrefixUnaryExpression(operator Kind, operand *Expression) *Node {
data := f.prefixUnaryExpressionPool.New()
data.Operator = operator
data.Operand = operand
return f.newNode(KindPrefixUnaryExpression, data)
}
func (f *NodeFactory) UpdatePrefixUnaryExpression(node *PrefixUnaryExpression, operand *Expression) *Node {
if operand != node.Operand {
return updateNode(f.NewPrefixUnaryExpression(node.Operator, operand), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *PrefixUnaryExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Operand)
}
func (node *PrefixUnaryExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdatePrefixUnaryExpression(node, v.visitNode(node.Operand))
}
func (node *PrefixUnaryExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewPrefixUnaryExpression(node.Operator, node.Operand), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *PrefixUnaryExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Operand)
}
func IsPrefixUnaryExpression(node *Node) bool {
return node.Kind == KindPrefixUnaryExpression
}
// PostfixUnaryExpression
type PostfixUnaryExpression struct {
ExpressionBase
Operand *Expression // Expression
Operator Kind
}
func (f *NodeFactory) NewPostfixUnaryExpression(operand *Expression, operator Kind) *Node {
data := &PostfixUnaryExpression{}
data.Operand = operand
data.Operator = operator
return f.newNode(KindPostfixUnaryExpression, data)
}
func (f *NodeFactory) UpdatePostfixUnaryExpression(node *PostfixUnaryExpression, operand *Expression) *Node {
if operand != node.Operand {
return updateNode(f.NewPostfixUnaryExpression(operand, node.Operator), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *PostfixUnaryExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Operand)
}
func (node *PostfixUnaryExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdatePostfixUnaryExpression(node, v.visitNode(node.Operand))
}
func (node *PostfixUnaryExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewPostfixUnaryExpression(node.Operand, node.Operator), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *PostfixUnaryExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Operand)
}
// YieldExpression
type YieldExpression struct {
ExpressionBase
AsteriskToken *TokenNode // TokenNode
Expression *Expression // Expression. Optional
}
func (f *NodeFactory) NewYieldExpression(asteriskToken *TokenNode, expression *Expression) *Node {
data := &YieldExpression{}
data.AsteriskToken = asteriskToken
data.Expression = expression
return f.newNode(KindYieldExpression, data)
}
func (f *NodeFactory) UpdateYieldExpression(node *YieldExpression, asteriskToken *TokenNode, expression *Expression) *Node {
if asteriskToken != node.AsteriskToken || expression != node.Expression {
return updateNode(f.NewYieldExpression(asteriskToken, expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *YieldExpression) ForEachChild(v Visitor) bool {
return visit(v, node.AsteriskToken) || visit(v, node.Expression)
}
func (node *YieldExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateYieldExpression(node, v.visitToken(node.AsteriskToken), v.visitNode(node.Expression))
}
func (node *YieldExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewYieldExpression(node.AsteriskToken, node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *YieldExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsForAwaitOrAsyncGenerator
}
func IsYieldExpression(node *Node) bool {
return node.Kind == KindYieldExpression
}
// ArrowFunction
type ArrowFunction struct {
ExpressionBase
DeclarationBase
ModifiersBase
FunctionLikeWithBodyBase
FlowNodeBase
compositeNodeBase
EqualsGreaterThanToken *TokenNode // TokenNode
}
func (f *NodeFactory) NewArrowFunction(modifiers *ModifierList, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode, fullSignature *TypeNode, equalsGreaterThanToken *TokenNode, body *BlockOrExpression) *Node {
data := &ArrowFunction{}
data.modifiers = modifiers
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
data.FullSignature = fullSignature
data.EqualsGreaterThanToken = equalsGreaterThanToken
data.Body = body
return f.newNode(KindArrowFunction, data)
}
func (f *NodeFactory) UpdateArrowFunction(node *ArrowFunction, modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode, fullSignature *TypeNode, equalsGreaterThanToken *TokenNode, body *BlockOrExpression) *Node {
if modifiers != node.modifiers || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type || fullSignature != node.FullSignature || equalsGreaterThanToken != node.EqualsGreaterThanToken || body != node.Body {
return updateNode(f.NewArrowFunction(modifiers, typeParameters, parameters, returnType, fullSignature, equalsGreaterThanToken, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ArrowFunction) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) ||
visit(v, node.Type) || visit(v, node.FullSignature) || visit(v, node.EqualsGreaterThanToken) || visit(v, node.Body)
}
func (node *ArrowFunction) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateArrowFunction(node, v.visitModifiers(node.modifiers), v.visitNodes(node.TypeParameters), v.visitParameters(node.Parameters), v.visitNode(node.Type), v.visitNode(node.FullSignature), v.visitToken(node.EqualsGreaterThanToken), v.visitFunctionBody(node.Body))
}
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)
}
func (node *ArrowFunction) Name() *DeclarationName {
return nil
}
func (node *ArrowFunction) computeSubtreeFacts() SubtreeFacts {
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeParameters) |
propagateNodeListSubtreeFacts(node.Parameters, propagateSubtreeFacts) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateEraseableSyntaxSubtreeFacts(node.FullSignature) |
propagateSubtreeFacts(node.Body) |
core.IfElse(node.ModifierFlags()&ModifierFlagsAsync != 0, SubtreeContainsAnyAwait, SubtreeFactsNone)
}
func (node *ArrowFunction) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsArrowFunction
}
func IsArrowFunction(node *Node) bool {
return node.Kind == KindArrowFunction
}
// FunctionExpression
type FunctionExpression struct {
ExpressionBase
DeclarationBase
ModifiersBase
FunctionLikeWithBodyBase
FlowNodeBase
compositeNodeBase
name *IdentifierNode // IdentifierNode. Optional
ReturnFlowNode *FlowNode
}
func (f *NodeFactory) NewFunctionExpression(modifiers *ModifierList, asteriskToken *TokenNode, name *IdentifierNode, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
data := &FunctionExpression{}
data.modifiers = modifiers
data.AsteriskToken = asteriskToken
data.name = name
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
data.FullSignature = fullSignature
data.Body = body
return f.newNode(KindFunctionExpression, data)
}
func (f *NodeFactory) UpdateFunctionExpression(node *FunctionExpression, modifiers *ModifierList, asteriskToken *TokenNode, name *IdentifierNode, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode, fullSignature *TypeNode, body *BlockNode) *Node {
if modifiers != node.modifiers || asteriskToken != node.AsteriskToken || name != node.name || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type || fullSignature != node.FullSignature || body != node.Body {
return updateNode(f.NewFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, returnType, fullSignature, body), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *FunctionExpression) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.AsteriskToken) || visit(v, node.name) || visitNodeList(v, node.TypeParameters) ||
visitNodeList(v, node.Parameters) || visit(v, node.Type) || visit(v, node.FullSignature) || visit(v, node.Body)
}
func (node *FunctionExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateFunctionExpression(node, v.visitModifiers(node.modifiers), v.visitToken(node.AsteriskToken), v.visitNode(node.name), v.visitNodes(node.TypeParameters), v.visitParameters(node.Parameters), v.visitNode(node.Type), v.visitNode(node.FullSignature), v.visitFunctionBody(node.Body))
}
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)
}
func (node *FunctionExpression) Name() *DeclarationName {
return node.name
}
func (node *FunctionExpression) computeSubtreeFacts() SubtreeFacts {
isAsync := node.modifiers != nil && node.modifiers.ModifierFlags&ModifierFlagsAsync != 0
isGenerator := node.AsteriskToken != nil
return propagateModifierListSubtreeFacts(node.modifiers) |
propagateSubtreeFacts(node.AsteriskToken) |
propagateSubtreeFacts(node.name) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeParameters) |
propagateNodeListSubtreeFacts(node.Parameters, propagateSubtreeFacts) |
propagateEraseableSyntaxSubtreeFacts(node.Type) |
propagateEraseableSyntaxSubtreeFacts(node.FullSignature) |
propagateSubtreeFacts(node.Body) |
core.IfElse(isAsync && isGenerator, SubtreeContainsForAwaitOrAsyncGenerator, SubtreeFactsNone) |
core.IfElse(isAsync && !isGenerator, SubtreeContainsAnyAwait, SubtreeFactsNone)
}
func (node *FunctionExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsFunction
}
func IsFunctionExpression(node *Node) bool {
return node.Kind == KindFunctionExpression
}
// AsExpression
type AsExpression struct {
ExpressionBase
Expression *Expression // Expression
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewAsExpression(expression *Expression, typeNode *TypeNode) *Node {
data := &AsExpression{}
data.Expression = expression
data.Type = typeNode
return f.newNode(KindAsExpression, data)
}
func (f *NodeFactory) UpdateAsExpression(node *AsExpression, expression *Expression, typeNode *TypeNode) *Node {
if expression != node.Expression || typeNode != node.Type {
return updateNode(f.NewAsExpression(expression, typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *AsExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.Type)
}
func (node *AsExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateAsExpression(node, v.visitNode(node.Expression), v.visitNode(node.Type))
}
func (node *AsExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewAsExpression(node.Expression, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *AsExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsTypeScript
}
func (node *AsExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsOuterExpression
}
// SatisfiesExpression
type SatisfiesExpression struct {
ExpressionBase
Expression *Expression // Expression
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewSatisfiesExpression(expression *Expression, typeNode *TypeNode) *Node {
data := &SatisfiesExpression{}
data.Expression = expression
data.Type = typeNode
return f.newNode(KindSatisfiesExpression, data)
}
func (f *NodeFactory) UpdateSatisfiesExpression(node *SatisfiesExpression, expression *Expression, typeNode *TypeNode) *Node {
if expression != node.Expression || typeNode != node.Type {
return updateNode(f.NewSatisfiesExpression(expression, typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *SatisfiesExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.Type)
}
func (node *SatisfiesExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateSatisfiesExpression(node, v.visitNode(node.Expression), v.visitNode(node.Type))
}
func (node *SatisfiesExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewSatisfiesExpression(node.Expression, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *SatisfiesExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsTypeScript
}
func (node *SatisfiesExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsOuterExpression
}
func IsSatisfiesExpression(node *Node) bool {
return node.Kind == KindSatisfiesExpression
}
// ConditionalExpression
type ConditionalExpression struct {
ExpressionBase
compositeNodeBase
Condition *Expression
QuestionToken *TokenNode
WhenTrue *Expression
ColonToken *TokenNode
WhenFalse *Expression
}
func (f *NodeFactory) NewConditionalExpression(condition *Expression, questionToken *TokenNode, whenTrue *Expression, colonToken *TokenNode, whenFalse *Expression) *Node {
data := f.conditionalExpressionPool.New()
data.Condition = condition
data.QuestionToken = questionToken
data.WhenTrue = whenTrue
data.ColonToken = colonToken
data.WhenFalse = whenFalse
return f.newNode(KindConditionalExpression, data)
}
func (f *NodeFactory) UpdateConditionalExpression(node *ConditionalExpression, condition *Expression, questionToken *TokenNode, whenTrue *Expression, colonToken *TokenNode, whenFalse *Expression) *Node {
if condition != node.Condition || questionToken != node.QuestionToken || whenTrue != node.WhenTrue || colonToken != node.ColonToken || whenFalse != node.WhenFalse {
return updateNode(f.NewConditionalExpression(condition, questionToken, whenTrue, colonToken, whenFalse), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ConditionalExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Condition) || visit(v, node.QuestionToken) || visit(v, node.WhenTrue) ||
visit(v, node.ColonToken) || visit(v, node.WhenFalse)
}
func (node *ConditionalExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateConditionalExpression(node, v.visitNode(node.Condition), v.visitToken(node.QuestionToken), v.visitNode(node.WhenTrue), v.visitToken(node.ColonToken), v.visitNode(node.WhenFalse))
}
func (node *ConditionalExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewConditionalExpression(node.Condition, node.QuestionToken, node.WhenTrue, node.ColonToken, node.WhenFalse), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ConditionalExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Condition) |
propagateSubtreeFacts(node.WhenTrue) |
propagateSubtreeFacts(node.WhenFalse)
}
func IsConditionalExpression(node *Node) bool {
return node.Kind == KindConditionalExpression
}
// PropertyAccessExpression
type PropertyAccessExpression struct {
ExpressionBase
FlowNodeBase
compositeNodeBase
Expression *Expression // Expression
QuestionDotToken *TokenNode // TokenNode
name *MemberName // MemberName
}
func (f *NodeFactory) NewPropertyAccessExpression(expression *Expression, questionDotToken *TokenNode, name *MemberName, flags NodeFlags) *Node {
data := f.propertyAccessExpressionPool.New()
data.Expression = expression
data.QuestionDotToken = questionDotToken
data.name = name
node := f.newNode(KindPropertyAccessExpression, data)
node.Flags |= flags & NodeFlagsOptionalChain
return node
}
func (f *NodeFactory) UpdatePropertyAccessExpression(node *PropertyAccessExpression, expression *Expression, questionDotToken *TokenNode, name *MemberName) *Node {
if expression != node.Expression || questionDotToken != node.QuestionDotToken || name != node.name {
return updateNode(f.NewPropertyAccessExpression(expression, questionDotToken, name, node.Flags), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *PropertyAccessExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.QuestionDotToken) || visit(v, node.name)
}
func (node *PropertyAccessExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdatePropertyAccessExpression(node, v.visitNode(node.Expression), v.visitToken(node.QuestionDotToken), v.visitNode(node.name))
}
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)
}
func (node *PropertyAccessExpression) Name() *DeclarationName { return node.name }
func (node *PropertyAccessExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) |
propagateSubtreeFacts(node.QuestionDotToken) |
propagateSubtreeFacts(node.name)
}
func (node *PropertyAccessExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsPropertyAccess
}
func IsPropertyAccessExpression(node *Node) bool {
return node.Kind == KindPropertyAccessExpression
}
// ElementAccessExpression
type ElementAccessExpression struct {
ExpressionBase
FlowNodeBase
compositeNodeBase
Expression *Expression // Expression
QuestionDotToken *TokenNode // TokenNode
ArgumentExpression *Expression // Expression
}
func (f *NodeFactory) NewElementAccessExpression(expression *Expression, questionDotToken *TokenNode, argumentExpression *Expression, flags NodeFlags) *Node {
data := f.elementAccessExpressionPool.New()
data.Expression = expression
data.QuestionDotToken = questionDotToken
data.ArgumentExpression = argumentExpression
node := f.newNode(KindElementAccessExpression, data)
node.Flags |= flags & NodeFlagsOptionalChain
return node
}
func (f *NodeFactory) UpdateElementAccessExpression(node *ElementAccessExpression, expression *Expression, questionDotToken *TokenNode, argumentExpression *Expression) *Node {
if expression != node.Expression || questionDotToken != node.QuestionDotToken || argumentExpression != node.ArgumentExpression {
return updateNode(f.NewElementAccessExpression(expression, questionDotToken, argumentExpression, node.Flags), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ElementAccessExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.QuestionDotToken) || visit(v, node.ArgumentExpression)
}
func (node *ElementAccessExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateElementAccessExpression(node, v.visitNode(node.Expression), v.visitToken(node.QuestionDotToken), v.visitNode(node.ArgumentExpression))
}
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)
}
func (node *ElementAccessExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) |
propagateSubtreeFacts(node.QuestionDotToken) |
propagateSubtreeFacts(node.ArgumentExpression)
}
func (node *ElementAccessExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsElementAccess
}
func IsElementAccessExpression(node *Node) bool {
return node.Kind == KindElementAccessExpression
}
// CallExpression
type CallExpression struct {
ExpressionBase
compositeNodeBase
Expression *Expression // Expression
QuestionDotToken *TokenNode // TokenNode
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
Arguments *NodeList // NodeList[*Expression]
}
func (f *NodeFactory) NewCallExpression(expression *Expression, questionDotToken *TokenNode, typeArguments *NodeList, arguments *NodeList, flags NodeFlags) *Node {
data := f.callExpressionPool.New()
data.Expression = expression
data.QuestionDotToken = questionDotToken
data.TypeArguments = typeArguments
data.Arguments = arguments
node := f.newNode(KindCallExpression, data)
node.Flags |= flags & NodeFlagsOptionalChain
return node
}
func (f *NodeFactory) UpdateCallExpression(node *CallExpression, expression *Expression, questionDotToken *TokenNode, typeArguments *TypeArgumentList, arguments *ArgumentList) *Node {
if expression != node.Expression || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || arguments != node.Arguments {
return updateNode(f.NewCallExpression(expression, questionDotToken, typeArguments, arguments, node.Flags), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *CallExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.QuestionDotToken) || visitNodeList(v, node.TypeArguments) || visitNodeList(v, node.Arguments)
}
func (node *CallExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateCallExpression(node, v.visitNode(node.Expression), v.visitToken(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNodes(node.Arguments))
}
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)
}
func (node *CallExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) |
propagateSubtreeFacts(node.QuestionDotToken) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeArguments) |
propagateNodeListSubtreeFacts(node.Arguments, propagateSubtreeFacts) |
core.IfElse(node.Expression.Kind == KindImportKeyword, SubtreeContainsDynamicImport, SubtreeFactsNone)
}
func (node *CallExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsCall
}
func IsCallExpression(node *Node) bool {
return node.Kind == KindCallExpression
}
// NewExpression
type NewExpression struct {
ExpressionBase
compositeNodeBase
Expression *Expression // Expression
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
Arguments *NodeList // NodeList[*Expression]. Optional
}
func (f *NodeFactory) NewNewExpression(expression *Expression, typeArguments *NodeList, arguments *NodeList) *Node {
data := &NewExpression{}
data.Expression = expression
data.TypeArguments = typeArguments
data.Arguments = arguments
return f.newNode(KindNewExpression, data)
}
func (f *NodeFactory) UpdateNewExpression(node *NewExpression, expression *Expression, typeArguments *TypeArgumentList, arguments *ArgumentList) *Node {
if expression != node.Expression || typeArguments != node.TypeArguments || arguments != node.Arguments {
return updateNode(f.NewNewExpression(expression, typeArguments, arguments), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *NewExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visitNodeList(v, node.TypeArguments) || visitNodeList(v, node.Arguments)
}
func (node *NewExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateNewExpression(node, v.visitNode(node.Expression), v.visitNodes(node.TypeArguments), v.visitNodes(node.Arguments))
}
func (node *NewExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNewExpression(node.Expression, node.TypeArguments, node.Arguments), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *NewExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeArguments) |
propagateNodeListSubtreeFacts(node.Arguments, propagateSubtreeFacts)
}
func (node *NewExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsNew
}
func IsNewExpression(node *Node) bool {
return node.Kind == KindNewExpression
}
// MetaProperty
type MetaProperty struct {
ExpressionBase
FlowNodeBase
compositeNodeBase
KeywordToken Kind // NewKeyword | ImportKeyword
name *IdentifierNode // IdentifierNode
}
func (f *NodeFactory) NewMetaProperty(keywordToken Kind, name *IdentifierNode) *Node {
data := &MetaProperty{}
data.KeywordToken = keywordToken
data.name = name
return f.newNode(KindMetaProperty, data)
}
func (f *NodeFactory) UpdateMetaProperty(node *MetaProperty, name *IdentifierNode) *Node {
if name != node.name {
return updateNode(f.NewMetaProperty(node.KeywordToken, name), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *MetaProperty) ForEachChild(v Visitor) bool {
return visit(v, node.name)
}
func (node *MetaProperty) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateMetaProperty(node, v.visitNode(node.name))
}
func (node *MetaProperty) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewMetaProperty(node.Kind, node.Name()), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *MetaProperty) Name() *DeclarationName {
return node.name
}
func (node *MetaProperty) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name) // `import.meta` is not downleveled in any way
}
func IsMetaProperty(node *Node) bool {
return node.Kind == KindMetaProperty
}
// NonNullExpression
type NonNullExpression struct {
ExpressionBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewNonNullExpression(expression *Expression, flags NodeFlags) *Node {
data := &NonNullExpression{}
data.Expression = expression
data.Flags |= flags & NodeFlagsOptionalChain
return f.newNode(KindNonNullExpression, data)
}
func (f *NodeFactory) UpdateNonNullExpression(node *NonNullExpression, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewNonNullExpression(expression, node.AsNode().Flags), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *NonNullExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *NonNullExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateNonNullExpression(node, v.visitNode(node.Expression))
}
func (node *NonNullExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNonNullExpression(node.Expression, node.Flags), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *NonNullExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsTypeScript
}
func IsNonNullExpression(node *Node) bool {
return node.Kind == KindNonNullExpression
}
// SpreadElement
type SpreadElement struct {
ExpressionBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewSpreadElement(expression *Expression) *Node {
data := &SpreadElement{}
data.Expression = expression
return f.newNode(KindSpreadElement, data)
}
func (f *NodeFactory) UpdateSpreadElement(node *SpreadElement, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewSpreadElement(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *SpreadElement) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *SpreadElement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateSpreadElement(node, v.visitNode(node.Expression))
}
func (node *SpreadElement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewSpreadElement(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *SpreadElement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsRestOrSpread
}
func IsSpreadElement(node *Node) bool {
return node.Kind == KindSpreadElement
}
// TemplateExpression
type TemplateExpression struct {
ExpressionBase
compositeNodeBase
Head *TemplateHeadNode // TemplateHeadNode
TemplateSpans *NodeList // NodeList[*TemplateSpanNode]
}
func (f *NodeFactory) NewTemplateExpression(head *TemplateHeadNode, templateSpans *NodeList) *Node {
data := &TemplateExpression{}
data.Head = head
data.TemplateSpans = templateSpans
return f.newNode(KindTemplateExpression, data)
}
func (f *NodeFactory) UpdateTemplateExpression(node *TemplateExpression, head *TemplateHeadNode, templateSpans *TemplateSpanList) *Node {
if head != node.Head || templateSpans != node.TemplateSpans {
return updateNode(f.NewTemplateExpression(head, templateSpans), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TemplateExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Head) || visitNodeList(v, node.TemplateSpans)
}
func (node *TemplateExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTemplateExpression(node, v.visitNode(node.Head), v.visitNodes(node.TemplateSpans))
}
func (node *TemplateExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTemplateExpression(node.Head, node.TemplateSpans), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *TemplateExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Head) |
propagateNodeListSubtreeFacts(node.TemplateSpans, propagateSubtreeFacts)
}
func IsTemplateExpression(node *Node) bool {
return node.Kind == KindTemplateExpression
}
// TemplateLiteralTypeSpan
type TemplateSpan struct {
NodeBase
Expression *Expression // Expression
Literal *TemplateMiddleOrTail // TemplateMiddleOrTail
}
func (f *NodeFactory) NewTemplateSpan(expression *Expression, literal *TemplateMiddleOrTail) *Node {
data := &TemplateSpan{}
data.Expression = expression
data.Literal = literal
return f.newNode(KindTemplateSpan, data)
}
func (f *NodeFactory) UpdateTemplateSpan(node *TemplateSpan, expression *Expression, literal *TemplateMiddleOrTail) *Node {
if expression != node.Expression || literal != node.Literal {
return updateNode(f.NewTemplateSpan(expression, literal), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TemplateSpan) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visit(v, node.Literal)
}
func (node *TemplateSpan) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTemplateSpan(node, v.visitNode(node.Expression), v.visitNode(node.Literal))
}
func (node *TemplateSpan) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTemplateSpan(node.Expression, node.Literal), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *TemplateSpan) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func IsTemplateSpan(node *Node) bool {
return node.Kind == KindTemplateSpan
}
// TaggedTemplateExpression
type TaggedTemplateExpression struct {
ExpressionBase
compositeNodeBase
Tag *Expression // Expression
QuestionDotToken *TokenNode // TokenNode. For error reporting purposes only
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
Template *TemplateLiteral // TemplateLiteral
}
func (f *NodeFactory) NewTaggedTemplateExpression(tag *Expression, questionDotToken *TokenNode, typeArguments *NodeList, template *TemplateLiteral, flags NodeFlags) *Node {
data := &TaggedTemplateExpression{}
data.Tag = tag
data.QuestionDotToken = questionDotToken
data.TypeArguments = typeArguments
data.Template = template
node := f.newNode(KindTaggedTemplateExpression, data)
node.Flags |= flags & NodeFlagsOptionalChain
return node
}
func (f *NodeFactory) UpdateTaggedTemplateExpression(node *TaggedTemplateExpression, tag *Expression, questionDotToken *TokenNode, typeArguments *TypeArgumentList, template *TemplateLiteral) *Node {
if tag != node.Tag || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || template != node.Template {
return updateNode(f.NewTaggedTemplateExpression(tag, questionDotToken, typeArguments, template, node.Flags), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TaggedTemplateExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Tag) || visit(v, node.QuestionDotToken) || visitNodeList(v, node.TypeArguments) || visit(v, node.Template)
}
func (node *TaggedTemplateExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTaggedTemplateExpression(node, v.visitNode(node.Tag), v.visitToken(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNode(node.Template))
}
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)
}
func (node *TaggedTemplateExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Tag) |
propagateSubtreeFacts(node.QuestionDotToken) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeArguments) |
propagateSubtreeFacts(node.Template)
}
func IsTaggedTemplateExpression(node *Node) bool {
return node.Kind == KindTaggedTemplateExpression
}
// ParenthesizedExpression
type ParenthesizedExpression struct {
ExpressionBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewParenthesizedExpression(expression *Expression) *Node {
data := f.parenthesizedExpressionPool.New()
data.Expression = expression
return f.newNode(KindParenthesizedExpression, data)
}
func (f *NodeFactory) UpdateParenthesizedExpression(node *ParenthesizedExpression, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewParenthesizedExpression(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ParenthesizedExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *ParenthesizedExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateParenthesizedExpression(node, v.visitNode(node.Expression))
}
func (node *ParenthesizedExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewParenthesizedExpression(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ParenthesizedExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func (node *ParenthesizedExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsOuterExpression
}
func IsParenthesizedExpression(node *Node) bool {
return node.Kind == KindParenthesizedExpression
}
// ArrayLiteralExpression
type ArrayLiteralExpression struct {
ExpressionBase
compositeNodeBase
Elements *NodeList // NodeList[*Expression]
MultiLine bool
}
func (f *NodeFactory) NewArrayLiteralExpression(elements *NodeList, multiLine bool) *Node {
data := &ArrayLiteralExpression{}
data.Elements = elements
data.MultiLine = multiLine
return f.newNode(KindArrayLiteralExpression, data)
}
func (f *NodeFactory) UpdateArrayLiteralExpression(node *ArrayLiteralExpression, elements *ElementList) *Node {
if elements != node.Elements {
return updateNode(f.NewArrayLiteralExpression(elements, node.MultiLine), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ArrayLiteralExpression) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Elements)
}
func (node *ArrayLiteralExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateArrayLiteralExpression(node, v.visitNodes(node.Elements))
}
func (node *ArrayLiteralExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewArrayLiteralExpression(node.Elements, node.MultiLine), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ArrayLiteralExpression) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Elements, propagateSubtreeFacts)
}
func (node *ArrayLiteralExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsArrayLiteral
}
func IsArrayLiteralExpression(node *Node) bool {
return node.Kind == KindArrayLiteralExpression
}
// ObjectLiteralExpression
type ObjectLiteralExpression struct {
ExpressionBase
DeclarationBase
compositeNodeBase
Properties *NodeList // NodeList[*ObjectLiteralElement]
MultiLine bool
}
func (f *NodeFactory) NewObjectLiteralExpression(properties *NodeList, multiLine bool) *Node {
data := &ObjectLiteralExpression{}
data.Properties = properties
data.MultiLine = multiLine
return f.newNode(KindObjectLiteralExpression, data)
}
func (f *NodeFactory) UpdateObjectLiteralExpression(node *ObjectLiteralExpression, properties *PropertyDefinitionList) *Node {
if properties != node.Properties {
return updateNode(f.NewObjectLiteralExpression(properties, node.MultiLine), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ObjectLiteralExpression) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Properties)
}
func (node *ObjectLiteralExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateObjectLiteralExpression(node, v.visitNodes(node.Properties))
}
func (node *ObjectLiteralExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewObjectLiteralExpression(node.Properties, node.MultiLine), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ObjectLiteralExpression) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Properties, propagateSubtreeFacts)
}
func (node *ObjectLiteralExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsObjectLiteral
}
func IsObjectLiteralExpression(node *Node) bool {
return node.Kind == KindObjectLiteralExpression
}
// ObjectLiteralElementBase
type ObjectLiteralElementBase struct{}
// SpreadAssignment
type SpreadAssignment struct {
NodeBase
DeclarationBase
ObjectLiteralElementBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewSpreadAssignment(expression *Expression) *Node {
data := &SpreadAssignment{}
data.Expression = expression
return f.newNode(KindSpreadAssignment, data)
}
func (f *NodeFactory) UpdateSpreadAssignment(node *SpreadAssignment, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewSpreadAssignment(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *SpreadAssignment) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *SpreadAssignment) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateSpreadAssignment(node, v.visitNode(node.Expression))
}
func (node *SpreadAssignment) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewSpreadAssignment(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *SpreadAssignment) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsESObjectRestOrSpread | SubtreeContainsObjectRestOrSpread
}
func IsSpreadAssignment(node *Node) bool {
return node.Kind == KindSpreadAssignment
}
// PropertyAssignment
type PropertyAssignment struct {
NodeBase
NamedMemberBase
ObjectLiteralElementBase
compositeNodeBase
Type *TypeNode // TypeNode. Only set by JSDoc @type tags.
Initializer *Expression // Expression
}
func (f *NodeFactory) NewPropertyAssignment(modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
data := f.propertyAssignmentPool.New()
data.modifiers = modifiers
data.name = name
data.PostfixToken = postfixToken
data.Type = typeNode
data.Initializer = initializer
return f.newNode(KindPropertyAssignment, data)
}
func (f *NodeFactory) UpdatePropertyAssignment(node *PropertyAssignment, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node {
if modifiers != node.modifiers || name != node.name || postfixToken != node.PostfixToken || typeNode != node.Type || initializer != node.Initializer {
return updateNode(f.NewPropertyAssignment(modifiers, name, postfixToken, typeNode, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *PropertyAssignment) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.PostfixToken) || visit(v, node.Type) || visit(v, node.Initializer)
}
func (node *PropertyAssignment) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdatePropertyAssignment(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitToken(node.PostfixToken), v.visitNode(node.Type), v.visitNode(node.Initializer))
}
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)
}
func (node *PropertyAssignment) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name) |
propagateSubtreeFacts(node.Type) |
propagateSubtreeFacts(node.Initializer)
}
func IsPropertyAssignment(node *Node) bool {
return node.Kind == KindPropertyAssignment
}
// ShorthandPropertyAssignment
type ShorthandPropertyAssignment struct {
NodeBase
NamedMemberBase
ObjectLiteralElementBase
compositeNodeBase
Type *TypeNode // TypeNode. Only set by JSDoc @type tags.
EqualsToken *TokenNode
ObjectAssignmentInitializer *Expression // Optional
}
func (f *NodeFactory) NewShorthandPropertyAssignment(modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, equalsToken *TokenNode, objectAssignmentInitializer *Expression) *Node {
data := &ShorthandPropertyAssignment{}
data.modifiers = modifiers
data.name = name
data.PostfixToken = postfixToken
data.Type = typeNode
data.EqualsToken = equalsToken
data.ObjectAssignmentInitializer = objectAssignmentInitializer
return f.newNode(KindShorthandPropertyAssignment, data)
}
func (f *NodeFactory) UpdateShorthandPropertyAssignment(node *ShorthandPropertyAssignment, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, equalsToken *TokenNode, objectAssignmentInitializer *Expression) *Node {
if modifiers != node.modifiers || name != node.name || typeNode != node.Type || postfixToken != node.PostfixToken || objectAssignmentInitializer != node.ObjectAssignmentInitializer {
return updateNode(f.NewShorthandPropertyAssignment(modifiers, name, postfixToken, typeNode, equalsToken, objectAssignmentInitializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ShorthandPropertyAssignment) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visit(v, node.name) || visit(v, node.Type) || visit(v, node.PostfixToken) || visit(v, node.EqualsToken) || visit(v, node.ObjectAssignmentInitializer)
}
func (node *ShorthandPropertyAssignment) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateShorthandPropertyAssignment(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitToken(node.PostfixToken), v.visitNode(node.Type), v.visitToken(node.EqualsToken), v.visitNode(node.ObjectAssignmentInitializer))
}
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)
}
func (node *ShorthandPropertyAssignment) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name) | // we do not use propagateSubtreeFacts here because this is an IdentifierReference
propagateSubtreeFacts(node.Type) |
propagateSubtreeFacts(node.ObjectAssignmentInitializer) |
SubtreeContainsTypeScript // may require rewriting in a TypeScript namespace
}
func IsShorthandPropertyAssignment(node *Node) bool {
return node.Kind == KindShorthandPropertyAssignment
}
// DeleteExpression
type DeleteExpression struct {
ExpressionBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewDeleteExpression(expression *Expression) *Node {
data := &DeleteExpression{}
data.Expression = expression
return f.newNode(KindDeleteExpression, data)
}
func (f *NodeFactory) UpdateDeleteExpression(node *DeleteExpression, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewDeleteExpression(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *DeleteExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *DeleteExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateDeleteExpression(node, v.visitNode(node.Expression))
}
func (node *DeleteExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewDeleteExpression(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *DeleteExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
// TypeOfExpression
type TypeOfExpression struct {
ExpressionBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewTypeOfExpression(expression *Expression) *Node {
data := &TypeOfExpression{}
data.Expression = expression
return f.newNode(KindTypeOfExpression, data)
}
func (f *NodeFactory) UpdateTypeOfExpression(node *TypeOfExpression, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewTypeOfExpression(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypeOfExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *TypeOfExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypeOfExpression(node, v.visitNode(node.Expression))
}
func (node *TypeOfExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTypeOfExpression(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *TypeOfExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func IsTypeOfExpression(node *Node) bool {
return node.Kind == KindTypeOfExpression
}
// VoidExpression
type VoidExpression struct {
ExpressionBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewVoidExpression(expression *Expression) *Node {
data := &VoidExpression{}
data.Expression = expression
return f.newNode(KindVoidExpression, data)
}
func (f *NodeFactory) UpdateVoidExpression(node *VoidExpression, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewVoidExpression(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *VoidExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *VoidExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateVoidExpression(node, v.visitNode(node.Expression))
}
func (node *VoidExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewVoidExpression(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *VoidExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
// AwaitExpression
type AwaitExpression struct {
ExpressionBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewAwaitExpression(expression *Expression) *Node {
data := &AwaitExpression{}
data.Expression = expression
return f.newNode(KindAwaitExpression, data)
}
func (f *NodeFactory) UpdateAwaitExpression(node *AwaitExpression, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewAwaitExpression(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *AwaitExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *AwaitExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateAwaitExpression(node, v.visitNode(node.Expression))
}
func (node *AwaitExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewAwaitExpression(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *AwaitExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsAwait
}
func IsAwaitExpression(node *Node) bool {
return node.Kind == KindAwaitExpression
}
// TypeAssertion
type TypeAssertion struct {
ExpressionBase
Type *TypeNode // TypeNode
Expression *Expression // Expression
}
func (f *NodeFactory) NewTypeAssertion(typeNode *TypeNode, expression *Expression) *Node {
data := &TypeAssertion{}
data.Type = typeNode
data.Expression = expression
return f.newNode(KindTypeAssertionExpression, data)
}
func (f *NodeFactory) UpdateTypeAssertion(node *TypeAssertion, typeNode *TypeNode, expression *Expression) *Node {
if typeNode != node.Type || expression != node.Expression {
return updateNode(f.NewTypeAssertion(typeNode, expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypeAssertion) ForEachChild(v Visitor) bool {
return visit(v, node.Type) || visit(v, node.Expression)
}
func (node *TypeAssertion) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypeAssertion(node, v.visitNode(node.Type), v.visitNode(node.Expression))
}
func (node *TypeAssertion) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTypeAssertion(node.Type, node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *TypeAssertion) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsTypeScript
}
func (node *TypeAssertion) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsOuterExpression
}
// TypeNodeBase
type TypeNodeBase struct {
NodeBase
typeSyntaxBase
}
// KeywordTypeNode
type KeywordTypeNode struct {
TypeNodeBase
}
func (f *NodeFactory) NewKeywordTypeNode(kind Kind) *Node {
return f.newNode(kind, f.keywordTypeNodePool.New())
}
func (node *KeywordTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewKeywordTypeNode(node.Kind), node.AsNode(), f.AsNodeFactory().hooks)
}
// UnionOrIntersectionTypeBase
type UnionOrIntersectionTypeNodeBase struct {
TypeNodeBase
Types *NodeList // NodeList[*TypeNode]
}
func (node *UnionOrIntersectionTypeNodeBase) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Types)
}
// UnionTypeNode
type UnionTypeNode struct {
UnionOrIntersectionTypeNodeBase
}
func (f *NodeFactory) UpdateUnionTypeNode(node *UnionTypeNode, types *TypeList) *Node {
if types != node.Types {
return updateNode(f.NewUnionTypeNode(types), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (f *NodeFactory) NewUnionTypeNode(types *NodeList) *Node {
data := f.unionTypeNodePool.New()
data.Types = types
return f.newNode(KindUnionType, data)
}
func (node *UnionTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateUnionTypeNode(node, v.visitNodes(node.Types))
}
func (node *UnionTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewUnionTypeNode(node.Types), node.AsNode(), f.AsNodeFactory().hooks)
}
// IntersectionTypeNode
type IntersectionTypeNode struct {
UnionOrIntersectionTypeNodeBase
}
func (f *NodeFactory) UpdateIntersectionTypeNode(node *IntersectionTypeNode, types *TypeList) *Node {
if types != node.Types {
return updateNode(f.NewIntersectionTypeNode(types), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (f *NodeFactory) NewIntersectionTypeNode(types *NodeList) *Node {
data := f.intersectionTypeNodePool.New()
data.Types = types
return f.newNode(KindIntersectionType, data)
}
func (node *IntersectionTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateIntersectionTypeNode(node, v.visitNodes(node.Types))
}
func (node *IntersectionTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewIntersectionTypeNode(node.Types), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsIntersectionTypeNode(node *Node) bool {
return node.Kind == KindIntersectionType
}
// ConditionalTypeNode
type ConditionalTypeNode struct {
TypeNodeBase
LocalsContainerBase
CheckType *TypeNode // TypeNode
ExtendsType *TypeNode // TypeNode
TrueType *TypeNode // TypeNode
FalseType *TypeNode // TypeNode
}
func (f *NodeFactory) NewConditionalTypeNode(checkType *TypeNode, extendsType *TypeNode, trueType *TypeNode, falseType *TypeNode) *Node {
data := &ConditionalTypeNode{}
data.CheckType = checkType
data.ExtendsType = extendsType
data.TrueType = trueType
data.FalseType = falseType
return f.newNode(KindConditionalType, data)
}
func (f *NodeFactory) UpdateConditionalTypeNode(node *ConditionalTypeNode, checkType *TypeNode, extendsType *TypeNode, trueType *TypeNode, falseType *TypeNode) *Node {
if checkType != node.CheckType || extendsType != node.ExtendsType || trueType != node.TrueType || falseType != node.FalseType {
return updateNode(f.NewConditionalTypeNode(checkType, extendsType, trueType, falseType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ConditionalTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.CheckType) || visit(v, node.ExtendsType) || visit(v, node.TrueType) || visit(v, node.FalseType)
}
func (node *ConditionalTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateConditionalTypeNode(node, v.visitNode(node.CheckType), v.visitNode(node.ExtendsType), v.visitNode(node.TrueType), v.visitNode(node.FalseType))
}
func (node *ConditionalTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewConditionalTypeNode(node.CheckType, node.ExtendsType, node.TrueType, node.FalseType), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsConditionalTypeNode(node *Node) bool {
return node.Kind == KindConditionalType
}
// TypeOperatorNode
type TypeOperatorNode struct {
TypeNodeBase
Operator Kind // KindKeyOfKeyword | KindUniqueKeyword | KindReadonlyKeyword
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewTypeOperatorNode(operator Kind, typeNode *TypeNode) *Node {
data := f.typeOperatorNodePool.New()
data.Operator = operator
data.Type = typeNode
return f.newNode(KindTypeOperator, data)
}
func (f *NodeFactory) UpdateTypeOperatorNode(node *TypeOperatorNode, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewTypeOperatorNode(node.Operator, typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypeOperatorNode) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *TypeOperatorNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypeOperatorNode(node, v.visitNode(node.Type))
}
func (node *TypeOperatorNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTypeOperatorNode(node.Operator, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsTypeOperatorNode(node *Node) bool {
return node.Kind == KindTypeOperator
}
// InferTypeNode
type InferTypeNode struct {
TypeNodeBase
TypeParameter *TypeParameterDeclarationNode // TypeParameterDeclarationNode
}
func (f *NodeFactory) NewInferTypeNode(typeParameter *TypeParameterDeclarationNode) *Node {
data := &InferTypeNode{}
data.TypeParameter = typeParameter
return f.newNode(KindInferType, data)
}
func (f *NodeFactory) UpdateInferTypeNode(node *InferTypeNode, typeParameter *TypeNode) *Node {
if typeParameter != node.TypeParameter {
return updateNode(f.NewInferTypeNode(typeParameter), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *InferTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.TypeParameter)
}
func (node *InferTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateInferTypeNode(node, v.visitNode(node.TypeParameter))
}
func (node *InferTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewInferTypeNode(node.TypeParameter), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsInferTypeNode(node *Node) bool {
return node.Kind == KindInferType
}
// ArrayTypeNode
type ArrayTypeNode struct {
TypeNodeBase
ElementType *TypeNode // TypeNode
}
func (f *NodeFactory) NewArrayTypeNode(elementType *TypeNode) *Node {
data := f.arrayTypeNodePool.New()
data.ElementType = elementType
return f.newNode(KindArrayType, data)
}
func (f *NodeFactory) UpdateArrayTypeNode(node *ArrayTypeNode, elementType *TypeNode) *Node {
if elementType != node.ElementType {
return updateNode(f.NewArrayTypeNode(elementType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ArrayTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.ElementType)
}
func (node *ArrayTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateArrayTypeNode(node, v.visitNode(node.ElementType))
}
func (node *ArrayTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewArrayTypeNode(node.ElementType), node.AsNode(), f.AsNodeFactory().hooks)
}
// IndexedAccessTypeNode
type IndexedAccessTypeNode struct {
TypeNodeBase
ObjectType *TypeNode // TypeNode
IndexType *TypeNode // TypeNode
}
func (f *NodeFactory) NewIndexedAccessTypeNode(objectType *TypeNode, indexType *TypeNode) *Node {
data := f.indexedAccessTypeNodePool.New()
data.ObjectType = objectType
data.IndexType = indexType
return f.newNode(KindIndexedAccessType, data)
}
func (f *NodeFactory) UpdateIndexedAccessTypeNode(node *IndexedAccessTypeNode, objectType *TypeNode, indexType *TypeNode) *Node {
if objectType != node.ObjectType || indexType != node.IndexType {
return updateNode(f.NewIndexedAccessTypeNode(objectType, indexType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *IndexedAccessTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.ObjectType) || visit(v, node.IndexType)
}
func (node *IndexedAccessTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateIndexedAccessTypeNode(node, v.visitNode(node.ObjectType), v.visitNode(node.IndexType))
}
func (node *IndexedAccessTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewIndexedAccessTypeNode(node.ObjectType, node.IndexType), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsIndexedAccessTypeNode(node *Node) bool {
return node.Kind == KindIndexedAccessType
}
// TypeReferenceNode
type TypeReferenceNode struct {
TypeNodeBase
TypeName *EntityName // EntityName
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
}
func (f *NodeFactory) NewTypeReferenceNode(typeName *EntityName, typeArguments *NodeList) *Node {
data := f.typeReferenceNodePool.New()
data.TypeName = typeName
data.TypeArguments = typeArguments
return f.newNode(KindTypeReference, data)
}
func (f *NodeFactory) UpdateTypeReferenceNode(node *TypeReferenceNode, typeName *EntityName, typeArguments *TypeArgumentList) *Node {
if typeName != node.TypeName || typeArguments != node.TypeArguments {
return updateNode(f.NewTypeReferenceNode(typeName, typeArguments), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypeReferenceNode) ForEachChild(v Visitor) bool {
return visit(v, node.TypeName) || visitNodeList(v, node.TypeArguments)
}
func (node *TypeReferenceNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypeReferenceNode(node, v.visitNode(node.TypeName), v.visitNodes(node.TypeArguments))
}
func (node *TypeReferenceNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTypeReferenceNode(node.TypeName, node.TypeArguments), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsTypeReferenceNode(node *Node) bool {
return node.Kind == KindTypeReference
}
// ExpressionWithTypeArguments
type ExpressionWithTypeArguments struct {
ExpressionBase
compositeNodeBase
Expression *Expression // Expression
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
}
func (f *NodeFactory) NewExpressionWithTypeArguments(expression *Expression, typeArguments *NodeList) *Node {
data := f.expressionWithTypeArgumentsPool.New()
data.Expression = expression
data.TypeArguments = typeArguments
return f.newNode(KindExpressionWithTypeArguments, data)
}
func (f *NodeFactory) UpdateExpressionWithTypeArguments(node *ExpressionWithTypeArguments, expression *Expression, typeArguments *TypeArgumentList) *Node {
if expression != node.Expression || typeArguments != node.TypeArguments {
return updateNode(f.NewExpressionWithTypeArguments(expression, typeArguments), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ExpressionWithTypeArguments) ForEachChild(v Visitor) bool {
return visit(v, node.Expression) || visitNodeList(v, node.TypeArguments)
}
func (node *ExpressionWithTypeArguments) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateExpressionWithTypeArguments(node, v.visitNode(node.Expression), v.visitNodes(node.TypeArguments))
}
func (node *ExpressionWithTypeArguments) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewExpressionWithTypeArguments(node.Expression, node.TypeArguments), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ExpressionWithTypeArguments) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeArguments)
}
func IsExpressionWithTypeArguments(node *Node) bool {
return node.Kind == KindExpressionWithTypeArguments
}
// LiteralTypeNode
type LiteralTypeNode struct {
TypeNodeBase
Literal *Node // KeywordExpression | LiteralExpression | PrefixUnaryExpression
}
func (f *NodeFactory) NewLiteralTypeNode(literal *Node) *Node {
data := f.literalTypeNodePool.New()
data.Literal = literal
return f.newNode(KindLiteralType, data)
}
func (f *NodeFactory) UpdateLiteralTypeNode(node *LiteralTypeNode, literal *Node) *Node {
if literal != node.Literal {
return updateNode(f.NewLiteralTypeNode(literal), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *LiteralTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.Literal)
}
func (node *LiteralTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateLiteralTypeNode(node, v.visitNode(node.Literal))
}
func (node *LiteralTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewLiteralTypeNode(node.Literal), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsLiteralTypeNode(node *Node) bool {
return node.Kind == KindLiteralType
}
// ThisTypeNode
type ThisTypeNode struct {
TypeNodeBase
}
func (f *NodeFactory) NewThisTypeNode() *Node {
return f.newNode(KindThisType, &ThisTypeNode{})
}
func (node *ThisTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewThisTypeNode(), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsThisTypeNode(node *Node) bool {
return node.Kind == KindThisType
}
// TypePredicateNode
type TypePredicateNode struct {
TypeNodeBase
AssertsModifier *TokenNode // TokenNode. Optional
ParameterName *TypePredicateParameterName // TypePredicateParameterName (Identifier | ThisTypeNode)
Type *TypeNode // TypeNode. Optional
}
func (f *NodeFactory) NewTypePredicateNode(assertsModifier *TokenNode, parameterName *TypePredicateParameterName, typeNode *TypeNode) *Node {
data := &TypePredicateNode{}
data.AssertsModifier = assertsModifier
data.ParameterName = parameterName
data.Type = typeNode
return f.newNode(KindTypePredicate, data)
}
func (f *NodeFactory) UpdateTypePredicateNode(node *TypePredicateNode, assertsModifier *TokenNode, parameterName *TypePredicateParameterName, typeNode *TypeNode) *Node {
if assertsModifier != node.AssertsModifier || parameterName != node.ParameterName || typeNode != node.Type {
return updateNode(f.NewTypePredicateNode(assertsModifier, parameterName, typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypePredicateNode) ForEachChild(v Visitor) bool {
return visit(v, node.AssertsModifier) || visit(v, node.ParameterName) || visit(v, node.Type)
}
func (node *TypePredicateNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypePredicateNode(node, v.visitNode(node.AssertsModifier), v.visitNode(node.ParameterName), v.visitNode(node.Type))
}
func (node *TypePredicateNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTypePredicateNode(node.AssertsModifier, node.ParameterName, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsTypePredicateNode(node *Node) bool {
return node.Kind == KindTypePredicate
}
// ImportTypeNode
type ImportTypeNode struct {
TypeNodeBase
IsTypeOf bool
Argument *TypeNode // TypeNode
Attributes *ImportAttributesNode // ImportAttributesNode. Optional
Qualifier *EntityName // EntityName. Optional
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
}
func (f *NodeFactory) NewImportTypeNode(isTypeOf bool, argument *TypeNode, attributes *ImportAttributesNode, qualifier *EntityName, typeArguments *NodeList) *Node {
data := &ImportTypeNode{}
data.IsTypeOf = isTypeOf
data.Argument = argument
data.Attributes = attributes
data.Qualifier = qualifier
data.TypeArguments = typeArguments
return f.newNode(KindImportType, data)
}
func (f *NodeFactory) UpdateImportTypeNode(node *ImportTypeNode, isTypeOf bool, argument *TypeNode, attributes *ImportAttributesNode, qualifier *EntityName, typeArguments *TypeArgumentList) *Node {
if isTypeOf != node.IsTypeOf || argument != node.Argument || attributes != node.Attributes || qualifier != node.Qualifier || typeArguments != node.TypeArguments {
return updateNode(f.NewImportTypeNode(isTypeOf, argument, attributes, qualifier, typeArguments), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ImportTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.Argument) || visit(v, node.Attributes) || visit(v, node.Qualifier) || visitNodeList(v, node.TypeArguments)
}
func (node *ImportTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateImportTypeNode(node, node.IsTypeOf, v.visitNode(node.Argument), v.visitNode(node.Attributes), v.visitNode(node.Qualifier), v.visitNodes(node.TypeArguments))
}
func (node *ImportTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewImportTypeNode(node.IsTypeOf, node.Argument, node.Attributes, node.Qualifier, node.TypeArguments), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsImportTypeNode(node *Node) bool {
return node.Kind == KindImportType
}
// ImportAttribute
type ImportAttribute struct {
NodeBase
compositeNodeBase
name *ImportAttributeName // ImportAttributeName
Value *Expression // Expression
}
func (f *NodeFactory) NewImportAttribute(name *ImportAttributeName, value *Expression) *Node {
data := &ImportAttribute{}
data.name = name
data.Value = value
return f.newNode(KindImportAttribute, data)
}
func (f *NodeFactory) UpdateImportAttribute(node *ImportAttribute, name *ImportAttributeName, value *Expression) *Node {
if name != node.name || value != node.Value {
return updateNode(f.NewImportAttribute(name, value), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ImportAttribute) ForEachChild(v Visitor) bool {
return visit(v, node.name) || visit(v, node.Value)
}
func (node *ImportAttribute) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateImportAttribute(node, v.visitNode(node.name), v.visitNode(node.Value))
}
func (node *ImportAttribute) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewImportAttribute(node.Name(), node.Value), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ImportAttribute) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name) |
propagateSubtreeFacts(node.Value)
}
func (node *ImportAttribute) Name() *ImportAttributeName {
return node.name
}
// ImportAttributes
type ImportAttributes struct {
NodeBase
compositeNodeBase
Token Kind
Attributes *NodeList // NodeList[*ImportAttributeNode]
MultiLine bool
}
func (f *NodeFactory) NewImportAttributes(token Kind, attributes *NodeList, multiLine bool) *Node {
data := &ImportAttributes{}
data.Token = token
data.Attributes = attributes
data.MultiLine = multiLine
return f.newNode(KindImportAttributes, data)
}
func (f *NodeFactory) UpdateImportAttributes(node *ImportAttributes, attributes *ImportAttributeList) *Node {
if attributes != node.Attributes {
return updateNode(f.NewImportAttributes(node.Token, attributes, node.MultiLine), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ImportAttributes) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Attributes)
}
func (node *ImportAttributes) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateImportAttributes(node, v.visitNodes(node.Attributes))
}
func (node *ImportAttributes) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewImportAttributes(node.Token, node.Attributes, node.MultiLine), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *ImportAttributes) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Attributes, propagateSubtreeFacts)
}
func IsImportAttributes(node *Node) bool {
return node.Kind == KindImportAttributes
}
func (node *ImportAttributesNode) GetResolutionModeOverride( /* !!! grammarErrorOnNode?: (node: Node, diagnostic: DiagnosticMessage) => void*/ ) (core.ResolutionMode, bool) {
if node == nil {
return core.ResolutionModeNone, false
}
attributes := node.AsImportAttributes().Attributes
if len(attributes.Nodes) != 1 {
// !!!
// grammarErrorOnNode?.(
// node,
// node.token === SyntaxKind.WithKeyword
// ? Diagnostics.Type_import_attributes_should_have_exactly_one_key_resolution_mode_with_value_import_or_require
// : Diagnostics.Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require,
// );
return core.ResolutionModeNone, false
}
elem := attributes.Nodes[0].AsImportAttribute()
if !IsStringLiteralLike(elem.Name()) {
return core.ResolutionModeNone, false
}
if elem.Name().Text() != "resolution-mode" {
// !!!
// grammarErrorOnNode?.(
// elem.name,
// node.token === SyntaxKind.WithKeyword
// ? Diagnostics.resolution_mode_is_the_only_valid_key_for_type_import_attributes
// : Diagnostics.resolution_mode_is_the_only_valid_key_for_type_import_assertions,
// );
return core.ResolutionModeNone, false
}
if !IsStringLiteralLike(elem.Value) {
return core.ResolutionModeNone, false
}
if elem.Value.Text() != "import" && elem.Value.Text() != "require" {
// !!!
// grammarErrorOnNode?.(elem.value, Diagnostics.resolution_mode_should_be_either_require_or_import);
return core.ResolutionModeNone, false
}
if elem.Value.Text() == "import" {
return core.ResolutionModeESM, true
} else {
return core.ModuleKindCommonJS, true
}
}
// TypeQueryNode
type TypeQueryNode struct {
TypeNodeBase
ExprName *EntityName // EntityName
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
}
func (f *NodeFactory) NewTypeQueryNode(exprName *EntityName, typeArguments *NodeList) *Node {
data := &TypeQueryNode{}
data.ExprName = exprName
data.TypeArguments = typeArguments
return f.newNode(KindTypeQuery, data)
}
func (f *NodeFactory) UpdateTypeQueryNode(node *TypeQueryNode, exprName *EntityName, typeArguments *TypeArgumentList) *Node {
if exprName != node.ExprName || typeArguments != node.TypeArguments {
return updateNode(f.NewTypeQueryNode(exprName, typeArguments), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypeQueryNode) ForEachChild(v Visitor) bool {
return visit(v, node.ExprName) || visitNodeList(v, node.TypeArguments)
}
func (node *TypeQueryNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypeQueryNode(node, v.visitNode(node.ExprName), v.visitNodes(node.TypeArguments))
}
func (node *TypeQueryNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTypeQueryNode(node.ExprName, node.TypeArguments), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsTypeQueryNode(node *Node) bool {
return node.Kind == KindTypeQuery
}
// MappedTypeNode
type MappedTypeNode struct {
TypeNodeBase
DeclarationBase
LocalsContainerBase
ReadonlyToken *TokenNode // TokenNode. Optional
TypeParameter *TypeParameterDeclarationNode // TypeParameterDeclarationNode
NameType *TypeNode // TypeNode. Optional
QuestionToken *TokenNode // TokenNode. Optional
Type *TypeNode // TypeNode. Optional (error if missing)
Members *NodeList // NodeList[*TypeElement]. Used only to produce grammar errors
}
func (f *NodeFactory) NewMappedTypeNode(readonlyToken *TokenNode, typeParameter *TypeParameterDeclarationNode, nameType *TypeNode, questionToken *TokenNode, typeNode *TypeNode, members *NodeList) *Node {
data := &MappedTypeNode{}
data.ReadonlyToken = readonlyToken
data.TypeParameter = typeParameter
data.NameType = nameType
data.QuestionToken = questionToken
data.Type = typeNode
data.Members = members
return f.newNode(KindMappedType, data)
}
func (f *NodeFactory) UpdateMappedTypeNode(node *MappedTypeNode, readonlyToken *TokenNode, typeParameter *TypeParameterDeclarationNode, nameType *TypeNode, questionToken *TokenNode, typeNode *TypeNode, members *TypeElementList) *Node {
if readonlyToken != node.ReadonlyToken || typeParameter != node.TypeParameter || nameType != node.NameType || questionToken != node.QuestionToken || typeNode != node.Type || members != node.Members {
return updateNode(f.NewMappedTypeNode(readonlyToken, typeParameter, nameType, questionToken, typeNode, members), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *MappedTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.ReadonlyToken) || visit(v, node.TypeParameter) || visit(v, node.NameType) ||
visit(v, node.QuestionToken) || visit(v, node.Type) || visitNodeList(v, node.Members)
}
func (node *MappedTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateMappedTypeNode(node, v.visitToken(node.ReadonlyToken), v.visitNode(node.TypeParameter), v.visitNode(node.NameType), v.visitToken(node.QuestionToken), v.visitNode(node.Type), v.visitNodes(node.Members))
}
func (node *MappedTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewMappedTypeNode(node.ReadonlyToken, node.TypeParameter, node.NameType, node.QuestionToken, node.Type, node.Members), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsMappedTypeNode(node *Node) bool {
return node.Kind == KindMappedType
}
// TypeLiteralNode
type TypeLiteralNode struct {
TypeNodeBase
DeclarationBase
Members *NodeList // NodeList[*TypeElement]
}
func (f *NodeFactory) NewTypeLiteralNode(members *NodeList) *Node {
data := f.typeLiteralNodePool.New()
data.Members = members
return f.newNode(KindTypeLiteral, data)
}
func (f *NodeFactory) UpdateTypeLiteralNode(node *TypeLiteralNode, members *TypeElementList) *Node {
if members != node.Members {
return updateNode(f.NewTypeLiteralNode(members), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TypeLiteralNode) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Members)
}
func (node *TypeLiteralNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTypeLiteralNode(node, v.visitNodes(node.Members))
}
func (node *TypeLiteralNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTypeLiteralNode(node.Members), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsTypeLiteralNode(node *Node) bool {
return node.Kind == KindTypeLiteral
}
// TupleTypeNode
type TupleTypeNode struct {
TypeNodeBase
Elements *NodeList // NodeList[*TypeNode]
}
func (f *NodeFactory) NewTupleTypeNode(elements *NodeList) *Node {
data := &TupleTypeNode{}
data.Elements = elements
return f.newNode(KindTupleType, data)
}
func (f *NodeFactory) UpdateTupleTypeNode(node *TupleTypeNode, elements *TypeList) *Node {
if elements != node.Elements {
return updateNode(f.NewTupleTypeNode(elements), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TupleTypeNode) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Elements)
}
func (node *TupleTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTupleTypeNode(node, v.visitNodes(node.Elements))
}
func (node *TupleTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTupleTypeNode(node.Elements), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsTupleTypeNode(node *Node) bool {
return node.Kind == KindTupleType
}
// NamedTupleTypeMember
type NamedTupleMember struct {
TypeNodeBase
DeclarationBase
DotDotDotToken *TokenNode // TokenNode
name *IdentifierNode // IdentifierNode
QuestionToken *TokenNode // TokenNode
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewNamedTupleMember(dotDotDotToken *TokenNode, name *IdentifierNode, questionToken *TokenNode, typeNode *TypeNode) *Node {
data := &NamedTupleMember{}
data.DotDotDotToken = dotDotDotToken
data.name = name
data.QuestionToken = questionToken
data.Type = typeNode
return f.newNode(KindNamedTupleMember, data)
}
func (f *NodeFactory) UpdateNamedTupleMember(node *NamedTupleMember, dotDotDotToken *TokenNode, name *IdentifierNode, questionToken *TokenNode, typeNode *TypeNode) *Node {
if dotDotDotToken != node.DotDotDotToken || name != node.name || questionToken != node.QuestionToken || typeNode != node.Type {
return updateNode(f.NewNamedTupleMember(dotDotDotToken, name, questionToken, typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *NamedTupleMember) ForEachChild(v Visitor) bool {
return visit(v, node.DotDotDotToken) || visit(v, node.name) || visit(v, node.QuestionToken) || visit(v, node.Type)
}
func (node *NamedTupleMember) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateNamedTupleMember(node, v.visitToken(node.DotDotDotToken), v.visitNode(node.name), v.visitToken(node.QuestionToken), v.visitNode(node.Type))
}
func (node *NamedTupleMember) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewNamedTupleMember(node.DotDotDotToken, node.Name(), node.QuestionToken, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *NamedTupleMember) Name() *DeclarationName {
return node.name
}
func IsNamedTupleMember(node *Node) bool {
return node.Kind == KindNamedTupleMember
}
// OptionalTypeNode
type OptionalTypeNode struct {
TypeNodeBase
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewOptionalTypeNode(typeNode *TypeNode) *Node {
data := &OptionalTypeNode{}
data.Type = typeNode
return f.newNode(KindOptionalType, data)
}
func (f *NodeFactory) UpdateOptionalTypeNode(node *OptionalTypeNode, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewOptionalTypeNode(typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *OptionalTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *OptionalTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateOptionalTypeNode(node, v.visitNode(node.Type))
}
func (node *OptionalTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewOptionalTypeNode(node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsOptionalTypeNode(node *Node) bool {
return node.Kind == KindOptionalType
}
// RestTypeNode
type RestTypeNode struct {
TypeNodeBase
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewRestTypeNode(typeNode *TypeNode) *Node {
data := &RestTypeNode{}
data.Type = typeNode
return f.newNode(KindRestType, data)
}
func (f *NodeFactory) UpdateRestTypeNode(node *RestTypeNode, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewRestTypeNode(typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *RestTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *RestTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateRestTypeNode(node, v.visitNode(node.Type))
}
func (node *RestTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewRestTypeNode(node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsRestTypeNode(node *Node) bool {
return node.Kind == KindRestType
}
// ParenthesizedTypeNode
type ParenthesizedTypeNode struct {
TypeNodeBase
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewParenthesizedTypeNode(typeNode *TypeNode) *Node {
data := f.parenthesizedTypeNodePool.New()
data.Type = typeNode
return f.newNode(KindParenthesizedType, data)
}
func (f *NodeFactory) UpdateParenthesizedTypeNode(node *ParenthesizedTypeNode, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewParenthesizedTypeNode(typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ParenthesizedTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *ParenthesizedTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateParenthesizedTypeNode(node, v.visitNode(node.Type))
}
func (node *ParenthesizedTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewParenthesizedTypeNode(node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsParenthesizedTypeNode(node *Node) bool {
return node.Kind == KindParenthesizedType
}
// FunctionOrConstructorTypeNodeBase
type FunctionOrConstructorTypeNodeBase struct {
TypeNodeBase
DeclarationBase
ModifiersBase
FunctionLikeBase
}
func (node *FunctionOrConstructorTypeNodeBase) ForEachChild(v Visitor) bool {
return visitModifiers(v, node.modifiers) || visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) || visit(v, node.Type)
}
// FunctionTypeNode
type FunctionTypeNode struct {
FunctionOrConstructorTypeNodeBase
}
func (f *NodeFactory) NewFunctionTypeNode(typeParameters *NodeList, parameters *NodeList, returnType *TypeNode) *Node {
data := f.functionTypeNodePool.New()
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
return f.newNode(KindFunctionType, data)
}
func (f *NodeFactory) UpdateFunctionTypeNode(node *FunctionTypeNode, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode) *Node {
if typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type {
return updateNode(f.NewFunctionTypeNode(typeParameters, parameters, returnType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *FunctionTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateFunctionTypeNode(node, v.visitNodes(node.TypeParameters), v.visitNodes(node.Parameters), v.visitNode(node.Type))
}
func (node *FunctionTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewFunctionTypeNode(node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsFunctionTypeNode(node *Node) bool {
return node.Kind == KindFunctionType
}
// ConstructorTypeNode
type ConstructorTypeNode struct {
FunctionOrConstructorTypeNodeBase
}
func (f *NodeFactory) NewConstructorTypeNode(modifiers *ModifierList, typeParameters *NodeList, parameters *NodeList, returnType *TypeNode) *Node {
data := &ConstructorTypeNode{}
data.modifiers = modifiers
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = returnType
return f.newNode(KindConstructorType, data)
}
func (f *NodeFactory) UpdateConstructorTypeNode(node *ConstructorTypeNode, modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, returnType *TypeNode) *Node {
if modifiers != node.modifiers || typeParameters != node.TypeParameters || parameters != node.Parameters || returnType != node.Type {
return updateNode(f.NewConstructorTypeNode(modifiers, typeParameters, parameters, returnType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *ConstructorTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateConstructorTypeNode(node, v.visitModifiers(node.modifiers), v.visitNodes(node.TypeParameters), v.visitNodes(node.Parameters), v.visitNode(node.Type))
}
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)
}
func IsConstructorTypeNode(node *Node) bool {
return node.Kind == KindConstructorType
}
// TemplateLiteralLikeBase
type TemplateLiteralLikeBase struct {
LiteralLikeBase
RawText string
TemplateFlags TokenFlags
}
func (node *TemplateLiteralLikeBase) LiteralLikeData() *LiteralLikeBase { return &node.LiteralLikeBase }
func (node *TemplateLiteralLikeBase) TemplateLiteralLikeData() *TemplateLiteralLikeBase { return node }
// TemplateHead
type TemplateHead struct {
NodeBase
TemplateLiteralLikeBase
}
func (f *NodeFactory) NewTemplateHead(text string, rawText string, templateFlags TokenFlags) *Node {
data := &TemplateHead{}
data.Text = text
data.RawText = rawText
data.TemplateFlags = templateFlags
f.textCount++
return f.newNode(KindTemplateHead, data)
}
func (node *TemplateHead) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTemplateHead(node.Text, node.RawText, node.TemplateFlags), node.AsNode(), f.AsNodeFactory().hooks)
}
// TemplateMiddle
type TemplateMiddle struct {
NodeBase
TemplateLiteralLikeBase
}
func (f *NodeFactory) NewTemplateMiddle(text string, rawText string, templateFlags TokenFlags) *Node {
data := &TemplateMiddle{}
data.Text = text
data.RawText = rawText
data.TemplateFlags = templateFlags
f.textCount++
return f.newNode(KindTemplateMiddle, data)
}
func (node *TemplateMiddle) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTemplateMiddle(node.Text, node.RawText, node.TemplateFlags), node.AsNode(), f.AsNodeFactory().hooks)
}
// TemplateTail
type TemplateTail struct {
NodeBase
TemplateLiteralLikeBase
}
func (f *NodeFactory) NewTemplateTail(text string, rawText string, templateFlags TokenFlags) *Node {
data := &TemplateTail{}
data.Text = text
data.RawText = rawText
data.TemplateFlags = templateFlags
f.textCount++
return f.newNode(KindTemplateTail, data)
}
func (node *TemplateTail) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTemplateTail(node.Text, node.RawText, node.TemplateFlags), node.AsNode(), f.AsNodeFactory().hooks)
}
// TemplateLiteralTypeNode
type TemplateLiteralTypeNode struct {
TypeNodeBase
Head *TemplateHeadNode // TemplateHeadNode
TemplateSpans *NodeList // NodeList[*TemplateLiteralTypeSpanNode]
}
func (f *NodeFactory) NewTemplateLiteralTypeNode(head *TemplateHeadNode, templateSpans *NodeList) *Node {
data := &TemplateLiteralTypeNode{}
data.Head = head
data.TemplateSpans = templateSpans
return f.newNode(KindTemplateLiteralType, data)
}
func (f *NodeFactory) UpdateTemplateLiteralTypeNode(node *TemplateLiteralTypeNode, head *TemplateHeadNode, templateSpans *TemplateLiteralTypeSpanList) *Node {
if head != node.Head || templateSpans != node.TemplateSpans {
return updateNode(f.NewTemplateLiteralTypeNode(head, templateSpans), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TemplateLiteralTypeNode) ForEachChild(v Visitor) bool {
return visit(v, node.Head) || visitNodeList(v, node.TemplateSpans)
}
func (node *TemplateLiteralTypeNode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTemplateLiteralTypeNode(node, v.visitNode(node.Head), v.visitNodes(node.TemplateSpans))
}
func (node *TemplateLiteralTypeNode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTemplateLiteralTypeNode(node.Head, node.TemplateSpans), node.AsNode(), f.AsNodeFactory().hooks)
}
// TemplateLiteralTypeSpan
type TemplateLiteralTypeSpan struct {
NodeBase
typeSyntaxBase
Type *TypeNode // TypeNode
Literal *TemplateMiddleOrTail // TemplateMiddleOrTail
}
func (f *NodeFactory) NewTemplateLiteralTypeSpan(typeNode *TypeNode, literal *TemplateMiddleOrTail) *Node {
data := &TemplateLiteralTypeSpan{}
data.Type = typeNode
data.Literal = literal
return f.newNode(KindTemplateLiteralTypeSpan, data)
}
func (f *NodeFactory) UpdateTemplateLiteralTypeSpan(node *TemplateLiteralTypeSpan, typeNode *TypeNode, literal *TemplateMiddleOrTail) *Node {
if typeNode != node.Type || literal != node.Literal {
return updateNode(f.NewTemplateLiteralTypeSpan(typeNode, literal), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *TemplateLiteralTypeSpan) ForEachChild(v Visitor) bool {
return visit(v, node.Type) || visit(v, node.Literal)
}
func (node *TemplateLiteralTypeSpan) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateTemplateLiteralTypeSpan(node, v.visitNode(node.Type), v.visitNode(node.Literal))
}
func (node *TemplateLiteralTypeSpan) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewTemplateLiteralTypeSpan(node.Type, node.Literal), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsTemplateLiteralTypeSpan(node *Node) bool {
return node.Kind == KindTemplateLiteralTypeSpan
}
// SyntheticExpression
type SyntheticExpression struct {
ExpressionBase
Type any
IsSpread bool
TupleNameSource *Node
}
func (f *NodeFactory) NewSyntheticExpression(t any, isSpread bool, tupleNameSource *Node) *Node {
data := &SyntheticExpression{}
data.Type = t
data.IsSpread = isSpread
data.TupleNameSource = tupleNameSource
return f.newNode(KindSyntheticExpression, data)
}
func (node *SyntheticExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewSyntheticExpression(node.Type, node.IsSpread, node.TupleNameSource), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsSyntheticExpression(node *Node) bool {
return node.Kind == KindSyntheticExpression
}
// PartiallyEmittedExpression
type PartiallyEmittedExpression struct {
ExpressionBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewPartiallyEmittedExpression(expression *Expression) *Node {
data := &PartiallyEmittedExpression{}
data.Expression = expression
return newNode(KindPartiallyEmittedExpression, data, f.hooks)
}
func (f *NodeFactory) UpdatePartiallyEmittedExpression(node *PartiallyEmittedExpression, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewPartiallyEmittedExpression(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *PartiallyEmittedExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *PartiallyEmittedExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdatePartiallyEmittedExpression(node, v.visitNode(node.Expression))
}
func (node *PartiallyEmittedExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewPartiallyEmittedExpression(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *PartiallyEmittedExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression)
}
func (node *PartiallyEmittedExpression) propagateSubtreeFacts() SubtreeFacts {
return node.SubtreeFacts() & ^SubtreeExclusionsOuterExpression
}
func IsPartiallyEmittedExpression(node *Node) bool {
return node.Kind == KindPartiallyEmittedExpression
}
/// A JSX expression of the form ...
type JsxElement struct {
ExpressionBase
compositeNodeBase
OpeningElement *JsxOpeningElementNode // JsxOpeningElementNode
Children *NodeList // NodeList[*JsxChild]
ClosingElement *JsxClosingElementNode // JsxClosingElementNode
}
func (f *NodeFactory) NewJsxElement(openingElement *JsxOpeningElementNode, children *NodeList, closingElement *JsxClosingElementNode) *Node {
data := &JsxElement{}
data.OpeningElement = openingElement
data.Children = children
data.ClosingElement = closingElement
return f.newNode(KindJsxElement, data)
}
func (f *NodeFactory) UpdateJsxElement(node *JsxElement, openingElement *JsxOpeningElementNode, children *JsxChildList, closingElement *JsxClosingElementNode) *Node {
if openingElement != node.OpeningElement || children != node.Children || closingElement != node.ClosingElement {
return updateNode(f.NewJsxElement(openingElement, children, closingElement), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxElement) ForEachChild(v Visitor) bool {
return visit(v, node.OpeningElement) || visitNodeList(v, node.Children) || visit(v, node.ClosingElement)
}
func (node *JsxElement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxElement(node, v.visitNode(node.OpeningElement), v.visitNodes(node.Children), v.visitNode(node.ClosingElement))
}
func (node *JsxElement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxElement(node.OpeningElement, node.Children, node.ClosingElement), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxElement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.OpeningElement) |
propagateNodeListSubtreeFacts(node.Children, propagateSubtreeFacts) |
propagateSubtreeFacts(node.ClosingElement) |
SubtreeContainsJsx
}
func IsJsxElement(node *Node) bool {
return node.Kind == KindJsxElement
}
// JsxAttributes
type JsxAttributes struct {
ExpressionBase
DeclarationBase
compositeNodeBase
Properties *NodeList // NodeList[*JsxAttributeLike]
}
func (f *NodeFactory) NewJsxAttributes(properties *NodeList) *Node {
data := &JsxAttributes{}
data.Properties = properties
return f.newNode(KindJsxAttributes, data)
}
func (f *NodeFactory) UpdateJsxAttributes(node *JsxAttributes, properties *JsxAttributeList) *Node {
if properties != node.Properties {
return updateNode(f.NewJsxAttributes(properties), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxAttributes) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Properties)
}
func (node *JsxAttributes) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxAttributes(node, v.visitNodes(node.Properties))
}
func (node *JsxAttributes) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxAttributes(node.Properties), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxAttributes) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Properties, propagateSubtreeFacts) |
SubtreeContainsJsx
}
func IsJsxAttributes(node *Node) bool {
return node.Kind == KindJsxAttributes
}
// JsxNamespacedName
type JsxNamespacedName struct {
ExpressionBase
compositeNodeBase
name *IdentifierNode // IdentifierNode
Namespace *IdentifierNode // IdentifierNode
}
func (f *NodeFactory) NewJsxNamespacedName(namespace *IdentifierNode, name *IdentifierNode) *Node {
data := &JsxNamespacedName{}
data.Namespace = namespace
data.name = name
return f.newNode(KindJsxNamespacedName, data)
}
func (f *NodeFactory) UpdateJsxNamespacedName(node *JsxNamespacedName, name *IdentifierNode, namespace *IdentifierNode) *Node {
if name != node.name || namespace != node.Namespace {
return updateNode(f.NewJsxNamespacedName(name, namespace), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxNamespacedName) ForEachChild(v Visitor) bool {
return visit(v, node.Namespace) || visit(v, node.name)
}
func (node *JsxNamespacedName) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxNamespacedName(node, v.visitNode(node.name), v.visitNode(node.Namespace))
}
func (node *JsxNamespacedName) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxNamespacedName(node.Name(), node.Namespace), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxNamespacedName) Name() *DeclarationName {
return node.name
}
func (node *JsxNamespacedName) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Namespace) |
propagateSubtreeFacts(node.name) |
SubtreeContainsJsx
}
func IsJsxNamespacedName(node *Node) bool {
return node.Kind == KindJsxNamespacedName
}
/// The opening element of a ... JsxElement
type JsxOpeningElement struct {
ExpressionBase
compositeNodeBase
TagName *JsxTagNameExpression // JsxTagNameExpression (Identifier | KeywordExpression | JsxTagNamePropertyAccess | JsxNamespacedName)
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
Attributes *JsxAttributesNode // JsxAttributesNode
}
func (f *NodeFactory) NewJsxOpeningElement(tagName *JsxTagNameExpression, typeArguments *NodeList, attributes *JsxAttributesNode) *Node {
data := &JsxOpeningElement{}
data.TagName = tagName
data.TypeArguments = typeArguments
data.Attributes = attributes
return f.newNode(KindJsxOpeningElement, data)
}
func (f *NodeFactory) UpdateJsxOpeningElement(node *JsxOpeningElement, tagName *JsxTagNameExpression, typeArguments *TypeArgumentList, attributes *JsxAttributesNode) *Node {
if tagName != node.TagName || typeArguments != node.TypeArguments || attributes != node.Attributes {
return updateNode(f.NewJsxOpeningElement(tagName, typeArguments, attributes), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxOpeningElement) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.TypeArguments) || visit(v, node.Attributes)
}
func (node *JsxOpeningElement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxOpeningElement(node, v.visitNode(node.TagName), v.visitNodes(node.TypeArguments), v.visitNode(node.Attributes))
}
func (node *JsxOpeningElement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxOpeningElement(node.TagName, node.TypeArguments, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxOpeningElement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.TagName) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeArguments) |
propagateSubtreeFacts(node.Attributes) |
SubtreeContainsJsx
}
func IsJsxOpeningElement(node *Node) bool {
return node.Kind == KindJsxOpeningElement
}
/// A JSX expression of the form
type JsxSelfClosingElement struct {
ExpressionBase
compositeNodeBase
TagName *JsxTagNameExpression // JsxTagNameExpression (IdentifierReference | KeywordExpression | JsxTagNamePropertyAccess | JsxNamespacedName)
TypeArguments *NodeList // NodeList[*TypeNode]. Optional
Attributes *JsxAttributesNode // JsxAttributesNode
}
func (f *NodeFactory) NewJsxSelfClosingElement(tagName *JsxTagNameExpression, typeArguments *NodeList, attributes *JsxAttributesNode) *Node {
data := &JsxSelfClosingElement{}
data.TagName = tagName
data.TypeArguments = typeArguments
data.Attributes = attributes
return f.newNode(KindJsxSelfClosingElement, data)
}
func (f *NodeFactory) UpdateJsxSelfClosingElement(node *JsxSelfClosingElement, tagName *JsxTagNameExpression, typeArguments *TypeArgumentList, attributes *JsxAttributesNode) *Node {
if tagName != node.TagName || typeArguments != node.TypeArguments || attributes != node.Attributes {
return updateNode(f.NewJsxSelfClosingElement(tagName, typeArguments, attributes), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxSelfClosingElement) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.TypeArguments) || visit(v, node.Attributes)
}
func (node *JsxSelfClosingElement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxSelfClosingElement(node, v.visitNode(node.TagName), v.visitNodes(node.TypeArguments), v.visitNode(node.Attributes))
}
func (node *JsxSelfClosingElement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxSelfClosingElement(node.TagName, node.TypeArguments, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxSelfClosingElement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.TagName) |
propagateEraseableSyntaxListSubtreeFacts(node.TypeArguments) |
propagateSubtreeFacts(node.Attributes) |
SubtreeContainsJsx
}
func IsJsxSelfClosingElement(node *Node) bool {
return node.Kind == KindJsxSelfClosingElement
}
/// A JSX expression of the form <>...>
type JsxFragment struct {
ExpressionBase
compositeNodeBase
OpeningFragment *JsxOpeningFragmentNode // JsxOpeningFragmentNode
Children *NodeList // NodeList[*JsxChild]
ClosingFragment *JsxClosingFragmentNode // JsxClosingFragmentNode
}
func (f *NodeFactory) NewJsxFragment(openingFragment *JsxOpeningFragmentNode, children *NodeList, closingFragment *JsxClosingFragmentNode) *Node {
data := &JsxFragment{}
data.OpeningFragment = openingFragment
data.Children = children
data.ClosingFragment = closingFragment
return f.newNode(KindJsxFragment, data)
}
func (f *NodeFactory) UpdateJsxFragment(node *JsxFragment, openingFragment *JsxOpeningFragmentNode, children *JsxChildList, closingFragment *JsxClosingFragmentNode) *Node {
if openingFragment != node.OpeningFragment || children != node.Children || closingFragment != node.ClosingFragment {
return updateNode(f.NewJsxFragment(openingFragment, children, closingFragment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxFragment) ForEachChild(v Visitor) bool {
return visit(v, node.OpeningFragment) || visitNodeList(v, node.Children) || visit(v, node.ClosingFragment)
}
func (node *JsxFragment) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxFragment(node, v.visitNode(node.OpeningFragment), v.visitNodes(node.Children), v.visitNode(node.ClosingFragment))
}
func (node *JsxFragment) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxFragment(node.OpeningFragment, node.Children, node.ClosingFragment), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxFragment) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Children, propagateSubtreeFacts) |
SubtreeContainsJsx
}
func IsJsxFragment(node *Node) bool {
return node.Kind == KindJsxFragment
}
/// The opening element of a <>...> JsxFragment
type JsxOpeningFragment struct {
ExpressionBase
}
func (f *NodeFactory) NewJsxOpeningFragment() *Node {
return f.newNode(KindJsxOpeningFragment, &JsxOpeningFragment{})
}
func (node *JsxOpeningFragment) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxOpeningFragment(), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxOpeningFragment) computeSubtreeFacts() SubtreeFacts {
return SubtreeContainsJsx
}
func IsJsxOpeningFragment(node *Node) bool {
return node.Kind == KindJsxOpeningFragment
}
/// The closing element of a <>...> JsxFragment
type JsxClosingFragment struct {
ExpressionBase
}
func (f *NodeFactory) NewJsxClosingFragment() *Node {
return f.newNode(KindJsxClosingFragment, &JsxClosingFragment{})
}
func (node *JsxClosingFragment) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxClosingFragment(), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxClosingFragment) computeSubtreeFacts() SubtreeFacts {
return SubtreeContainsJsx
}
// JsxAttribute
type JsxAttribute struct {
NodeBase
DeclarationBase
compositeNodeBase
name *JsxAttributeName // JsxAttributeName
Initializer *JsxAttributeValue // JsxAttributeValue. Optional, is sugar for
}
func (f *NodeFactory) NewJsxAttribute(name *JsxAttributeName, initializer *JsxAttributeValue) *Node {
data := &JsxAttribute{}
data.name = name
data.Initializer = initializer
return f.newNode(KindJsxAttribute, data)
}
func (f *NodeFactory) UpdateJsxAttribute(node *JsxAttribute, name *JsxAttributeName, initializer *JsxAttributeValue) *Node {
if name != node.name || initializer != node.Initializer {
return updateNode(f.NewJsxAttribute(name, initializer), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxAttribute) ForEachChild(v Visitor) bool {
return visit(v, node.name) || visit(v, node.Initializer)
}
func (node *JsxAttribute) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxAttribute(node, v.visitNode(node.name), v.visitNode(node.Initializer))
}
func (node *JsxAttribute) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxAttribute(node.Name(), node.Initializer), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxAttribute) Name() *JsxAttributeName {
return node.name
}
func (node *JsxAttribute) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.name) |
propagateSubtreeFacts(node.Initializer) |
SubtreeContainsJsx
}
func IsJsxAttribute(node *Node) bool {
return node.Kind == KindJsxAttribute
}
// JsxSpreadAttribute
type JsxSpreadAttribute struct {
NodeBase
Expression *Expression // Expression
}
func (f *NodeFactory) NewJsxSpreadAttribute(expression *Expression) *Node {
data := &JsxSpreadAttribute{}
data.Expression = expression
return f.newNode(KindJsxSpreadAttribute, data)
}
func (f *NodeFactory) UpdateJsxSpreadAttribute(node *JsxSpreadAttribute, expression *Expression) *Node {
if expression != node.Expression {
return updateNode(f.NewJsxSpreadAttribute(expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxSpreadAttribute) ForEachChild(v Visitor) bool {
return visit(v, node.Expression)
}
func (node *JsxSpreadAttribute) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxSpreadAttribute(node, v.visitNode(node.Expression))
}
func (node *JsxSpreadAttribute) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxSpreadAttribute(node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxSpreadAttribute) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsJsx
}
func IsJsxSpreadAttribute(node *Node) bool {
return node.Kind == KindJsxSpreadAttribute
}
// JsxClosingElement
type JsxClosingElement struct {
NodeBase
TagName *JsxTagNameExpression // JsxTagNameExpression
}
func (f *NodeFactory) NewJsxClosingElement(tagName *JsxTagNameExpression) *Node {
data := &JsxClosingElement{}
data.TagName = tagName
return f.newNode(KindJsxClosingElement, data)
}
func (f *NodeFactory) UpdateJsxClosingElement(node *JsxClosingElement, tagName *JsxTagNameExpression) *Node {
if tagName != node.TagName {
return updateNode(f.NewJsxClosingElement(tagName), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxClosingElement) ForEachChild(v Visitor) bool {
return visit(v, node.TagName)
}
func (node *JsxClosingElement) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxClosingElement(node, v.visitNode(node.TagName))
}
func (node *JsxClosingElement) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxClosingElement(node.TagName), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxClosingElement) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.TagName) | SubtreeContainsJsx
}
func IsJsxClosingElement(node *Node) bool {
return node.Kind == KindJsxClosingElement
}
// JsxExpression
type JsxExpression struct {
ExpressionBase
DotDotDotToken *TokenNode // TokenNode. Optional
Expression *Expression // Expression
}
func (f *NodeFactory) NewJsxExpression(dotDotDotToken *TokenNode, expression *Expression) *Node {
data := &JsxExpression{}
data.DotDotDotToken = dotDotDotToken
data.Expression = expression
return f.newNode(KindJsxExpression, data)
}
func (f *NodeFactory) UpdateJsxExpression(node *JsxExpression, dotDotDotToken *TokenNode, expression *Expression) *Node {
if dotDotDotToken != node.DotDotDotToken || expression != node.Expression {
return updateNode(f.NewJsxExpression(dotDotDotToken, expression), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JsxExpression) ForEachChild(v Visitor) bool {
return visit(v, node.DotDotDotToken) || visit(v, node.Expression)
}
func (node *JsxExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJsxExpression(node, v.visitToken(node.DotDotDotToken), v.visitNode(node.Expression))
}
func (node *JsxExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxExpression(node.DotDotDotToken, node.Expression), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxExpression) computeSubtreeFacts() SubtreeFacts {
return propagateSubtreeFacts(node.Expression) | SubtreeContainsJsx
}
func IsJsxExpression(node *Node) bool {
return node.Kind == KindJsxExpression
}
// JsxText
type JsxText struct {
ExpressionBase
LiteralLikeBase
ContainsOnlyTriviaWhiteSpaces bool
}
func (f *NodeFactory) NewJsxText(text string, containsOnlyTriviaWhiteSpace bool) *Node {
data := &JsxText{}
data.Text = text
data.ContainsOnlyTriviaWhiteSpaces = containsOnlyTriviaWhiteSpace
f.textCount++
return f.newNode(KindJsxText, data)
}
func (node *JsxText) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJsxText(node.Text, node.ContainsOnlyTriviaWhiteSpaces), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JsxText) computeSubtreeFacts() SubtreeFacts {
return SubtreeContainsJsx
}
func IsJsxText(node *Node) bool {
return node.Kind == KindJsxText
}
// SyntaxList
type SyntaxList struct {
NodeBase
Children []*Node
}
func (f *NodeFactory) NewSyntaxList(children []*Node) *Node {
data := &SyntaxList{}
data.Children = children
return f.newNode(KindSyntaxList, data)
}
func (node *SyntaxList) ForEachChild(v Visitor) bool {
return visitNodes(v, node.Children)
}
func (node *SyntaxList) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewSyntaxList(node.Children), node.AsNode(), f.AsNodeFactory().hooks)
}
/// JSDoc ///
type JSDoc struct {
NodeBase
Comment *NodeList // NodeList[*JSDocCommentBase]
Tags *NodeList // NodeList[*JSDocTagBase]
}
func (f *NodeFactory) NewJSDoc(comment *NodeList, tags *NodeList) *Node {
data := f.jsdocPool.New()
data.Comment = comment
data.Tags = tags
return f.newNode(KindJSDoc, data)
}
func (f *NodeFactory) UpdateJSDoc(node *JSDoc, comment *NodeList, tags *NodeList) *Node {
if comment != node.Comment || tags != node.Tags {
return updateNode(f.NewJSDoc(comment, tags), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDoc) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Comment) || visitNodeList(v, node.Tags)
}
func (node *JSDoc) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDoc(node, v.visitNodes(node.Comment), v.visitNodes(node.Tags))
}
func (node *JSDoc) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDoc(node.Comment, node.Tags), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *Node) IsJSDoc() bool {
return node.Kind == KindJSDoc
}
type JSDocTagBase struct {
NodeBase
TagName *IdentifierNode
Comment *NodeList
}
type JSDocCommentBase struct {
NodeBase
text []string
}
// JSDoc comments
type JSDocText struct {
JSDocCommentBase
}
func (f *NodeFactory) NewJSDocText(text []string) *Node {
data := f.jsdocTextPool.New()
data.text = text
f.textCount++
return f.newNode(KindJSDocText, data)
}
func (node *JSDocText) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocText(node.text), node.AsNode(), f.AsNodeFactory().hooks)
}
type JSDocLink struct {
JSDocCommentBase
name *Node // optional (should only be EntityName)
}
func (f *NodeFactory) NewJSDocLink(name *Node, text []string) *Node {
data := &JSDocLink{}
data.name = name
data.text = text
f.textCount++
return f.newNode(KindJSDocLink, data)
}
func (f *NodeFactory) UpdateJSDocLink(node *JSDocLink, name *Node, text []string) *Node {
if name != node.name || !core.Same(text, node.text) {
return updateNode(f.NewJSDocLink(name, text), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocLink) ForEachChild(v Visitor) bool {
return visit(v, node.name)
}
func (node *JSDocLink) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocLink(node, v.visitNode(node.name), node.text)
}
func (node *JSDocLink) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocLink(node.Name(), node.text), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JSDocLink) Name() *DeclarationName {
return node.name
}
type JSDocLinkPlain struct {
JSDocCommentBase
name *Node // optional (should only be EntityName)
}
func (f *NodeFactory) NewJSDocLinkPlain(name *Node, text []string) *Node {
data := &JSDocLinkPlain{}
data.name = name
data.text = text
f.textCount++
return f.newNode(KindJSDocLinkPlain, data)
}
func (f *NodeFactory) UpdateJSDocLinkPlain(node *JSDocLinkPlain, name *Node, text []string) *Node {
if name != node.name || !core.Same(text, node.text) {
return updateNode(f.NewJSDocLinkPlain(name, text), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocLinkPlain) ForEachChild(v Visitor) bool {
return visit(v, node.name)
}
func (node *JSDocLinkPlain) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocLinkPlain(node, v.visitNode(node.name), node.text)
}
func (node *JSDocLinkPlain) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocLinkPlain(node.Name(), node.text), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JSDocLinkPlain) Name() *DeclarationName {
return node.name
}
type JSDocLinkCode struct {
JSDocCommentBase
name *Node // optional (should only be EntityName)
}
func (f *NodeFactory) NewJSDocLinkCode(name *Node, text []string) *Node {
data := &JSDocLinkCode{}
data.name = name
data.text = text
f.textCount++
return f.newNode(KindJSDocLinkCode, data)
}
func (f *NodeFactory) UpdateJSDocLinkCode(node *JSDocLinkCode, name *Node, text []string) *Node {
if name != node.name || !core.Same(text, node.text) {
return updateNode(f.NewJSDocLinkCode(name, text), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocLinkCode) ForEachChild(v Visitor) bool {
return visit(v, node.name)
}
func (node *JSDocLinkCode) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocLinkCode(node, v.visitNode(node.name), node.text)
}
func (node *JSDocLinkCode) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocLinkCode(node.Name(), node.text), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JSDocLinkCode) Name() *DeclarationName {
return node.name
}
// JSDocTypeExpression
type JSDocTypeExpression struct {
TypeNodeBase
Type *TypeNode
}
func (f *NodeFactory) NewJSDocTypeExpression(typeNode *TypeNode) *Node {
data := &JSDocTypeExpression{}
data.Type = typeNode
return f.newNode(KindJSDocTypeExpression, data)
}
func (f *NodeFactory) UpdateJSDocTypeExpression(node *JSDocTypeExpression, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewJSDocTypeExpression(typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocTypeExpression) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *JSDocTypeExpression) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocTypeExpression(node, v.visitNode(node.Type))
}
func (node *JSDocTypeExpression) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocTypeExpression(node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocNonNullableType
type JSDocNonNullableType struct {
TypeNodeBase
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewJSDocNonNullableType(typeNode *TypeNode) *Node {
data := &JSDocNonNullableType{}
data.Type = typeNode
return f.newNode(KindJSDocNonNullableType, data)
}
func (f *NodeFactory) UpdateJSDocNonNullableType(node *JSDocNonNullableType, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewJSDocNonNullableType(typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocNonNullableType) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *JSDocNonNullableType) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocNonNullableType(node, v.visitNode(node.Type))
}
func (node *JSDocNonNullableType) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocNonNullableType(node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocNonNullableType(node *Node) bool {
return node.Kind == KindJSDocNonNullableType
}
// JSDocNullableType
type JSDocNullableType struct {
TypeNodeBase
Type *TypeNode // TypeNode
}
func (f *NodeFactory) NewJSDocNullableType(typeNode *TypeNode) *Node {
data := &JSDocNullableType{}
data.Type = typeNode
return f.newNode(KindJSDocNullableType, data)
}
func (f *NodeFactory) UpdateJSDocNullableType(node *JSDocNullableType, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewJSDocNullableType(typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocNullableType) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *JSDocNullableType) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocNullableType(node, v.visitNode(node.Type))
}
func (node *JSDocNullableType) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocNullableType(node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocNullableType(node *Node) bool {
return node.Kind == KindJSDocNullableType
}
// JSDocAllType
type JSDocAllType struct {
TypeNodeBase
}
func (f *NodeFactory) NewJSDocAllType() *Node {
data := &JSDocAllType{}
return f.newNode(KindJSDocAllType, data)
}
func (node *JSDocAllType) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocAllType(), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocVariadicType
type JSDocVariadicType struct {
TypeNodeBase
Type *TypeNode
}
func (f *NodeFactory) NewJSDocVariadicType(typeNode *TypeNode) *Node {
data := &JSDocVariadicType{}
data.Type = typeNode
return f.newNode(KindJSDocVariadicType, data)
}
func (f *NodeFactory) UpdateJSDocVariadicType(node *JSDocVariadicType, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewJSDocVariadicType(typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocVariadicType) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *JSDocVariadicType) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocVariadicType(node, v.visitNode(node.Type))
}
func (node *JSDocVariadicType) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocVariadicType(node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocOptionalType
type JSDocOptionalType struct {
TypeNodeBase
Type *TypeNode
}
func (f *NodeFactory) NewJSDocOptionalType(typeNode *TypeNode) *Node {
data := &JSDocOptionalType{}
data.Type = typeNode
return f.newNode(KindJSDocOptionalType, data)
}
func (f *NodeFactory) UpdateJSDocOptionalType(node *JSDocOptionalType, typeNode *TypeNode) *Node {
if typeNode != node.Type {
return updateNode(f.NewJSDocOptionalType(typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocOptionalType) ForEachChild(v Visitor) bool {
return visit(v, node.Type)
}
func (node *JSDocOptionalType) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocOptionalType(node, v.visitNode(node.Type))
}
func (node *JSDocOptionalType) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocOptionalType(node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocTypeTag
type JSDocTypeTag struct {
JSDocTagBase
TypeExpression *TypeNode
}
func (f *NodeFactory) NewJSDocTypeTag(tagName *IdentifierNode, typeExpression *Node, comment *NodeList) *Node {
data := &JSDocTypeTag{}
data.TagName = tagName
data.TypeExpression = typeExpression
data.Comment = comment
return f.newNode(KindJSDocTypeTag, data)
}
func (f *NodeFactory) UpdateJSDocTypeTag(node *JSDocTypeTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
if tagName != node.TagName || typeExpression != node.TypeExpression || comment != node.Comment {
return updateNode(f.NewJSDocTypeTag(tagName, typeExpression, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocTypeTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment)
}
func (node *JSDocTypeTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocTypeTag(node, v.visitNode(node.TagName), v.visitNode(node.TypeExpression), v.visitNodes(node.Comment))
}
func (node *JSDocTypeTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocTypeTag(node.TagName, node.TypeExpression, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocTypeTag(node *Node) bool {
return node.Kind == KindJSDocTypeTag
}
// JSDocUnknownTag
type JSDocUnknownTag struct {
JSDocTagBase
}
func (f *NodeFactory) NewJSDocUnknownTag(tagName *IdentifierNode, comment *NodeList) *Node {
data := f.jsdocUnknownTagPool.New()
data.TagName = tagName
data.Comment = comment
return f.newNode(KindJSDocTag, data)
}
func (f *NodeFactory) UpdateJSDocUnknownTag(node *JSDocUnknownTag, tagName *IdentifierNode, comment *NodeList) *Node {
if tagName != node.TagName || comment != node.Comment {
return updateNode(f.NewJSDocUnknownTag(tagName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocUnknownTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.Comment)
}
func (node *JSDocUnknownTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocUnknownTag(node, v.visitNode(node.TagName), v.visitNodes(node.Comment))
}
func (node *JSDocUnknownTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocUnknownTag(node.TagName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocUnknownTag(node *Node) bool {
return node.Kind == KindJSDocTag
}
// JSDocTemplateTag
type JSDocTemplateTag struct {
JSDocTagBase
Constraint *Node
TypeParameters *TypeParameterList
}
func (f *NodeFactory) NewJSDocTemplateTag(tagName *IdentifierNode, constraint *Node, typeParameters *TypeParameterList, comment *NodeList) *Node {
data := &JSDocTemplateTag{}
data.TagName = tagName
data.Constraint = constraint
data.TypeParameters = typeParameters
data.Comment = comment
return f.newNode(KindJSDocTemplateTag, data)
}
func (f *NodeFactory) UpdateJSDocTemplateTag(node *JSDocTemplateTag, tagName *IdentifierNode, constraint *Node, typeParameters *TypeParameterList, comment *NodeList) *Node {
if tagName != node.TagName || constraint != node.Constraint || typeParameters != node.TypeParameters || comment != node.Comment {
return updateNode(f.NewJSDocTemplateTag(tagName, constraint, typeParameters, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocTemplateTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.Constraint) || visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Comment)
}
func (node *JSDocTemplateTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocTemplateTag(node, v.visitNode(node.TagName), v.visitNode(node.Constraint), v.visitNodes(node.TypeParameters), v.visitNodes(node.Comment))
}
func (node *JSDocTemplateTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocTemplateTag(node.TagName, node.Constraint, node.TypeParameters, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocTemplateTag(n *Node) bool {
return n.Kind == KindJSDocTemplateTag
}
// JSDocParameterOrPropertyTag
type JSDocParameterOrPropertyTag struct {
JSDocTagBase
name *EntityName
IsBracketed bool
TypeExpression *TypeNode
IsNameFirst bool
}
type (
JSDocParameterTag = JSDocParameterOrPropertyTag
JSDocPropertyTag = JSDocParameterOrPropertyTag
)
func (f *NodeFactory) newJSDocParameterOrPropertyTag(kind Kind, tagName *IdentifierNode, name *EntityName, isBracketed bool, typeExpression *TypeNode, isNameFirst bool, comment *NodeList) *Node {
data := f.jsdocParameterOrPropertyTagPool.New()
data.TagName = tagName
data.name = name
data.IsBracketed = isBracketed
data.TypeExpression = typeExpression
data.IsNameFirst = isNameFirst
data.Comment = comment
return f.newNode(kind, data)
}
func (f *NodeFactory) NewJSDocParameterTag(tagName *IdentifierNode, name *EntityName, isBracketed bool, typeExpression *TypeNode, isNameFirst bool, comment *NodeList) *Node {
return f.newJSDocParameterOrPropertyTag(KindJSDocParameterTag, tagName, name, isBracketed, typeExpression, isNameFirst, comment)
}
func (f *NodeFactory) NewJSDocPropertyTag(tagName *IdentifierNode, name *EntityName, isBracketed bool, typeExpression *TypeNode, isNameFirst bool, comment *NodeList) *Node {
return f.newJSDocParameterOrPropertyTag(KindJSDocPropertyTag, tagName, name, isBracketed, typeExpression, isNameFirst, comment)
}
func (f *NodeFactory) UpdateJSDocParameterOrPropertyTag(kind Kind, 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(kind, tagName, name, isBracketed, typeExpression, isNameFirst, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocParameterOrPropertyTag) ForEachChild(v Visitor) bool {
if node.IsNameFirst {
return visit(v, node.TagName) || visit(v, node.name) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment)
} else {
return visit(v, node.TagName) || visit(v, node.TypeExpression) || visit(v, node.name) || visitNodeList(v, node.Comment)
}
}
func (node *JSDocParameterOrPropertyTag) VisitEachChild(v *NodeVisitor) *Node {
tagName := v.visitNode(node.TagName)
var name, typeExpression *Node
if node.IsNameFirst {
name, typeExpression = v.visitNode(node.name), v.visitNode(node.TypeExpression)
} else {
typeExpression, name = v.visitNode(node.TypeExpression), v.visitNode(node.name)
}
return v.Factory.UpdateJSDocParameterOrPropertyTag(node.Kind, node, tagName, name, node.IsBracketed, typeExpression, node.IsNameFirst, v.visitNodes(node.Comment))
}
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)
}
func (node *JSDocParameterOrPropertyTag) Name() *EntityName { return node.name }
func IsJSDocParameterTag(node *Node) bool {
return node.Kind == KindJSDocParameterTag
}
func IsJSDocPropertyTag(node *Node) bool {
return node.Kind == KindJSDocPropertyTag
}
// JSDocReturnTag
type JSDocReturnTag struct {
JSDocTagBase
TypeExpression *TypeNode
}
func (f *NodeFactory) NewJSDocReturnTag(tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
data := &JSDocReturnTag{}
data.TagName = tagName
data.TypeExpression = typeExpression
data.Comment = comment
return f.newNode(KindJSDocReturnTag, data)
}
func (f *NodeFactory) UpdateJSDocReturnTag(node *JSDocReturnTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
if tagName != node.TagName || typeExpression != node.TypeExpression || comment != node.Comment {
return updateNode(f.NewJSDocReturnTag(tagName, typeExpression, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocReturnTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment)
}
func (node *JSDocReturnTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocReturnTag(node, v.visitNode(node.TagName), v.visitNode(node.TypeExpression), v.visitNodes(node.Comment))
}
func (node *JSDocReturnTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocReturnTag(node.TagName, node.TypeExpression, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocReturnTag(node *Node) bool {
return node.Kind == KindJSDocReturnTag
}
// JSDocPublicTag
type JSDocPublicTag struct {
JSDocTagBase
}
func (f *NodeFactory) NewJSDocPublicTag(tagName *IdentifierNode, comment *NodeList) *Node {
data := &JSDocPublicTag{}
data.TagName = tagName
data.Comment = comment
return f.newNode(KindJSDocPublicTag, data)
}
func (f *NodeFactory) UpdateJSDocPublicTag(node *JSDocPublicTag, tagName *IdentifierNode, comment *NodeList) *Node {
if tagName != node.TagName || comment != node.Comment {
return updateNode(f.NewJSDocPublicTag(tagName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocPublicTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.Comment)
}
func (node *JSDocPublicTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocPublicTag(node, v.visitNode(node.TagName), v.visitNodes(node.Comment))
}
func (node *JSDocPublicTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocPublicTag(node.TagName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocPrivateTag
type JSDocPrivateTag struct {
JSDocTagBase
}
func (f *NodeFactory) NewJSDocPrivateTag(tagName *IdentifierNode, comment *NodeList) *Node {
data := &JSDocPrivateTag{}
data.TagName = tagName
data.Comment = comment
return f.newNode(KindJSDocPrivateTag, data)
}
func (f *NodeFactory) UpdateJSDocPrivateTag(node *JSDocPrivateTag, tagName *IdentifierNode, comment *NodeList) *Node {
if tagName != node.TagName || comment != node.Comment {
return updateNode(f.NewJSDocPrivateTag(tagName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocPrivateTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.Comment)
}
func (node *JSDocPrivateTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocPrivateTag(node, v.visitNode(node.TagName), v.visitNodes(node.Comment))
}
func (node *JSDocPrivateTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocPrivateTag(node.TagName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocProtectedTag
type JSDocProtectedTag struct {
JSDocTagBase
}
func (f *NodeFactory) NewJSDocProtectedTag(tagName *IdentifierNode, comment *NodeList) *Node {
data := &JSDocProtectedTag{}
data.TagName = tagName
data.Comment = comment
return f.newNode(KindJSDocProtectedTag, data)
}
func (f *NodeFactory) UpdateJSDocProtectedTag(node *JSDocProtectedTag, tagName *IdentifierNode, comment *NodeList) *Node {
if tagName != node.TagName || comment != node.Comment {
return updateNode(f.NewJSDocProtectedTag(tagName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocProtectedTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.Comment)
}
func (node *JSDocProtectedTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocProtectedTag(node, v.visitNode(node.TagName), v.visitNodes(node.Comment))
}
func (node *JSDocProtectedTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocProtectedTag(node.TagName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocReadonlyTag
type JSDocReadonlyTag struct {
JSDocTagBase
}
func (f *NodeFactory) NewJSDocReadonlyTag(tagName *IdentifierNode, comment *NodeList) *Node {
data := &JSDocReadonlyTag{}
data.TagName = tagName
data.Comment = comment
return f.newNode(KindJSDocReadonlyTag, data)
}
func (f *NodeFactory) UpdateJSDocReadonlyTag(node *JSDocReadonlyTag, tagName *IdentifierNode, comment *NodeList) *Node {
if tagName != node.TagName || comment != node.Comment {
return updateNode(f.NewJSDocReadonlyTag(tagName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocReadonlyTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.Comment)
}
func (node *JSDocReadonlyTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocReadonlyTag(node, v.visitNode(node.TagName), v.visitNodes(node.Comment))
}
func (node *JSDocReadonlyTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocReadonlyTag(node.TagName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocOverrideTag
type JSDocOverrideTag struct {
JSDocTagBase
}
func (f *NodeFactory) NewJSDocOverrideTag(tagName *IdentifierNode, comment *NodeList) *Node {
data := &JSDocOverrideTag{}
data.TagName = tagName
data.Comment = comment
return f.newNode(KindJSDocOverrideTag, data)
}
func (f *NodeFactory) UpdateJSDocOverrideTag(node *JSDocOverrideTag, tagName *IdentifierNode, comment *NodeList) *Node {
if tagName != node.TagName || comment != node.Comment {
return updateNode(f.NewJSDocOverrideTag(tagName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocOverrideTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.Comment)
}
func (node *JSDocOverrideTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocOverrideTag(node, v.visitNode(node.TagName), v.visitNodes(node.Comment))
}
func (node *JSDocOverrideTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocOverrideTag(node.TagName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocDeprecatedTag
type JSDocDeprecatedTag struct {
JSDocTagBase
}
func (f *NodeFactory) NewJSDocDeprecatedTag(tagName *IdentifierNode, comment *NodeList) *Node {
data := f.jsdocDeprecatedTagPool.New()
data.TagName = tagName
data.Comment = comment
return f.newNode(KindJSDocDeprecatedTag, data)
}
func (f *NodeFactory) UpdateJSDocDeprecatedTag(node *JSDocDeprecatedTag, tagName *IdentifierNode, comment *NodeList) *Node {
if tagName != node.TagName || comment != node.Comment {
return updateNode(f.NewJSDocDeprecatedTag(tagName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocDeprecatedTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visitNodeList(v, node.Comment)
}
func (node *JSDocDeprecatedTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocDeprecatedTag(node, v.visitNode(node.TagName), v.visitNodes(node.Comment))
}
func (node *JSDocDeprecatedTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocDeprecatedTag(node.TagName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocDeprecatedTag(node *Node) bool {
return node.Kind == KindJSDocDeprecatedTag
}
// JSDocSeeTag
type JSDocSeeTag struct {
JSDocTagBase
NameExpression *TypeNode
}
func (f *NodeFactory) NewJSDocSeeTag(tagName *IdentifierNode, nameExpression *TypeNode, comment *NodeList) *Node {
data := &JSDocSeeTag{}
data.TagName = tagName
data.NameExpression = nameExpression
data.Comment = comment
return f.newNode(KindJSDocSeeTag, data)
}
func (f *NodeFactory) UpdateJSDocSeeTag(node *JSDocSeeTag, tagName *IdentifierNode, nameExpression *TypeNode, comment *NodeList) *Node {
if tagName != node.TagName || nameExpression != node.NameExpression || comment != node.Comment {
return updateNode(f.NewJSDocSeeTag(tagName, nameExpression, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocSeeTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.NameExpression) || visitNodeList(v, node.Comment)
}
func (node *JSDocSeeTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocSeeTag(node, v.visitNode(node.TagName), v.visitNode(node.NameExpression), v.visitNodes(node.Comment))
}
func (node *JSDocSeeTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocSeeTag(node.TagName, node.NameExpression, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocImplementsTag
type JSDocImplementsTag struct {
JSDocTagBase
ClassName *Expression
}
func (f *NodeFactory) NewJSDocImplementsTag(tagName *IdentifierNode, className *Expression, comment *NodeList) *Node {
data := &JSDocImplementsTag{}
data.TagName = tagName
data.ClassName = className
data.Comment = comment
return f.newNode(KindJSDocImplementsTag, data)
}
func (f *NodeFactory) UpdateJSDocImplementsTag(node *JSDocImplementsTag, tagName *IdentifierNode, className *Expression, comment *NodeList) *Node {
if tagName != node.TagName || className != node.ClassName || comment != node.Comment {
return updateNode(f.NewJSDocImplementsTag(tagName, className, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocImplementsTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.ClassName) || visitNodeList(v, node.Comment)
}
func (node *JSDocImplementsTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocImplementsTag(node, v.visitNode(node.TagName), v.visitNode(node.ClassName), v.visitNodes(node.Comment))
}
func (node *JSDocImplementsTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocImplementsTag(node.TagName, node.ClassName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocImplementsTag(node *Node) bool {
return node.Kind == KindJSDocImplementsTag
}
// JSDocAugmentsTag
type JSDocAugmentsTag struct {
JSDocTagBase
ClassName *Expression
}
func (f *NodeFactory) NewJSDocAugmentsTag(tagName *IdentifierNode, className *Expression, comment *NodeList) *Node {
data := &JSDocAugmentsTag{}
data.TagName = tagName
data.ClassName = className
data.Comment = comment
return f.newNode(KindJSDocAugmentsTag, data)
}
func (f *NodeFactory) UpdateJSDocAugmentsTag(node *JSDocAugmentsTag, tagName *IdentifierNode, className *Expression, comment *NodeList) *Node {
if tagName != node.TagName || className != node.ClassName || comment != node.Comment {
return updateNode(f.NewJSDocAugmentsTag(tagName, className, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocAugmentsTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.ClassName) || visitNodeList(v, node.Comment)
}
func (node *JSDocAugmentsTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocAugmentsTag(node, v.visitNode(node.TagName), v.visitNode(node.ClassName), v.visitNodes(node.Comment))
}
func (node *JSDocAugmentsTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocAugmentsTag(node.TagName, node.ClassName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocAugmentsTag(node *Node) bool {
return node.Kind == KindJSDocAugmentsTag
}
// JSDocSatisfiesTag
type JSDocSatisfiesTag struct {
JSDocTagBase
TypeExpression *TypeNode
}
func (f *NodeFactory) NewJSDocSatisfiesTag(tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
data := &JSDocSatisfiesTag{}
data.TagName = tagName
data.TypeExpression = typeExpression
data.Comment = comment
return f.newNode(KindJSDocSatisfiesTag, data)
}
func (f *NodeFactory) UpdateJSDocSatisfiesTag(node *JSDocSatisfiesTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
if tagName != node.TagName || typeExpression != node.TypeExpression || comment != node.Comment {
return updateNode(f.NewJSDocSatisfiesTag(tagName, typeExpression, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocSatisfiesTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment)
}
func (node *JSDocSatisfiesTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocSatisfiesTag(node, v.visitNode(node.TagName), v.visitNode(node.TypeExpression), v.visitNodes(node.Comment))
}
func (node *JSDocSatisfiesTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocSatisfiesTag(node.TagName, node.TypeExpression, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocThisTag
type JSDocThisTag struct {
JSDocTagBase
TypeExpression *TypeNode
}
func (f *NodeFactory) NewJSDocThisTag(tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
data := &JSDocThisTag{}
data.TagName = tagName
data.TypeExpression = typeExpression
data.Comment = comment
return f.newNode(KindJSDocThisTag, data)
}
func (f *NodeFactory) UpdateJSDocThisTag(node *JSDocThisTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
if tagName != node.TagName || typeExpression != node.TypeExpression || comment != node.Comment {
return updateNode(f.NewJSDocThisTag(tagName, typeExpression, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocThisTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment)
}
func (node *JSDocThisTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocThisTag(node, v.visitNode(node.TagName), v.visitNode(node.TypeExpression), v.visitNodes(node.Comment))
}
func (node *JSDocThisTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocThisTag(node.TagName, node.TypeExpression, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocImportTag
type JSDocImportTag struct {
JSDocTagBase
ImportClause *Declaration
ModuleSpecifier *Expression
Attributes *Node
}
func (f *NodeFactory) NewJSDocImportTag(tagName *IdentifierNode, importClause *Declaration, moduleSpecifier *Node, attributes *Node, comment *NodeList) *Node {
data := &JSDocImportTag{}
data.TagName = tagName
data.ImportClause = importClause
data.ModuleSpecifier = moduleSpecifier
data.Attributes = attributes
data.Comment = comment
return f.newNode(KindJSDocImportTag, data)
}
func (f *NodeFactory) UpdateJSDocImportTag(node *JSDocImportTag, tagName *IdentifierNode, importClause *Declaration, moduleSpecifier *Node, attributes *Node, comment *NodeList) *Node {
if tagName != node.TagName || importClause != node.ImportClause || moduleSpecifier != node.ModuleSpecifier || attributes != node.Attributes || comment != node.Comment {
return updateNode(f.NewJSDocImportTag(tagName, importClause, moduleSpecifier, attributes, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocImportTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.ImportClause) || visit(v, node.ModuleSpecifier) || visit(v, node.Attributes) || visitNodeList(v, node.Comment)
}
func (node *JSDocImportTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocImportTag(node, v.visitNode(node.TagName), v.visitNode(node.ImportClause), v.visitNode(node.ModuleSpecifier), v.visitNode(node.Attributes), v.visitNodes(node.Comment))
}
func (node *JSDocImportTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocImportTag(node.TagName, node.ImportClause, node.ModuleSpecifier, node.Attributes, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocImportTag(node *Node) bool {
return node.Kind == KindJSDocImportTag
}
// JSDocCallbackTag
type JSDocCallbackTag struct {
JSDocTagBase
FullName *Node
TypeExpression *TypeNode
}
func (f *NodeFactory) NewJSDocCallbackTag(tagName *IdentifierNode, typeExpression *TypeNode, fullName *Node, comment *NodeList) *Node {
data := &JSDocCallbackTag{}
data.TagName = tagName
data.FullName = fullName
data.TypeExpression = typeExpression
data.Comment = comment
return f.newNode(KindJSDocCallbackTag, data)
}
func (f *NodeFactory) UpdateJSDocCallbackTag(node *JSDocCallbackTag, tagName *IdentifierNode, typeExpression *TypeNode, fullName *Node, comment *NodeList) *Node {
if tagName != node.TagName || typeExpression != node.TypeExpression || fullName != node.FullName || comment != node.Comment {
return updateNode(f.NewJSDocCallbackTag(tagName, typeExpression, fullName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocCallbackTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.FullName) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment)
}
func (node *JSDocCallbackTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocCallbackTag(node, v.visitNode(node.TagName), v.visitNode(node.TypeExpression), v.visitNode(node.FullName), v.visitNodes(node.Comment))
}
func (node *JSDocCallbackTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocCallbackTag(node.TagName, node.TypeExpression, node.FullName, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JSDocCallbackTag) Name() *DeclarationName { return node.FullName }
func IsJSDocCallbackTag(node *Node) bool {
return node.Kind == KindJSDocCallbackTag
}
// JSDocOverloadTag
type JSDocOverloadTag struct {
JSDocTagBase
TypeExpression *TypeNode
}
func (f *NodeFactory) NewJSDocOverloadTag(tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
data := &JSDocOverloadTag{}
data.TagName = tagName
data.TypeExpression = typeExpression
data.Comment = comment
return f.newNode(KindJSDocOverloadTag, data)
}
func (f *NodeFactory) UpdateJSDocOverloadTag(node *JSDocOverloadTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node {
if tagName != node.TagName || typeExpression != node.TypeExpression || comment != node.Comment {
return updateNode(f.NewJSDocOverloadTag(tagName, typeExpression, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocOverloadTag) ForEachChild(v Visitor) bool {
return visit(v, node.TagName) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment)
}
func (node *JSDocOverloadTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocOverloadTag(node, v.visitNode(node.TagName), v.visitNode(node.TypeExpression), v.visitNodes(node.Comment))
}
func (node *JSDocOverloadTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocOverloadTag(node.TagName, node.TypeExpression, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocTypedefTag
type JSDocTypedefTag struct {
JSDocTagBase
TypeExpression *Node
name *IdentifierNode
}
func (f *NodeFactory) NewJSDocTypedefTag(tagName *IdentifierNode, typeExpression *Node, name *IdentifierNode, comment *NodeList) *Node {
data := &JSDocTypedefTag{}
data.TagName = tagName
data.TypeExpression = typeExpression
data.name = name
data.Comment = comment
return f.newNode(KindJSDocTypedefTag, data)
}
func (f *NodeFactory) UpdateJSDocTypedefTag(node *JSDocTypedefTag, tagName *IdentifierNode, typeExpression *Node, fullName *IdentifierNode, comment *NodeList) *Node {
if tagName != node.TagName || typeExpression != node.TypeExpression || fullName != node.name || comment != node.Comment {
return updateNode(f.NewJSDocTypedefTag(tagName, typeExpression, fullName, comment), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocTypedefTag) ForEachChild(v Visitor) bool {
if node.TypeExpression != nil && node.TypeExpression.Kind == KindJSDocTypeLiteral {
return visit(v, node.TagName) || visit(v, node.name) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment)
}
return visit(v, node.TagName) || visit(v, node.TypeExpression) || visit(v, node.name) || visitNodeList(v, node.Comment)
}
func (node *JSDocTypedefTag) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocTypedefTag(node, v.visitNode(node.TagName), v.visitNode(node.TypeExpression), v.visitNode(node.name), v.visitNodes(node.Comment))
}
func (node *JSDocTypedefTag) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocTypedefTag(node.TagName, node.TypeExpression, node.name, node.Comment), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JSDocTypedefTag) Name() *DeclarationName { return node.name }
func IsJSDocTypedefTag(node *Node) bool {
return node.Kind == KindJSDocTypedefTag
}
// JSDocTypeLiteral
type JSDocTypeLiteral struct {
TypeNodeBase
DeclarationBase
JSDocPropertyTags []*Node
IsArrayType bool
}
func (f *NodeFactory) NewJSDocTypeLiteral(jsdocPropertyTags []*Node, isArrayType bool) *Node {
data := &JSDocTypeLiteral{}
data.JSDocPropertyTags = jsdocPropertyTags
data.IsArrayType = isArrayType
return f.newNode(KindJSDocTypeLiteral, data)
}
func (f *NodeFactory) UpdateJSDocTypeLiteral(node *JSDocTypeLiteral, jsdocPropertyTags []*Node, isArrayType bool) *Node {
if !core.Same(jsdocPropertyTags, node.JSDocPropertyTags) || isArrayType != node.IsArrayType {
return updateNode(f.NewJSDocTypeLiteral(jsdocPropertyTags, isArrayType), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocTypeLiteral) ForEachChild(v Visitor) bool {
return visitNodes(v, node.JSDocPropertyTags)
}
func (node *JSDocTypeLiteral) VisitEachChild(v *NodeVisitor) *Node {
jsdocPropertyTags := core.SameMap(node.JSDocPropertyTags, func(n *Node) *Node { return v.visitNode(n) })
return v.Factory.UpdateJSDocTypeLiteral(node, jsdocPropertyTags, node.IsArrayType)
}
func (node *JSDocTypeLiteral) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocTypeLiteral(node.JSDocPropertyTags, node.IsArrayType), node.AsNode(), f.AsNodeFactory().hooks)
}
// JSDocSignature
type JSDocSignature struct {
TypeNodeBase
FunctionLikeBase
}
func (f *NodeFactory) NewJSDocSignature(typeParameters *NodeList, parameters *NodeList, typeNode *JSDocTag) *Node {
data := &JSDocSignature{}
data.TypeParameters = typeParameters
data.Parameters = parameters
data.Type = typeNode
return f.newNode(KindJSDocSignature, data)
}
func (f *NodeFactory) UpdateJSDocSignature(node *JSDocSignature, typeParameters *NodeList, parameters *NodeList, typeNode *JSDocTag) *Node {
if typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type {
return updateNode(f.NewJSDocSignature(typeParameters, parameters, typeNode), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocSignature) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) || visit(v, node.Type)
}
func (node *JSDocSignature) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocSignature(node, v.visitNodes(node.TypeParameters), v.visitNodes(node.Parameters), v.visitNode(node.Type))
}
func (node *JSDocSignature) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocSignature(node.TypeParameters, node.Parameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks)
}
func IsJSDocSignature(node *Node) bool {
return node.Kind == KindJSDocSignature
}
// JSDocNameReference
type JSDocNameReference struct {
TypeNodeBase
name *EntityName
}
func (f *NodeFactory) NewJSDocNameReference(name *EntityName) *Node {
data := &JSDocNameReference{}
data.name = name
return f.newNode(KindJSDocNameReference, data)
}
func (f *NodeFactory) UpdateJSDocNameReference(node *JSDocNameReference, name *EntityName) *Node {
if name != node.name {
return updateNode(f.NewJSDocNameReference(name), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *JSDocNameReference) ForEachChild(v Visitor) bool {
return visit(v, node.name)
}
func (node *JSDocNameReference) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateJSDocNameReference(node, v.visitNode(node.name))
}
func (node *JSDocNameReference) Clone(f NodeFactoryCoercible) *Node {
return cloneNode(f.AsNodeFactory().NewJSDocNameReference(node.Name()), node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *JSDocNameReference) Name() *EntityName { return node.name }
func IsJSDocNameReference(node *Node) bool {
return node.Kind == KindJSDocNameReference
}
// PatternAmbientModule
type PatternAmbientModule struct {
Pattern core.Pattern
Symbol *Symbol
}
type CommentDirectiveKind int32
const (
CommentDirectiveKindUnknown CommentDirectiveKind = iota
CommentDirectiveKindExpectError
CommentDirectiveKindIgnore
)
type CommentDirective struct {
Loc core.TextRange
Kind CommentDirectiveKind
}
// SourceFile
type SourceFileMetaData struct {
PackageJsonType string
PackageJsonDirectory string
ImpliedNodeFormat core.ResolutionMode
}
type CheckJsDirective struct {
Enabled bool
Range CommentRange
}
type HasFileName interface {
FileName() string
Path() tspath.Path
}
type SourceFile struct {
NodeBase
DeclarationBase
LocalsContainerBase
compositeNodeBase
// Fields set by NewSourceFile
fileName string // For debugging convenience
parseOptions SourceFileParseOptions
text string
Statements *NodeList // NodeList[*Statement]
EndOfFileToken *TokenNode // TokenNode[*EndOfFileToken]
// Fields set by parser
diagnostics []*Diagnostic
jsDiagnostics []*Diagnostic
jsdocDiagnostics []*Diagnostic
LanguageVariant core.LanguageVariant
ScriptKind core.ScriptKind
IsDeclarationFile bool
UsesUriStyleNodeCoreModules core.Tristate
Identifiers map[string]string
IdentifierCount int
imports []*LiteralLikeNode // []LiteralLikeNode
ModuleAugmentations []*ModuleName // []ModuleName
AmbientModuleNames []string
CommentDirectives []CommentDirective
jsdocCache map[*Node][]*Node
Pragmas []Pragma
ReferencedFiles []*FileReference
TypeReferenceDirectives []*FileReference
LibReferenceDirectives []*FileReference
CheckJsDirective *CheckJsDirective
NodeCount int
TextCount int
CommonJSModuleIndicator *Node
ExternalModuleIndicator *Node
// Fields set by binder
isBound atomic.Bool
bindOnce sync.Once
bindDiagnostics []*Diagnostic
BindSuggestionDiagnostics []*Diagnostic
EndFlowNode *FlowNode
SymbolCount int
ClassifiableNames collections.Set[string]
PatternAmbientModules []*PatternAmbientModule
// Fields set by ECMALineMap
ecmaLineMapMu sync.RWMutex
ecmaLineMap []core.TextPos
// Fields set by language service
tokenCacheMu sync.Mutex
tokenCache map[core.TextRange]*Node
declarationMapMu sync.Mutex
declarationMap map[string][]*Node
}
func (f *NodeFactory) NewSourceFile(opts SourceFileParseOptions, text string, statements *NodeList, endOfFileToken *TokenNode) *Node {
if tspath.GetEncodedRootLength(opts.FileName) == 0 || opts.FileName != tspath.NormalizePath(opts.FileName) {
panic(fmt.Sprintf("fileName should be normalized and absolute: %q", opts.FileName))
}
data := &SourceFile{}
data.fileName = opts.FileName
data.parseOptions = opts
data.text = text
data.Statements = statements
data.EndOfFileToken = endOfFileToken
return f.newNode(KindSourceFile, data)
}
func (node *SourceFile) ParseOptions() SourceFileParseOptions {
return node.parseOptions
}
func (node *SourceFile) Text() string {
return node.text
}
func (node *SourceFile) FileName() string {
return node.parseOptions.FileName
}
func (node *SourceFile) Path() tspath.Path {
return node.parseOptions.Path
}
func (node *SourceFile) Imports() []*LiteralLikeNode {
return node.imports
}
func (node *SourceFile) Diagnostics() []*Diagnostic {
return node.diagnostics
}
func (node *SourceFile) SetDiagnostics(diags []*Diagnostic) {
node.diagnostics = diags
}
func (node *SourceFile) JSDiagnostics() []*Diagnostic {
return node.jsDiagnostics
}
func (node *SourceFile) SetJSDiagnostics(diags []*Diagnostic) {
node.jsDiagnostics = diags
}
func (node *SourceFile) JSDocDiagnostics() []*Diagnostic {
return node.jsdocDiagnostics
}
func (node *SourceFile) SetJSDocDiagnostics(diags []*Diagnostic) {
node.jsdocDiagnostics = diags
}
func (node *SourceFile) JSDocCache() map[*Node][]*Node {
return node.jsdocCache
}
func (node *SourceFile) SetJSDocCache(cache map[*Node][]*Node) {
node.jsdocCache = cache
}
func (node *SourceFile) BindDiagnostics() []*Diagnostic {
return node.bindDiagnostics
}
func (node *SourceFile) SetBindDiagnostics(diags []*Diagnostic) {
node.bindDiagnostics = diags
}
func (node *SourceFile) ForEachChild(v Visitor) bool {
return visitNodeList(v, node.Statements) || visit(v, node.EndOfFileToken)
}
func (node *SourceFile) VisitEachChild(v *NodeVisitor) *Node {
return v.Factory.UpdateSourceFile(node, v.visitTopLevelStatements(node.Statements), v.visitToken(node.EndOfFileToken))
}
func (node *SourceFile) IsJS() bool {
return IsSourceFileJS(node)
}
func (node *SourceFile) copyFrom(other *SourceFile) {
// Do not copy fields set by NewSourceFile (Text, FileName, Path, or Statements)
node.LanguageVariant = other.LanguageVariant
node.ScriptKind = other.ScriptKind
node.IsDeclarationFile = other.IsDeclarationFile
node.UsesUriStyleNodeCoreModules = other.UsesUriStyleNodeCoreModules
node.Identifiers = other.Identifiers
node.imports = other.imports
node.ModuleAugmentations = other.ModuleAugmentations
node.AmbientModuleNames = other.AmbientModuleNames
node.CommentDirectives = other.CommentDirectives
node.Pragmas = other.Pragmas
node.ReferencedFiles = other.ReferencedFiles
node.TypeReferenceDirectives = other.TypeReferenceDirectives
node.LibReferenceDirectives = other.LibReferenceDirectives
node.CommonJSModuleIndicator = other.CommonJSModuleIndicator
node.ExternalModuleIndicator = other.ExternalModuleIndicator
node.Flags |= other.Flags
}
func (node *SourceFile) Clone(f NodeFactoryCoercible) *Node {
updated := f.AsNodeFactory().NewSourceFile(node.parseOptions, node.text, node.Statements, node.EndOfFileToken)
newFile := updated.AsSourceFile()
newFile.copyFrom(node)
return cloneNode(updated, node.AsNode(), f.AsNodeFactory().hooks)
}
func (node *SourceFile) computeSubtreeFacts() SubtreeFacts {
return propagateNodeListSubtreeFacts(node.Statements, propagateSubtreeFacts)
}
func (f *NodeFactory) UpdateSourceFile(node *SourceFile, statements *StatementList, endOfFileToken *TokenNode) *Node {
if statements != node.Statements || endOfFileToken != node.EndOfFileToken {
updated := f.NewSourceFile(node.parseOptions, node.text, statements, endOfFileToken).AsSourceFile()
updated.copyFrom(node)
return updateNode(updated.AsNode(), node.AsNode(), f.hooks)
}
return node.AsNode()
}
func (node *SourceFile) ECMALineMap() []core.TextPos {
node.ecmaLineMapMu.RLock()
lineMap := node.ecmaLineMap
node.ecmaLineMapMu.RUnlock()
if lineMap == nil {
node.ecmaLineMapMu.Lock()
defer node.ecmaLineMapMu.Unlock()
lineMap = node.ecmaLineMap
if lineMap == nil {
lineMap = core.ComputeECMALineStarts(node.Text())
node.ecmaLineMap = lineMap
}
}
return lineMap
}
func (node *SourceFile) IsBound() bool {
return node.isBound.Load()
}
func (node *SourceFile) BindOnce(bind func()) {
node.bindOnce.Do(func() {
bind()
node.isBound.Store(true)
})
}
func (node *SourceFile) GetOrCreateToken(
kind Kind,
pos int,
end int,
parent *Node,
) *TokenNode {
node.tokenCacheMu.Lock()
defer node.tokenCacheMu.Unlock()
loc := core.NewTextRange(pos, end)
if node.tokenCache == nil {
node.tokenCache = make(map[core.TextRange]*Node)
} else if token, ok := node.tokenCache[loc]; ok {
if token.Kind != kind {
panic(fmt.Sprintf("Token cache mismatch: %v != %v", token.Kind, kind))
}
if token.Parent != parent {
panic(fmt.Sprintf("Token cache mismatch: parent. Expected parent of kind %v, got %v", token.Parent.Kind, parent.Kind))
}
return token
}
token := newNode(kind, &Token{}, NodeFactoryHooks{})
token.Loc = loc
token.Parent = parent
node.tokenCache[loc] = token
return token
}
func IsSourceFile(node *Node) bool {
return node.Kind == KindSourceFile
}
func (node *SourceFile) GetDeclarationMap() map[string][]*Node {
node.declarationMapMu.Lock()
defer node.declarationMapMu.Unlock()
if node.declarationMap == nil {
node.declarationMap = node.computeDeclarationMap()
}
return node.declarationMap
}
func (node *SourceFile) computeDeclarationMap() map[string][]*Node {
result := make(map[string][]*Node)
addDeclaration := func(declaration *Node) {
name := getDeclarationName(declaration)
if name != "" {
result[name] = append(result[name], declaration)
}
}
var visit func(*Node) bool
visit = func(node *Node) bool {
switch node.Kind {
case KindFunctionDeclaration, KindFunctionExpression, KindMethodDeclaration, KindMethodSignature:
declarationName := getDeclarationName(node)
if declarationName != "" {
declarations := result[declarationName]
var lastDeclaration *Node
if len(declarations) != 0 {
lastDeclaration = declarations[len(declarations)-1]
}
// Check whether this declaration belongs to an "overload group".
if lastDeclaration != nil && node.Parent == lastDeclaration.Parent && node.Symbol() == lastDeclaration.Symbol() {
// Overwrite the last declaration if it was an overload and this one is an implementation.
if node.Body() != nil && lastDeclaration.Body() == nil {
declarations[len(declarations)-1] = node
}
} else {
result[declarationName] = append(result[declarationName], node)
}
}
node.ForEachChild(visit)
case KindClassDeclaration, KindClassExpression, KindInterfaceDeclaration, KindTypeAliasDeclaration, KindEnumDeclaration, KindModuleDeclaration,
KindImportEqualsDeclaration, KindImportClause, KindNamespaceImport, KindGetAccessor, KindSetAccessor, KindTypeLiteral:
addDeclaration(node)
node.ForEachChild(visit)
case KindImportSpecifier, KindExportSpecifier:
if node.PropertyName() != nil {
addDeclaration(node)
}
case KindParameter:
// Only consider parameter properties
if !HasSyntacticModifier(node, ModifierFlagsParameterPropertyModifier) {
break
}
fallthrough
case KindVariableDeclaration, KindBindingElement:
name := node.Name()
if name != nil {
if IsBindingPattern(name) {
node.Name().ForEachChild(visit)
} else {
if node.Initializer() != nil {
visit(node.Initializer())
}
addDeclaration(node)
}
}
case KindEnumMember, KindPropertyDeclaration, KindPropertySignature:
addDeclaration(node)
case KindExportDeclaration:
// Handle named exports case e.g.:
// export {a, b as B} from "mod";
exportClause := node.AsExportDeclaration().ExportClause
if exportClause != nil {
if IsNamedExports(exportClause) {
for _, element := range exportClause.AsNamedExports().Elements.Nodes {
visit(element)
}
} else {
visit(exportClause.AsNamespaceExport().Name())
}
}
case KindImportDeclaration:
importClause := node.AsImportDeclaration().ImportClause
if importClause != nil {
// Handle default import case e.g.:
// import d from "mod";
if importClause.Name() != nil {
addDeclaration(importClause.Name())
}
// Handle named bindings in imports e.g.:
// import * as NS from "mod";
// import {a, b as B} from "mod";
namedBindings := importClause.AsImportClause().NamedBindings
if namedBindings != nil {
if namedBindings.Kind == KindNamespaceImport {
addDeclaration(namedBindings)
} else {
for _, element := range namedBindings.AsNamedImports().Elements.Nodes {
visit(element)
}
}
}
}
default:
node.ForEachChild(visit)
}
return false
}
node.ForEachChild(visit)
return result
}
func getDeclarationName(declaration *Node) string {
name := GetNonAssignedNameOfDeclaration(declaration)
if name != nil {
if IsComputedPropertyName(name) {
if IsStringOrNumericLiteralLike(name.Expression()) {
return name.Expression().Text()
}
if IsPropertyAccessExpression(name.Expression()) {
return name.Expression().Name().Text()
}
} else if IsPropertyName(name) {
return name.Text()
}
}
return ""
}
type SourceFileLike interface {
Text() string
ECMALineMap() []core.TextPos
}
type CommentRange struct {
core.TextRange
Kind Kind
HasTrailingNewLine bool
}
func (f *NodeFactory) NewCommentRange(kind Kind, pos int, end int, hasTrailingNewLine bool) CommentRange {
return CommentRange{
TextRange: core.NewTextRange(pos, end),
Kind: kind,
HasTrailingNewLine: hasTrailingNewLine,
}
}
type FileReference struct {
core.TextRange
FileName string
ResolutionMode core.ResolutionMode
Preserve bool
}
type PragmaArgument struct {
core.TextRange
Name string
Value string
}
type Pragma struct {
CommentRange
Name string
Args map[string]PragmaArgument
}
type PragmaKindFlags = uint8
const (
PragmaKindTripleSlashXML PragmaKindFlags = 1 << iota
PragmaKindSingleLine
PragmaKindMultiLine
PragmaKindFlagsNone PragmaKindFlags = 0
PragmaKindAll = PragmaKindTripleSlashXML | PragmaKindSingleLine | PragmaKindMultiLine
PragmaKindDefault = PragmaKindAll
)
type PragmaArgumentSpecification struct {
Name string
Optional bool
CaptureSpan bool
}
type PragmaSpecification struct {
Args []PragmaArgumentSpecification
Kind PragmaKindFlags
}
func (spec *PragmaSpecification) IsTripleSlash() bool {
return (spec.Kind & PragmaKindTripleSlashXML) > 0
}