11119 lines
372 KiB
Go
11119 lines
372 KiB
Go
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 <TagName attrs>...</TagName>
|
|
|
|
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 <Tag>...</Tag> 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 <TagName attrs />
|
|
|
|
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, <X y /> is sugar for <X y={true} />
|
|
}
|
|
|
|
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
|
|
}
|