// Code generated by _scripts/generate-ts-ast.ts. DO NOT EDIT.
import { SyntaxKind } from "#enums/syntaxKind";
import { createNodeArray, updateArrayBindingPattern, updateArrayLiteralExpression, updateArrayTypeNode, updateArrowFunction, updateAsExpression, updateAwaitExpression, updateBinaryExpression, updateBindingElement, updateBlock, updateBreakStatement, updateCallExpression, updateCallSignatureDeclaration, updateCaseBlock, updateCaseClause, updateCatchClause, updateClassDeclaration, updateClassExpression, updateClassStaticBlockDeclaration, updateComputedPropertyName, updateConditionalExpression, updateConditionalTypeNode, updateConstructorDeclaration, updateConstructorTypeNode, updateConstructSignatureDeclaration, updateContinueStatement, updateDecorator, updateDefaultClause, updateDeleteExpression, updateDoStatement, updateElementAccessExpression, updateEnumDeclaration, updateEnumMember, updateExportAssignment, updateExportDeclaration, updateExportSpecifier, updateExpressionStatement, updateExpressionWithTypeArguments, updateExternalModuleReference, updateForInStatement, updateForOfStatement, updateForStatement, updateFunctionDeclaration, updateFunctionExpression, updateFunctionTypeNode, updateGetAccessorDeclaration, updateHeritageClause, updateIfStatement, updateImportAttribute, updateImportAttributes, updateImportClause, updateImportDeclaration, updateImportEqualsDeclaration, updateImportSpecifier, updateImportTypeNode, updateIndexedAccessTypeNode, updateIndexSignatureDeclaration, updateInferTypeNode, updateInterfaceDeclaration, updateIntersectionTypeNode, updateJSDoc, updateJSDocAugmentsTag, updateJSDocCallbackTag, updateJSDocDeprecatedTag, updateJSDocImplementsTag, updateJSDocImportTag, updateJSDocLink, updateJSDocLinkCode, updateJSDocLinkPlain, updateJSDocNameReference, updateJSDocNonNullableType, updateJSDocNullableType, updateJSDocOptionalType, updateJSDocOverloadTag, updateJSDocOverrideTag, updateJSDocPrivateTag, updateJSDocProtectedTag, updateJSDocPublicTag, updateJSDocReadonlyTag, updateJSDocReturnTag, updateJSDocSatisfiesTag, updateJSDocSeeTag, updateJSDocSignature, updateJSDocTemplateTag, updateJSDocThisTag, updateJSDocThrowsTag, updateJSDocTypedefTag, updateJSDocTypeExpression, updateJSDocTypeLiteral, updateJSDocTypeTag, updateJSDocUnknownTag, updateJSDocVariadicType, updateJsxAttribute, updateJsxAttributes, updateJsxClosingElement, updateJsxElement, updateJsxExpression, updateJsxFragment, updateJsxNamespacedName, updateJsxOpeningElement, updateJsxSelfClosingElement, updateJsxSpreadAttribute, updateLabeledStatement, updateLiteralTypeNode, updateMappedTypeNode, updateMetaProperty, updateMethodDeclaration, updateMethodSignatureDeclaration, updateMissingDeclaration, updateModuleBlock, updateModuleDeclaration, updateNamedExports, updateNamedImports, updateNamedTupleMember, updateNamespaceExport, updateNamespaceExportDeclaration, updateNamespaceImport, updateNewExpression, updateNonNullExpression, updateObjectBindingPattern, updateObjectLiteralExpression, updateOptionalTypeNode, updateParameterDeclaration, updateParenthesizedExpression, updateParenthesizedTypeNode, updatePartiallyEmittedExpression, updatePostfixUnaryExpression, updatePrefixUnaryExpression, updatePropertyAccessExpression, updatePropertyAssignment, updatePropertyDeclaration, updatePropertySignatureDeclaration, updateQualifiedName, updateRestTypeNode, updateReturnStatement, updateSatisfiesExpression, updateSetAccessorDeclaration, updateShorthandPropertyAssignment, updateSourceFile, updateSpreadAssignment, updateSpreadElement, updateSwitchStatement, updateSyntaxList, updateSyntheticExpression, updateSyntheticReferenceExpression, updateTaggedTemplateExpression, updateTemplateExpression, updateTemplateLiteralTypeNode, updateTemplateLiteralTypeSpan, updateTemplateSpan, updateThrowStatement, updateTryStatement, updateTupleTypeNode, updateTypeAliasDeclaration, updateTypeAssertion, updateTypeLiteralNode, updateTypeOfExpression, updateTypeOperatorNode, updateTypeParameterDeclaration, updateTypePredicateNode, updateTypeQueryNode, updateTypeReferenceNode, updateUnionTypeNode, updateVariableDeclaration, updateVariableDeclarationList, updateVariableStatement, updateVoidExpression, updateWhileStatement, updateWithStatement, updateYieldExpression, } from "./factory.generated.js";
import { isAssertsKeyword, isAsteriskToken, isAwaitKeyword, isBinaryOperatorToken, isBindingName, isBlock, isCaseBlock, isCatchClause, isColonToken, isConciseBody, isDotDotDotToken, isEndOfFile, isEntityName, isEqualsGreaterThanToken, isEqualsToken, isExclamationToken, isExpression, isExpressionWithTypeArguments, isForInitializer, isFunctionBody, isIdentifier, isImportAttributeName, isImportAttributes, isImportClause, isJSDocFullName, isJsxAttributeName, isJsxAttributes, isJsxAttributeValue, isJsxClosingElement, isJsxClosingFragment, isJsxOpeningElement, isJsxOpeningFragment, isJsxTagNameExpression, isLeftHandSideExpression, isMemberName, isModuleBody, isModuleExportName, isModuleName, isModuleReference, isNamedExportBindings, isNamedImportBindings, isPropertyName, isQuestionDotToken, isQuestionOrExclamationToken, isQuestionOrPlusOrMinusToken, isQuestionToken, isReadonlyKeywordOrPlusOrMinusToken, isStatement, isTemplateHead, isTemplateLiteral, isTemplateMiddleOrTail, isTypeNode, isTypeParameterDeclaration, isTypePredicateParameterName, isVariableDeclaration, isVariableDeclarationList, } from "./is.js";
import { visitEachChildOfJSDocParameterTag, visitEachChildOfJSDocPropertyTag, } from "./visitor.js";
export function visitNode(node, visitor, test) {
    if (node === undefined)
        return undefined;
    const visited = visitor(node);
    if (visited !== undefined && test !== undefined && !test(visited)) {
        throw new Error("Visited node failed test assertion.");
    }
    return visited;
}
export function visitNodes(nodes, visitor) {
    if (nodes === undefined)
        return undefined;
    const updated = visitNodesArray(nodes, visitor);
    if (updated === nodes) {
        return nodes;
    }
    return createNodeArray(updated, nodes.pos, nodes.end);
}
export function visitNodesArray(nodes, visitor) {
    if (nodes === undefined)
        return undefined;
    let updated;
    for (let i = 0; i < nodes.length; i++) {
        const node = nodes[i];
        const visited = visitor(node);
        if (updated) {
            if (visited)
                updated.push(visited);
        }
        else if (visited !== node) {
            updated = [];
            for (let j = 0; j < i; j++)
                updated.push(nodes[j]);
            if (visited)
                updated.push(visited);
        }
    }
    return updated ?? nodes;
}
export function visitEachChild(node, visitor) {
    if (node === undefined)
        return undefined;
    const fn = visitEachChildTable[node.kind];
    return fn ? fn(node, visitor) : node;
}
const visitEachChildTable = {
    [SyntaxKind.QualifiedName]: (node, visitor) => {
        const _left = visitNode(node.left, visitor, isEntityName);
        const _right = visitNode(node.right, visitor, isIdentifier);
        return updateQualifiedName(node, _left, _right);
    },
    [SyntaxKind.ComputedPropertyName]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateComputedPropertyName(node, _expression);
    },
    [SyntaxKind.Decorator]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isLeftHandSideExpression);
        return updateDecorator(node, _expression);
    },
    [SyntaxKind.IfStatement]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _thenStatement = visitNode(node.thenStatement, visitor, isStatement);
        const _elseStatement = visitNode(node.elseStatement, visitor, isStatement);
        return updateIfStatement(node, _expression, _thenStatement, _elseStatement);
    },
    [SyntaxKind.DoStatement]: (node, visitor) => {
        const _statement = visitNode(node.statement, visitor, isStatement);
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateDoStatement(node, _statement, _expression);
    },
    [SyntaxKind.WhileStatement]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _statement = visitNode(node.statement, visitor, isStatement);
        return updateWhileStatement(node, _expression, _statement);
    },
    [SyntaxKind.ForStatement]: (node, visitor) => {
        const _initializer = visitNode(node.initializer, visitor, isForInitializer);
        const _condition = visitNode(node.condition, visitor, isExpression);
        const _incrementor = visitNode(node.incrementor, visitor, isExpression);
        const _statement = visitNode(node.statement, visitor, isStatement);
        return updateForStatement(node, _initializer, _condition, _incrementor, _statement);
    },
    [SyntaxKind.BreakStatement]: (node, visitor) => {
        const _label = visitNode(node.label, visitor, isIdentifier);
        return updateBreakStatement(node, _label);
    },
    [SyntaxKind.ContinueStatement]: (node, visitor) => {
        const _label = visitNode(node.label, visitor, isIdentifier);
        return updateContinueStatement(node, _label);
    },
    [SyntaxKind.ReturnStatement]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateReturnStatement(node, _expression);
    },
    [SyntaxKind.WithStatement]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _statement = visitNode(node.statement, visitor, isStatement);
        return updateWithStatement(node, _expression, _statement);
    },
    [SyntaxKind.SwitchStatement]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _caseBlock = visitNode(node.caseBlock, visitor, isCaseBlock);
        return updateSwitchStatement(node, _expression, _caseBlock);
    },
    [SyntaxKind.CaseBlock]: (node, visitor) => {
        const _clauses = visitNodes(node.clauses, visitor);
        return updateCaseBlock(node, _clauses);
    },
    [SyntaxKind.ThrowStatement]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateThrowStatement(node, _expression);
    },
    [SyntaxKind.TryStatement]: (node, visitor) => {
        const _tryBlock = visitNode(node.tryBlock, visitor, isBlock);
        const _catchClause = visitNode(node.catchClause, visitor, isCatchClause);
        const _finallyBlock = visitNode(node.finallyBlock, visitor, isBlock);
        return updateTryStatement(node, _tryBlock, _catchClause, _finallyBlock);
    },
    [SyntaxKind.CatchClause]: (node, visitor) => {
        const _variableDeclaration = visitNode(node.variableDeclaration, visitor, isVariableDeclaration);
        const _block = visitNode(node.block, visitor, isBlock);
        return updateCatchClause(node, _variableDeclaration, _block);
    },
    [SyntaxKind.LabeledStatement]: (node, visitor) => {
        const _label = visitNode(node.label, visitor, isIdentifier);
        const _statement = visitNode(node.statement, visitor, isStatement);
        return updateLabeledStatement(node, _label, _statement);
    },
    [SyntaxKind.ExpressionStatement]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateExpressionStatement(node, _expression);
    },
    [SyntaxKind.Block]: (node, visitor) => {
        const _statements = visitNodes(node.statements, visitor);
        return updateBlock(node, _statements);
    },
    [SyntaxKind.VariableStatement]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _declarationList = visitNode(node.declarationList, visitor, isVariableDeclarationList);
        return updateVariableStatement(node, _modifiers, _declarationList);
    },
    [SyntaxKind.VariableDeclaration]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isBindingName);
        const _exclamationToken = visitNode(node.exclamationToken, visitor, isExclamationToken);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _initializer = visitNode(node.initializer, visitor, isExpression);
        return updateVariableDeclaration(node, _name, _exclamationToken, _type, _initializer);
    },
    [SyntaxKind.VariableDeclarationList]: (node, visitor) => {
        const _declarations = visitNodes(node.declarations, visitor);
        return updateVariableDeclarationList(node, _declarations);
    },
    [SyntaxKind.Parameter]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _dotDotDotToken = visitNode(node.dotDotDotToken, visitor, isDotDotDotToken);
        const _name = visitNode(node.name, visitor, isBindingName);
        const _questionToken = visitNode(node.questionToken, visitor, isQuestionToken);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _initializer = visitNode(node.initializer, visitor, isExpression);
        return updateParameterDeclaration(node, _modifiers, _dotDotDotToken, _name, _questionToken, _type, _initializer);
    },
    [SyntaxKind.BindingElement]: (node, visitor) => {
        const _dotDotDotToken = visitNode(node.dotDotDotToken, visitor, isDotDotDotToken);
        const _propertyName = visitNode(node.propertyName, visitor, isPropertyName);
        const _name = visitNode(node.name, visitor, isBindingName);
        const _initializer = visitNode(node.initializer, visitor, isExpression);
        return updateBindingElement(node, _dotDotDotToken, _propertyName, _name, _initializer);
    },
    [SyntaxKind.MissingDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        return updateMissingDeclaration(node, _modifiers);
    },
    [SyntaxKind.FunctionDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _asteriskToken = visitNode(node.asteriskToken, visitor, isAsteriskToken);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _body = visitNode(node.body, visitor, isFunctionBody);
        return updateFunctionDeclaration(node, _modifiers, _asteriskToken, _name, _typeParameters, _parameters, _type, _body);
    },
    [SyntaxKind.ClassDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _heritageClauses = visitNodes(node.heritageClauses, visitor);
        const _members = visitNodes(node.members, visitor);
        return updateClassDeclaration(node, _modifiers, _name, _typeParameters, _heritageClauses, _members);
    },
    [SyntaxKind.ClassExpression]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _heritageClauses = visitNodes(node.heritageClauses, visitor);
        const _members = visitNodes(node.members, visitor);
        return updateClassExpression(node, _modifiers, _name, _typeParameters, _heritageClauses, _members);
    },
    [SyntaxKind.HeritageClause]: (node, visitor) => {
        const _types = visitNodes(node.types, visitor);
        return updateHeritageClause(node, _types);
    },
    [SyntaxKind.InterfaceDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _heritageClauses = visitNodes(node.heritageClauses, visitor);
        const _members = visitNodes(node.members, visitor);
        return updateInterfaceDeclaration(node, _modifiers, _name, _typeParameters, _heritageClauses, _members);
    },
    [SyntaxKind.TypeAliasDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateTypeAliasDeclaration(node, _modifiers, _name, _typeParameters, _type);
    },
    [SyntaxKind.EnumMember]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _initializer = visitNode(node.initializer, visitor, isExpression);
        return updateEnumMember(node, _name, _initializer);
    },
    [SyntaxKind.EnumDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _members = visitNodes(node.members, visitor);
        return updateEnumDeclaration(node, _modifiers, _name, _members);
    },
    [SyntaxKind.ModuleBlock]: (node, visitor) => {
        const _statements = visitNodes(node.statements, visitor);
        return updateModuleBlock(node, _statements);
    },
    [SyntaxKind.ImportDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _importClause = visitNode(node.importClause, visitor, isImportClause);
        const _moduleSpecifier = visitNode(node.moduleSpecifier, visitor, isExpression);
        const _attributes = visitNode(node.attributes, visitor, isImportAttributes);
        return updateImportDeclaration(node, _modifiers, _importClause, _moduleSpecifier, _attributes);
    },
    [SyntaxKind.ExternalModuleReference]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateExternalModuleReference(node, _expression);
    },
    [SyntaxKind.NamespaceImport]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isIdentifier);
        return updateNamespaceImport(node, _name);
    },
    [SyntaxKind.NamedImports]: (node, visitor) => {
        const _elements = visitNodes(node.elements, visitor);
        return updateNamedImports(node, _elements);
    },
    [SyntaxKind.ExportAssignment]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateExportAssignment(node, _modifiers, _type, _expression);
    },
    [SyntaxKind.NamespaceExportDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isIdentifier);
        return updateNamespaceExportDeclaration(node, _modifiers, _name);
    },
    [SyntaxKind.NamespaceExport]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isModuleExportName);
        return updateNamespaceExport(node, _name);
    },
    [SyntaxKind.NamedExports]: (node, visitor) => {
        const _elements = visitNodes(node.elements, visitor);
        return updateNamedExports(node, _elements);
    },
    [SyntaxKind.ExportSpecifier]: (node, visitor) => {
        const _propertyName = visitNode(node.propertyName, visitor, isModuleExportName);
        const _name = visitNode(node.name, visitor, isModuleExportName);
        return updateExportSpecifier(node, _propertyName, _name);
    },
    [SyntaxKind.CallSignature]: (node, visitor) => {
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateCallSignatureDeclaration(node, _typeParameters, _parameters, _type);
    },
    [SyntaxKind.ConstructSignature]: (node, visitor) => {
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateConstructSignatureDeclaration(node, _typeParameters, _parameters, _type);
    },
    [SyntaxKind.Constructor]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _body = visitNode(node.body, visitor, isFunctionBody);
        return updateConstructorDeclaration(node, _modifiers, _typeParameters, _parameters, _type, _body);
    },
    [SyntaxKind.GetAccessor]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _body = visitNode(node.body, visitor, isFunctionBody);
        return updateGetAccessorDeclaration(node, _modifiers, _name, _typeParameters, _parameters, _type, _body);
    },
    [SyntaxKind.SetAccessor]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _body = visitNode(node.body, visitor, isFunctionBody);
        return updateSetAccessorDeclaration(node, _modifiers, _name, _typeParameters, _parameters, _type, _body);
    },
    [SyntaxKind.IndexSignature]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateIndexSignatureDeclaration(node, _modifiers, _parameters, _type);
    },
    [SyntaxKind.MethodSignature]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _postfixToken = visitNode(node.postfixToken, visitor, isQuestionOrExclamationToken);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateMethodSignatureDeclaration(node, _modifiers, _name, _postfixToken, _typeParameters, _parameters, _type);
    },
    [SyntaxKind.MethodDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _asteriskToken = visitNode(node.asteriskToken, visitor, isAsteriskToken);
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _postfixToken = visitNode(node.postfixToken, visitor, isQuestionOrExclamationToken);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _body = visitNode(node.body, visitor, isFunctionBody);
        return updateMethodDeclaration(node, _modifiers, _asteriskToken, _name, _postfixToken, _typeParameters, _parameters, _type, _body);
    },
    [SyntaxKind.PropertySignature]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _postfixToken = visitNode(node.postfixToken, visitor, isQuestionOrExclamationToken);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _initializer = visitNode(node.initializer, visitor, isExpression);
        return updatePropertySignatureDeclaration(node, _modifiers, _name, _postfixToken, _type, _initializer);
    },
    [SyntaxKind.PropertyDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _postfixToken = visitNode(node.postfixToken, visitor, isQuestionOrExclamationToken);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _initializer = visitNode(node.initializer, visitor, isExpression);
        return updatePropertyDeclaration(node, _modifiers, _name, _postfixToken, _type, _initializer);
    },
    [SyntaxKind.ClassStaticBlockDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _body = visitNode(node.body, visitor, isBlock);
        return updateClassStaticBlockDeclaration(node, _modifiers, _body);
    },
    [SyntaxKind.BinaryExpression]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _left = visitNode(node.left, visitor, isExpression);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _operatorToken = visitNode(node.operatorToken, visitor, isBinaryOperatorToken);
        const _right = visitNode(node.right, visitor, isExpression);
        return updateBinaryExpression(node, _modifiers, _left, _type, _operatorToken, _right);
    },
    [SyntaxKind.PrefixUnaryExpression]: (node, visitor) => {
        const _operand = visitNode(node.operand, visitor, isExpression);
        return updatePrefixUnaryExpression(node, _operand);
    },
    [SyntaxKind.PostfixUnaryExpression]: (node, visitor) => {
        const _operand = visitNode(node.operand, visitor, isExpression);
        return updatePostfixUnaryExpression(node, _operand);
    },
    [SyntaxKind.YieldExpression]: (node, visitor) => {
        const _asteriskToken = visitNode(node.asteriskToken, visitor, isAsteriskToken);
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateYieldExpression(node, _asteriskToken, _expression);
    },
    [SyntaxKind.ArrowFunction]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _equalsGreaterThanToken = visitNode(node.equalsGreaterThanToken, visitor, isEqualsGreaterThanToken);
        const _body = visitNode(node.body, visitor, isConciseBody);
        return updateArrowFunction(node, _modifiers, _typeParameters, _parameters, _type, _equalsGreaterThanToken, _body);
    },
    [SyntaxKind.FunctionExpression]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _asteriskToken = visitNode(node.asteriskToken, visitor, isAsteriskToken);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _body = visitNode(node.body, visitor, isFunctionBody);
        return updateFunctionExpression(node, _modifiers, _asteriskToken, _name, _typeParameters, _parameters, _type, _body);
    },
    [SyntaxKind.AsExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateAsExpression(node, _expression, _type);
    },
    [SyntaxKind.SatisfiesExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateSatisfiesExpression(node, _expression, _type);
    },
    [SyntaxKind.ConditionalExpression]: (node, visitor) => {
        const _condition = visitNode(node.condition, visitor, isExpression);
        const _questionToken = visitNode(node.questionToken, visitor, isQuestionToken);
        const _whenTrue = visitNode(node.whenTrue, visitor, isExpression);
        const _colonToken = visitNode(node.colonToken, visitor, isColonToken);
        const _whenFalse = visitNode(node.whenFalse, visitor, isExpression);
        return updateConditionalExpression(node, _condition, _questionToken, _whenTrue, _colonToken, _whenFalse);
    },
    [SyntaxKind.PropertyAccessExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _questionDotToken = visitNode(node.questionDotToken, visitor, isQuestionDotToken);
        const _name = visitNode(node.name, visitor, isMemberName);
        return updatePropertyAccessExpression(node, _expression, _questionDotToken, _name);
    },
    [SyntaxKind.ElementAccessExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _questionDotToken = visitNode(node.questionDotToken, visitor, isQuestionDotToken);
        const _argumentExpression = visitNode(node.argumentExpression, visitor, isExpression);
        return updateElementAccessExpression(node, _expression, _questionDotToken, _argumentExpression);
    },
    [SyntaxKind.CallExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _questionDotToken = visitNode(node.questionDotToken, visitor, isQuestionDotToken);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        const _arguments = visitNodes(node.arguments, visitor);
        return updateCallExpression(node, _expression, _questionDotToken, _typeArguments, _arguments);
    },
    [SyntaxKind.NewExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        const _arguments = visitNodes(node.arguments, visitor);
        return updateNewExpression(node, _expression, _typeArguments, _arguments);
    },
    [SyntaxKind.MetaProperty]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isIdentifier);
        return updateMetaProperty(node, _name);
    },
    [SyntaxKind.NonNullExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateNonNullExpression(node, _expression);
    },
    [SyntaxKind.SpreadElement]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateSpreadElement(node, _expression);
    },
    [SyntaxKind.TemplateExpression]: (node, visitor) => {
        const _head = visitNode(node.head, visitor, isTemplateHead);
        const _templateSpans = visitNodes(node.templateSpans, visitor);
        return updateTemplateExpression(node, _head, _templateSpans);
    },
    [SyntaxKind.TemplateSpan]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _literal = visitNode(node.literal, visitor, isTemplateMiddleOrTail);
        return updateTemplateSpan(node, _expression, _literal);
    },
    [SyntaxKind.TaggedTemplateExpression]: (node, visitor) => {
        const _tag = visitNode(node.tag, visitor, isExpression);
        const _questionDotToken = visitNode(node.questionDotToken, visitor, isQuestionDotToken);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        const _template = visitNode(node.template, visitor, isTemplateLiteral);
        return updateTaggedTemplateExpression(node, _tag, _questionDotToken, _typeArguments, _template);
    },
    [SyntaxKind.ParenthesizedExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateParenthesizedExpression(node, _expression);
    },
    [SyntaxKind.ArrayLiteralExpression]: (node, visitor) => {
        const _elements = visitNodes(node.elements, visitor);
        return updateArrayLiteralExpression(node, _elements);
    },
    [SyntaxKind.ObjectLiteralExpression]: (node, visitor) => {
        const _properties = visitNodes(node.properties, visitor);
        return updateObjectLiteralExpression(node, _properties);
    },
    [SyntaxKind.SpreadAssignment]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateSpreadAssignment(node, _expression);
    },
    [SyntaxKind.PropertyAssignment]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _postfixToken = visitNode(node.postfixToken, visitor, isQuestionOrExclamationToken);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _initializer = visitNode(node.initializer, visitor, isExpression);
        return updatePropertyAssignment(node, _modifiers, _name, _postfixToken, _type, _initializer);
    },
    [SyntaxKind.ShorthandPropertyAssignment]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isPropertyName);
        const _postfixToken = visitNode(node.postfixToken, visitor, isQuestionOrExclamationToken);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _equalsToken = visitNode(node.equalsToken, visitor, isEqualsToken);
        const _objectAssignmentInitializer = visitNode(node.objectAssignmentInitializer, visitor, isExpression);
        return updateShorthandPropertyAssignment(node, _modifiers, _name, _postfixToken, _type, _equalsToken, _objectAssignmentInitializer);
    },
    [SyntaxKind.DeleteExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateDeleteExpression(node, _expression);
    },
    [SyntaxKind.TypeOfExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateTypeOfExpression(node, _expression);
    },
    [SyntaxKind.VoidExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateVoidExpression(node, _expression);
    },
    [SyntaxKind.AwaitExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateAwaitExpression(node, _expression);
    },
    [SyntaxKind.TypeAssertionExpression]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateTypeAssertion(node, _type, _expression);
    },
    [SyntaxKind.UnionType]: (node, visitor) => {
        const _types = visitNodes(node.types, visitor);
        return updateUnionTypeNode(node, _types);
    },
    [SyntaxKind.IntersectionType]: (node, visitor) => {
        const _types = visitNodes(node.types, visitor);
        return updateIntersectionTypeNode(node, _types);
    },
    [SyntaxKind.ConditionalType]: (node, visitor) => {
        const _checkType = visitNode(node.checkType, visitor, isTypeNode);
        const _extendsType = visitNode(node.extendsType, visitor, isTypeNode);
        const _trueType = visitNode(node.trueType, visitor, isTypeNode);
        const _falseType = visitNode(node.falseType, visitor, isTypeNode);
        return updateConditionalTypeNode(node, _checkType, _extendsType, _trueType, _falseType);
    },
    [SyntaxKind.TypeOperator]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateTypeOperatorNode(node, _type);
    },
    [SyntaxKind.InferType]: (node, visitor) => {
        const _typeParameter = visitNode(node.typeParameter, visitor, isTypeParameterDeclaration);
        return updateInferTypeNode(node, _typeParameter);
    },
    [SyntaxKind.ArrayType]: (node, visitor) => {
        const _elementType = visitNode(node.elementType, visitor, isTypeNode);
        return updateArrayTypeNode(node, _elementType);
    },
    [SyntaxKind.IndexedAccessType]: (node, visitor) => {
        const _objectType = visitNode(node.objectType, visitor, isTypeNode);
        const _indexType = visitNode(node.indexType, visitor, isTypeNode);
        return updateIndexedAccessTypeNode(node, _objectType, _indexType);
    },
    [SyntaxKind.TypeReference]: (node, visitor) => {
        const _typeName = visitNode(node.typeName, visitor, isEntityName);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        return updateTypeReferenceNode(node, _typeName, _typeArguments);
    },
    [SyntaxKind.ExpressionWithTypeArguments]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        return updateExpressionWithTypeArguments(node, _expression, _typeArguments);
    },
    [SyntaxKind.LiteralType]: (node, visitor) => {
        const _literal = visitNode(node.literal, visitor);
        return updateLiteralTypeNode(node, _literal);
    },
    [SyntaxKind.TypePredicate]: (node, visitor) => {
        const _assertsModifier = visitNode(node.assertsModifier, visitor, isAssertsKeyword);
        const _parameterName = visitNode(node.parameterName, visitor, isTypePredicateParameterName);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateTypePredicateNode(node, _assertsModifier, _parameterName, _type);
    },
    [SyntaxKind.ImportAttribute]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isImportAttributeName);
        const _value = visitNode(node.value, visitor, isExpression);
        return updateImportAttribute(node, _name, _value);
    },
    [SyntaxKind.ImportAttributes]: (node, visitor) => {
        const _attributes = visitNodes(node.attributes, visitor);
        return updateImportAttributes(node, _attributes);
    },
    [SyntaxKind.TypeQuery]: (node, visitor) => {
        const _exprName = visitNode(node.exprName, visitor, isEntityName);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        return updateTypeQueryNode(node, _exprName, _typeArguments);
    },
    [SyntaxKind.MappedType]: (node, visitor) => {
        const _readonlyToken = visitNode(node.readonlyToken, visitor, isReadonlyKeywordOrPlusOrMinusToken);
        const _typeParameter = visitNode(node.typeParameter, visitor, isTypeParameterDeclaration);
        const _nameType = visitNode(node.nameType, visitor, isTypeNode);
        const _questionToken = visitNode(node.questionToken, visitor, isQuestionOrPlusOrMinusToken);
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _members = visitNodes(node.members, visitor);
        return updateMappedTypeNode(node, _readonlyToken, _typeParameter, _nameType, _questionToken, _type, _members);
    },
    [SyntaxKind.TypeLiteral]: (node, visitor) => {
        const _members = visitNodes(node.members, visitor);
        return updateTypeLiteralNode(node, _members);
    },
    [SyntaxKind.TupleType]: (node, visitor) => {
        const _elements = visitNodes(node.elements, visitor);
        return updateTupleTypeNode(node, _elements);
    },
    [SyntaxKind.NamedTupleMember]: (node, visitor) => {
        const _dotDotDotToken = visitNode(node.dotDotDotToken, visitor, isDotDotDotToken);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _questionToken = visitNode(node.questionToken, visitor, isQuestionToken);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateNamedTupleMember(node, _dotDotDotToken, _name, _questionToken, _type);
    },
    [SyntaxKind.OptionalType]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateOptionalTypeNode(node, _type);
    },
    [SyntaxKind.RestType]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateRestTypeNode(node, _type);
    },
    [SyntaxKind.ParenthesizedType]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateParenthesizedTypeNode(node, _type);
    },
    [SyntaxKind.FunctionType]: (node, visitor) => {
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateFunctionTypeNode(node, _typeParameters, _parameters, _type);
    },
    [SyntaxKind.ConstructorType]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateConstructorTypeNode(node, _modifiers, _typeParameters, _parameters, _type);
    },
    [SyntaxKind.TemplateLiteralType]: (node, visitor) => {
        const _head = visitNode(node.head, visitor, isTemplateHead);
        const _templateSpans = visitNodes(node.templateSpans, visitor);
        return updateTemplateLiteralTypeNode(node, _head, _templateSpans);
    },
    [SyntaxKind.TemplateLiteralTypeSpan]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        const _literal = visitNode(node.literal, visitor, isTemplateMiddleOrTail);
        return updateTemplateLiteralTypeSpan(node, _type, _literal);
    },
    [SyntaxKind.SyntheticExpression]: (node, visitor) => {
        const _tupleNameSource = visitNode(node.tupleNameSource, visitor);
        return updateSyntheticExpression(node, _tupleNameSource);
    },
    [SyntaxKind.PartiallyEmittedExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updatePartiallyEmittedExpression(node, _expression);
    },
    [SyntaxKind.JsxElement]: (node, visitor) => {
        const _openingElement = visitNode(node.openingElement, visitor, isJsxOpeningElement);
        const _children = visitNodes(node.children, visitor);
        const _closingElement = visitNode(node.closingElement, visitor, isJsxClosingElement);
        return updateJsxElement(node, _openingElement, _children, _closingElement);
    },
    [SyntaxKind.JsxAttributes]: (node, visitor) => {
        const _properties = visitNodes(node.properties, visitor);
        return updateJsxAttributes(node, _properties);
    },
    [SyntaxKind.JsxNamespacedName]: (node, visitor) => {
        const _namespace = visitNode(node.namespace, visitor, isIdentifier);
        const _name = visitNode(node.name, visitor, isIdentifier);
        return updateJsxNamespacedName(node, _namespace, _name);
    },
    [SyntaxKind.JsxOpeningElement]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isJsxTagNameExpression);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        const _attributes = visitNode(node.attributes, visitor, isJsxAttributes);
        return updateJsxOpeningElement(node, _tagName, _typeArguments, _attributes);
    },
    [SyntaxKind.JsxSelfClosingElement]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isJsxTagNameExpression);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        const _attributes = visitNode(node.attributes, visitor, isJsxAttributes);
        return updateJsxSelfClosingElement(node, _tagName, _typeArguments, _attributes);
    },
    [SyntaxKind.JsxFragment]: (node, visitor) => {
        const _openingFragment = visitNode(node.openingFragment, visitor, isJsxOpeningFragment);
        const _children = visitNodes(node.children, visitor);
        const _closingFragment = visitNode(node.closingFragment, visitor, isJsxClosingFragment);
        return updateJsxFragment(node, _openingFragment, _children, _closingFragment);
    },
    [SyntaxKind.JsxAttribute]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isJsxAttributeName);
        const _initializer = visitNode(node.initializer, visitor, isJsxAttributeValue);
        return updateJsxAttribute(node, _name, _initializer);
    },
    [SyntaxKind.JsxSpreadAttribute]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateJsxSpreadAttribute(node, _expression);
    },
    [SyntaxKind.JsxClosingElement]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isJsxTagNameExpression);
        return updateJsxClosingElement(node, _tagName);
    },
    [SyntaxKind.JsxExpression]: (node, visitor) => {
        const _dotDotDotToken = visitNode(node.dotDotDotToken, visitor, isDotDotDotToken);
        const _expression = visitNode(node.expression, visitor, isExpression);
        return updateJsxExpression(node, _dotDotDotToken, _expression);
    },
    [SyntaxKind.SyntaxList]: (node, visitor) => {
        const _children = visitNodesArray(node.children, visitor);
        return updateSyntaxList(node, _children);
    },
    [SyntaxKind.JSDoc]: (node, visitor) => {
        const _comment = visitNodes(node.comment, visitor);
        const _tags = visitNodes(node.tags, visitor);
        return updateJSDoc(node, _comment, _tags);
    },
    [SyntaxKind.JSDocTypeExpression]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateJSDocTypeExpression(node, _type);
    },
    [SyntaxKind.JSDocNonNullableType]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateJSDocNonNullableType(node, _type);
    },
    [SyntaxKind.JSDocNullableType]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateJSDocNullableType(node, _type);
    },
    [SyntaxKind.JSDocVariadicType]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateJSDocVariadicType(node, _type);
    },
    [SyntaxKind.JSDocOptionalType]: (node, visitor) => {
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateJSDocOptionalType(node, _type);
    },
    [SyntaxKind.JSDocTypeTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _typeExpression = visitNode(node.typeExpression, visitor);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocTypeTag(node, _tagName, _typeExpression, _comment);
    },
    [SyntaxKind.JSDocUnknownTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocUnknownTag(node, _tagName, _comment);
    },
    [SyntaxKind.JSDocTemplateTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _constraint = visitNode(node.constraint, visitor);
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocTemplateTag(node, _tagName, _constraint, _typeParameters, _comment);
    },
    [SyntaxKind.JSDocReturnTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _typeExpression = visitNode(node.typeExpression, visitor, isTypeNode);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocReturnTag(node, _tagName, _typeExpression, _comment);
    },
    [SyntaxKind.JSDocPublicTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocPublicTag(node, _tagName, _comment);
    },
    [SyntaxKind.JSDocPrivateTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocPrivateTag(node, _tagName, _comment);
    },
    [SyntaxKind.JSDocProtectedTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocProtectedTag(node, _tagName, _comment);
    },
    [SyntaxKind.JSDocReadonlyTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocReadonlyTag(node, _tagName, _comment);
    },
    [SyntaxKind.JSDocOverrideTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocOverrideTag(node, _tagName, _comment);
    },
    [SyntaxKind.JSDocDeprecatedTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocDeprecatedTag(node, _tagName, _comment);
    },
    [SyntaxKind.JSDocSeeTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _nameExpression = visitNode(node.nameExpression, visitor, isTypeNode);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocSeeTag(node, _tagName, _nameExpression, _comment);
    },
    [SyntaxKind.JSDocImplementsTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _className = visitNode(node.className, visitor, isExpressionWithTypeArguments);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocImplementsTag(node, _tagName, _className, _comment);
    },
    [SyntaxKind.JSDocAugmentsTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _className = visitNode(node.className, visitor, isExpressionWithTypeArguments);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocAugmentsTag(node, _tagName, _className, _comment);
    },
    [SyntaxKind.JSDocSatisfiesTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _typeExpression = visitNode(node.typeExpression, visitor, isTypeNode);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocSatisfiesTag(node, _tagName, _typeExpression, _comment);
    },
    [SyntaxKind.JSDocThrowsTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _typeExpression = visitNode(node.typeExpression, visitor, isTypeNode);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocThrowsTag(node, _tagName, _typeExpression, _comment);
    },
    [SyntaxKind.JSDocThisTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _typeExpression = visitNode(node.typeExpression, visitor, isTypeNode);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocThisTag(node, _tagName, _typeExpression, _comment);
    },
    [SyntaxKind.JSDocImportTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _importClause = visitNode(node.importClause, visitor, isImportClause);
        const _moduleSpecifier = visitNode(node.moduleSpecifier, visitor, isExpression);
        const _attributes = visitNode(node.attributes, visitor, isImportAttributes);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocImportTag(node, _tagName, _importClause, _moduleSpecifier, _attributes, _comment);
    },
    [SyntaxKind.JSDocCallbackTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _typeExpression = visitNode(node.typeExpression, visitor, isTypeNode);
        const _name = visitNode(node.name, visitor, isJSDocFullName);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocCallbackTag(node, _tagName, _typeExpression, _name, _comment);
    },
    [SyntaxKind.JSDocOverloadTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _typeExpression = visitNode(node.typeExpression, visitor, isTypeNode);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocOverloadTag(node, _tagName, _typeExpression, _comment);
    },
    [SyntaxKind.JSDocTypedefTag]: (node, visitor) => {
        const _tagName = visitNode(node.tagName, visitor, isIdentifier);
        const _typeExpression = visitNode(node.typeExpression, visitor);
        const _name = visitNode(node.name, visitor, isJSDocFullName);
        const _comment = visitNodes(node.comment, visitor);
        return updateJSDocTypedefTag(node, _tagName, _typeExpression, _name, _comment);
    },
    [SyntaxKind.JSDocSignature]: (node, visitor) => {
        const _typeParameters = visitNodes(node.typeParameters, visitor);
        const _parameters = visitNodes(node.parameters, visitor);
        const _type = visitNode(node.type, visitor, isTypeNode);
        return updateJSDocSignature(node, _typeParameters, _parameters, _type);
    },
    [SyntaxKind.JSDocNameReference]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isEntityName);
        return updateJSDocNameReference(node, _name);
    },
    [SyntaxKind.SourceFile]: (node, visitor) => {
        const _statements = visitNodes(node.statements, visitor);
        const _endOfFileToken = visitNode(node.endOfFileToken, visitor, isEndOfFile);
        return updateSourceFile(node, _statements, _endOfFileToken);
    },
    [SyntaxKind.ModuleDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isModuleName);
        const _body = visitNode(node.body, visitor, isModuleBody);
        return updateModuleDeclaration(node, _modifiers, _name, _body);
    },
    [SyntaxKind.ImportEqualsDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _moduleReference = visitNode(node.moduleReference, visitor, isModuleReference);
        return updateImportEqualsDeclaration(node, _modifiers, _name, _moduleReference);
    },
    [SyntaxKind.ExportDeclaration]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _exportClause = visitNode(node.exportClause, visitor, isNamedExportBindings);
        const _moduleSpecifier = visitNode(node.moduleSpecifier, visitor, isExpression);
        const _attributes = visitNode(node.attributes, visitor, isImportAttributes);
        return updateExportDeclaration(node, _modifiers, _exportClause, _moduleSpecifier, _attributes);
    },
    [SyntaxKind.ImportType]: (node, visitor) => {
        const _argument = visitNode(node.argument, visitor, isTypeNode);
        const _attributes = visitNode(node.attributes, visitor, isImportAttributes);
        const _qualifier = visitNode(node.qualifier, visitor, isEntityName);
        const _typeArguments = visitNodes(node.typeArguments, visitor);
        return updateImportTypeNode(node, _argument, _attributes, _qualifier, _typeArguments);
    },
    [SyntaxKind.ImportClause]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _namedBindings = visitNode(node.namedBindings, visitor, isNamedImportBindings);
        return updateImportClause(node, _name, _namedBindings);
    },
    [SyntaxKind.ImportSpecifier]: (node, visitor) => {
        const _propertyName = visitNode(node.propertyName, visitor, isModuleExportName);
        const _name = visitNode(node.name, visitor, isIdentifier);
        return updateImportSpecifier(node, _propertyName, _name);
    },
    [SyntaxKind.JSDocLink]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isEntityName);
        return updateJSDocLink(node, _name);
    },
    [SyntaxKind.JSDocLinkPlain]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isEntityName);
        return updateJSDocLinkPlain(node, _name);
    },
    [SyntaxKind.JSDocLinkCode]: (node, visitor) => {
        const _name = visitNode(node.name, visitor, isEntityName);
        return updateJSDocLinkCode(node, _name);
    },
    [SyntaxKind.TypeParameter]: (node, visitor) => {
        const _modifiers = visitNodes(node.modifiers, visitor);
        const _name = visitNode(node.name, visitor, isIdentifier);
        const _constraint = visitNode(node.constraint, visitor, isTypeNode);
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _defaultType = visitNode(node.defaultType, visitor, isTypeNode);
        return updateTypeParameterDeclaration(node, _modifiers, _name, _constraint, _expression, _defaultType);
    },
    [SyntaxKind.SyntheticReferenceExpression]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _thisArg = visitNode(node.thisArg, visitor, isExpression);
        return updateSyntheticReferenceExpression(node, _expression, _thisArg);
    },
    [SyntaxKind.JSDocTypeLiteral]: (node, visitor) => {
        const _jsdocPropertyTags = visitNodesArray(node.jsdocPropertyTags, visitor);
        return updateJSDocTypeLiteral(node, _jsdocPropertyTags);
    },
    [SyntaxKind.ForInStatement]: (node, visitor) => {
        const _awaitModifier = visitNode(node.awaitModifier, visitor, isAwaitKeyword);
        const _initializer = visitNode(node.initializer, visitor, isForInitializer);
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _statement = visitNode(node.statement, visitor, isStatement);
        return updateForInStatement(node, _awaitModifier, _initializer, _expression, _statement);
    },
    [SyntaxKind.ForOfStatement]: (node, visitor) => {
        const _awaitModifier = visitNode(node.awaitModifier, visitor, isAwaitKeyword);
        const _initializer = visitNode(node.initializer, visitor, isForInitializer);
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _statement = visitNode(node.statement, visitor, isStatement);
        return updateForOfStatement(node, _awaitModifier, _initializer, _expression, _statement);
    },
    [SyntaxKind.CaseClause]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _statements = visitNodes(node.statements, visitor);
        return updateCaseClause(node, _expression, _statements);
    },
    [SyntaxKind.DefaultClause]: (node, visitor) => {
        const _expression = visitNode(node.expression, visitor, isExpression);
        const _statements = visitNodes(node.statements, visitor);
        return updateDefaultClause(node, _expression, _statements);
    },
    [SyntaxKind.ObjectBindingPattern]: (node, visitor) => {
        const _elements = visitNodes(node.elements, visitor);
        return updateObjectBindingPattern(node, _elements);
    },
    [SyntaxKind.ArrayBindingPattern]: (node, visitor) => {
        const _elements = visitNodes(node.elements, visitor);
        return updateArrayBindingPattern(node, _elements);
    },
    [SyntaxKind.JSDocParameterTag]: visitEachChildOfJSDocParameterTag,
    [SyntaxKind.JSDocPropertyTag]: visitEachChildOfJSDocPropertyTag,
};
//# sourceMappingURL=visitor.generated.js.map