// Code generated by _scripts/generate-go-ast.ts. DO NOT EDIT. package ast import ( "sync/atomic" "github.com/microsoft/typescript-go/internal/core" ) var ( _ = core.Same[string] // prevent unused import _ atomic.Uint32 // prevent unused import ) // ────────────────────────────────────────────────────────────────────── // NodeFactory // ────────────────────────────────────────────────────────────────────── type NodeFactory struct { hooks NodeFactoryHooks arrayTypeNodeArena core.Arena[ArrayTypeNode] binaryExpressionArena core.Arena[BinaryExpression] blockArena core.Arena[Block] callExpressionArena core.Arena[CallExpression] conditionalExpressionArena core.Arena[ConditionalExpression] constructSignatureDeclarationArena core.Arena[ConstructSignatureDeclaration] elementAccessExpressionArena core.Arena[ElementAccessExpression] expressionStatementArena core.Arena[ExpressionStatement] expressionWithTypeArgumentsArena core.Arena[ExpressionWithTypeArguments] functionDeclarationArena core.Arena[FunctionDeclaration] functionTypeNodeArena core.Arena[FunctionTypeNode] heritageClauseArena core.Arena[HeritageClause] identifierArena core.Arena[Identifier] ifStatementArena core.Arena[IfStatement] importSpecifierArena core.Arena[ImportSpecifier] indexedAccessTypeNodeArena core.Arena[IndexedAccessTypeNode] interfaceDeclarationArena core.Arena[InterfaceDeclaration] intersectionTypeNodeArena core.Arena[IntersectionTypeNode] jsdocArena core.Arena[JSDoc] jsdocDeprecatedTagArena core.Arena[JSDocDeprecatedTag] jsdocTextArena core.Arena[JSDocText] jsdocUnknownTagArena core.Arena[JSDocUnknownTag] keywordExpressionArena core.Arena[KeywordExpression] keywordTypeNodeArena core.Arena[KeywordTypeNode] literalTypeNodeArena core.Arena[LiteralTypeNode] methodSignatureDeclarationArena core.Arena[MethodSignatureDeclaration] modifierListArena core.Arena[ModifierList] nodeListArena core.Arena[NodeList] numericLiteralArena core.Arena[NumericLiteral] parameterDeclarationArena core.Arena[ParameterDeclaration] parenthesizedExpressionArena core.Arena[ParenthesizedExpression] parenthesizedTypeNodeArena core.Arena[ParenthesizedTypeNode] prefixUnaryExpressionArena core.Arena[PrefixUnaryExpression] propertyAccessExpressionArena core.Arena[PropertyAccessExpression] propertyAssignmentArena core.Arena[PropertyAssignment] propertySignatureDeclarationArena core.Arena[PropertySignatureDeclaration] returnStatementArena core.Arena[ReturnStatement] stringLiteralArena core.Arena[StringLiteral] tokenArena core.Arena[Token] typeAliasDeclarationArena core.Arena[TypeAliasDeclaration] typeLiteralNodeArena core.Arena[TypeLiteralNode] typeOperatorNodeArena core.Arena[TypeOperatorNode] typeParameterDeclarationArena core.Arena[TypeParameterDeclaration] typeReferenceNodeArena core.Arena[TypeReferenceNode] unionTypeNodeArena core.Arena[UnionTypeNode] variableDeclarationArena core.Arena[VariableDeclaration] variableDeclarationListArena core.Arena[VariableDeclarationList] variableStatementArena core.Arena[VariableStatement] nodeCount int textCount int } // ────────────────────────────────────────────────────────────────────── // Base struct definitions // ────────────────────────────────────────────────────────────────────── type StatementBase struct { NodeBase FlowNodeBase } type IterationStatementBase struct { StatementBase Statement *Statement } type ExpressionBase struct { NodeBase } type UnaryExpressionBase struct { ExpressionBase } type UpdateExpressionBase struct { UnaryExpressionBase } type LeftHandSideExpressionBase struct { UpdateExpressionBase } type MemberExpressionBase struct { LeftHandSideExpressionBase } type PrimaryExpressionBase struct { MemberExpressionBase } type TypeNodeBase struct { NodeBase TypeSyntaxBase } type NodeWithTypeArgumentsBase struct { TypeNodeBase TypeArguments *TypeList // Optional } type JSDocTypeBase struct { TypeNodeBase } type DeclarationBase struct { Symbol *Symbol } type ExportableBase struct { LocalSymbol *Symbol } type ModifiersBase struct { modifiers *ModifierList // Optional } type LocalsContainerBase struct { Locals SymbolTable NextContainer *Node } type FlowNodeBase struct { FlowNode *FlowNode } type CompositeBase struct { facts atomic.Uint32 } type TypeSyntaxBase struct{} type FunctionLikeBase struct { DeclarationBase LocalsContainerBase TypeParameters *TypeParameterList // Optional Parameters *ParameterList Type *TypeNode // Optional FullSignature *TypeNode // Optional } type BodyBase struct { AsteriskToken *AsteriskToken // Optional Body *NodeBody // Optional EndFlowNode *FlowNode } type FunctionLikeWithBodyBase struct { FunctionLikeBase BodyBase } type ClassLikeBase struct { DeclarationBase ExportableBase ModifiersBase LocalsContainerBase CompositeBase name *IdentifierNode // Optional TypeParameters *TypeParameterList // Optional HeritageClauses *HeritageClauseList // Optional Members *ClassElementList } type LiteralLikeNodeBase struct { Text string TokenFlags TokenFlags } type LiteralExpressionBase struct { LiteralLikeNodeBase PrimaryExpressionBase } type TemplateLiteralLikeNodeBase struct { LiteralLikeNodeBase RawText string TemplateFlags TokenFlags } type TypeElementBase struct{} type ClassElementBase struct{} type NamedMemberBase struct { DeclarationBase ModifiersBase name *PropertyName PostfixToken *TokenNode // Optional } type ObjectLiteralElementBase struct{} type AccessorDeclarationBase struct { NamedMemberBase FunctionLikeWithBodyBase FlowNodeBase TypeElementBase ClassElementBase ObjectLiteralElementBase CompositeBase NodeBase } type FunctionOrConstructorTypeNodeBase struct { TypeNodeBase ModifiersBase FunctionLikeBase } type UnionOrIntersectionTypeNodeBase struct { TypeNodeBase Types *TypeList } type JSDocTagBase struct { NodeBase TagName *IdentifierNode Comment *NodeList // Optional } type JSDocCommentBase struct { NodeBase text []string } // ────────────────────────────────────────────────────────────────────── // Node type aliases // ────────────────────────────────────────────────────────────────────── type ( TokenNode = Node IdentifierNode = Node PrivateIdentifierNode = Node QualifiedNameNode = Node ComputedPropertyNameNode = Node DecoratorNode = Node EmptyStatementNode = Node IfStatementNode = Node DoStatementNode = Node WhileStatementNode = Node ForStatementNode = Node ForInOrOfStatementNode = Node BreakStatementNode = Node ContinueStatementNode = Node ReturnStatementNode = Node WithStatementNode = Node SwitchStatementNode = Node CaseBlockNode = Node CaseOrDefaultClauseNode = Node ThrowStatementNode = Node TryStatementNode = Node CatchClauseNode = Node DebuggerStatementNode = Node LabeledStatementNode = Node ExpressionStatementNode = Node BlockNode = Node VariableStatementNode = Node VariableDeclarationNode = Node VariableDeclarationListNode = Node BindingPatternNode = Node ParameterDeclarationNode = Node BindingElementNode = Node MissingDeclarationNode = Node FunctionDeclarationNode = Node ClassDeclarationNode = Node ClassExpressionNode = Node HeritageClauseNode = Node InterfaceDeclarationNode = Node TypeAliasDeclarationNode = Node EnumMemberNode = Node EnumDeclarationNode = Node ModuleBlockNode = Node NotEmittedStatementNode = Node NotEmittedTypeElementNode = Node ImportDeclarationNode = Node ExternalModuleReferenceNode = Node NamespaceImportNode = Node NamedImportsNode = Node ExportAssignmentNode = Node NamespaceExportDeclarationNode = Node NamespaceExportNode = Node NamedExportsNode = Node ExportSpecifierNode = Node CallSignatureDeclarationNode = Node ConstructSignatureDeclarationNode = Node ConstructorDeclarationNode = Node GetAccessorDeclarationNode = Node SetAccessorDeclarationNode = Node IndexSignatureDeclarationNode = Node MethodSignatureDeclarationNode = Node MethodDeclarationNode = Node PropertySignatureDeclarationNode = Node PropertyDeclarationNode = Node SemicolonClassElementNode = Node ClassStaticBlockDeclarationNode = Node OmittedExpressionNode = Node KeywordExpressionNode = Node StringLiteralNode = Node NumericLiteralNode = Node BigIntLiteralNode = Node RegularExpressionLiteralNode = Node NoSubstitutionTemplateLiteralNode = Node BinaryExpressionNode = Node PrefixUnaryExpressionNode = Node PostfixUnaryExpressionNode = Node YieldExpressionNode = Node ArrowFunctionNode = Node FunctionExpressionNode = Node AsExpressionNode = Node SatisfiesExpressionNode = Node ConditionalExpressionNode = Node PropertyAccessExpressionNode = Node ElementAccessExpressionNode = Node CallExpressionNode = Node NewExpressionNode = Node MetaPropertyNode = Node NonNullExpressionNode = Node SpreadElementNode = Node TemplateExpressionNode = Node TemplateSpanNode = Node TaggedTemplateExpressionNode = Node ParenthesizedExpressionNode = Node ArrayLiteralExpressionNode = Node ObjectLiteralExpressionNode = Node SpreadAssignmentNode = Node PropertyAssignmentNode = Node ShorthandPropertyAssignmentNode = Node DeleteExpressionNode = Node TypeOfExpressionNode = Node VoidExpressionNode = Node AwaitExpressionNode = Node TypeAssertionNode = Node KeywordTypeNodeNode = Node UnionTypeNodeNode = Node IntersectionTypeNodeNode = Node ConditionalTypeNodeNode = Node TypeOperatorNodeNode = Node InferTypeNodeNode = Node ArrayTypeNodeNode = Node IndexedAccessTypeNodeNode = Node TypeReferenceNodeNode = Node ExpressionWithTypeArgumentsNode = Node LiteralTypeNodeNode = Node ThisTypeNodeNode = Node TypePredicateNodeNode = Node ImportAttributeNode = Node ImportAttributesNode = Node TypeQueryNodeNode = Node MappedTypeNodeNode = Node TypeLiteralNodeNode = Node TupleTypeNodeNode = Node NamedTupleMemberNode = Node OptionalTypeNodeNode = Node RestTypeNodeNode = Node ParenthesizedTypeNodeNode = Node FunctionTypeNodeNode = Node ConstructorTypeNodeNode = Node TemplateHeadNode = Node TemplateMiddleNode = Node TemplateTailNode = Node TemplateLiteralTypeNodeNode = Node TemplateLiteralTypeSpanNode = Node SyntheticExpressionNode = Node PartiallyEmittedExpressionNode = Node JsxElementNode = Node JsxAttributesNode = Node JsxNamespacedNameNode = Node JsxOpeningElementNode = Node JsxSelfClosingElementNode = Node JsxFragmentNode = Node JsxOpeningFragmentNode = Node JsxClosingFragmentNode = Node JsxAttributeNode = Node JsxSpreadAttributeNode = Node JsxClosingElementNode = Node JsxExpressionNode = Node JsxTextNode = Node SyntaxListNode = Node JSDocNode = Node JSDocTypeExpressionNode = Node JSDocNonNullableTypeNode = Node JSDocNullableTypeNode = Node JSDocAllTypeNode = Node JSDocVariadicTypeNode = Node JSDocOptionalTypeNode = Node JSDocTypeTagNode = Node JSDocUnknownTagNode = Node JSDocTemplateTagNode = Node JSDocReturnTagNode = Node JSDocPublicTagNode = Node JSDocPrivateTagNode = Node JSDocProtectedTagNode = Node JSDocReadonlyTagNode = Node JSDocOverrideTagNode = Node JSDocDeprecatedTagNode = Node JSDocSeeTagNode = Node JSDocImplementsTagNode = Node JSDocAugmentsTagNode = Node JSDocSatisfiesTagNode = Node JSDocThrowsTagNode = Node JSDocThisTagNode = Node JSDocImportTagNode = Node JSDocCallbackTagNode = Node JSDocOverloadTagNode = Node JSDocTypedefTagNode = Node JSDocSignatureNode = Node JSDocNameReferenceNode = Node SourceFileNode = Node ModuleDeclarationNode = Node ImportEqualsDeclarationNode = Node ExportDeclarationNode = Node ImportTypeNodeNode = Node ImportClauseNode = Node ImportSpecifierNode = Node JSDocTextNode = Node JSDocLinkNode = Node JSDocLinkPlainNode = Node JSDocLinkCodeNode = Node TypeParameterDeclarationNode = Node SyntheticReferenceExpressionNode = Node JSDocTypeLiteralNode = Node JSDocParameterOrPropertyTagNode = Node EndOfFile = Node DotToken = Node DotDotDotToken = Node QuestionToken = Node ExclamationToken = Node ColonToken = Node EqualsToken = Node AsteriskToken = Node EqualsGreaterThanToken = Node PlusToken = Node MinusToken = Node QuestionDotToken = Node AssertsKeyword = Node AssertKeyword = Node AwaitKeyword = Node CaseKeyword = Node AbstractKeyword = Node AccessorKeyword = Node AsyncKeyword = Node ConstKeyword = Node DeclareKeyword = Node DefaultKeyword = Node ExportKeyword = Node InKeyword = Node PrivateKeyword = Node ProtectedKeyword = Node PublicKeyword = Node ReadonlyKeyword = Node OutKeyword = Node OverrideKeyword = Node StaticKeyword = Node BinaryOperatorToken = Node AssignmentOperatorToken = Node NullLiteral = Node TrueLiteral = Node FalseLiteral = Node ThisExpression = Node SuperExpression = Node ImportExpression = 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[*ImportAttribute] TemplateLiteralTypeSpanList = NodeList // NodeList[*TemplateLiteralTypeSpan] JsxChildList = NodeList // NodeList[*JsxChild] JsxAttributeList = NodeList // NodeList[*JsxAttributeLike] ) // ────────────────────────────────────────────────────────────────────── // Node union aliases // ────────────────────────────────────────────────────────────────────── type ( Expression = Node // Node with ExpressionBase Statement = Node // Node with StatementBase TypeNode = Node // Node with TypeNodeBase BlockOrExpression = Node // Block | Expression NodeBody = Node // Block | Expression | ModuleBlock | ModuleDeclaration 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 JSDocFullName = Node // Identifier | 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 // Identifier | ThisExpression | 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 // PseudoLiteralSyntaxKind TemplateMiddleOrTail = Node // TemplateMiddle | TemplateTail TemplateLiteral = Node // TemplateExpression | NoSubstitutionTemplateLiteral TypePredicateParameterName = Node // Identifier | ThisTypeNode ImportAttributeName = Node // Identifier | StringLiteral LeftHandSideExpression = Node // Node with LeftHandSideExpressionBase JSDocComment = Node // JSDocText | JSDocLink | JSDocLinkCode | JSDocLinkPlain SignatureDeclaration = Node // CallSignatureDeclaration | ConstructSignatureDeclaration | MethodSignatureDeclaration | IndexSignatureDeclaration | FunctionTypeNode | ConstructorTypeNode | FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | AccessorDeclaration | FunctionExpression | ArrowFunction StringLiteralLikeNode = Node // StringLiteral | NoSubstitutionTemplateLiteral NumericOrStringLikeLiteral = Node // StringLiteralLikeNode | NumericLiteral ObjectLiteralLikeNode = 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 | JsxOpeningLikeElement | BinaryExpression FunctionLikeDeclaration = Node // FunctionDeclaration | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | ConstructorDeclaration | FunctionExpression | ArrowFunction VariableOrParameterDeclaration = Node // VariableDeclaration | ParameterDeclaration VariableOrPropertyDeclaration = Node // VariableDeclaration | PropertyDeclaration CallOrNewExpression = Node // CallExpression | NewExpression ImportClauseOrBindingPattern = Node // ImportClause | BindingPattern AnyImportSyntax = Node // ImportDeclaration | ImportEqualsDeclaration Declaration = Node // Node with DeclarationBase ClassElement = Node // Node with ClassElementBase TypeElement = Node // Node with TypeElementBase ObjectLiteralElement = Node // Node with ObjectLiteralElementBase JSDocTag = Node // Node with JSDocTagBase ArrayBindingElement = Node // BindingElement | OmittedExpression AssertionExpression = Node // TypeAssertion | AsExpression BooleanLiteral = Node // TrueLiteral | FalseLiteral ConciseBody = Node // Block | Expression DestructuringAssignment = Node // ObjectDestructuringAssignment | ArrayDestructuringAssignment LiteralToken = Node // NumericLiteral | BigIntLiteral | StringLiteral | JsxText | RegularExpressionLiteral | NoSubstitutionTemplateLiteral Modifier = Node // ModifierSyntaxKind ObjectLiteralElementLike = Node // PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration PropertyNameLiteral = Node // Identifier | StringLiteral | NumericLiteral PseudoLiteralToken = Node // PseudoLiteralSyntaxKind TemplateLiteralToken = Node // NoSubstitutionTemplateLiteral | PseudoLiteralToken ArrayDestructuringAssignment = Node // BinaryExpression ObjectDestructuringAssignment = Node // BinaryExpression FunctionBody = Node // Block IncrementExpression = Node // UpdateExpressionBase ) // ────────────────────────────────────────────────────────────────────── // Token // ────────────────────────────────────────────────────────────────────── type Token struct { NodeBase } func (f *NodeFactory) NewToken(kind TokenSyntaxKind) *Node { data := f.tokenArena.New() return f.newNode(kind, data) } func (node *Token) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewToken(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsToken(node *Node) bool { switch node.Kind { case KindUnknown, KindEndOfFile, KindSingleLineCommentTrivia, KindMultiLineCommentTrivia, KindNewLineTrivia, KindWhitespaceTrivia, KindConflictMarkerTrivia, KindNonTextFileMarkerTrivia, KindNumericLiteral, KindBigIntLiteral, KindStringLiteral, KindJsxText, KindJsxTextAllWhiteSpaces, KindRegularExpressionLiteral, KindNoSubstitutionTemplateLiteral, KindTemplateHead, KindTemplateMiddle, KindTemplateTail, KindOpenBraceToken, KindCloseBraceToken, KindOpenParenToken, KindCloseParenToken, KindOpenBracketToken, KindCloseBracketToken, KindDotToken, KindDotDotDotToken, KindSemicolonToken, KindCommaToken, KindQuestionDotToken, KindLessThanToken, KindLessThanSlashToken, KindGreaterThanToken, KindLessThanEqualsToken, KindGreaterThanEqualsToken, KindEqualsEqualsToken, KindExclamationEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindEqualsGreaterThanToken, KindPlusToken, KindMinusToken, KindAsteriskToken, KindAsteriskAsteriskToken, KindSlashToken, KindPercentToken, KindPlusPlusToken, KindMinusMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindExclamationToken, KindTildeToken, KindAmpersandAmpersandToken, KindBarBarToken, KindQuestionToken, KindColonToken, KindAtToken, KindQuestionQuestionToken, KindBacktickToken, KindHashToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskEqualsToken, KindAsteriskAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken, KindCaretEqualsToken, KindIdentifier, KindPrivateIdentifier, KindJSDocCommentTextToken, KindBreakKeyword, KindCaseKeyword, KindCatchKeyword, KindClassKeyword, KindConstKeyword, KindContinueKeyword, KindDebuggerKeyword, KindDefaultKeyword, KindDeleteKeyword, KindDoKeyword, KindElseKeyword, KindEnumKeyword, KindExportKeyword, KindExtendsKeyword, KindFalseKeyword, KindFinallyKeyword, KindForKeyword, KindFunctionKeyword, KindIfKeyword, KindImportKeyword, KindInKeyword, KindInstanceOfKeyword, KindNewKeyword, KindNullKeyword, KindReturnKeyword, KindSuperKeyword, KindSwitchKeyword, KindThisKeyword, KindThrowKeyword, KindTrueKeyword, KindTryKeyword, KindTypeOfKeyword, KindVarKeyword, KindVoidKeyword, KindWhileKeyword, KindWithKeyword, KindImplementsKeyword, KindInterfaceKeyword, KindLetKeyword, KindPackageKeyword, KindPrivateKeyword, KindProtectedKeyword, KindPublicKeyword, KindStaticKeyword, KindYieldKeyword, KindAbstractKeyword, KindAccessorKeyword, KindAsKeyword, KindAssertsKeyword, KindAssertKeyword, KindAnyKeyword, KindAsyncKeyword, KindAwaitKeyword, KindBooleanKeyword, KindConstructorKeyword, KindDeclareKeyword, KindGetKeyword, KindImmediateKeyword, KindInferKeyword, KindIntrinsicKeyword, KindIsKeyword, KindKeyOfKeyword, KindModuleKeyword, KindNamespaceKeyword, KindNeverKeyword, KindOutKeyword, KindReadonlyKeyword, KindRequireKeyword, KindNumberKeyword, KindObjectKeyword, KindSatisfiesKeyword, KindSetKeyword, KindStringKeyword, KindSymbolKeyword, KindTypeKeyword, KindUndefinedKeyword, KindUniqueKeyword, KindUnknownKeyword, KindUsingKeyword, KindFromKeyword, KindGlobalKeyword, KindBigIntKeyword, KindOverrideKeyword, KindOfKeyword, KindDeferKeyword: return true } return false } // ────────────────────────────────────────────────────────────────────── // Identifier // ────────────────────────────────────────────────────────────────────── type Identifier struct { PrimaryExpressionBase FlowNodeBase Text string } func (f *NodeFactory) NewIdentifier(text string) *Node { data := f.identifierArena.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 IsIdentifier(node *Node) bool { return node.Kind == KindIdentifier } // ────────────────────────────────────────────────────────────────────── // PrivateIdentifier // ────────────────────────────────────────────────────────────────────── type PrivateIdentifier struct { PrimaryExpressionBase 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 IsPrivateIdentifier(node *Node) bool { return node.Kind == KindPrivateIdentifier } // ────────────────────────────────────────────────────────────────────── // QualifiedName // ────────────────────────────────────────────────────────────────────── type QualifiedName struct { NodeBase FlowNodeBase CompositeBase Left *EntityName Right *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 (node *QualifiedName) computeSubtreeFacts() SubtreeFacts { return propagateSubtreeFacts(node.Left) | propagateSubtreeFacts(node.Right) } func IsQualifiedName(node *Node) bool { return node.Kind == KindQualifiedName } // ────────────────────────────────────────────────────────────────────── // ComputedPropertyName // ────────────────────────────────────────────────────────────────────── type ComputedPropertyName struct { NodeBase CompositeBase 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 } // ────────────────────────────────────────────────────────────────────── // Decorator // ────────────────────────────────────────────────────────────────────── type Decorator struct { NodeBase CompositeBase Expression *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 *LeftHandSideExpression) *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 IsDecorator(node *Node) bool { return node.Kind == KindDecorator } // ────────────────────────────────────────────────────────────────────── // EmptyStatement // ────────────────────────────────────────────────────────────────────── type EmptyStatement struct { StatementBase } func (f *NodeFactory) NewEmptyStatement() *Node { data := &EmptyStatement{} return f.newNode(KindEmptyStatement, data) } 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 CompositeBase Expression *Expression ThenStatement *Statement ElseStatement *Statement // Optional } func (f *NodeFactory) NewIfStatement(expression *Expression, thenStatement *Statement, elseStatement *Statement) *Node { data := f.ifStatementArena.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 { IterationStatementBase CompositeBase 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) ForEachChild(v Visitor) bool { return visit(v, node.Statement) || visit(v, node.Expression) } func (node *DoStatement) VisitEachChild(v *NodeVisitor) *Node { return v.Factory.UpdateDoStatement(node, v.visitIterationBody(node.Statement), v.visitNode(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) } func IsDoStatement(node *Node) bool { return node.Kind == KindDoStatement } // ────────────────────────────────────────────────────────────────────── // WhileStatement // ────────────────────────────────────────────────────────────────────── type WhileStatement struct { IterationStatementBase CompositeBase Expression *Expression } 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) } func IsWhileStatement(node *Node) bool { return node.Kind == KindWhileStatement } // ────────────────────────────────────────────────────────────────────── // ForStatement // ────────────────────────────────────────────────────────────────────── type ForStatement struct { IterationStatementBase LocalsContainerBase CompositeBase Initializer *ForInitializer // Optional Condition *Expression // Optional Incrementor *Expression // Optional } 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.Condition, 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 CompositeBase AwaitModifier *AwaitKeyword // Optional Initializer *ForInitializer Expression *Expression Statement *Statement } func (f *NodeFactory) NewForInOrOfStatement(kind Kind, awaitModifier *AwaitKeyword, 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 *AwaitKeyword, initializer *ForInitializer, expression *Expression, statement *Statement) *Node { if awaitModifier != node.AwaitModifier || initializer != node.Initializer || expression != node.Expression || statement != node.Statement { return updateNode(f.NewForInOrOfStatement(node.Kind, awaitModifier, initializer, expression, statement), node.AsNode(), f.hooks) } return 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.visitNode(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 IsForInStatement(node *Node) bool { return node.Kind == KindForInStatement } func IsForOfStatement(node *Node) bool { return node.Kind == KindForOfStatement } // ────────────────────────────────────────────────────────────────────── // BreakStatement // ────────────────────────────────────────────────────────────────────── type BreakStatement struct { StatementBase Label *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) } func IsBreakStatement(node *Node) bool { return node.Kind == KindBreakStatement } // ────────────────────────────────────────────────────────────────────── // ContinueStatement // ────────────────────────────────────────────────────────────────────── type ContinueStatement struct { StatementBase Label *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) } func IsContinueStatement(node *Node) bool { return node.Kind == KindContinueStatement } // ────────────────────────────────────────────────────────────────────── // ReturnStatement // ────────────────────────────────────────────────────────────────────── type ReturnStatement struct { StatementBase CompositeBase Expression *Expression // Optional } func (f *NodeFactory) NewReturnStatement(expression *Expression) *Node { data := f.returnStatementArena.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 IsReturnStatement(node *Node) bool { return node.Kind == KindReturnStatement } // ────────────────────────────────────────────────────────────────────── // WithStatement // ────────────────────────────────────────────────────────────────────── type WithStatement struct { StatementBase CompositeBase Expression *Expression 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) } func IsWithStatement(node *Node) bool { return node.Kind == KindWithStatement } // ────────────────────────────────────────────────────────────────────── // SwitchStatement // ────────────────────────────────────────────────────────────────────── type SwitchStatement struct { StatementBase CompositeBase Expression *Expression CaseBlock *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 CompositeBase Clauses *CaseClausesList } func (f *NodeFactory) NewCaseBlock(clauses *CaseClausesList) *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) } func IsCaseBlock(node *Node) bool { return node.Kind == KindCaseBlock } // ────────────────────────────────────────────────────────────────────── // CaseOrDefaultClause // ────────────────────────────────────────────────────────────────────── type CaseOrDefaultClause struct { NodeBase CompositeBase Expression *Expression Statements *StatementList FallthroughFlowNode *FlowNode } func (f *NodeFactory) NewCaseOrDefaultClause(kind Kind, expression *Expression, statements *StatementList) *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 CompositeBase 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 CompositeBase TryBlock *BlockNode CatchClause *CatchClauseNode // Optional FinallyBlock *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 CompositeBase VariableDeclaration *VariableDeclarationNode // Optional Block *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 IsCatchClause(node *Node) bool { return node.Kind == KindCatchClause } // ────────────────────────────────────────────────────────────────────── // DebuggerStatement // ────────────────────────────────────────────────────────────────────── type DebuggerStatement struct { StatementBase } func (f *NodeFactory) NewDebuggerStatement() *Node { data := &DebuggerStatement{} return f.newNode(KindDebuggerStatement, data) } func (node *DebuggerStatement) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewDebuggerStatement(), node.AsNode(), f.AsNodeFactory().hooks) } func IsDebuggerStatement(node *Node) bool { return node.Kind == KindDebuggerStatement } // ────────────────────────────────────────────────────────────────────── // LabeledStatement // ────────────────────────────────────────────────────────────────────── type LabeledStatement struct { StatementBase Label *IdentifierNode 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.Label) | propagateSubtreeFacts(node.Statement) } func IsLabeledStatement(node *Node) bool { return node.Kind == KindLabeledStatement } // ────────────────────────────────────────────────────────────────────── // ExpressionStatement // ────────────────────────────────────────────────────────────────────── type ExpressionStatement struct { StatementBase Expression *Expression } func (f *NodeFactory) NewExpressionStatement(expression *Expression) *Node { data := f.expressionStatementArena.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 CompositeBase Statements *StatementList MultiLine bool } func (f *NodeFactory) NewBlock(statements *StatementList, multiLine bool) *Node { data := f.blockArena.New() data.Statements = statements data.MultiLine = multiLine return f.newNode(KindBlock, data) } func (f *NodeFactory) UpdateBlock(node *Block, statements *StatementList, multiLine bool) *Node { if statements != node.Statements || multiLine != node.MultiLine { return updateNode(f.NewBlock(statements, 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), node.MultiLine) } 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 CompositeBase DeclarationList *VariableDeclarationListNode } func (f *NodeFactory) NewVariableStatement(modifiers *ModifierList, declarationList *VariableDeclarationListNode) *Node { data := f.variableStatementArena.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 IsVariableStatement(node *Node) bool { return node.Kind == KindVariableStatement } // ────────────────────────────────────────────────────────────────────── // VariableDeclaration // ────────────────────────────────────────────────────────────────────── type VariableDeclaration struct { NodeBase DeclarationBase ExportableBase CompositeBase name *BindingName ExclamationToken *ExclamationToken // Optional Type *TypeNode // Optional Initializer *Expression // Optional } func (f *NodeFactory) NewVariableDeclaration(name *BindingName, exclamationToken *ExclamationToken, typeNode *TypeNode, initializer *Expression) *Node { data := f.variableDeclarationArena.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 *ExclamationToken, 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.visitNode(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 IsVariableDeclaration(node *Node) bool { return node.Kind == KindVariableDeclaration } // ────────────────────────────────────────────────────────────────────── // VariableDeclarationList // ────────────────────────────────────────────────────────────────────── type VariableDeclarationList struct { NodeBase CompositeBase Declarations *VariableDeclarationNodeList } func (f *NodeFactory) NewVariableDeclarationList(declarations *VariableDeclarationNodeList, flags NodeFlags) *Node { data := f.variableDeclarationListArena.New() data.Declarations = declarations node := f.newNode(KindVariableDeclarationList, data) node.Flags = flags return node } func (f *NodeFactory) UpdateVariableDeclarationList(node *VariableDeclarationList, declarations *VariableDeclarationNodeList, flags NodeFlags) *Node { if declarations != node.Declarations || flags != node.Flags { return updateNode(f.NewVariableDeclarationList(declarations, flags), 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), node.Flags) } func (node *VariableDeclarationList) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewVariableDeclarationList(node.Declarations, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsVariableDeclarationList(node *Node) bool { return node.Kind == KindVariableDeclarationList } // ────────────────────────────────────────────────────────────────────── // BindingPattern // ────────────────────────────────────────────────────────────────────── type BindingPattern struct { NodeBase CompositeBase Elements *BindingElementList } func (f *NodeFactory) NewBindingPattern(kind Kind, elements *BindingElementList) *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 IsObjectBindingPattern(node *Node) bool { return node.Kind == KindObjectBindingPattern } func IsArrayBindingPattern(node *Node) bool { return node.Kind == KindArrayBindingPattern } // ────────────────────────────────────────────────────────────────────── // ParameterDeclaration // ────────────────────────────────────────────────────────────────────── type ParameterDeclaration struct { NodeBase DeclarationBase ModifiersBase CompositeBase DotDotDotToken *DotDotDotToken // Optional name *BindingName QuestionToken *QuestionToken // Optional Type *TypeNode // Optional Initializer *Expression // Optional } func (f *NodeFactory) NewParameterDeclaration(modifiers *ModifierList, dotDotDotToken *DotDotDotToken, name *BindingName, questionToken *QuestionToken, typeNode *TypeNode, initializer *Expression) *Node { data := f.parameterDeclarationArena.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 *DotDotDotToken, name *BindingName, questionToken *QuestionToken, 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.visitNode(node.DotDotDotToken), v.visitNode(node.name), v.visitNode(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) Name() *DeclarationName { return node.name } func IsParameterDeclaration(node *Node) bool { return node.Kind == KindParameter } // ────────────────────────────────────────────────────────────────────── // BindingElement // ────────────────────────────────────────────────────────────────────── type BindingElement struct { NodeBase DeclarationBase ExportableBase FlowNodeBase CompositeBase DotDotDotToken *DotDotDotToken // Optional PropertyName *PropertyName // Optional name *BindingName // Optional Initializer *Expression // Optional } func (f *NodeFactory) NewBindingElement(dotDotDotToken *DotDotDotToken, 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 *DotDotDotToken, 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.visitNode(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 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) } func IsMissingDeclaration(node *Node) bool { return node.Kind == KindMissingDeclaration } // ────────────────────────────────────────────────────────────────────── // FunctionDeclaration // ────────────────────────────────────────────────────────────────────── type FunctionDeclaration struct { DeclarationBase StatementBase ExportableBase ModifiersBase FunctionLikeWithBodyBase CompositeBase name *IdentifierNode // Optional ReturnFlowNode *FlowNode } func (f *NodeFactory) NewFunctionDeclaration(modifiers *ModifierList, asteriskToken *AsteriskToken, name *IdentifierNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { data := f.functionDeclarationArena.New() data.modifiers = modifiers data.AsteriskToken = asteriskToken data.name = name data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode data.FullSignature = fullSignature data.Body = body return f.newNode(KindFunctionDeclaration, data) } func (f *NodeFactory) UpdateFunctionDeclaration(node *FunctionDeclaration, modifiers *ModifierList, asteriskToken *AsteriskToken, name *IdentifierNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { if modifiers != node.modifiers || asteriskToken != node.AsteriskToken || name != node.name || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type || fullSignature != node.FullSignature || body != node.Body { return updateNode(f.NewFunctionDeclaration(modifiers, asteriskToken, name, typeParameters, parameters, typeNode, 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.visitNode(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 IsFunctionDeclaration(node *Node) bool { return node.Kind == KindFunctionDeclaration } // ────────────────────────────────────────────────────────────────────── // ClassDeclaration // ────────────────────────────────────────────────────────────────────── type ClassDeclaration struct { DeclarationBase StatementBase ClassLikeBase } func (f *NodeFactory) NewClassDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *ClassElementList) *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) 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 *ClassDeclaration) VisitEachChild(v *NodeVisitor) *Node { return v.Factory.UpdateClassDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNodes(node.TypeParameters), v.visitNodes(node.HeritageClauses), v.visitNodes(node.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) Name() *DeclarationName { return node.name } func IsClassDeclaration(node *Node) bool { return node.Kind == KindClassDeclaration } // ────────────────────────────────────────────────────────────────────── // ClassExpression // ────────────────────────────────────────────────────────────────────── type ClassExpression struct { PrimaryExpressionBase ClassLikeBase } func (f *NodeFactory) NewClassExpression(modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *ClassElementList) *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) 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 *ClassExpression) VisitEachChild(v *NodeVisitor) *Node { return v.Factory.UpdateClassExpression(node, v.visitModifiers(node.modifiers), v.visitNode(node.name), v.visitNodes(node.TypeParameters), v.visitNodes(node.HeritageClauses), v.visitNodes(node.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) Name() *DeclarationName { return node.name } func IsClassExpression(node *Node) bool { return node.Kind == KindClassExpression } // ────────────────────────────────────────────────────────────────────── // HeritageClause // ────────────────────────────────────────────────────────────────────── type HeritageClause struct { NodeBase CompositeBase Token Kind Types *ExpressionWithTypeArgumentsList } func (f *NodeFactory) NewHeritageClause(token Kind, types *ExpressionWithTypeArgumentsList) *Node { data := f.heritageClauseArena.New() data.Token = token data.Types = types return f.newNode(KindHeritageClause, data) } func (f *NodeFactory) UpdateHeritageClause(node *HeritageClause, token Kind, types *ExpressionWithTypeArgumentsList) *Node { if token != node.Token || types != node.Types { return updateNode(f.NewHeritageClause(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, node.Token, v.visitNodes(node.Types)) } func (node *HeritageClause) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewHeritageClause(node.Token, node.Types), node.AsNode(), f.AsNodeFactory().hooks) } func IsHeritageClause(node *Node) bool { return node.Kind == KindHeritageClause } // ────────────────────────────────────────────────────────────────────── // InterfaceDeclaration // ────────────────────────────────────────────────────────────────────── type InterfaceDeclaration struct { DeclarationBase StatementBase ExportableBase ModifiersBase TypeSyntaxBase name *IdentifierNode TypeParameters *TypeParameterList // Optional HeritageClauses *HeritageClauseList // Optional Members *TypeElementList } func (f *NodeFactory) NewInterfaceDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, heritageClauses *HeritageClauseList, members *TypeElementList) *Node { data := f.interfaceDeclarationArena.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 { DeclarationBase StatementBase ExportableBase ModifiersBase LocalsContainerBase TypeSyntaxBase name *IdentifierNode TypeParameters *TypeParameterList // Optional Type *TypeNode } func (f *NodeFactory) NewTypeAliasDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, typeNode *TypeNode) *Node { data := f.typeAliasDeclarationArena.New() data.modifiers = modifiers data.name = name data.TypeParameters = typeParameters data.Type = typeNode return f.newNode(KindTypeAliasDeclaration, data) } func (f *NodeFactory) NewJSTypeAliasDeclaration(modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, typeNode *TypeNode) *Node { data := f.typeAliasDeclarationArena.New() data.modifiers = modifiers data.name = name data.TypeParameters = typeParameters data.Type = typeNode return f.newNode(KindJSTypeAliasDeclaration, data) } func (f *NodeFactory) UpdateTypeAliasDeclaration(node *TypeAliasDeclaration, modifiers *ModifierList, name *IdentifierNode, typeParameters *TypeParameterList, typeNode *TypeNode) *Node { if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || typeNode != node.Type { switch node.Kind { case KindTypeAliasDeclaration: return updateNode(f.NewTypeAliasDeclaration(modifiers, name, typeParameters, typeNode), node.AsNode(), f.hooks) case KindJSTypeAliasDeclaration: return updateNode(f.NewJSTypeAliasDeclaration(modifiers, name, typeParameters, typeNode), node.AsNode(), f.hooks) default: panic("unexpected kind in UpdateTypeAliasDeclaration: " + node.Kind.String()) } } 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 { switch node.Kind { case KindTypeAliasDeclaration: return cloneNode(f.AsNodeFactory().NewTypeAliasDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) case KindJSTypeAliasDeclaration: return cloneNode(f.AsNodeFactory().NewJSTypeAliasDeclaration(node.Modifiers(), node.name, node.TypeParameters, node.Type), node.AsNode(), f.AsNodeFactory().hooks) default: panic("unexpected kind in TypeAliasDeclaration.Clone: " + node.Kind.String()) } } func (node *TypeAliasDeclaration) Name() *DeclarationName { return node.name } func IsTypeAliasDeclaration(node *Node) bool { return node.Kind == KindTypeAliasDeclaration } func IsJSTypeAliasDeclaration(node *Node) bool { return node.Kind == KindJSTypeAliasDeclaration } // ────────────────────────────────────────────────────────────────────── // EnumMember // ────────────────────────────────────────────────────────────────────── type EnumMember struct { NodeBase NamedMemberBase CompositeBase Initializer *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 IsEnumMember(node *Node) bool { return node.Kind == KindEnumMember } // ────────────────────────────────────────────────────────────────────── // EnumDeclaration // ────────────────────────────────────────────────────────────────────── type EnumDeclaration struct { DeclarationBase StatementBase ExportableBase ModifiersBase CompositeBase name *IdentifierNode Members *EnumMemberList } func (f *NodeFactory) NewEnumDeclaration(modifiers *ModifierList, name *IdentifierNode, members *EnumMemberList) *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 IsEnumDeclaration(node *Node) bool { return node.Kind == KindEnumDeclaration } // ────────────────────────────────────────────────────────────────────── // ModuleBlock // ────────────────────────────────────────────────────────────────────── type ModuleBlock struct { StatementBase CompositeBase Statements *StatementList } func (f *NodeFactory) NewModuleBlock(statements *StatementList) *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 } // ────────────────────────────────────────────────────────────────────── // NotEmittedStatement // ────────────────────────────────────────────────────────────────────── type NotEmittedStatement struct { StatementBase } func (f *NodeFactory) NewNotEmittedStatement() *Node { data := &NotEmittedStatement{} return f.newNode(KindNotEmittedStatement, data) } 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 // ────────────────────────────────────────────────────────────────────── type NotEmittedTypeElement struct { NodeBase TypeElementBase } func (f *NodeFactory) NewNotEmittedTypeElement() *Node { data := &NotEmittedTypeElement{} return f.newNode(KindNotEmittedTypeElement, data) } 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 } // ────────────────────────────────────────────────────────────────────── // ImportDeclaration // ────────────────────────────────────────────────────────────────────── type ImportDeclaration struct { StatementBase ModifiersBase CompositeBase DeclarationBase ImportClause *ImportClauseNode // Optional ModuleSpecifier *Expression Attributes *ImportAttributesNode // Optional } func (f *NodeFactory) NewImportDeclaration(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(KindImportDeclaration, data) } func (f *NodeFactory) NewJSImportDeclaration(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(KindJSImportDeclaration, data) } func (f *NodeFactory) UpdateImportDeclaration(node *ImportDeclaration, modifiers *ModifierList, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode) *Node { if modifiers != node.modifiers || importClause != node.ImportClause || moduleSpecifier != node.ModuleSpecifier || attributes != node.Attributes { switch node.Kind { case KindImportDeclaration: return updateNode(f.NewImportDeclaration(modifiers, importClause, moduleSpecifier, attributes), node.AsNode(), f.hooks) case KindJSImportDeclaration: return updateNode(f.NewJSImportDeclaration(modifiers, importClause, moduleSpecifier, attributes), node.AsNode(), f.hooks) default: panic("unexpected kind in UpdateImportDeclaration: " + node.Kind.String()) } } 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 { switch node.Kind { case KindImportDeclaration: return cloneNode(f.AsNodeFactory().NewImportDeclaration(node.Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) case KindJSImportDeclaration: return cloneNode(f.AsNodeFactory().NewJSImportDeclaration(node.Modifiers(), node.ImportClause, node.ModuleSpecifier, node.Attributes), node.AsNode(), f.AsNodeFactory().hooks) default: panic("unexpected kind in ImportDeclaration.Clone: " + node.Kind.String()) } } 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 IsJSImportDeclaration(node *Node) bool { return node.Kind == KindJSImportDeclaration } // ────────────────────────────────────────────────────────────────────── // ExternalModuleReference // ────────────────────────────────────────────────────────────────────── type ExternalModuleReference struct { NodeBase 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 } // ────────────────────────────────────────────────────────────────────── // NamespaceImport // ────────────────────────────────────────────────────────────────────── type NamespaceImport struct { NodeBase DeclarationBase ExportableBase name *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) computeSubtreeFacts() SubtreeFacts { return propagateSubtreeFacts(node.name) } func (node *NamespaceImport) Name() *DeclarationName { return node.name } func IsNamespaceImport(node *Node) bool { return node.Kind == KindNamespaceImport } // ────────────────────────────────────────────────────────────────────── // NamedImports // ────────────────────────────────────────────────────────────────────── type NamedImports struct { NodeBase CompositeBase Elements *ImportSpecifierList } 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 // ────────────────────────────────────────────────────────────────────── type ExportAssignment struct { DeclarationBase StatementBase ModifiersBase CompositeBase IsExportEquals bool Type *TypeNode Expression *Expression } func (f *NodeFactory) NewExportAssignment(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(KindExportAssignment, data) } func (f *NodeFactory) UpdateExportAssignment(node *ExportAssignment, modifiers *ModifierList, isExportEquals bool, typeNode *TypeNode, expression *Expression) *Node { if modifiers != node.modifiers || isExportEquals != node.IsExportEquals || typeNode != node.Type || expression != node.Expression { return updateNode(f.NewExportAssignment(modifiers, 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), node.IsExportEquals, v.visitNode(node.Type), v.visitNode(node.Expression)) } func (node *ExportAssignment) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewExportAssignment(node.Modifiers(), node.IsExportEquals, node.Type, node.Expression), node.AsNode(), f.AsNodeFactory().hooks) } func IsExportAssignment(node *Node) bool { return node.Kind == KindExportAssignment } // ────────────────────────────────────────────────────────────────────── // NamespaceExportDeclaration // ────────────────────────────────────────────────────────────────────── type NamespaceExportDeclaration struct { DeclarationBase StatementBase ModifiersBase TypeSyntaxBase name *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 } // ────────────────────────────────────────────────────────────────────── // NamespaceExport // ────────────────────────────────────────────────────────────────────── type NamespaceExport struct { NodeBase DeclarationBase name *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) computeSubtreeFacts() SubtreeFacts { return propagateSubtreeFacts(node.name) } func (node *NamespaceExport) Name() *DeclarationName { return node.name } func IsNamespaceExport(node *Node) bool { return node.Kind == KindNamespaceExport } // ────────────────────────────────────────────────────────────────────── // NamedExports // ────────────────────────────────────────────────────────────────────── type NamedExports struct { NodeBase CompositeBase Elements *ExportSpecifierList } func (f *NodeFactory) NewNamedExports(elements *ExportSpecifierList) *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 CompositeBase IsTypeOnly bool PropertyName *ModuleExportName // Optional name *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 IsExportSpecifier(node *Node) bool { return node.Kind == KindExportSpecifier } // ────────────────────────────────────────────────────────────────────── // CallSignatureDeclaration // ────────────────────────────────────────────────────────────────────── type CallSignatureDeclaration struct { NodeBase DeclarationBase FunctionLikeBase TypeElementBase TypeSyntaxBase } func (f *NodeFactory) NewCallSignatureDeclaration(typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { data := &CallSignatureDeclaration{} data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode return f.newNode(KindCallSignature, data) } func (f *NodeFactory) UpdateCallSignatureDeclaration(node *CallSignatureDeclaration, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { if typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type { return updateNode(f.NewCallSignatureDeclaration(typeParameters, parameters, typeNode), 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 *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { data := f.constructSignatureDeclarationArena.New() data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode return f.newNode(KindConstructSignature, data) } func (f *NodeFactory) UpdateConstructSignatureDeclaration(node *ConstructSignatureDeclaration, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { if typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type { return updateNode(f.NewConstructSignatureDeclaration(typeParameters, parameters, typeNode), 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 CompositeBase ReturnFlowNode *FlowNode } func (f *NodeFactory) NewConstructorDeclaration(modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { data := &ConstructorDeclaration{} data.modifiers = modifiers data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode data.FullSignature = fullSignature data.Body = body return f.newNode(KindConstructor, data) } func (f *NodeFactory) UpdateConstructorDeclaration(node *ConstructorDeclaration, modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { if modifiers != node.modifiers || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type || fullSignature != node.FullSignature || body != node.Body { return updateNode(f.NewConstructorDeclaration(modifiers, typeParameters, parameters, typeNode, 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 IsConstructorDeclaration(node *Node) bool { return node.Kind == KindConstructor } // ────────────────────────────────────────────────────────────────────── // GetAccessorDeclaration // ────────────────────────────────────────────────────────────────────── type GetAccessorDeclaration struct { AccessorDeclarationBase } func (f *NodeFactory) NewGetAccessorDeclaration(modifiers *ModifierList, name *PropertyName, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { data := &GetAccessorDeclaration{} data.modifiers = modifiers data.name = name data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode 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, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type || fullSignature != node.FullSignature || body != node.Body { return updateNode(f.NewGetAccessorDeclaration(modifiers, name, typeParameters, parameters, typeNode, fullSignature, body), node.AsNode(), f.hooks) } return node.AsNode() } func (node *GetAccessorDeclaration) 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 *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 (node *GetAccessorDeclaration) Name() *DeclarationName { return node.name } func IsGetAccessorDeclaration(node *Node) bool { return node.Kind == KindGetAccessor } // ────────────────────────────────────────────────────────────────────── // SetAccessorDeclaration // ────────────────────────────────────────────────────────────────────── type SetAccessorDeclaration struct { AccessorDeclarationBase } func (f *NodeFactory) NewSetAccessorDeclaration(modifiers *ModifierList, name *PropertyName, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { data := &SetAccessorDeclaration{} data.modifiers = modifiers data.name = name data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode 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, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { if modifiers != node.modifiers || name != node.name || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type || fullSignature != node.FullSignature || body != node.Body { return updateNode(f.NewSetAccessorDeclaration(modifiers, name, typeParameters, parameters, typeNode, fullSignature, body), node.AsNode(), f.hooks) } return node.AsNode() } func (node *SetAccessorDeclaration) 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 *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 (node *SetAccessorDeclaration) Name() *DeclarationName { return node.name } 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 *ParameterList, typeNode *TypeNode) *Node { data := &IndexSignatureDeclaration{} data.modifiers = modifiers data.Parameters = parameters data.Type = typeNode return f.newNode(KindIndexSignature, data) } func (f *NodeFactory) UpdateIndexSignatureDeclaration(node *IndexSignatureDeclaration, modifiers *ModifierList, parameters *ParameterList, typeNode *TypeNode) *Node { if modifiers != node.modifiers || parameters != node.Parameters || typeNode != node.Type { return updateNode(f.NewIndexSignatureDeclaration(modifiers, parameters, typeNode), 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 *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { data := f.methodSignatureDeclarationArena.New() data.modifiers = modifiers data.name = name data.PostfixToken = postfixToken data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode return f.newNode(KindMethodSignature, data) } func (f *NodeFactory) UpdateMethodSignatureDeclaration(node *MethodSignatureDeclaration, modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { if modifiers != node.modifiers || name != node.name || postfixToken != node.PostfixToken || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type { return updateNode(f.NewMethodSignatureDeclaration(modifiers, name, postfixToken, typeParameters, parameters, typeNode), 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.visitNode(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 (node *MethodSignatureDeclaration) Name() *DeclarationName { return node.name } func IsMethodSignatureDeclaration(node *Node) bool { return node.Kind == KindMethodSignature } // ────────────────────────────────────────────────────────────────────── // MethodDeclaration // ────────────────────────────────────────────────────────────────────── type MethodDeclaration struct { NodeBase NamedMemberBase FunctionLikeWithBodyBase FlowNodeBase ClassElementBase ObjectLiteralElementBase CompositeBase } func (f *NodeFactory) NewMethodDeclaration(modifiers *ModifierList, asteriskToken *AsteriskToken, name *PropertyName, postfixToken *TokenNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { data := &MethodDeclaration{} data.modifiers = modifiers data.AsteriskToken = asteriskToken data.name = name data.PostfixToken = postfixToken data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode data.FullSignature = fullSignature data.Body = body return f.newNode(KindMethodDeclaration, data) } func (f *NodeFactory) UpdateMethodDeclaration(node *MethodDeclaration, modifiers *ModifierList, asteriskToken *AsteriskToken, name *PropertyName, postfixToken *TokenNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { if modifiers != node.modifiers || asteriskToken != node.AsteriskToken || name != node.name || postfixToken != node.PostfixToken || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type || fullSignature != node.FullSignature || body != node.Body { return updateNode(f.NewMethodDeclaration(modifiers, asteriskToken, name, postfixToken, typeParameters, parameters, typeNode, 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.visitNode(node.AsteriskToken), v.visitNode(node.name), v.visitNode(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) Name() *DeclarationName { return node.name } func IsMethodDeclaration(node *Node) bool { return node.Kind == KindMethodDeclaration } // ────────────────────────────────────────────────────────────────────── // PropertySignatureDeclaration // ────────────────────────────────────────────────────────────────────── type PropertySignatureDeclaration struct { NodeBase NamedMemberBase TypeElementBase TypeSyntaxBase Type *TypeNode Initializer *Expression } func (f *NodeFactory) NewPropertySignatureDeclaration(modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node { data := f.propertySignatureDeclarationArena.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.visitNode(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 (node *PropertySignatureDeclaration) Name() *DeclarationName { return node.name } func IsPropertySignatureDeclaration(node *Node) bool { return node.Kind == KindPropertySignature } // ────────────────────────────────────────────────────────────────────── // PropertyDeclaration // ────────────────────────────────────────────────────────────────────── type PropertyDeclaration struct { NodeBase NamedMemberBase ClassElementBase CompositeBase Type *TypeNode // Optional Initializer *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.visitNode(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) Name() *DeclarationName { return node.name } func IsPropertyDeclaration(node *Node) bool { return node.Kind == KindPropertyDeclaration } // ────────────────────────────────────────────────────────────────────── // SemicolonClassElement // ────────────────────────────────────────────────────────────────────── type SemicolonClassElement struct { NodeBase DeclarationBase ClassElementBase } func (f *NodeFactory) NewSemicolonClassElement() *Node { data := &SemicolonClassElement{} return f.newNode(KindSemicolonClassElement, data) } func (node *SemicolonClassElement) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewSemicolonClassElement(), node.AsNode(), f.AsNodeFactory().hooks) } func IsSemicolonClassElement(node *Node) bool { return node.Kind == KindSemicolonClassElement } // ────────────────────────────────────────────────────────────────────── // ClassStaticBlockDeclaration // ────────────────────────────────────────────────────────────────────── type ClassStaticBlockDeclaration struct { NodeBase DeclarationBase ModifiersBase LocalsContainerBase ClassElementBase CompositeBase Body *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 { return v.Factory.UpdateClassStaticBlockDeclaration(node, v.visitModifiers(node.modifiers), v.visitNode(node.Body)) } func (node *ClassStaticBlockDeclaration) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewClassStaticBlockDeclaration(node.Modifiers(), node.Body), node.AsNode(), f.AsNodeFactory().hooks) } func IsClassStaticBlockDeclaration(node *Node) bool { return node.Kind == KindClassStaticBlockDeclaration } // ────────────────────────────────────────────────────────────────────── // OmittedExpression // ────────────────────────────────────────────────────────────────────── type OmittedExpression struct { ExpressionBase } func (f *NodeFactory) NewOmittedExpression() *Node { data := &OmittedExpression{} return f.newNode(KindOmittedExpression, data) } 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 } func (f *NodeFactory) NewKeywordExpression(kind KeywordExpressionSyntaxKind) *Node { data := f.keywordExpressionArena.New() return f.newNode(kind, data) } func (node *KeywordExpression) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewKeywordExpression(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsKeywordExpression(node *Node) bool { switch node.Kind { case KindNullKeyword, KindTrueKeyword, KindFalseKeyword, KindThisKeyword, KindSuperKeyword, KindImportKeyword: return true } return false } // ────────────────────────────────────────────────────────────────────── // StringLiteral // ────────────────────────────────────────────────────────────────────── type StringLiteral struct { LiteralExpressionBase } func (f *NodeFactory) NewStringLiteral(text string, tokenFlags TokenFlags) *Node { data := f.stringLiteralArena.New() data.Text = text data.TokenFlags = tokenFlags & TokenFlagsStringLiteralFlags f.textCount++ return f.newNode(KindStringLiteral, data) } func (node *StringLiteral) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewStringLiteral(node.Text, node.TokenFlags), node.AsNode(), f.AsNodeFactory().hooks) } func IsStringLiteral(node *Node) bool { return node.Kind == KindStringLiteral } // ────────────────────────────────────────────────────────────────────── // NumericLiteral // ────────────────────────────────────────────────────────────────────── type NumericLiteral struct { LiteralExpressionBase } func (f *NodeFactory) NewNumericLiteral(text string, tokenFlags TokenFlags) *Node { data := f.numericLiteralArena.New() data.Text = text data.TokenFlags = tokenFlags & TokenFlagsNumericLiteralFlags f.textCount++ return f.newNode(KindNumericLiteral, data) } func (node *NumericLiteral) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewNumericLiteral(node.Text, node.TokenFlags), node.AsNode(), f.AsNodeFactory().hooks) } func IsNumericLiteral(node *Node) bool { return node.Kind == KindNumericLiteral } // ────────────────────────────────────────────────────────────────────── // BigIntLiteral // ────────────────────────────────────────────────────────────────────── type BigIntLiteral struct { LiteralExpressionBase } func (f *NodeFactory) NewBigIntLiteral(text string, tokenFlags TokenFlags) *Node { data := &BigIntLiteral{} data.Text = text data.TokenFlags = tokenFlags & TokenFlagsNumericLiteralFlags f.textCount++ return f.newNode(KindBigIntLiteral, data) } func (node *BigIntLiteral) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewBigIntLiteral(node.Text, node.TokenFlags), node.AsNode(), f.AsNodeFactory().hooks) } func IsBigIntLiteral(node *Node) bool { return node.Kind == KindBigIntLiteral } // ────────────────────────────────────────────────────────────────────── // RegularExpressionLiteral // ────────────────────────────────────────────────────────────────────── type RegularExpressionLiteral struct { LiteralExpressionBase } func (f *NodeFactory) NewRegularExpressionLiteral(text string, tokenFlags TokenFlags) *Node { data := &RegularExpressionLiteral{} data.Text = text data.TokenFlags = tokenFlags & TokenFlagsRegularExpressionLiteralFlags f.textCount++ return f.newNode(KindRegularExpressionLiteral, data) } func (node *RegularExpressionLiteral) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewRegularExpressionLiteral(node.Text, node.TokenFlags), node.AsNode(), f.AsNodeFactory().hooks) } func IsRegularExpressionLiteral(node *Node) bool { return node.Kind == KindRegularExpressionLiteral } // ────────────────────────────────────────────────────────────────────── // NoSubstitutionTemplateLiteral // ────────────────────────────────────────────────────────────────────── type NoSubstitutionTemplateLiteral struct { ExpressionBase TemplateLiteralLikeNodeBase DeclarationBase } func (f *NodeFactory) NewNoSubstitutionTemplateLiteral(text string, templateFlags TokenFlags) *Node { data := &NoSubstitutionTemplateLiteral{} data.Text = text data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags f.textCount++ return f.newNode(KindNoSubstitutionTemplateLiteral, data) } func (node *NoSubstitutionTemplateLiteral) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewNoSubstitutionTemplateLiteral(node.Text, node.TemplateFlags), node.AsNode(), f.AsNodeFactory().hooks) } func IsNoSubstitutionTemplateLiteral(node *Node) bool { return node.Kind == KindNoSubstitutionTemplateLiteral } // ────────────────────────────────────────────────────────────────────── // BinaryExpression // ────────────────────────────────────────────────────────────────────── type BinaryExpression struct { ExpressionBase DeclarationBase ModifiersBase CompositeBase Left *Expression Type *TypeNode // Optional OperatorToken *BinaryOperatorToken Right *Expression } func (f *NodeFactory) NewBinaryExpression(modifiers *ModifierList, left *Expression, typeNode *TypeNode, operatorToken *BinaryOperatorToken, right *Expression) *Node { data := f.binaryExpressionArena.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 *BinaryOperatorToken, right *Expression) *Node { if modifiers != node.modifiers || 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.visitNode(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 IsBinaryExpression(node *Node) bool { return node.Kind == KindBinaryExpression } // ────────────────────────────────────────────────────────────────────── // PrefixUnaryExpression // ────────────────────────────────────────────────────────────────────── type PrefixUnaryExpression struct { UpdateExpressionBase Operator Kind Operand *Expression } func (f *NodeFactory) NewPrefixUnaryExpression(operator Kind, operand *Expression) *Node { data := f.prefixUnaryExpressionArena.New() data.Operator = operator data.Operand = operand return f.newNode(KindPrefixUnaryExpression, data) } func (f *NodeFactory) UpdatePrefixUnaryExpression(node *PrefixUnaryExpression, operator Kind, operand *Expression) *Node { if operator != node.Operator || operand != node.Operand { return updateNode(f.NewPrefixUnaryExpression(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, node.Operator, 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 { UpdateExpressionBase Operand *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, operator Kind) *Node { if operand != node.Operand || operator != node.Operator { return updateNode(f.NewPostfixUnaryExpression(operand, 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), node.Operator) } 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) } func IsPostfixUnaryExpression(node *Node) bool { return node.Kind == KindPostfixUnaryExpression } // ────────────────────────────────────────────────────────────────────── // YieldExpression // ────────────────────────────────────────────────────────────────────── type YieldExpression struct { ExpressionBase AsteriskToken *AsteriskToken // Optional Expression *Expression // Optional } func (f *NodeFactory) NewYieldExpression(asteriskToken *AsteriskToken, expression *Expression) *Node { data := &YieldExpression{} data.AsteriskToken = asteriskToken data.Expression = expression return f.newNode(KindYieldExpression, data) } func (f *NodeFactory) UpdateYieldExpression(node *YieldExpression, asteriskToken *AsteriskToken, 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.visitNode(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 IsYieldExpression(node *Node) bool { return node.Kind == KindYieldExpression } // ────────────────────────────────────────────────────────────────────── // ArrowFunction // ────────────────────────────────────────────────────────────────────── type ArrowFunction struct { ExpressionBase DeclarationBase ModifiersBase FunctionLikeWithBodyBase FlowNodeBase CompositeBase EqualsGreaterThanToken *EqualsGreaterThanToken } func (f *NodeFactory) NewArrowFunction(modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, equalsGreaterThanToken *EqualsGreaterThanToken, body *ConciseBody) *Node { data := &ArrowFunction{} data.modifiers = modifiers data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode 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, typeNode *TypeNode, fullSignature *TypeNode, equalsGreaterThanToken *EqualsGreaterThanToken, body *ConciseBody) *Node { if modifiers != node.modifiers || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type || fullSignature != node.FullSignature || equalsGreaterThanToken != node.EqualsGreaterThanToken || body != node.Body { return updateNode(f.NewArrowFunction(modifiers, typeParameters, parameters, typeNode, 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.visitNode(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 IsArrowFunction(node *Node) bool { return node.Kind == KindArrowFunction } // ────────────────────────────────────────────────────────────────────── // FunctionExpression // ────────────────────────────────────────────────────────────────────── type FunctionExpression struct { PrimaryExpressionBase DeclarationBase ModifiersBase FunctionLikeWithBodyBase FlowNodeBase CompositeBase name *IdentifierNode // Optional ReturnFlowNode *FlowNode } func (f *NodeFactory) NewFunctionExpression(modifiers *ModifierList, asteriskToken *AsteriskToken, name *IdentifierNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { data := &FunctionExpression{} data.modifiers = modifiers data.AsteriskToken = asteriskToken data.name = name data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode data.FullSignature = fullSignature data.Body = body return f.newNode(KindFunctionExpression, data) } func (f *NodeFactory) UpdateFunctionExpression(node *FunctionExpression, modifiers *ModifierList, asteriskToken *AsteriskToken, name *IdentifierNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode, fullSignature *TypeNode, body *FunctionBody) *Node { if modifiers != node.modifiers || asteriskToken != node.AsteriskToken || name != node.name || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type || fullSignature != node.FullSignature || body != node.Body { return updateNode(f.NewFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, typeNode, 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.visitNode(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 IsFunctionExpression(node *Node) bool { return node.Kind == KindFunctionExpression } // ────────────────────────────────────────────────────────────────────── // AsExpression // ────────────────────────────────────────────────────────────────────── type AsExpression struct { ExpressionBase Expression *Expression Type *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 IsAsExpression(node *Node) bool { return node.Kind == KindAsExpression } // ────────────────────────────────────────────────────────────────────── // SatisfiesExpression // ────────────────────────────────────────────────────────────────────── type SatisfiesExpression struct { ExpressionBase Expression *Expression Type *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 IsSatisfiesExpression(node *Node) bool { return node.Kind == KindSatisfiesExpression } // ────────────────────────────────────────────────────────────────────── // ConditionalExpression // ────────────────────────────────────────────────────────────────────── type ConditionalExpression struct { ExpressionBase CompositeBase Condition *Expression QuestionToken *QuestionToken WhenTrue *Expression ColonToken *ColonToken WhenFalse *Expression } func (f *NodeFactory) NewConditionalExpression(condition *Expression, questionToken *QuestionToken, whenTrue *Expression, colonToken *ColonToken, whenFalse *Expression) *Node { data := f.conditionalExpressionArena.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 *QuestionToken, whenTrue *Expression, colonToken *ColonToken, 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.visitNode(node.QuestionToken), v.visitNode(node.WhenTrue), v.visitNode(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.QuestionToken) | propagateSubtreeFacts(node.WhenTrue) | propagateSubtreeFacts(node.ColonToken) | propagateSubtreeFacts(node.WhenFalse) } func IsConditionalExpression(node *Node) bool { return node.Kind == KindConditionalExpression } // ────────────────────────────────────────────────────────────────────── // PropertyAccessExpression // ────────────────────────────────────────────────────────────────────── type PropertyAccessExpression struct { MemberExpressionBase FlowNodeBase CompositeBase Expression *Expression QuestionDotToken *QuestionDotToken // Optional name *MemberName } func (f *NodeFactory) NewPropertyAccessExpression(expression *Expression, questionDotToken *QuestionDotToken, name *MemberName, flags NodeFlags) *Node { data := f.propertyAccessExpressionArena.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 *QuestionDotToken, name *MemberName, flags NodeFlags) *Node { if expression != node.Expression || questionDotToken != node.QuestionDotToken || name != node.name || flags != node.Flags { return updateNode(f.NewPropertyAccessExpression(expression, questionDotToken, name, flags), node.AsNode(), f.hooks) } return node.AsNode() } 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.visitNode(node.QuestionDotToken), v.visitNode(node.name), node.Flags) } func (node *PropertyAccessExpression) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewPropertyAccessExpression(node.Expression, node.QuestionDotToken, node.name, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func (node *PropertyAccessExpression) Name() *DeclarationName { return node.name } func IsPropertyAccessExpression(node *Node) bool { return node.Kind == KindPropertyAccessExpression } // ────────────────────────────────────────────────────────────────────── // ElementAccessExpression // ────────────────────────────────────────────────────────────────────── type ElementAccessExpression struct { MemberExpressionBase FlowNodeBase CompositeBase Expression *Expression QuestionDotToken *QuestionDotToken // Optional ArgumentExpression *Expression } func (f *NodeFactory) NewElementAccessExpression(expression *Expression, questionDotToken *QuestionDotToken, argumentExpression *Expression, flags NodeFlags) *Node { data := f.elementAccessExpressionArena.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 *QuestionDotToken, argumentExpression *Expression, flags NodeFlags) *Node { if expression != node.Expression || questionDotToken != node.QuestionDotToken || argumentExpression != node.ArgumentExpression || flags != node.Flags { return updateNode(f.NewElementAccessExpression(expression, questionDotToken, argumentExpression, flags), node.AsNode(), f.hooks) } return node.AsNode() } 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.visitNode(node.QuestionDotToken), v.visitNode(node.ArgumentExpression), node.Flags) } func (node *ElementAccessExpression) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewElementAccessExpression(node.Expression, node.QuestionDotToken, node.ArgumentExpression, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func (node *ElementAccessExpression) computeSubtreeFacts() SubtreeFacts { return propagateSubtreeFacts(node.Expression) | propagateSubtreeFacts(node.QuestionDotToken) | propagateSubtreeFacts(node.ArgumentExpression) } func IsElementAccessExpression(node *Node) bool { return node.Kind == KindElementAccessExpression } // ────────────────────────────────────────────────────────────────────── // CallExpression // ────────────────────────────────────────────────────────────────────── type CallExpression struct { LeftHandSideExpressionBase DeclarationBase CompositeBase Expression *Expression QuestionDotToken *QuestionDotToken // Optional TypeArguments *TypeList // Optional Arguments *ElementList } func (f *NodeFactory) NewCallExpression(expression *Expression, questionDotToken *QuestionDotToken, typeArguments *TypeList, arguments *ElementList, flags NodeFlags) *Node { data := f.callExpressionArena.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 *QuestionDotToken, typeArguments *TypeList, arguments *ElementList, flags NodeFlags) *Node { if expression != node.Expression || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || arguments != node.Arguments || flags != node.Flags { return updateNode(f.NewCallExpression(expression, questionDotToken, typeArguments, arguments, flags), node.AsNode(), f.hooks) } return node.AsNode() } 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.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNodes(node.Arguments), node.Flags) } func (node *CallExpression) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewCallExpression(node.Expression, node.QuestionDotToken, node.TypeArguments, node.Arguments, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsCallExpression(node *Node) bool { return node.Kind == KindCallExpression } // ────────────────────────────────────────────────────────────────────── // NewExpression // ────────────────────────────────────────────────────────────────────── type NewExpression struct { PrimaryExpressionBase CompositeBase Expression *Expression TypeArguments *TypeList // Optional Arguments *ElementList // Optional } func (f *NodeFactory) NewNewExpression(expression *Expression, typeArguments *TypeList, arguments *ElementList) *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 *TypeList, arguments *ElementList) *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 IsNewExpression(node *Node) bool { return node.Kind == KindNewExpression } // ────────────────────────────────────────────────────────────────────── // MetaProperty // ────────────────────────────────────────────────────────────────────── type MetaProperty struct { PrimaryExpressionBase FlowNodeBase CompositeBase KeywordToken Kind name *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, keywordToken Kind, name *IdentifierNode) *Node { if keywordToken != node.KeywordToken || name != node.name { return updateNode(f.NewMetaProperty(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, node.KeywordToken, v.visitNode(node.name)) } func (node *MetaProperty) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewMetaProperty(node.KeywordToken, node.name), node.AsNode(), f.AsNodeFactory().hooks) } func (node *MetaProperty) Name() *DeclarationName { return node.name } func IsMetaProperty(node *Node) bool { return node.Kind == KindMetaProperty } // ────────────────────────────────────────────────────────────────────── // NonNullExpression // ────────────────────────────────────────────────────────────────────── type NonNullExpression struct { LeftHandSideExpressionBase Expression *Expression } func (f *NodeFactory) NewNonNullExpression(expression *Expression, flags NodeFlags) *Node { data := &NonNullExpression{} data.Expression = expression node := f.newNode(KindNonNullExpression, data) node.Flags |= flags & NodeFlagsOptionalChain return node } func (f *NodeFactory) UpdateNonNullExpression(node *NonNullExpression, expression *Expression, flags NodeFlags) *Node { if expression != node.Expression || flags != node.Flags { return updateNode(f.NewNonNullExpression(expression, 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), node.Flags) } func (node *NonNullExpression) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewNonNullExpression(node.Expression, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsNonNullExpression(node *Node) bool { return node.Kind == KindNonNullExpression } // ────────────────────────────────────────────────────────────────────── // SpreadElement // ────────────────────────────────────────────────────────────────────── type SpreadElement struct { ExpressionBase 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 IsSpreadElement(node *Node) bool { return node.Kind == KindSpreadElement } // ────────────────────────────────────────────────────────────────────── // TemplateExpression // ────────────────────────────────────────────────────────────────────── type TemplateExpression struct { PrimaryExpressionBase CompositeBase Head *TemplateHeadNode TemplateSpans *TemplateSpanList } func (f *NodeFactory) NewTemplateExpression(head *TemplateHeadNode, templateSpans *TemplateSpanList) *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 } // ────────────────────────────────────────────────────────────────────── // TemplateSpan // ────────────────────────────────────────────────────────────────────── type TemplateSpan struct { NodeBase Expression *Expression Literal *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) | propagateSubtreeFacts(node.Literal) } func IsTemplateSpan(node *Node) bool { return node.Kind == KindTemplateSpan } // ────────────────────────────────────────────────────────────────────── // TaggedTemplateExpression // ────────────────────────────────────────────────────────────────────── type TaggedTemplateExpression struct { MemberExpressionBase CompositeBase Tag *Expression QuestionDotToken *QuestionDotToken TypeArguments *TypeList // Optional Template *TemplateLiteral } func (f *NodeFactory) NewTaggedTemplateExpression(tag *Expression, questionDotToken *QuestionDotToken, typeArguments *TypeList, 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 *QuestionDotToken, typeArguments *TypeList, template *TemplateLiteral, flags NodeFlags) *Node { if tag != node.Tag || questionDotToken != node.QuestionDotToken || typeArguments != node.TypeArguments || template != node.Template || flags != node.Flags { return updateNode(f.NewTaggedTemplateExpression(tag, questionDotToken, typeArguments, template, flags), node.AsNode(), f.hooks) } return node.AsNode() } 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.visitNode(node.QuestionDotToken), v.visitNodes(node.TypeArguments), v.visitNode(node.Template), node.Flags) } func (node *TaggedTemplateExpression) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewTaggedTemplateExpression(node.Tag, node.QuestionDotToken, node.TypeArguments, node.Template, node.Flags), node.AsNode(), f.AsNodeFactory().hooks) } func IsTaggedTemplateExpression(node *Node) bool { return node.Kind == KindTaggedTemplateExpression } // ────────────────────────────────────────────────────────────────────── // ParenthesizedExpression // ────────────────────────────────────────────────────────────────────── type ParenthesizedExpression struct { PrimaryExpressionBase Expression *Expression } func (f *NodeFactory) NewParenthesizedExpression(expression *Expression) *Node { data := f.parenthesizedExpressionArena.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 IsParenthesizedExpression(node *Node) bool { return node.Kind == KindParenthesizedExpression } // ────────────────────────────────────────────────────────────────────── // ArrayLiteralExpression // ────────────────────────────────────────────────────────────────────── type ArrayLiteralExpression struct { PrimaryExpressionBase CompositeBase Elements *ElementList MultiLine bool } func (f *NodeFactory) NewArrayLiteralExpression(elements *ElementList, multiLine bool) *Node { data := &ArrayLiteralExpression{} data.Elements = elements data.MultiLine = multiLine return f.newNode(KindArrayLiteralExpression, data) } func (f *NodeFactory) UpdateArrayLiteralExpression(node *ArrayLiteralExpression, elements *ElementList, multiLine bool) *Node { if elements != node.Elements || multiLine != node.MultiLine { return updateNode(f.NewArrayLiteralExpression(elements, 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), node.MultiLine) } 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 IsArrayLiteralExpression(node *Node) bool { return node.Kind == KindArrayLiteralExpression } // ────────────────────────────────────────────────────────────────────── // ObjectLiteralExpression // ────────────────────────────────────────────────────────────────────── type ObjectLiteralExpression struct { PrimaryExpressionBase DeclarationBase CompositeBase Properties *NodeList 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 *NodeList, multiLine bool) *Node { if properties != node.Properties || multiLine != node.MultiLine { return updateNode(f.NewObjectLiteralExpression(properties, 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), node.MultiLine) } 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 IsObjectLiteralExpression(node *Node) bool { return node.Kind == KindObjectLiteralExpression } // ────────────────────────────────────────────────────────────────────── // SpreadAssignment // ────────────────────────────────────────────────────────────────────── type SpreadAssignment struct { NodeBase DeclarationBase ObjectLiteralElementBase 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 IsSpreadAssignment(node *Node) bool { return node.Kind == KindSpreadAssignment } // ────────────────────────────────────────────────────────────────────── // PropertyAssignment // ────────────────────────────────────────────────────────────────────── type PropertyAssignment struct { NodeBase NamedMemberBase ObjectLiteralElementBase CompositeBase Type *TypeNode Initializer *Expression } func (f *NodeFactory) NewPropertyAssignment(modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, initializer *Expression) *Node { data := f.propertyAssignmentArena.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.visitNode(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) Name() *DeclarationName { return node.name } func IsPropertyAssignment(node *Node) bool { return node.Kind == KindPropertyAssignment } // ────────────────────────────────────────────────────────────────────── // ShorthandPropertyAssignment // ────────────────────────────────────────────────────────────────────── type ShorthandPropertyAssignment struct { NodeBase NamedMemberBase ObjectLiteralElementBase CompositeBase Type *TypeNode EqualsToken *EqualsToken // Optional ObjectAssignmentInitializer *Expression // Optional } func (f *NodeFactory) NewShorthandPropertyAssignment(modifiers *ModifierList, name *PropertyName, postfixToken *TokenNode, typeNode *TypeNode, equalsToken *EqualsToken, 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 *EqualsToken, objectAssignmentInitializer *Expression) *Node { if modifiers != node.modifiers || name != node.name || postfixToken != node.PostfixToken || typeNode != node.Type || equalsToken != node.EqualsToken || 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.PostfixToken) || visit(v, node.Type) || 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.visitNode(node.PostfixToken), v.visitNode(node.Type), v.visitNode(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) Name() *DeclarationName { return node.name } func IsShorthandPropertyAssignment(node *Node) bool { return node.Kind == KindShorthandPropertyAssignment } // ────────────────────────────────────────────────────────────────────── // DeleteExpression // ────────────────────────────────────────────────────────────────────── type DeleteExpression struct { UnaryExpressionBase 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) } func IsDeleteExpression(node *Node) bool { return node.Kind == KindDeleteExpression } // ────────────────────────────────────────────────────────────────────── // TypeOfExpression // ────────────────────────────────────────────────────────────────────── type TypeOfExpression struct { UnaryExpressionBase 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 { UnaryExpressionBase 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) } func IsVoidExpression(node *Node) bool { return node.Kind == KindVoidExpression } // ────────────────────────────────────────────────────────────────────── // AwaitExpression // ────────────────────────────────────────────────────────────────────── type AwaitExpression struct { UnaryExpressionBase 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 IsAwaitExpression(node *Node) bool { return node.Kind == KindAwaitExpression } // ────────────────────────────────────────────────────────────────────── // TypeAssertion // ────────────────────────────────────────────────────────────────────── type TypeAssertion struct { UnaryExpressionBase Type *TypeNode 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 IsTypeAssertion(node *Node) bool { return node.Kind == KindTypeAssertionExpression } // ────────────────────────────────────────────────────────────────────── // KeywordTypeNode // ────────────────────────────────────────────────────────────────────── type KeywordTypeNode struct { TypeNodeBase } func (f *NodeFactory) NewKeywordTypeNode(kind KeywordTypeSyntaxKind) *Node { data := f.keywordTypeNodeArena.New() return f.newNode(kind, data) } func (node *KeywordTypeNode) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewKeywordTypeNode(node.Kind), node.AsNode(), f.AsNodeFactory().hooks) } func IsKeywordTypeNode(node *Node) bool { switch node.Kind { case KindAnyKeyword, KindBigIntKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindVoidKeyword: return true } return false } // ────────────────────────────────────────────────────────────────────── // UnionTypeNode // ────────────────────────────────────────────────────────────────────── type UnionTypeNode struct { TypeNodeBase UnionOrIntersectionTypeNodeBase } func (f *NodeFactory) NewUnionTypeNode(types *TypeList) *Node { data := f.unionTypeNodeArena.New() data.Types = types return f.newNode(KindUnionType, data) } 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 (node *UnionTypeNode) ForEachChild(v Visitor) bool { return visitNodeList(v, node.Types) } 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) } func IsUnionTypeNode(node *Node) bool { return node.Kind == KindUnionType } // ────────────────────────────────────────────────────────────────────── // IntersectionTypeNode // ────────────────────────────────────────────────────────────────────── type IntersectionTypeNode struct { TypeNodeBase UnionOrIntersectionTypeNodeBase } func (f *NodeFactory) NewIntersectionTypeNode(types *TypeList) *Node { data := f.intersectionTypeNodeArena.New() data.Types = types return f.newNode(KindIntersectionType, data) } 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 (node *IntersectionTypeNode) ForEachChild(v Visitor) bool { return visitNodeList(v, node.Types) } 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 ExtendsType *TypeNode TrueType *TypeNode FalseType *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 Type *TypeNode } func (f *NodeFactory) NewTypeOperatorNode(operator Kind, typeNode *TypeNode) *Node { data := f.typeOperatorNodeArena.New() data.Operator = operator data.Type = typeNode return f.newNode(KindTypeOperator, data) } func (f *NodeFactory) UpdateTypeOperatorNode(node *TypeOperatorNode, operator Kind, typeNode *TypeNode) *Node { if operator != node.Operator || typeNode != node.Type { return updateNode(f.NewTypeOperatorNode(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, node.Operator, 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 } func (f *NodeFactory) NewInferTypeNode(typeParameter *TypeParameterDeclarationNode) *Node { data := &InferTypeNode{} data.TypeParameter = typeParameter return f.newNode(KindInferType, data) } func (f *NodeFactory) UpdateInferTypeNode(node *InferTypeNode, typeParameter *TypeParameterDeclarationNode) *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 } func (f *NodeFactory) NewArrayTypeNode(elementType *TypeNode) *Node { data := f.arrayTypeNodeArena.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) } func IsArrayTypeNode(node *Node) bool { return node.Kind == KindArrayType } // ────────────────────────────────────────────────────────────────────── // IndexedAccessTypeNode // ────────────────────────────────────────────────────────────────────── type IndexedAccessTypeNode struct { TypeNodeBase ObjectType *TypeNode IndexType *TypeNode } func (f *NodeFactory) NewIndexedAccessTypeNode(objectType *TypeNode, indexType *TypeNode) *Node { data := f.indexedAccessTypeNodeArena.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 { NodeWithTypeArgumentsBase TypeName *EntityName } func (f *NodeFactory) NewTypeReferenceNode(typeName *EntityName, typeArguments *TypeList) *Node { data := f.typeReferenceNodeArena.New() data.TypeName = typeName data.TypeArguments = typeArguments return f.newNode(KindTypeReference, data) } func (f *NodeFactory) UpdateTypeReferenceNode(node *TypeReferenceNode, typeName *EntityName, typeArguments *TypeList) *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 { MemberExpressionBase CompositeBase Expression *Expression TypeArguments *TypeList // Optional } func (f *NodeFactory) NewExpressionWithTypeArguments(expression *Expression, typeArguments *TypeList) *Node { data := f.expressionWithTypeArgumentsArena.New() data.Expression = expression data.TypeArguments = typeArguments return f.newNode(KindExpressionWithTypeArguments, data) } func (f *NodeFactory) UpdateExpressionWithTypeArguments(node *ExpressionWithTypeArguments, expression *Expression, typeArguments *TypeList) *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 IsExpressionWithTypeArguments(node *Node) bool { return node.Kind == KindExpressionWithTypeArguments } // ────────────────────────────────────────────────────────────────────── // LiteralTypeNode // ────────────────────────────────────────────────────────────────────── type LiteralTypeNode struct { TypeNodeBase Literal *Node } func (f *NodeFactory) NewLiteralTypeNode(literal *Node) *Node { data := f.literalTypeNodeArena.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 { data := &ThisTypeNode{} return f.newNode(KindThisType, data) } 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 *AssertsKeyword // Optional ParameterName *TypePredicateParameterName Type *TypeNode // Optional } func (f *NodeFactory) NewTypePredicateNode(assertsModifier *AssertsKeyword, 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 *AssertsKeyword, 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 } // ────────────────────────────────────────────────────────────────────── // ImportAttribute // ────────────────────────────────────────────────────────────────────── type ImportAttribute struct { NodeBase CompositeBase name *ImportAttributeName Value *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() *DeclarationName { return node.name } func IsImportAttribute(node *Node) bool { return node.Kind == KindImportAttribute } // ────────────────────────────────────────────────────────────────────── // ImportAttributes // ────────────────────────────────────────────────────────────────────── type ImportAttributes struct { NodeBase CompositeBase Token Kind Attributes *ImportAttributeList MultiLine bool } func (f *NodeFactory) NewImportAttributes(token Kind, attributes *ImportAttributeList, 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, token Kind, attributes *ImportAttributeList, multiLine bool) *Node { if token != node.Token || attributes != node.Attributes || multiLine != node.MultiLine { return updateNode(f.NewImportAttributes(token, attributes, 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, node.Token, v.visitNodes(node.Attributes), node.MultiLine) } 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 } // ────────────────────────────────────────────────────────────────────── // TypeQueryNode // ────────────────────────────────────────────────────────────────────── type TypeQueryNode struct { NodeWithTypeArgumentsBase ExprName *EntityName } func (f *NodeFactory) NewTypeQueryNode(exprName *EntityName, typeArguments *TypeList) *Node { data := &TypeQueryNode{} data.ExprName = exprName data.TypeArguments = typeArguments return f.newNode(KindTypeQuery, data) } func (f *NodeFactory) UpdateTypeQueryNode(node *TypeQueryNode, exprName *EntityName, typeArguments *TypeList) *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 // Optional TypeParameter *TypeParameterDeclarationNode NameType *TypeNode // Optional QuestionToken *TokenNode // Optional Type *TypeNode // Optional Members *TypeElementList // Optional } func (f *NodeFactory) NewMappedTypeNode(readonlyToken *TokenNode, typeParameter *TypeParameterDeclarationNode, nameType *TypeNode, questionToken *TokenNode, typeNode *TypeNode, members *TypeElementList) *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.visitNode(node.ReadonlyToken), v.visitNode(node.TypeParameter), v.visitNode(node.NameType), v.visitNode(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 *TypeElementList } func (f *NodeFactory) NewTypeLiteralNode(members *TypeElementList) *Node { data := f.typeLiteralNodeArena.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 *TypeList } func (f *NodeFactory) NewTupleTypeNode(elements *TypeList) *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 } // ────────────────────────────────────────────────────────────────────── // NamedTupleMember // ────────────────────────────────────────────────────────────────────── type NamedTupleMember struct { TypeNodeBase DeclarationBase DotDotDotToken *DotDotDotToken // Optional name *IdentifierNode QuestionToken *QuestionToken // Optional Type *TypeNode } func (f *NodeFactory) NewNamedTupleMember(dotDotDotToken *DotDotDotToken, name *IdentifierNode, questionToken *QuestionToken, 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 *DotDotDotToken, name *IdentifierNode, questionToken *QuestionToken, 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.visitNode(node.DotDotDotToken), v.visitNode(node.name), v.visitNode(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 } 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 } 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 } func (f *NodeFactory) NewParenthesizedTypeNode(typeNode *TypeNode) *Node { data := f.parenthesizedTypeNodeArena.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 } // ────────────────────────────────────────────────────────────────────── // FunctionTypeNode // ────────────────────────────────────────────────────────────────────── type FunctionTypeNode struct { TypeNodeBase FunctionOrConstructorTypeNodeBase } func (f *NodeFactory) NewFunctionTypeNode(typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { data := f.functionTypeNodeArena.New() data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode return f.newNode(KindFunctionType, data) } func (f *NodeFactory) UpdateFunctionTypeNode(node *FunctionTypeNode, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { if typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type { return updateNode(f.NewFunctionTypeNode(typeParameters, parameters, typeNode), node.AsNode(), f.hooks) } return node.AsNode() } func (node *FunctionTypeNode) ForEachChild(v Visitor) bool { return visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) || visit(v, node.Type) } 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 { TypeNodeBase FunctionOrConstructorTypeNodeBase } func (f *NodeFactory) NewConstructorTypeNode(modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { data := &ConstructorTypeNode{} data.modifiers = modifiers data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode return f.newNode(KindConstructorType, data) } func (f *NodeFactory) UpdateConstructorTypeNode(node *ConstructorTypeNode, modifiers *ModifierList, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { if modifiers != node.modifiers || typeParameters != node.TypeParameters || parameters != node.Parameters || typeNode != node.Type { return updateNode(f.NewConstructorTypeNode(modifiers, typeParameters, parameters, typeNode), node.AsNode(), f.hooks) } return node.AsNode() } func (node *ConstructorTypeNode) ForEachChild(v Visitor) bool { return visitModifiers(v, node.modifiers) || visitNodeList(v, node.TypeParameters) || visitNodeList(v, node.Parameters) || visit(v, node.Type) } 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 } // ────────────────────────────────────────────────────────────────────── // TemplateHead // ────────────────────────────────────────────────────────────────────── type TemplateHead struct { NodeBase TemplateLiteralLikeNodeBase } func (f *NodeFactory) NewTemplateHead(text string, rawText string, templateFlags TokenFlags) *Node { data := &TemplateHead{} data.Text = text data.RawText = rawText data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags 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) } func IsTemplateHead(node *Node) bool { return node.Kind == KindTemplateHead } // ────────────────────────────────────────────────────────────────────── // TemplateMiddle // ────────────────────────────────────────────────────────────────────── type TemplateMiddle struct { NodeBase TemplateLiteralLikeNodeBase } func (f *NodeFactory) NewTemplateMiddle(text string, rawText string, templateFlags TokenFlags) *Node { data := &TemplateMiddle{} data.Text = text data.RawText = rawText data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags 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) } func IsTemplateMiddle(node *Node) bool { return node.Kind == KindTemplateMiddle } // ────────────────────────────────────────────────────────────────────── // TemplateTail // ────────────────────────────────────────────────────────────────────── type TemplateTail struct { NodeBase TemplateLiteralLikeNodeBase } func (f *NodeFactory) NewTemplateTail(text string, rawText string, templateFlags TokenFlags) *Node { data := &TemplateTail{} data.Text = text data.RawText = rawText data.TemplateFlags = templateFlags & TokenFlagsTemplateLiteralLikeFlags 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) } func IsTemplateTail(node *Node) bool { return node.Kind == KindTemplateTail } // ────────────────────────────────────────────────────────────────────── // TemplateLiteralTypeNode // ────────────────────────────────────────────────────────────────────── type TemplateLiteralTypeNode struct { TypeNodeBase Head *TemplateHeadNode TemplateSpans *TemplateLiteralTypeSpanList } func (f *NodeFactory) NewTemplateLiteralTypeNode(head *TemplateHeadNode, templateSpans *TemplateLiteralTypeSpanList) *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) } func IsTemplateLiteralTypeNode(node *Node) bool { return node.Kind == KindTemplateLiteralType } // ────────────────────────────────────────────────────────────────────── // TemplateLiteralTypeSpan // ────────────────────────────────────────────────────────────────────── type TemplateLiteralTypeSpan struct { TypeNodeBase Type *TypeNode Literal *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 // Optional } func (f *NodeFactory) NewSyntheticExpression(typeNode any, isSpread bool, tupleNameSource *Node) *Node { data := &SyntheticExpression{} data.Type = typeNode data.IsSpread = isSpread data.TupleNameSource = tupleNameSource return f.newNode(KindSyntheticExpression, data) } func (f *NodeFactory) UpdateSyntheticExpression(node *SyntheticExpression, typeNode any, isSpread bool, tupleNameSource *Node) *Node { if typeNode != node.Type || isSpread != node.IsSpread || tupleNameSource != node.TupleNameSource { return updateNode(f.NewSyntheticExpression(typeNode, isSpread, tupleNameSource), node.AsNode(), f.hooks) } return node.AsNode() } func (node *SyntheticExpression) ForEachChild(v Visitor) bool { return visit(v, node.TupleNameSource) } func (node *SyntheticExpression) VisitEachChild(v *NodeVisitor) *Node { return v.Factory.UpdateSyntheticExpression(node, node.Type, node.IsSpread, v.visitNode(node.TupleNameSource)) } 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 { LeftHandSideExpressionBase Expression *Expression } func (f *NodeFactory) NewPartiallyEmittedExpression(expression *Expression) *Node { data := &PartiallyEmittedExpression{} data.Expression = expression return f.newNode(KindPartiallyEmittedExpression, data) } 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 IsPartiallyEmittedExpression(node *Node) bool { return node.Kind == KindPartiallyEmittedExpression } // ────────────────────────────────────────────────────────────────────── // JsxElement // ────────────────────────────────────────────────────────────────────── type JsxElement struct { PrimaryExpressionBase CompositeBase OpeningElement *JsxOpeningElementNode Children *JsxChildList ClosingElement *JsxClosingElementNode } func (f *NodeFactory) NewJsxElement(openingElement *JsxOpeningElementNode, children *JsxChildList, 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 IsJsxElement(node *Node) bool { return node.Kind == KindJsxElement } // ────────────────────────────────────────────────────────────────────── // JsxAttributes // ────────────────────────────────────────────────────────────────────── type JsxAttributes struct { PrimaryExpressionBase DeclarationBase CompositeBase Properties *JsxAttributeList } func (f *NodeFactory) NewJsxAttributes(properties *JsxAttributeList) *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 IsJsxAttributes(node *Node) bool { return node.Kind == KindJsxAttributes } // ────────────────────────────────────────────────────────────────────── // JsxNamespacedName // ────────────────────────────────────────────────────────────────────── type JsxNamespacedName struct { ExpressionBase CompositeBase Namespace *IdentifierNode name *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, namespace *IdentifierNode, name *IdentifierNode) *Node { if namespace != node.Namespace || name != node.name { return updateNode(f.NewJsxNamespacedName(namespace, name), 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.Namespace), v.visitNode(node.name)) } func (node *JsxNamespacedName) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewJsxNamespacedName(node.Namespace, node.name), node.AsNode(), f.AsNodeFactory().hooks) } func (node *JsxNamespacedName) Name() *DeclarationName { return node.name } func IsJsxNamespacedName(node *Node) bool { return node.Kind == KindJsxNamespacedName } // ────────────────────────────────────────────────────────────────────── // JsxOpeningElement // ────────────────────────────────────────────────────────────────────── type JsxOpeningElement struct { ExpressionBase CompositeBase TagName *JsxTagNameExpression TypeArguments *TypeList // Optional Attributes *JsxAttributesNode } func (f *NodeFactory) NewJsxOpeningElement(tagName *JsxTagNameExpression, typeArguments *TypeList, 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 *TypeList, 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 IsJsxOpeningElement(node *Node) bool { return node.Kind == KindJsxOpeningElement } // ────────────────────────────────────────────────────────────────────── // JsxSelfClosingElement // ────────────────────────────────────────────────────────────────────── type JsxSelfClosingElement struct { PrimaryExpressionBase CompositeBase TagName *JsxTagNameExpression TypeArguments *TypeList // Optional Attributes *JsxAttributesNode } func (f *NodeFactory) NewJsxSelfClosingElement(tagName *JsxTagNameExpression, typeArguments *TypeList, 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 *TypeList, 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 IsJsxSelfClosingElement(node *Node) bool { return node.Kind == KindJsxSelfClosingElement } // ────────────────────────────────────────────────────────────────────── // JsxFragment // ────────────────────────────────────────────────────────────────────── type JsxFragment struct { PrimaryExpressionBase CompositeBase OpeningFragment *JsxOpeningFragmentNode Children *JsxChildList ClosingFragment *JsxClosingFragmentNode } func (f *NodeFactory) NewJsxFragment(openingFragment *JsxOpeningFragmentNode, children *JsxChildList, 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 IsJsxFragment(node *Node) bool { return node.Kind == KindJsxFragment } // ────────────────────────────────────────────────────────────────────── // JsxOpeningFragment // ────────────────────────────────────────────────────────────────────── type JsxOpeningFragment struct { ExpressionBase } func (f *NodeFactory) NewJsxOpeningFragment() *Node { data := &JsxOpeningFragment{} return f.newNode(KindJsxOpeningFragment, data) } func (node *JsxOpeningFragment) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewJsxOpeningFragment(), node.AsNode(), f.AsNodeFactory().hooks) } func IsJsxOpeningFragment(node *Node) bool { return node.Kind == KindJsxOpeningFragment } // ────────────────────────────────────────────────────────────────────── // JsxClosingFragment // ────────────────────────────────────────────────────────────────────── type JsxClosingFragment struct { ExpressionBase } func (f *NodeFactory) NewJsxClosingFragment() *Node { data := &JsxClosingFragment{} return f.newNode(KindJsxClosingFragment, data) } func (node *JsxClosingFragment) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewJsxClosingFragment(), node.AsNode(), f.AsNodeFactory().hooks) } func IsJsxClosingFragment(node *Node) bool { return node.Kind == KindJsxClosingFragment } // ────────────────────────────────────────────────────────────────────── // JsxAttribute // ────────────────────────────────────────────────────────────────────── type JsxAttribute struct { NodeBase DeclarationBase CompositeBase name *JsxAttributeName Initializer *JsxAttributeValue // Optional } 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() *DeclarationName { return node.name } func IsJsxAttribute(node *Node) bool { return node.Kind == KindJsxAttribute } // ────────────────────────────────────────────────────────────────────── // JsxSpreadAttribute // ────────────────────────────────────────────────────────────────────── type JsxSpreadAttribute struct { ObjectLiteralElementBase NodeBase 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 IsJsxSpreadAttribute(node *Node) bool { return node.Kind == KindJsxSpreadAttribute } // ────────────────────────────────────────────────────────────────────── // JsxClosingElement // ────────────────────────────────────────────────────────────────────── type JsxClosingElement struct { NodeBase TagName *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 IsJsxClosingElement(node *Node) bool { return node.Kind == KindJsxClosingElement } // ────────────────────────────────────────────────────────────────────── // JsxExpression // ────────────────────────────────────────────────────────────────────── type JsxExpression struct { ExpressionBase DotDotDotToken *DotDotDotToken // Optional Expression *Expression // Optional } func (f *NodeFactory) NewJsxExpression(dotDotDotToken *DotDotDotToken, expression *Expression) *Node { data := &JsxExpression{} data.DotDotDotToken = dotDotDotToken data.Expression = expression return f.newNode(KindJsxExpression, data) } func (f *NodeFactory) UpdateJsxExpression(node *JsxExpression, dotDotDotToken *DotDotDotToken, 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.visitNode(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 IsJsxExpression(node *Node) bool { return node.Kind == KindJsxExpression } // ────────────────────────────────────────────────────────────────────── // JsxText // ────────────────────────────────────────────────────────────────────── type JsxText struct { ExpressionBase LiteralLikeNodeBase ContainsOnlyTriviaWhiteSpaces bool } func (f *NodeFactory) NewJsxText(text string, containsOnlyTriviaWhiteSpaces bool) *Node { data := &JsxText{} data.Text = text data.ContainsOnlyTriviaWhiteSpaces = containsOnlyTriviaWhiteSpaces 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 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 (f *NodeFactory) UpdateSyntaxList(node *SyntaxList, children []*Node) *Node { if !core.Same(children, node.Children) { return updateNode(f.NewSyntaxList(children), node.AsNode(), f.hooks) } return node.AsNode() } func (node *SyntaxList) ForEachChild(v Visitor) bool { return visitNodes(v, node.Children) } func (node *SyntaxList) VisitEachChild(v *NodeVisitor) *Node { children := core.SameMap(node.Children, func(n *Node) *Node { return v.visitNode(n) }) return v.Factory.UpdateSyntaxList(node, children) } func (node *SyntaxList) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewSyntaxList(node.Children), node.AsNode(), f.AsNodeFactory().hooks) } func IsSyntaxList(node *Node) bool { return node.Kind == KindSyntaxList } // ────────────────────────────────────────────────────────────────────── // JSDoc // ────────────────────────────────────────────────────────────────────── type JSDoc struct { NodeBase Comment *NodeList Tags *NodeList // Optional } func (f *NodeFactory) NewJSDoc(comment *NodeList, tags *NodeList) *Node { data := f.jsdocArena.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 IsJSDoc(node *Node) bool { return node.Kind == KindJSDoc } // ────────────────────────────────────────────────────────────────────── // 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) } func IsJSDocTypeExpression(node *Node) bool { return node.Kind == KindJSDocTypeExpression } // ────────────────────────────────────────────────────────────────────── // JSDocNonNullableType // ────────────────────────────────────────────────────────────────────── type JSDocNonNullableType struct { JSDocTypeBase Type *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 { JSDocTypeBase Type *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 { JSDocTypeBase } 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) } func IsJSDocAllType(node *Node) bool { return node.Kind == KindJSDocAllType } // ────────────────────────────────────────────────────────────────────── // JSDocVariadicType // ────────────────────────────────────────────────────────────────────── type JSDocVariadicType struct { JSDocTypeBase 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) } func IsJSDocVariadicType(node *Node) bool { return node.Kind == KindJSDocVariadicType } // ────────────────────────────────────────────────────────────────────── // JSDocOptionalType // ────────────────────────────────────────────────────────────────────── type JSDocOptionalType struct { JSDocTypeBase 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) } func IsJSDocOptionalType(node *Node) bool { return node.Kind == KindJSDocOptionalType } // ────────────────────────────────────────────────────────────────────── // JSDocTypeTag // ────────────────────────────────────────────────────────────────────── type JSDocTypeTag struct { JSDocTagBase TypeExpression *Node } 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 *Node, 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.jsdocUnknownTagArena.New() data.TagName = tagName data.Comment = comment return f.newNode(KindJSDocUnknownTag, 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 == KindJSDocUnknownTag } // ────────────────────────────────────────────────────────────────────── // 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(node *Node) bool { return node.Kind == KindJSDocTemplateTag } // ────────────────────────────────────────────────────────────────────── // JSDocReturnTag // ────────────────────────────────────────────────────────────────────── type JSDocReturnTag struct { JSDocTagBase TypeExpression *TypeNode // Optional } 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) } func IsJSDocPublicTag(node *Node) bool { return node.Kind == KindJSDocPublicTag } // ────────────────────────────────────────────────────────────────────── // 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) } func IsJSDocPrivateTag(node *Node) bool { return node.Kind == KindJSDocPrivateTag } // ────────────────────────────────────────────────────────────────────── // 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) } func IsJSDocProtectedTag(node *Node) bool { return node.Kind == KindJSDocProtectedTag } // ────────────────────────────────────────────────────────────────────── // 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) } func IsJSDocReadonlyTag(node *Node) bool { return node.Kind == KindJSDocReadonlyTag } // ────────────────────────────────────────────────────────────────────── // 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) } func IsJSDocOverrideTag(node *Node) bool { return node.Kind == KindJSDocOverrideTag } // ────────────────────────────────────────────────────────────────────── // JSDocDeprecatedTag // ────────────────────────────────────────────────────────────────────── type JSDocDeprecatedTag struct { JSDocTagBase } func (f *NodeFactory) NewJSDocDeprecatedTag(tagName *IdentifierNode, comment *NodeList) *Node { data := f.jsdocDeprecatedTagArena.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) } func IsJSDocSeeTag(node *Node) bool { return node.Kind == KindJSDocSeeTag } // ────────────────────────────────────────────────────────────────────── // JSDocImplementsTag // ────────────────────────────────────────────────────────────────────── type JSDocImplementsTag struct { JSDocTagBase ClassName *ExpressionWithTypeArgumentsNode } func (f *NodeFactory) NewJSDocImplementsTag(tagName *IdentifierNode, className *ExpressionWithTypeArgumentsNode, 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 *ExpressionWithTypeArgumentsNode, 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 *ExpressionWithTypeArgumentsNode } func (f *NodeFactory) NewJSDocAugmentsTag(tagName *IdentifierNode, className *ExpressionWithTypeArgumentsNode, 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 *ExpressionWithTypeArgumentsNode, 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) } func IsJSDocSatisfiesTag(node *Node) bool { return node.Kind == KindJSDocSatisfiesTag } // ────────────────────────────────────────────────────────────────────── // JSDocThrowsTag // ────────────────────────────────────────────────────────────────────── type JSDocThrowsTag struct { JSDocTagBase TypeExpression *TypeNode // Optional } func (f *NodeFactory) NewJSDocThrowsTag(tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node { data := &JSDocThrowsTag{} data.TagName = tagName data.TypeExpression = typeExpression data.Comment = comment return f.newNode(KindJSDocThrowsTag, data) } func (f *NodeFactory) UpdateJSDocThrowsTag(node *JSDocThrowsTag, tagName *IdentifierNode, typeExpression *TypeNode, comment *NodeList) *Node { if tagName != node.TagName || typeExpression != node.TypeExpression || comment != node.Comment { return updateNode(f.NewJSDocThrowsTag(tagName, typeExpression, comment), node.AsNode(), f.hooks) } return node.AsNode() } func (node *JSDocThrowsTag) ForEachChild(v Visitor) bool { return visit(v, node.TagName) || visit(v, node.TypeExpression) || visitNodeList(v, node.Comment) } func (node *JSDocThrowsTag) VisitEachChild(v *NodeVisitor) *Node { return v.Factory.UpdateJSDocThrowsTag(node, v.visitNode(node.TagName), v.visitNode(node.TypeExpression), v.visitNodes(node.Comment)) } func (node *JSDocThrowsTag) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewJSDocThrowsTag(node.TagName, node.TypeExpression, node.Comment), node.AsNode(), f.AsNodeFactory().hooks) } func IsJSDocThrowsTag(node *Node) bool { return node.Kind == KindJSDocThrowsTag } // ────────────────────────────────────────────────────────────────────── // 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) } func IsJSDocThisTag(node *Node) bool { return node.Kind == KindJSDocThisTag } // ────────────────────────────────────────────────────────────────────── // JSDocImportTag // ────────────────────────────────────────────────────────────────────── type JSDocImportTag struct { JSDocTagBase ImportClause *ImportClauseNode // Optional ModuleSpecifier *Expression Attributes *ImportAttributesNode // Optional } func (f *NodeFactory) NewJSDocImportTag(tagName *IdentifierNode, importClause *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode, 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 *ImportClauseNode, moduleSpecifier *Expression, attributes *ImportAttributesNode, 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 TypeExpression *TypeNode name *JSDocFullName // Optional } func (f *NodeFactory) NewJSDocCallbackTag(tagName *IdentifierNode, typeExpression *TypeNode, name *JSDocFullName, comment *NodeList) *Node { data := &JSDocCallbackTag{} data.TagName = tagName data.TypeExpression = typeExpression data.name = name data.Comment = comment return f.newNode(KindJSDocCallbackTag, data) } func (f *NodeFactory) UpdateJSDocCallbackTag(node *JSDocCallbackTag, tagName *IdentifierNode, typeExpression *TypeNode, name *JSDocFullName, comment *NodeList) *Node { if tagName != node.TagName || typeExpression != node.TypeExpression || name != node.name || comment != node.Comment { return updateNode(f.NewJSDocCallbackTag(tagName, typeExpression, name, comment), node.AsNode(), f.hooks) } return node.AsNode() } func (node *JSDocCallbackTag) ForEachChild(v Visitor) bool { return visit(v, node.TagName) || visit(v, node.TypeExpression) || visit(v, node.name) || 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.name), v.visitNodes(node.Comment)) } func (node *JSDocCallbackTag) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewJSDocCallbackTag(node.TagName, node.TypeExpression, node.name, node.Comment), node.AsNode(), f.AsNodeFactory().hooks) } func (node *JSDocCallbackTag) Name() *DeclarationName { return node.name } 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) } func IsJSDocOverloadTag(node *Node) bool { return node.Kind == KindJSDocOverloadTag } // ────────────────────────────────────────────────────────────────────── // JSDocTypedefTag // ────────────────────────────────────────────────────────────────────── type JSDocTypedefTag struct { JSDocTagBase TypeExpression *Node // Optional name *JSDocFullName // Optional } func (f *NodeFactory) NewJSDocTypedefTag(tagName *IdentifierNode, typeExpression *Node, name *JSDocFullName, 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, name *JSDocFullName, comment *NodeList) *Node { if tagName != node.TagName || typeExpression != node.TypeExpression || name != node.name || comment != node.Comment { return updateNode(f.NewJSDocTypedefTag(tagName, typeExpression, name, comment), node.AsNode(), f.hooks) } return node.AsNode() } func (node *JSDocTypedefTag) ForEachChild(v Visitor) bool { 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 } // ────────────────────────────────────────────────────────────────────── // JSDocSignature // ────────────────────────────────────────────────────────────────────── type JSDocSignature struct { JSDocTypeBase FunctionLikeBase } func (f *NodeFactory) NewJSDocSignature(typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *Node { data := &JSDocSignature{} data.TypeParameters = typeParameters data.Parameters = parameters data.Type = typeNode return f.newNode(KindJSDocSignature, data) } func (f *NodeFactory) UpdateJSDocSignature(node *JSDocSignature, typeParameters *TypeParameterList, parameters *ParameterList, typeNode *TypeNode) *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() *DeclarationName { return node.name } func IsJSDocNameReference(node *Node) bool { return node.Kind == KindJSDocNameReference } // ────────────────────────────────────────────────────────────────────── // SourceFile // ────────────────────────────────────────────────────────────────────── func IsSourceFile(node *Node) bool { return node.Kind == KindSourceFile } // Struct and factory methods hand-written in ./ast.go // ────────────────────────────────────────────────────────────────────── // ModuleDeclaration // ────────────────────────────────────────────────────────────────────── type ModuleDeclaration struct { DeclarationBase StatementBase ExportableBase ModifiersBase LocalsContainerBase BodyBase CompositeBase Keyword Kind name *ModuleName } 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 return f.newNode(KindModuleDeclaration, data) } 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 IsModuleDeclaration(node *Node) bool { return node.Kind == KindModuleDeclaration } // ────────────────────────────────────────────────────────────────────── // ImportEqualsDeclaration // ────────────────────────────────────────────────────────────────────── type ImportEqualsDeclaration struct { DeclarationBase StatementBase ExportableBase ModifiersBase CompositeBase IsTypeOnly bool name *IdentifierNode 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 IsImportEqualsDeclaration(node *Node) bool { return node.Kind == KindImportEqualsDeclaration } // ────────────────────────────────────────────────────────────────────── // ExportDeclaration // ────────────────────────────────────────────────────────────────────── type ExportDeclaration struct { DeclarationBase StatementBase ModifiersBase CompositeBase IsTypeOnly bool ExportClause *NamedExportBindings // Optional ModuleSpecifier *Expression // Optional Attributes *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 || isTypeOnly != node.IsTypeOnly || 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 IsExportDeclaration(node *Node) bool { return node.Kind == KindExportDeclaration } // ────────────────────────────────────────────────────────────────────── // ImportTypeNode // ────────────────────────────────────────────────────────────────────── type ImportTypeNode struct { NodeWithTypeArgumentsBase IsTypeOf bool Argument *TypeNode Attributes *ImportAttributesNode // Optional Qualifier *EntityName // Optional } func (f *NodeFactory) NewImportTypeNode(isTypeOf bool, argument *TypeNode, attributes *ImportAttributesNode, qualifier *EntityName, typeArguments *TypeList) *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 *TypeList) *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 } // ────────────────────────────────────────────────────────────────────── // ImportClause // ────────────────────────────────────────────────────────────────────── type ImportClause struct { NodeBase DeclarationBase ExportableBase CompositeBase PhaseModifier ImportPhaseModifierSyntaxKind // Optional name *IdentifierNode // Optional NamedBindings *NamedImportBindings // Optional } func (f *NodeFactory) NewImportClause(phaseModifier ImportPhaseModifierSyntaxKind, 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 ImportPhaseModifierSyntaxKind, 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 IsImportClause(node *Node) bool { return node.Kind == KindImportClause } // ────────────────────────────────────────────────────────────────────── // ImportSpecifier // ────────────────────────────────────────────────────────────────────── type ImportSpecifier struct { NodeBase DeclarationBase ExportableBase CompositeBase IsTypeOnly bool PropertyName *ModuleExportName // Optional name *IdentifierNode } func (f *NodeFactory) NewImportSpecifier(isTypeOnly bool, propertyName *ModuleExportName, name *IdentifierNode) *Node { data := f.importSpecifierArena.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 IsImportSpecifier(node *Node) bool { return node.Kind == KindImportSpecifier } // ────────────────────────────────────────────────────────────────────── // JSDocText // ────────────────────────────────────────────────────────────────────── type JSDocText struct { JSDocCommentBase } func (f *NodeFactory) NewJSDocText(text []string) *Node { data := f.jsdocTextArena.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) } func IsJSDocText(node *Node) bool { return node.Kind == KindJSDocText } // ────────────────────────────────────────────────────────────────────── // JSDocLink // ────────────────────────────────────────────────────────────────────── type JSDocLink struct { JSDocCommentBase name *EntityName // Optional } func (f *NodeFactory) NewJSDocLink(name *EntityName, 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 *EntityName, 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 } func IsJSDocLink(node *Node) bool { return node.Kind == KindJSDocLink } // ────────────────────────────────────────────────────────────────────── // JSDocLinkPlain // ────────────────────────────────────────────────────────────────────── type JSDocLinkPlain struct { JSDocCommentBase name *EntityName // Optional } func (f *NodeFactory) NewJSDocLinkPlain(name *EntityName, 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 *EntityName, 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 } func IsJSDocLinkPlain(node *Node) bool { return node.Kind == KindJSDocLinkPlain } // ────────────────────────────────────────────────────────────────────── // JSDocLinkCode // ────────────────────────────────────────────────────────────────────── type JSDocLinkCode struct { JSDocCommentBase name *EntityName // Optional } func (f *NodeFactory) NewJSDocLinkCode(name *EntityName, 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 *EntityName, 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 } func IsJSDocLinkCode(node *Node) bool { return node.Kind == KindJSDocLinkCode } // ────────────────────────────────────────────────────────────────────── // TypeParameterDeclaration // ────────────────────────────────────────────────────────────────────── type TypeParameterDeclaration struct { NodeBase DeclarationBase ModifiersBase TypeSyntaxBase name *IdentifierNode Constraint *TypeNode // Optional Expression *Expression // Optional DefaultType *TypeNode // Optional } func (f *NodeFactory) NewTypeParameterDeclaration(modifiers *ModifierList, name *IdentifierNode, constraint *TypeNode, expression *Expression, defaultType *TypeNode) *Node { data := f.typeParameterDeclarationArena.New() data.modifiers = modifiers data.name = name data.Constraint = constraint data.Expression = expression data.DefaultType = defaultType return f.newNode(KindTypeParameter, data) } func (f *NodeFactory) UpdateTypeParameterDeclaration(node *TypeParameterDeclaration, modifiers *ModifierList, name *IdentifierNode, constraint *TypeNode, expression *Expression, defaultType *TypeNode) *Node { if modifiers != node.modifiers || name != node.name || constraint != node.Constraint || expression != node.Expression || defaultType != node.DefaultType { return updateNode(f.NewTypeParameterDeclaration(modifiers, name, constraint, expression, 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.Expression), v.visitNode(node.DefaultType)) } func (node *TypeParameterDeclaration) Clone(f NodeFactoryCoercible) *Node { return cloneNode(f.AsNodeFactory().NewTypeParameterDeclaration(node.Modifiers(), node.name, node.Constraint, node.Expression, node.DefaultType), node.AsNode(), f.AsNodeFactory().hooks) } func (node *TypeParameterDeclaration) Name() *DeclarationName { return node.name } func IsTypeParameterDeclaration(node *Node) bool { return node.Kind == KindTypeParameter } // ────────────────────────────────────────────────────────────────────── // SyntheticReferenceExpression // ────────────────────────────────────────────────────────────────────── type SyntheticReferenceExpression struct { ExpressionBase Expression *Expression ThisArg *Expression } func (f *NodeFactory) NewSyntheticReferenceExpression(expression *Expression, thisArg *Expression) *Node { data := &SyntheticReferenceExpression{} data.Expression = expression data.ThisArg = thisArg return f.newNode(KindSyntheticReferenceExpression, data) } func (f *NodeFactory) UpdateSyntheticReferenceExpression(node *SyntheticReferenceExpression, expression *Expression, thisArg *Expression) *Node { if expression != node.Expression || thisArg != node.ThisArg { return updateNode(f.NewSyntheticReferenceExpression(expression, thisArg), node.AsNode(), f.hooks) } return node.AsNode() } func (node *SyntheticReferenceExpression) ForEachChild(v Visitor) bool { return visit(v, node.Expression) || visit(v, node.ThisArg) } func (node *SyntheticReferenceExpression) VisitEachChild(v *NodeVisitor) *Node { return v.Factory.UpdateSyntheticReferenceExpression(node, v.visitNode(node.Expression), v.visitNode(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) | propagateSubtreeFacts(node.ThisArg) } func IsSyntheticReferenceExpression(node *Node) bool { return node.Kind == KindSyntheticReferenceExpression } // ────────────────────────────────────────────────────────────────────── // JSDocTypeLiteral // ────────────────────────────────────────────────────────────────────── type JSDocTypeLiteral struct { JSDocTypeBase DeclarationBase JSDocPropertyTags []*Node // Optional 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) } func IsJSDocTypeLiteral(node *Node) bool { return node.Kind == KindJSDocTypeLiteral } // ────────────────────────────────────────────────────────────────────── // JSDocParameterOrPropertyTag // ────────────────────────────────────────────────────────────────────── type JSDocParameterOrPropertyTag struct { JSDocTagBase name *EntityName IsBracketed bool TypeExpression *TypeNode // Optional IsNameFirst bool } func (f *NodeFactory) NewJSDocParameterOrPropertyTag(kind Kind, tagName *IdentifierNode, name *EntityName, isBracketed bool, typeExpression *TypeNode, isNameFirst bool, comment *NodeList) *Node { data := &JSDocParameterOrPropertyTag{} 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) UpdateJSDocParameterOrPropertyTag(node *JSDocParameterOrPropertyTag, tagName *IdentifierNode, name *EntityName, isBracketed bool, typeExpression *TypeNode, isNameFirst bool, comment *NodeList) *Node { if tagName != node.TagName || name != node.name || isBracketed != node.IsBracketed || typeExpression != node.TypeExpression || isNameFirst != node.IsNameFirst || comment != node.Comment { return updateNode(f.NewJSDocParameterOrPropertyTag(node.Kind, tagName, name, isBracketed, typeExpression, isNameFirst, comment), node.AsNode(), f.hooks) } return node.AsNode() } func (node *JSDocParameterOrPropertyTag) ForEachChild(v Visitor) bool { return forEachChild_JSDocParameterOrPropertyTag(node, v) } func (node *JSDocParameterOrPropertyTag) VisitEachChild(v *NodeVisitor) *Node { return visitEachChild_JSDocParameterOrPropertyTag(node, v) } 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() *DeclarationName { return node.name } func IsJSDocParameterTag(node *Node) bool { return node.Kind == KindJSDocParameterTag } func IsJSDocPropertyTag(node *Node) bool { return node.Kind == KindJSDocPropertyTag } // ────────────────────────────────────────────────────────────────────── // ForEachChild dispatch // ────────────────────────────────────────────────────────────────────── func (n *Node) ForEachChild(v Visitor) bool { switch n.Kind { case KindQualifiedName: return n.data.(*QualifiedName).ForEachChild(v) case KindComputedPropertyName: return n.data.(*ComputedPropertyName).ForEachChild(v) case KindDecorator: return n.data.(*Decorator).ForEachChild(v) case KindIfStatement: return n.data.(*IfStatement).ForEachChild(v) case KindDoStatement: return n.data.(*DoStatement).ForEachChild(v) case KindWhileStatement: return n.data.(*WhileStatement).ForEachChild(v) case KindForStatement: return n.data.(*ForStatement).ForEachChild(v) case KindForInStatement, KindForOfStatement: return n.data.(*ForInOrOfStatement).ForEachChild(v) case KindBreakStatement: return n.data.(*BreakStatement).ForEachChild(v) case KindContinueStatement: return n.data.(*ContinueStatement).ForEachChild(v) case KindReturnStatement: return n.data.(*ReturnStatement).ForEachChild(v) case KindWithStatement: return n.data.(*WithStatement).ForEachChild(v) case KindSwitchStatement: return n.data.(*SwitchStatement).ForEachChild(v) case KindCaseBlock: return n.data.(*CaseBlock).ForEachChild(v) case KindCaseClause, KindDefaultClause: return n.data.(*CaseOrDefaultClause).ForEachChild(v) case KindThrowStatement: return n.data.(*ThrowStatement).ForEachChild(v) case KindTryStatement: return n.data.(*TryStatement).ForEachChild(v) case KindCatchClause: return n.data.(*CatchClause).ForEachChild(v) case KindLabeledStatement: return n.data.(*LabeledStatement).ForEachChild(v) case KindExpressionStatement: return n.data.(*ExpressionStatement).ForEachChild(v) case KindBlock: return n.data.(*Block).ForEachChild(v) case KindVariableStatement: return n.data.(*VariableStatement).ForEachChild(v) case KindVariableDeclaration: return n.data.(*VariableDeclaration).ForEachChild(v) case KindVariableDeclarationList: return n.data.(*VariableDeclarationList).ForEachChild(v) case KindObjectBindingPattern, KindArrayBindingPattern: return n.data.(*BindingPattern).ForEachChild(v) case KindParameter: return n.data.(*ParameterDeclaration).ForEachChild(v) case KindBindingElement: return n.data.(*BindingElement).ForEachChild(v) case KindMissingDeclaration: return n.data.(*MissingDeclaration).ForEachChild(v) case KindFunctionDeclaration: return n.data.(*FunctionDeclaration).ForEachChild(v) case KindClassDeclaration: return n.data.(*ClassDeclaration).ForEachChild(v) case KindClassExpression: return n.data.(*ClassExpression).ForEachChild(v) case KindHeritageClause: return n.data.(*HeritageClause).ForEachChild(v) case KindInterfaceDeclaration: return n.data.(*InterfaceDeclaration).ForEachChild(v) case KindTypeAliasDeclaration, KindJSTypeAliasDeclaration: return n.data.(*TypeAliasDeclaration).ForEachChild(v) case KindEnumMember: return n.data.(*EnumMember).ForEachChild(v) case KindEnumDeclaration: return n.data.(*EnumDeclaration).ForEachChild(v) case KindModuleBlock: return n.data.(*ModuleBlock).ForEachChild(v) case KindImportDeclaration, KindJSImportDeclaration: return n.data.(*ImportDeclaration).ForEachChild(v) case KindExternalModuleReference: return n.data.(*ExternalModuleReference).ForEachChild(v) case KindNamespaceImport: return n.data.(*NamespaceImport).ForEachChild(v) case KindNamedImports: return n.data.(*NamedImports).ForEachChild(v) case KindExportAssignment: return n.data.(*ExportAssignment).ForEachChild(v) case KindNamespaceExportDeclaration: return n.data.(*NamespaceExportDeclaration).ForEachChild(v) case KindNamespaceExport: return n.data.(*NamespaceExport).ForEachChild(v) case KindNamedExports: return n.data.(*NamedExports).ForEachChild(v) case KindExportSpecifier: return n.data.(*ExportSpecifier).ForEachChild(v) case KindCallSignature: return n.data.(*CallSignatureDeclaration).ForEachChild(v) case KindConstructSignature: return n.data.(*ConstructSignatureDeclaration).ForEachChild(v) case KindConstructor: return n.data.(*ConstructorDeclaration).ForEachChild(v) case KindGetAccessor: return n.data.(*GetAccessorDeclaration).ForEachChild(v) case KindSetAccessor: return n.data.(*SetAccessorDeclaration).ForEachChild(v) case KindIndexSignature: return n.data.(*IndexSignatureDeclaration).ForEachChild(v) case KindMethodSignature: return n.data.(*MethodSignatureDeclaration).ForEachChild(v) case KindMethodDeclaration: return n.data.(*MethodDeclaration).ForEachChild(v) case KindPropertySignature: return n.data.(*PropertySignatureDeclaration).ForEachChild(v) case KindPropertyDeclaration: return n.data.(*PropertyDeclaration).ForEachChild(v) case KindClassStaticBlockDeclaration: return n.data.(*ClassStaticBlockDeclaration).ForEachChild(v) case KindBinaryExpression: return n.data.(*BinaryExpression).ForEachChild(v) case KindPrefixUnaryExpression: return n.data.(*PrefixUnaryExpression).ForEachChild(v) case KindPostfixUnaryExpression: return n.data.(*PostfixUnaryExpression).ForEachChild(v) case KindYieldExpression: return n.data.(*YieldExpression).ForEachChild(v) case KindArrowFunction: return n.data.(*ArrowFunction).ForEachChild(v) case KindFunctionExpression: return n.data.(*FunctionExpression).ForEachChild(v) case KindAsExpression: return n.data.(*AsExpression).ForEachChild(v) case KindSatisfiesExpression: return n.data.(*SatisfiesExpression).ForEachChild(v) case KindConditionalExpression: return n.data.(*ConditionalExpression).ForEachChild(v) case KindPropertyAccessExpression: return n.data.(*PropertyAccessExpression).ForEachChild(v) case KindElementAccessExpression: return n.data.(*ElementAccessExpression).ForEachChild(v) case KindCallExpression: return n.data.(*CallExpression).ForEachChild(v) case KindNewExpression: return n.data.(*NewExpression).ForEachChild(v) case KindMetaProperty: return n.data.(*MetaProperty).ForEachChild(v) case KindNonNullExpression: return n.data.(*NonNullExpression).ForEachChild(v) case KindSpreadElement: return n.data.(*SpreadElement).ForEachChild(v) case KindTemplateExpression: return n.data.(*TemplateExpression).ForEachChild(v) case KindTemplateSpan: return n.data.(*TemplateSpan).ForEachChild(v) case KindTaggedTemplateExpression: return n.data.(*TaggedTemplateExpression).ForEachChild(v) case KindParenthesizedExpression: return n.data.(*ParenthesizedExpression).ForEachChild(v) case KindArrayLiteralExpression: return n.data.(*ArrayLiteralExpression).ForEachChild(v) case KindObjectLiteralExpression: return n.data.(*ObjectLiteralExpression).ForEachChild(v) case KindSpreadAssignment: return n.data.(*SpreadAssignment).ForEachChild(v) case KindPropertyAssignment: return n.data.(*PropertyAssignment).ForEachChild(v) case KindShorthandPropertyAssignment: return n.data.(*ShorthandPropertyAssignment).ForEachChild(v) case KindDeleteExpression: return n.data.(*DeleteExpression).ForEachChild(v) case KindTypeOfExpression: return n.data.(*TypeOfExpression).ForEachChild(v) case KindVoidExpression: return n.data.(*VoidExpression).ForEachChild(v) case KindAwaitExpression: return n.data.(*AwaitExpression).ForEachChild(v) case KindTypeAssertionExpression: return n.data.(*TypeAssertion).ForEachChild(v) case KindUnionType: return n.data.(*UnionTypeNode).ForEachChild(v) case KindIntersectionType: return n.data.(*IntersectionTypeNode).ForEachChild(v) case KindConditionalType: return n.data.(*ConditionalTypeNode).ForEachChild(v) case KindTypeOperator: return n.data.(*TypeOperatorNode).ForEachChild(v) case KindInferType: return n.data.(*InferTypeNode).ForEachChild(v) case KindArrayType: return n.data.(*ArrayTypeNode).ForEachChild(v) case KindIndexedAccessType: return n.data.(*IndexedAccessTypeNode).ForEachChild(v) case KindTypeReference: return n.data.(*TypeReferenceNode).ForEachChild(v) case KindExpressionWithTypeArguments: return n.data.(*ExpressionWithTypeArguments).ForEachChild(v) case KindLiteralType: return n.data.(*LiteralTypeNode).ForEachChild(v) case KindTypePredicate: return n.data.(*TypePredicateNode).ForEachChild(v) case KindImportAttribute: return n.data.(*ImportAttribute).ForEachChild(v) case KindImportAttributes: return n.data.(*ImportAttributes).ForEachChild(v) case KindTypeQuery: return n.data.(*TypeQueryNode).ForEachChild(v) case KindMappedType: return n.data.(*MappedTypeNode).ForEachChild(v) case KindTypeLiteral: return n.data.(*TypeLiteralNode).ForEachChild(v) case KindTupleType: return n.data.(*TupleTypeNode).ForEachChild(v) case KindNamedTupleMember: return n.data.(*NamedTupleMember).ForEachChild(v) case KindOptionalType: return n.data.(*OptionalTypeNode).ForEachChild(v) case KindRestType: return n.data.(*RestTypeNode).ForEachChild(v) case KindParenthesizedType: return n.data.(*ParenthesizedTypeNode).ForEachChild(v) case KindFunctionType: return n.data.(*FunctionTypeNode).ForEachChild(v) case KindConstructorType: return n.data.(*ConstructorTypeNode).ForEachChild(v) case KindTemplateLiteralType: return n.data.(*TemplateLiteralTypeNode).ForEachChild(v) case KindTemplateLiteralTypeSpan: return n.data.(*TemplateLiteralTypeSpan).ForEachChild(v) case KindSyntheticExpression: return n.data.(*SyntheticExpression).ForEachChild(v) case KindPartiallyEmittedExpression: return n.data.(*PartiallyEmittedExpression).ForEachChild(v) case KindJsxElement: return n.data.(*JsxElement).ForEachChild(v) case KindJsxAttributes: return n.data.(*JsxAttributes).ForEachChild(v) case KindJsxNamespacedName: return n.data.(*JsxNamespacedName).ForEachChild(v) case KindJsxOpeningElement: return n.data.(*JsxOpeningElement).ForEachChild(v) case KindJsxSelfClosingElement: return n.data.(*JsxSelfClosingElement).ForEachChild(v) case KindJsxFragment: return n.data.(*JsxFragment).ForEachChild(v) case KindJsxAttribute: return n.data.(*JsxAttribute).ForEachChild(v) case KindJsxSpreadAttribute: return n.data.(*JsxSpreadAttribute).ForEachChild(v) case KindJsxClosingElement: return n.data.(*JsxClosingElement).ForEachChild(v) case KindJsxExpression: return n.data.(*JsxExpression).ForEachChild(v) case KindSyntaxList: return n.data.(*SyntaxList).ForEachChild(v) case KindJSDoc: return n.data.(*JSDoc).ForEachChild(v) case KindJSDocTypeExpression: return n.data.(*JSDocTypeExpression).ForEachChild(v) case KindJSDocNonNullableType: return n.data.(*JSDocNonNullableType).ForEachChild(v) case KindJSDocNullableType: return n.data.(*JSDocNullableType).ForEachChild(v) case KindJSDocVariadicType: return n.data.(*JSDocVariadicType).ForEachChild(v) case KindJSDocOptionalType: return n.data.(*JSDocOptionalType).ForEachChild(v) case KindJSDocTypeTag: return n.data.(*JSDocTypeTag).ForEachChild(v) case KindJSDocUnknownTag: return n.data.(*JSDocUnknownTag).ForEachChild(v) case KindJSDocTemplateTag: return n.data.(*JSDocTemplateTag).ForEachChild(v) case KindJSDocReturnTag: return n.data.(*JSDocReturnTag).ForEachChild(v) case KindJSDocPublicTag: return n.data.(*JSDocPublicTag).ForEachChild(v) case KindJSDocPrivateTag: return n.data.(*JSDocPrivateTag).ForEachChild(v) case KindJSDocProtectedTag: return n.data.(*JSDocProtectedTag).ForEachChild(v) case KindJSDocReadonlyTag: return n.data.(*JSDocReadonlyTag).ForEachChild(v) case KindJSDocOverrideTag: return n.data.(*JSDocOverrideTag).ForEachChild(v) case KindJSDocDeprecatedTag: return n.data.(*JSDocDeprecatedTag).ForEachChild(v) case KindJSDocSeeTag: return n.data.(*JSDocSeeTag).ForEachChild(v) case KindJSDocImplementsTag: return n.data.(*JSDocImplementsTag).ForEachChild(v) case KindJSDocAugmentsTag: return n.data.(*JSDocAugmentsTag).ForEachChild(v) case KindJSDocSatisfiesTag: return n.data.(*JSDocSatisfiesTag).ForEachChild(v) case KindJSDocThrowsTag: return n.data.(*JSDocThrowsTag).ForEachChild(v) case KindJSDocThisTag: return n.data.(*JSDocThisTag).ForEachChild(v) case KindJSDocImportTag: return n.data.(*JSDocImportTag).ForEachChild(v) case KindJSDocCallbackTag: return n.data.(*JSDocCallbackTag).ForEachChild(v) case KindJSDocOverloadTag: return n.data.(*JSDocOverloadTag).ForEachChild(v) case KindJSDocTypedefTag: return n.data.(*JSDocTypedefTag).ForEachChild(v) case KindJSDocSignature: return n.data.(*JSDocSignature).ForEachChild(v) case KindJSDocNameReference: return n.data.(*JSDocNameReference).ForEachChild(v) case KindSourceFile: return n.data.(*SourceFile).ForEachChild(v) case KindModuleDeclaration: return n.data.(*ModuleDeclaration).ForEachChild(v) case KindImportEqualsDeclaration: return n.data.(*ImportEqualsDeclaration).ForEachChild(v) case KindExportDeclaration: return n.data.(*ExportDeclaration).ForEachChild(v) case KindImportType: return n.data.(*ImportTypeNode).ForEachChild(v) case KindImportClause: return n.data.(*ImportClause).ForEachChild(v) case KindImportSpecifier: return n.data.(*ImportSpecifier).ForEachChild(v) case KindJSDocLink: return n.data.(*JSDocLink).ForEachChild(v) case KindJSDocLinkPlain: return n.data.(*JSDocLinkPlain).ForEachChild(v) case KindJSDocLinkCode: return n.data.(*JSDocLinkCode).ForEachChild(v) case KindTypeParameter: return n.data.(*TypeParameterDeclaration).ForEachChild(v) case KindSyntheticReferenceExpression: return n.data.(*SyntheticReferenceExpression).ForEachChild(v) case KindJSDocTypeLiteral: return n.data.(*JSDocTypeLiteral).ForEachChild(v) case KindJSDocParameterTag, KindJSDocPropertyTag: return n.data.(*JSDocParameterOrPropertyTag).ForEachChild(v) default: return false } } // ────────────────────────────────────────────────────────────────────── // As*() cast methods // ────────────────────────────────────────────────────────────────────── func (n *Node) AsToken() *Token { return n.data.(*Token) } 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) AsComputedPropertyName() *ComputedPropertyName { return n.data.(*ComputedPropertyName) } func (n *Node) AsDecorator() *Decorator { return n.data.(*Decorator) } func (n *Node) AsEmptyStatement() *EmptyStatement { return n.data.(*EmptyStatement) } func (n *Node) AsIfStatement() *IfStatement { return n.data.(*IfStatement) } func (n *Node) AsDoStatement() *DoStatement { return n.data.(*DoStatement) } func (n *Node) AsWhileStatement() *WhileStatement { return n.data.(*WhileStatement) } func (n *Node) AsForStatement() *ForStatement { return n.data.(*ForStatement) } func (n *Node) AsForInOrOfStatement() *ForInOrOfStatement { return n.data.(*ForInOrOfStatement) } func (n *Node) AsBreakStatement() *BreakStatement { return n.data.(*BreakStatement) } func (n *Node) AsContinueStatement() *ContinueStatement { return n.data.(*ContinueStatement) } 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) AsCaseBlock() *CaseBlock { return n.data.(*CaseBlock) } func (n *Node) AsCaseOrDefaultClause() *CaseOrDefaultClause { return n.data.(*CaseOrDefaultClause) } func (n *Node) AsThrowStatement() *ThrowStatement { return n.data.(*ThrowStatement) } func (n *Node) AsTryStatement() *TryStatement { return n.data.(*TryStatement) } func (n *Node) AsCatchClause() *CatchClause { return n.data.(*CatchClause) } func (n *Node) AsDebuggerStatement() *DebuggerStatement { return n.data.(*DebuggerStatement) } func (n *Node) AsLabeledStatement() *LabeledStatement { return n.data.(*LabeledStatement) } func (n *Node) AsExpressionStatement() *ExpressionStatement { return n.data.(*ExpressionStatement) } func (n *Node) AsBlock() *Block { return n.data.(*Block) } func (n *Node) AsVariableStatement() *VariableStatement { return n.data.(*VariableStatement) } func (n *Node) AsVariableDeclaration() *VariableDeclaration { return n.data.(*VariableDeclaration) } func (n *Node) AsVariableDeclarationList() *VariableDeclarationList { return n.data.(*VariableDeclarationList) } func (n *Node) AsBindingPattern() *BindingPattern { return n.data.(*BindingPattern) } func (n *Node) AsParameterDeclaration() *ParameterDeclaration { return n.data.(*ParameterDeclaration) } func (n *Node) AsBindingElement() *BindingElement { return n.data.(*BindingElement) } func (n *Node) AsMissingDeclaration() *MissingDeclaration { return n.data.(*MissingDeclaration) } func (n *Node) AsFunctionDeclaration() *FunctionDeclaration { return n.data.(*FunctionDeclaration) } func (n *Node) AsClassDeclaration() *ClassDeclaration { return n.data.(*ClassDeclaration) } func (n *Node) AsClassExpression() *ClassExpression { return n.data.(*ClassExpression) } func (n *Node) AsHeritageClause() *HeritageClause { return n.data.(*HeritageClause) } func (n *Node) AsInterfaceDeclaration() *InterfaceDeclaration { return n.data.(*InterfaceDeclaration) } func (n *Node) AsTypeAliasDeclaration() *TypeAliasDeclaration { return n.data.(*TypeAliasDeclaration) } func (n *Node) AsEnumMember() *EnumMember { return n.data.(*EnumMember) } func (n *Node) AsEnumDeclaration() *EnumDeclaration { return n.data.(*EnumDeclaration) } func (n *Node) AsModuleBlock() *ModuleBlock { return n.data.(*ModuleBlock) } func (n *Node) AsNotEmittedStatement() *NotEmittedStatement { return n.data.(*NotEmittedStatement) } func (n *Node) AsNotEmittedTypeElement() *NotEmittedTypeElement { return n.data.(*NotEmittedTypeElement) } func (n *Node) AsImportDeclaration() *ImportDeclaration { return n.data.(*ImportDeclaration) } func (n *Node) AsExternalModuleReference() *ExternalModuleReference { return n.data.(*ExternalModuleReference) } func (n *Node) AsNamespaceImport() *NamespaceImport { return n.data.(*NamespaceImport) } func (n *Node) AsNamedImports() *NamedImports { return n.data.(*NamedImports) } func (n *Node) AsExportAssignment() *ExportAssignment { return n.data.(*ExportAssignment) } func (n *Node) AsNamespaceExportDeclaration() *NamespaceExportDeclaration { return n.data.(*NamespaceExportDeclaration) } func (n *Node) AsNamespaceExport() *NamespaceExport { return n.data.(*NamespaceExport) } func (n *Node) AsNamedExports() *NamedExports { return n.data.(*NamedExports) } func (n *Node) AsExportSpecifier() *ExportSpecifier { return n.data.(*ExportSpecifier) } func (n *Node) AsCallSignatureDeclaration() *CallSignatureDeclaration { return n.data.(*CallSignatureDeclaration) } func (n *Node) AsConstructSignatureDeclaration() *ConstructSignatureDeclaration { return n.data.(*ConstructSignatureDeclaration) } func (n *Node) AsConstructorDeclaration() *ConstructorDeclaration { return n.data.(*ConstructorDeclaration) } func (n *Node) AsGetAccessorDeclaration() *GetAccessorDeclaration { return n.data.(*GetAccessorDeclaration) } func (n *Node) AsSetAccessorDeclaration() *SetAccessorDeclaration { return n.data.(*SetAccessorDeclaration) } func (n *Node) AsIndexSignatureDeclaration() *IndexSignatureDeclaration { return n.data.(*IndexSignatureDeclaration) } func (n *Node) AsMethodSignatureDeclaration() *MethodSignatureDeclaration { return n.data.(*MethodSignatureDeclaration) } func (n *Node) AsMethodDeclaration() *MethodDeclaration { return n.data.(*MethodDeclaration) } func (n *Node) AsPropertySignatureDeclaration() *PropertySignatureDeclaration { return n.data.(*PropertySignatureDeclaration) } func (n *Node) AsPropertyDeclaration() *PropertyDeclaration { return n.data.(*PropertyDeclaration) } func (n *Node) AsSemicolonClassElement() *SemicolonClassElement { return n.data.(*SemicolonClassElement) } func (n *Node) AsClassStaticBlockDeclaration() *ClassStaticBlockDeclaration { return n.data.(*ClassStaticBlockDeclaration) } func (n *Node) AsOmittedExpression() *OmittedExpression { return n.data.(*OmittedExpression) } func (n *Node) AsKeywordExpression() *KeywordExpression { return n.data.(*KeywordExpression) } 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) AsRegularExpressionLiteral() *RegularExpressionLiteral { return n.data.(*RegularExpressionLiteral) } func (n *Node) AsNoSubstitutionTemplateLiteral() *NoSubstitutionTemplateLiteral { return n.data.(*NoSubstitutionTemplateLiteral) } func (n *Node) AsBinaryExpression() *BinaryExpression { return n.data.(*BinaryExpression) } func (n *Node) AsPrefixUnaryExpression() *PrefixUnaryExpression { return n.data.(*PrefixUnaryExpression) } func (n *Node) AsPostfixUnaryExpression() *PostfixUnaryExpression { return n.data.(*PostfixUnaryExpression) } func (n *Node) AsYieldExpression() *YieldExpression { return n.data.(*YieldExpression) } func (n *Node) AsArrowFunction() *ArrowFunction { return n.data.(*ArrowFunction) } func (n *Node) AsFunctionExpression() *FunctionExpression { return n.data.(*FunctionExpression) } func (n *Node) AsAsExpression() *AsExpression { return n.data.(*AsExpression) } func (n *Node) AsSatisfiesExpression() *SatisfiesExpression { return n.data.(*SatisfiesExpression) } func (n *Node) AsConditionalExpression() *ConditionalExpression { return n.data.(*ConditionalExpression) } func (n *Node) AsPropertyAccessExpression() *PropertyAccessExpression { return n.data.(*PropertyAccessExpression) } func (n *Node) AsElementAccessExpression() *ElementAccessExpression { return n.data.(*ElementAccessExpression) } func (n *Node) AsCallExpression() *CallExpression { return n.data.(*CallExpression) } func (n *Node) AsNewExpression() *NewExpression { return n.data.(*NewExpression) } func (n *Node) AsMetaProperty() *MetaProperty { return n.data.(*MetaProperty) } func (n *Node) AsNonNullExpression() *NonNullExpression { return n.data.(*NonNullExpression) } func (n *Node) AsSpreadElement() *SpreadElement { return n.data.(*SpreadElement) } func (n *Node) AsTemplateExpression() *TemplateExpression { return n.data.(*TemplateExpression) } func (n *Node) AsTemplateSpan() *TemplateSpan { return n.data.(*TemplateSpan) } func (n *Node) AsTaggedTemplateExpression() *TaggedTemplateExpression { return n.data.(*TaggedTemplateExpression) } func (n *Node) AsParenthesizedExpression() *ParenthesizedExpression { return n.data.(*ParenthesizedExpression) } func (n *Node) AsArrayLiteralExpression() *ArrayLiteralExpression { return n.data.(*ArrayLiteralExpression) } func (n *Node) AsObjectLiteralExpression() *ObjectLiteralExpression { return n.data.(*ObjectLiteralExpression) } func (n *Node) AsSpreadAssignment() *SpreadAssignment { return n.data.(*SpreadAssignment) } func (n *Node) AsPropertyAssignment() *PropertyAssignment { return n.data.(*PropertyAssignment) } func (n *Node) AsShorthandPropertyAssignment() *ShorthandPropertyAssignment { return n.data.(*ShorthandPropertyAssignment) } func (n *Node) AsDeleteExpression() *DeleteExpression { return n.data.(*DeleteExpression) } 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) AsTypeAssertion() *TypeAssertion { return n.data.(*TypeAssertion) } func (n *Node) AsKeywordTypeNode() *KeywordTypeNode { return n.data.(*KeywordTypeNode) } func (n *Node) AsUnionTypeNode() *UnionTypeNode { return n.data.(*UnionTypeNode) } func (n *Node) AsIntersectionTypeNode() *IntersectionTypeNode { return n.data.(*IntersectionTypeNode) } func (n *Node) AsConditionalTypeNode() *ConditionalTypeNode { return n.data.(*ConditionalTypeNode) } func (n *Node) AsTypeOperatorNode() *TypeOperatorNode { return n.data.(*TypeOperatorNode) } func (n *Node) AsInferTypeNode() *InferTypeNode { return n.data.(*InferTypeNode) } func (n *Node) AsArrayTypeNode() *ArrayTypeNode { return n.data.(*ArrayTypeNode) } func (n *Node) AsIndexedAccessTypeNode() *IndexedAccessTypeNode { return n.data.(*IndexedAccessTypeNode) } func (n *Node) AsTypeReferenceNode() *TypeReferenceNode { return n.data.(*TypeReferenceNode) } func (n *Node) AsExpressionWithTypeArguments() *ExpressionWithTypeArguments { return n.data.(*ExpressionWithTypeArguments) } func (n *Node) AsLiteralTypeNode() *LiteralTypeNode { return n.data.(*LiteralTypeNode) } func (n *Node) AsThisTypeNode() *ThisTypeNode { return n.data.(*ThisTypeNode) } func (n *Node) AsTypePredicateNode() *TypePredicateNode { return n.data.(*TypePredicateNode) } func (n *Node) AsImportAttribute() *ImportAttribute { return n.data.(*ImportAttribute) } func (n *Node) AsImportAttributes() *ImportAttributes { return n.data.(*ImportAttributes) } func (n *Node) AsTypeQueryNode() *TypeQueryNode { return n.data.(*TypeQueryNode) } func (n *Node) AsMappedTypeNode() *MappedTypeNode { return n.data.(*MappedTypeNode) } func (n *Node) AsTypeLiteralNode() *TypeLiteralNode { return n.data.(*TypeLiteralNode) } func (n *Node) AsTupleTypeNode() *TupleTypeNode { return n.data.(*TupleTypeNode) } func (n *Node) AsNamedTupleMember() *NamedTupleMember { return n.data.(*NamedTupleMember) } func (n *Node) AsOptionalTypeNode() *OptionalTypeNode { return n.data.(*OptionalTypeNode) } func (n *Node) AsRestTypeNode() *RestTypeNode { return n.data.(*RestTypeNode) } func (n *Node) AsParenthesizedTypeNode() *ParenthesizedTypeNode { return n.data.(*ParenthesizedTypeNode) } func (n *Node) AsFunctionTypeNode() *FunctionTypeNode { return n.data.(*FunctionTypeNode) } func (n *Node) AsConstructorTypeNode() *ConstructorTypeNode { return n.data.(*ConstructorTypeNode) } 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) AsTemplateLiteralTypeNode() *TemplateLiteralTypeNode { return n.data.(*TemplateLiteralTypeNode) } func (n *Node) AsTemplateLiteralTypeSpan() *TemplateLiteralTypeSpan { return n.data.(*TemplateLiteralTypeSpan) } func (n *Node) AsSyntheticExpression() *SyntheticExpression { return n.data.(*SyntheticExpression) } func (n *Node) AsPartiallyEmittedExpression() *PartiallyEmittedExpression { return n.data.(*PartiallyEmittedExpression) } func (n *Node) AsJsxElement() *JsxElement { return n.data.(*JsxElement) } func (n *Node) AsJsxAttributes() *JsxAttributes { return n.data.(*JsxAttributes) } func (n *Node) AsJsxNamespacedName() *JsxNamespacedName { return n.data.(*JsxNamespacedName) } func (n *Node) AsJsxOpeningElement() *JsxOpeningElement { return n.data.(*JsxOpeningElement) } func (n *Node) AsJsxSelfClosingElement() *JsxSelfClosingElement { return n.data.(*JsxSelfClosingElement) } func (n *Node) AsJsxFragment() *JsxFragment { return n.data.(*JsxFragment) } func (n *Node) AsJsxOpeningFragment() *JsxOpeningFragment { return n.data.(*JsxOpeningFragment) } func (n *Node) AsJsxClosingFragment() *JsxClosingFragment { return n.data.(*JsxClosingFragment) } func (n *Node) AsJsxAttribute() *JsxAttribute { return n.data.(*JsxAttribute) } func (n *Node) AsJsxSpreadAttribute() *JsxSpreadAttribute { return n.data.(*JsxSpreadAttribute) } func (n *Node) AsJsxClosingElement() *JsxClosingElement { return n.data.(*JsxClosingElement) } func (n *Node) AsJsxExpression() *JsxExpression { return n.data.(*JsxExpression) } func (n *Node) AsJsxText() *JsxText { return n.data.(*JsxText) } func (n *Node) AsSyntaxList() *SyntaxList { return n.data.(*SyntaxList) } func (n *Node) AsJSDoc() *JSDoc { return n.data.(*JSDoc) } 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) 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) AsJSDocThrowsTag() *JSDocThrowsTag { return n.data.(*JSDocThrowsTag) } 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) AsJSDocSignature() *JSDocSignature { return n.data.(*JSDocSignature) } func (n *Node) AsJSDocNameReference() *JSDocNameReference { return n.data.(*JSDocNameReference) } func (n *Node) AsSourceFile() *SourceFile { return n.data.(*SourceFile) } func (n *Node) AsModuleDeclaration() *ModuleDeclaration { return n.data.(*ModuleDeclaration) } func (n *Node) AsImportEqualsDeclaration() *ImportEqualsDeclaration { return n.data.(*ImportEqualsDeclaration) } func (n *Node) AsExportDeclaration() *ExportDeclaration { return n.data.(*ExportDeclaration) } func (n *Node) AsImportTypeNode() *ImportTypeNode { return n.data.(*ImportTypeNode) } func (n *Node) AsImportClause() *ImportClause { return n.data.(*ImportClause) } func (n *Node) AsImportSpecifier() *ImportSpecifier { return n.data.(*ImportSpecifier) } 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) AsTypeParameterDeclaration() *TypeParameterDeclaration { return n.data.(*TypeParameterDeclaration) } func (n *Node) AsSyntheticReferenceExpression() *SyntheticReferenceExpression { return n.data.(*SyntheticReferenceExpression) } func (n *Node) AsJSDocTypeLiteral() *JSDocTypeLiteral { return n.data.(*JSDocTypeLiteral) } func (n *Node) AsJSDocParameterOrPropertyTag() *JSDocParameterOrPropertyTag { return n.data.(*JSDocParameterOrPropertyTag) } // ────────────────────────────────────────────────────────────────────── // Kind alias guards // ────────────────────────────────────────────────────────────────────── func IsTriviaKind(kind Kind) bool { switch kind { case KindSingleLineCommentTrivia, KindMultiLineCommentTrivia, KindNewLineTrivia, KindWhitespaceTrivia, KindConflictMarkerTrivia: return true } return false } func IsLiteralKind(kind Kind) bool { return kind >= KindFirstLiteralToken && kind <= KindLastLiteralToken } func IsPseudoLiteralKind(kind Kind) bool { switch kind { case KindTemplateHead, KindTemplateMiddle, KindTemplateTail: return true } return false } func IsPunctuationKind(kind Kind) bool { return kind >= KindFirstPunctuation && kind <= KindLastPunctuation } func IsKeywordKind(kind Kind) bool { return kind >= KindFirstKeyword && kind <= KindLastKeyword } func IsModifierKind(kind Kind) bool { switch kind { case KindAbstractKeyword, KindAccessorKeyword, KindAsyncKeyword, KindConstKeyword, KindDeclareKeyword, KindDefaultKeyword, KindExportKeyword, KindInKeyword, KindPrivateKeyword, KindProtectedKeyword, KindPublicKeyword, KindReadonlyKeyword, KindOutKeyword, KindOverrideKeyword, KindStaticKeyword: return true } return false } func IsKeywordTypeKind(kind Kind) bool { switch kind { case KindAnyKeyword, KindBigIntKeyword, KindBooleanKeyword, KindIntrinsicKeyword, KindNeverKeyword, KindNumberKeyword, KindObjectKeyword, KindStringKeyword, KindSymbolKeyword, KindUndefinedKeyword, KindUnknownKeyword, KindVoidKeyword: return true } return false } func IsKeywordExpressionKind(kind Kind) bool { switch kind { case KindNullKeyword, KindTrueKeyword, KindFalseKeyword, KindThisKeyword, KindSuperKeyword, KindImportKeyword: return true } return false } func IsTokenKind(kind Kind) bool { return kind >= KindFirstToken && kind <= KindLastToken } func IsJsxTokenKind(kind Kind) bool { switch kind { case KindLessThanSlashToken, KindEndOfFile, KindConflictMarkerTrivia, KindJsxText, KindJsxTextAllWhiteSpaces, KindOpenBraceToken, KindLessThanToken: return true } return false } func IsJSDocNodeKind(kind Kind) bool { return kind >= KindFirstJSDocNode && kind <= KindLastJSDocNode } func IsImportPhaseModifierKind(kind Kind) bool { switch kind { case KindTypeKeyword, KindDeferKeyword: return true } return false } func IsPostfixUnaryOperator(kind Kind) bool { switch kind { case KindPlusPlusToken, KindMinusMinusToken: return true } return false } func IsPrefixUnaryOperator(kind Kind) bool { switch kind { case KindPlusToken, KindMinusToken, KindTildeToken, KindExclamationToken, KindPlusPlusToken, KindMinusMinusToken: return true } return false } func IsAssignmentOperator(kind Kind) bool { switch kind { case KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskAsteriskEqualsToken, KindAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindCaretEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken: return true } return false } func IsBinaryOperator(kind Kind) bool { switch kind { case KindQuestionQuestionToken, KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken, KindPlusToken, KindMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindLessThanToken, KindLessThanEqualsToken, KindGreaterThanToken, KindGreaterThanEqualsToken, KindInstanceOfKeyword, KindInKeyword, KindEqualsEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindExclamationEqualsToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindAmpersandAmpersandToken, KindBarBarToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskAsteriskEqualsToken, KindAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindCaretEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken, KindCommaToken: return true } return false } func IsExponentiationOperator(kind Kind) bool { switch kind { case KindAsteriskAsteriskToken: return true } return false } func IsMultiplicativeOperator(kind Kind) bool { switch kind { case KindAsteriskToken, KindSlashToken, KindPercentToken: return true } return false } func IsMultiplicativeOperatorOrHigher(kind Kind) bool { switch kind { case KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken: return true } return false } func IsAdditiveOperator(kind Kind) bool { switch kind { case KindPlusToken, KindMinusToken: return true } return false } func IsAdditiveOperatorOrHigher(kind Kind) bool { switch kind { case KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken, KindPlusToken, KindMinusToken: return true } return false } func IsShiftOperator(kind Kind) bool { switch kind { case KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken: return true } return false } func IsShiftOperatorOrHigher(kind Kind) bool { switch kind { case KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken, KindPlusToken, KindMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken: return true } return false } func IsRelationalOperator(kind Kind) bool { switch kind { case KindLessThanToken, KindLessThanEqualsToken, KindGreaterThanToken, KindGreaterThanEqualsToken, KindInstanceOfKeyword, KindInKeyword: return true } return false } func IsRelationalOperatorOrHigher(kind Kind) bool { switch kind { case KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken, KindPlusToken, KindMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindLessThanToken, KindLessThanEqualsToken, KindGreaterThanToken, KindGreaterThanEqualsToken, KindInstanceOfKeyword, KindInKeyword: return true } return false } func IsEqualityOperator(kind Kind) bool { switch kind { case KindEqualsEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindExclamationEqualsToken: return true } return false } func IsEqualityOperatorOrHigher(kind Kind) bool { switch kind { case KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken, KindPlusToken, KindMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindLessThanToken, KindLessThanEqualsToken, KindGreaterThanToken, KindGreaterThanEqualsToken, KindInstanceOfKeyword, KindInKeyword, KindEqualsEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindExclamationEqualsToken: return true } return false } func IsBitwiseOperator(kind Kind) bool { switch kind { case KindAmpersandToken, KindBarToken, KindCaretToken: return true } return false } func IsBitwiseOperatorOrHigher(kind Kind) bool { switch kind { case KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken, KindPlusToken, KindMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindLessThanToken, KindLessThanEqualsToken, KindGreaterThanToken, KindGreaterThanEqualsToken, KindInstanceOfKeyword, KindInKeyword, KindEqualsEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindExclamationEqualsToken, KindAmpersandToken, KindBarToken, KindCaretToken: return true } return false } func IsLogicalOperator(kind Kind) bool { switch kind { case KindAmpersandAmpersandToken, KindBarBarToken: return true } return false } func IsLogicalOperatorOrHigher(kind Kind) bool { switch kind { case KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken, KindPlusToken, KindMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindLessThanToken, KindLessThanEqualsToken, KindGreaterThanToken, KindGreaterThanEqualsToken, KindInstanceOfKeyword, KindInKeyword, KindEqualsEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindExclamationEqualsToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindAmpersandAmpersandToken, KindBarBarToken: return true } return false } func IsCompoundAssignmentOperator(kind Kind) bool { switch kind { case KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskAsteriskEqualsToken, KindAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindCaretEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken: return true } return false } func IsAssignmentOperatorOrHigher(kind Kind) bool { switch kind { case KindQuestionQuestionToken, KindAsteriskAsteriskToken, KindAsteriskToken, KindSlashToken, KindPercentToken, KindPlusToken, KindMinusToken, KindLessThanLessThanToken, KindGreaterThanGreaterThanToken, KindGreaterThanGreaterThanGreaterThanToken, KindLessThanToken, KindLessThanEqualsToken, KindGreaterThanToken, KindGreaterThanEqualsToken, KindInstanceOfKeyword, KindInKeyword, KindEqualsEqualsToken, KindEqualsEqualsEqualsToken, KindExclamationEqualsEqualsToken, KindExclamationEqualsToken, KindAmpersandToken, KindBarToken, KindCaretToken, KindAmpersandAmpersandToken, KindBarBarToken, KindEqualsToken, KindPlusEqualsToken, KindMinusEqualsToken, KindAsteriskAsteriskEqualsToken, KindAsteriskEqualsToken, KindSlashEqualsToken, KindPercentEqualsToken, KindAmpersandEqualsToken, KindBarEqualsToken, KindCaretEqualsToken, KindLessThanLessThanEqualsToken, KindGreaterThanGreaterThanGreaterThanEqualsToken, KindGreaterThanGreaterThanEqualsToken, KindBarBarEqualsToken, KindAmpersandAmpersandEqualsToken, KindQuestionQuestionEqualsToken: return true } return false } func IsLogicalOrCoalescingAssignmentOperator(kind Kind) bool { switch kind { case KindAmpersandAmpersandEqualsToken, KindBarBarEqualsToken, KindQuestionQuestionEqualsToken: return true } return false }