// Code generated by _scripts/generate-encoder.ts. DO NOT EDIT.

package encoder

import (
	"fmt"

	"github.com/microsoft/typescript-go/internal/ast"
)

func getNodeDataType(node *ast.Node) uint32 {
	switch node.Kind {
	case ast.KindIdentifier,
		ast.KindPrivateIdentifier,
		ast.KindJsxText,
		ast.KindJSDocText,
		ast.KindJSDocLink,
		ast.KindJSDocLinkPlain,
		ast.KindJSDocLinkCode:
		return NodeDataTypeString
	case ast.KindStringLiteral,
		ast.KindNumericLiteral,
		ast.KindBigIntLiteral,
		ast.KindRegularExpressionLiteral,
		ast.KindNoSubstitutionTemplateLiteral,
		ast.KindTemplateHead,
		ast.KindTemplateMiddle,
		ast.KindTemplateTail,
		ast.KindSourceFile:
		return NodeDataTypeExtendedData
	default:
		return NodeDataTypeChildren
	}
}

func getChildrenPropertyMask(node *ast.Node) uint8 {
	switch node.Kind {
	case ast.KindQualifiedName:
		n := node.AsQualifiedName()
		return (boolToByte(n.Left != nil) << 0) | (boolToByte(n.Right != nil) << 1)
	case ast.KindComputedPropertyName:
		n := node.AsComputedPropertyName()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindDecorator:
		n := node.AsDecorator()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindIfStatement:
		n := node.AsIfStatement()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.ThenStatement != nil) << 1) | (boolToByte(n.ElseStatement != nil) << 2)
	case ast.KindDoStatement:
		n := node.AsDoStatement()
		return (boolToByte(n.Statement != nil) << 0) | (boolToByte(n.Expression != nil) << 1)
	case ast.KindWhileStatement:
		n := node.AsWhileStatement()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.Statement != nil) << 1)
	case ast.KindForStatement:
		n := node.AsForStatement()
		return (boolToByte(n.Initializer != nil) << 0) | (boolToByte(n.Condition != nil) << 1) | (boolToByte(n.Incrementor != nil) << 2) | (boolToByte(n.Statement != nil) << 3)
	case ast.KindForInStatement, ast.KindForOfStatement:
		n := node.AsForInOrOfStatement()
		return (boolToByte(n.AwaitModifier != nil) << 0) | (boolToByte(n.Initializer != nil) << 1) | (boolToByte(n.Expression != nil) << 2) | (boolToByte(n.Statement != nil) << 3)
	case ast.KindBreakStatement:
		n := node.AsBreakStatement()
		return (boolToByte(n.Label != nil) << 0)
	case ast.KindContinueStatement:
		n := node.AsContinueStatement()
		return (boolToByte(n.Label != nil) << 0)
	case ast.KindReturnStatement:
		n := node.AsReturnStatement()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindWithStatement:
		n := node.AsWithStatement()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.Statement != nil) << 1)
	case ast.KindSwitchStatement:
		n := node.AsSwitchStatement()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.CaseBlock != nil) << 1)
	case ast.KindCaseBlock:
		n := node.AsCaseBlock()
		return (boolToByte(n.Clauses != nil) << 0)
	case ast.KindCaseClause, ast.KindDefaultClause:
		n := node.AsCaseOrDefaultClause()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.Statements != nil) << 1)
	case ast.KindThrowStatement:
		n := node.AsThrowStatement()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindTryStatement:
		n := node.AsTryStatement()
		return (boolToByte(n.TryBlock != nil) << 0) | (boolToByte(n.CatchClause != nil) << 1) | (boolToByte(n.FinallyBlock != nil) << 2)
	case ast.KindCatchClause:
		n := node.AsCatchClause()
		return (boolToByte(n.VariableDeclaration != nil) << 0) | (boolToByte(n.Block != nil) << 1)
	case ast.KindLabeledStatement:
		n := node.AsLabeledStatement()
		return (boolToByte(n.Label != nil) << 0) | (boolToByte(n.Statement != nil) << 1)
	case ast.KindExpressionStatement:
		n := node.AsExpressionStatement()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindBlock:
		n := node.AsBlock()
		return (boolToByte(n.Statements != nil) << 0)
	case ast.KindVariableStatement:
		n := node.AsVariableStatement()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.DeclarationList != nil) << 1)
	case ast.KindVariableDeclaration:
		n := node.AsVariableDeclaration()
		return (boolToByte(n.Name() != nil) << 0) | (boolToByte(n.ExclamationToken != nil) << 1) | (boolToByte(n.Type != nil) << 2) | (boolToByte(n.Initializer != nil) << 3)
	case ast.KindVariableDeclarationList:
		n := node.AsVariableDeclarationList()
		return (boolToByte(n.Declarations != nil) << 0)
	case ast.KindObjectBindingPattern, ast.KindArrayBindingPattern:
		n := node.AsBindingPattern()
		return (boolToByte(n.Elements != nil) << 0)
	case ast.KindParameter:
		n := node.AsParameterDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.DotDotDotToken != nil) << 1) | (boolToByte(n.Name() != nil) << 2) | (boolToByte(n.QuestionToken != nil) << 3) | (boolToByte(n.Type != nil) << 4) | (boolToByte(n.Initializer != nil) << 5)
	case ast.KindBindingElement:
		n := node.AsBindingElement()
		return (boolToByte(n.DotDotDotToken != nil) << 0) | (boolToByte(n.PropertyName != nil) << 1) | (boolToByte(n.Name() != nil) << 2) | (boolToByte(n.Initializer != nil) << 3)
	case ast.KindMissingDeclaration:
		n := node.AsMissingDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0)
	case ast.KindFunctionDeclaration:
		n := node.AsFunctionDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.AsteriskToken != nil) << 1) | (boolToByte(n.Name() != nil) << 2) | (boolToByte(n.TypeParameters != nil) << 3) | (boolToByte(n.Parameters != nil) << 4) | (boolToByte(n.Type != nil) << 5) | (boolToByte(n.Body != nil) << 6)
	case ast.KindClassDeclaration:
		n := node.AsClassDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.TypeParameters != nil) << 2) | (boolToByte(n.HeritageClauses != nil) << 3) | (boolToByte(n.Members != nil) << 4)
	case ast.KindClassExpression:
		n := node.AsClassExpression()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.TypeParameters != nil) << 2) | (boolToByte(n.HeritageClauses != nil) << 3) | (boolToByte(n.Members != nil) << 4)
	case ast.KindHeritageClause:
		n := node.AsHeritageClause()
		return (boolToByte(n.Types != nil) << 0)
	case ast.KindInterfaceDeclaration:
		n := node.AsInterfaceDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.TypeParameters != nil) << 2) | (boolToByte(n.HeritageClauses != nil) << 3) | (boolToByte(n.Members != nil) << 4)
	case ast.KindTypeAliasDeclaration, ast.KindJSTypeAliasDeclaration:
		n := node.AsTypeAliasDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.TypeParameters != nil) << 2) | (boolToByte(n.Type != nil) << 3)
	case ast.KindEnumMember:
		n := node.AsEnumMember()
		return (boolToByte(n.Name() != nil) << 0) | (boolToByte(n.Initializer != nil) << 1)
	case ast.KindEnumDeclaration:
		n := node.AsEnumDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.Members != nil) << 2)
	case ast.KindModuleBlock:
		n := node.AsModuleBlock()
		return (boolToByte(n.Statements != nil) << 0)
	case ast.KindImportDeclaration, ast.KindJSImportDeclaration:
		n := node.AsImportDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.ImportClause != nil) << 1) | (boolToByte(n.ModuleSpecifier != nil) << 2) | (boolToByte(n.Attributes != nil) << 3)
	case ast.KindExternalModuleReference:
		n := node.AsExternalModuleReference()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindNamespaceImport:
		n := node.AsNamespaceImport()
		return (boolToByte(n.Name() != nil) << 0)
	case ast.KindNamedImports:
		n := node.AsNamedImports()
		return (boolToByte(n.Elements != nil) << 0)
	case ast.KindExportAssignment:
		n := node.AsExportAssignment()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Type != nil) << 1) | (boolToByte(n.Expression != nil) << 2)
	case ast.KindNamespaceExportDeclaration:
		n := node.AsNamespaceExportDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1)
	case ast.KindNamespaceExport:
		n := node.AsNamespaceExport()
		return (boolToByte(n.Name() != nil) << 0)
	case ast.KindNamedExports:
		n := node.AsNamedExports()
		return (boolToByte(n.Elements != nil) << 0)
	case ast.KindExportSpecifier:
		n := node.AsExportSpecifier()
		return (boolToByte(n.PropertyName != nil) << 0) | (boolToByte(n.Name() != nil) << 1)
	case ast.KindCallSignature:
		n := node.AsCallSignatureDeclaration()
		return (boolToByte(n.TypeParameters != nil) << 0) | (boolToByte(n.Parameters != nil) << 1) | (boolToByte(n.Type != nil) << 2)
	case ast.KindConstructSignature:
		n := node.AsConstructSignatureDeclaration()
		return (boolToByte(n.TypeParameters != nil) << 0) | (boolToByte(n.Parameters != nil) << 1) | (boolToByte(n.Type != nil) << 2)
	case ast.KindConstructor:
		n := node.AsConstructorDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.TypeParameters != nil) << 1) | (boolToByte(n.Parameters != nil) << 2) | (boolToByte(n.Type != nil) << 3) | (boolToByte(n.Body != nil) << 4)
	case ast.KindGetAccessor:
		n := node.AsGetAccessorDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.TypeParameters != nil) << 2) | (boolToByte(n.Parameters != nil) << 3) | (boolToByte(n.Type != nil) << 4) | (boolToByte(n.Body != nil) << 5)
	case ast.KindSetAccessor:
		n := node.AsSetAccessorDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.TypeParameters != nil) << 2) | (boolToByte(n.Parameters != nil) << 3) | (boolToByte(n.Type != nil) << 4) | (boolToByte(n.Body != nil) << 5)
	case ast.KindIndexSignature:
		n := node.AsIndexSignatureDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Parameters != nil) << 1) | (boolToByte(n.Type != nil) << 2)
	case ast.KindMethodSignature:
		n := node.AsMethodSignatureDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.PostfixToken != nil) << 2) | (boolToByte(n.TypeParameters != nil) << 3) | (boolToByte(n.Parameters != nil) << 4) | (boolToByte(n.Type != nil) << 5)
	case ast.KindMethodDeclaration:
		n := node.AsMethodDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.AsteriskToken != nil) << 1) | (boolToByte(n.Name() != nil) << 2) | (boolToByte(n.PostfixToken != nil) << 3) | (boolToByte(n.TypeParameters != nil) << 4) | (boolToByte(n.Parameters != nil) << 5) | (boolToByte(n.Type != nil) << 6) | (boolToByte(n.Body != nil) << 7)
	case ast.KindPropertySignature:
		n := node.AsPropertySignatureDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.PostfixToken != nil) << 2) | (boolToByte(n.Type != nil) << 3) | (boolToByte(n.Initializer != nil) << 4)
	case ast.KindPropertyDeclaration:
		n := node.AsPropertyDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.PostfixToken != nil) << 2) | (boolToByte(n.Type != nil) << 3) | (boolToByte(n.Initializer != nil) << 4)
	case ast.KindClassStaticBlockDeclaration:
		n := node.AsClassStaticBlockDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Body != nil) << 1)
	case ast.KindBinaryExpression:
		n := node.AsBinaryExpression()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Left != nil) << 1) | (boolToByte(n.Type != nil) << 2) | (boolToByte(n.OperatorToken != nil) << 3) | (boolToByte(n.Right != nil) << 4)
	case ast.KindPrefixUnaryExpression:
		n := node.AsPrefixUnaryExpression()
		return (boolToByte(n.Operand != nil) << 0)
	case ast.KindPostfixUnaryExpression:
		n := node.AsPostfixUnaryExpression()
		return (boolToByte(n.Operand != nil) << 0)
	case ast.KindYieldExpression:
		n := node.AsYieldExpression()
		return (boolToByte(n.AsteriskToken != nil) << 0) | (boolToByte(n.Expression != nil) << 1)
	case ast.KindArrowFunction:
		n := node.AsArrowFunction()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.TypeParameters != nil) << 1) | (boolToByte(n.Parameters != nil) << 2) | (boolToByte(n.Type != nil) << 3) | (boolToByte(n.EqualsGreaterThanToken != nil) << 4) | (boolToByte(n.Body != nil) << 5)
	case ast.KindFunctionExpression:
		n := node.AsFunctionExpression()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.AsteriskToken != nil) << 1) | (boolToByte(n.Name() != nil) << 2) | (boolToByte(n.TypeParameters != nil) << 3) | (boolToByte(n.Parameters != nil) << 4) | (boolToByte(n.Type != nil) << 5) | (boolToByte(n.Body != nil) << 6)
	case ast.KindAsExpression:
		n := node.AsAsExpression()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.Type != nil) << 1)
	case ast.KindSatisfiesExpression:
		n := node.AsSatisfiesExpression()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.Type != nil) << 1)
	case ast.KindConditionalExpression:
		n := node.AsConditionalExpression()
		return (boolToByte(n.Condition != nil) << 0) | (boolToByte(n.QuestionToken != nil) << 1) | (boolToByte(n.WhenTrue != nil) << 2) | (boolToByte(n.ColonToken != nil) << 3) | (boolToByte(n.WhenFalse != nil) << 4)
	case ast.KindPropertyAccessExpression:
		n := node.AsPropertyAccessExpression()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.QuestionDotToken != nil) << 1) | (boolToByte(n.Name() != nil) << 2)
	case ast.KindElementAccessExpression:
		n := node.AsElementAccessExpression()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.QuestionDotToken != nil) << 1) | (boolToByte(n.ArgumentExpression != nil) << 2)
	case ast.KindCallExpression:
		n := node.AsCallExpression()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.QuestionDotToken != nil) << 1) | (boolToByte(n.TypeArguments != nil) << 2) | (boolToByte(n.Arguments != nil) << 3)
	case ast.KindNewExpression:
		n := node.AsNewExpression()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.TypeArguments != nil) << 1) | (boolToByte(n.Arguments != nil) << 2)
	case ast.KindMetaProperty:
		n := node.AsMetaProperty()
		return (boolToByte(n.Name() != nil) << 0)
	case ast.KindNonNullExpression:
		n := node.AsNonNullExpression()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindSpreadElement:
		n := node.AsSpreadElement()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindTemplateExpression:
		n := node.AsTemplateExpression()
		return (boolToByte(n.Head != nil) << 0) | (boolToByte(n.TemplateSpans != nil) << 1)
	case ast.KindTemplateSpan:
		n := node.AsTemplateSpan()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.Literal != nil) << 1)
	case ast.KindTaggedTemplateExpression:
		n := node.AsTaggedTemplateExpression()
		return (boolToByte(n.Tag != nil) << 0) | (boolToByte(n.QuestionDotToken != nil) << 1) | (boolToByte(n.TypeArguments != nil) << 2) | (boolToByte(n.Template != nil) << 3)
	case ast.KindParenthesizedExpression:
		n := node.AsParenthesizedExpression()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindArrayLiteralExpression:
		n := node.AsArrayLiteralExpression()
		return (boolToByte(n.Elements != nil) << 0)
	case ast.KindObjectLiteralExpression:
		n := node.AsObjectLiteralExpression()
		return (boolToByte(n.Properties != nil) << 0)
	case ast.KindSpreadAssignment:
		n := node.AsSpreadAssignment()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindPropertyAssignment:
		n := node.AsPropertyAssignment()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.PostfixToken != nil) << 2) | (boolToByte(n.Type != nil) << 3) | (boolToByte(n.Initializer != nil) << 4)
	case ast.KindShorthandPropertyAssignment:
		n := node.AsShorthandPropertyAssignment()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.PostfixToken != nil) << 2) | (boolToByte(n.Type != nil) << 3) | (boolToByte(n.EqualsToken != nil) << 4) | (boolToByte(n.ObjectAssignmentInitializer != nil) << 5)
	case ast.KindDeleteExpression:
		n := node.AsDeleteExpression()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindTypeOfExpression:
		n := node.AsTypeOfExpression()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindVoidExpression:
		n := node.AsVoidExpression()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindAwaitExpression:
		n := node.AsAwaitExpression()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindTypeAssertionExpression:
		n := node.AsTypeAssertion()
		return (boolToByte(n.Type != nil) << 0) | (boolToByte(n.Expression != nil) << 1)
	case ast.KindUnionType:
		n := node.AsUnionTypeNode()
		return (boolToByte(n.Types != nil) << 0)
	case ast.KindIntersectionType:
		n := node.AsIntersectionTypeNode()
		return (boolToByte(n.Types != nil) << 0)
	case ast.KindConditionalType:
		n := node.AsConditionalTypeNode()
		return (boolToByte(n.CheckType != nil) << 0) | (boolToByte(n.ExtendsType != nil) << 1) | (boolToByte(n.TrueType != nil) << 2) | (boolToByte(n.FalseType != nil) << 3)
	case ast.KindTypeOperator:
		n := node.AsTypeOperatorNode()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindInferType:
		n := node.AsInferTypeNode()
		return (boolToByte(n.TypeParameter != nil) << 0)
	case ast.KindArrayType:
		n := node.AsArrayTypeNode()
		return (boolToByte(n.ElementType != nil) << 0)
	case ast.KindIndexedAccessType:
		n := node.AsIndexedAccessTypeNode()
		return (boolToByte(n.ObjectType != nil) << 0) | (boolToByte(n.IndexType != nil) << 1)
	case ast.KindTypeReference:
		n := node.AsTypeReferenceNode()
		return (boolToByte(n.TypeName != nil) << 0) | (boolToByte(n.TypeArguments != nil) << 1)
	case ast.KindExpressionWithTypeArguments:
		n := node.AsExpressionWithTypeArguments()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.TypeArguments != nil) << 1)
	case ast.KindLiteralType:
		n := node.AsLiteralTypeNode()
		return (boolToByte(n.Literal != nil) << 0)
	case ast.KindTypePredicate:
		n := node.AsTypePredicateNode()
		return (boolToByte(n.AssertsModifier != nil) << 0) | (boolToByte(n.ParameterName != nil) << 1) | (boolToByte(n.Type != nil) << 2)
	case ast.KindImportAttribute:
		n := node.AsImportAttribute()
		return (boolToByte(n.Name() != nil) << 0) | (boolToByte(n.Value != nil) << 1)
	case ast.KindImportAttributes:
		n := node.AsImportAttributes()
		return (boolToByte(n.Attributes != nil) << 0)
	case ast.KindTypeQuery:
		n := node.AsTypeQueryNode()
		return (boolToByte(n.ExprName != nil) << 0) | (boolToByte(n.TypeArguments != nil) << 1)
	case ast.KindMappedType:
		n := node.AsMappedTypeNode()
		return (boolToByte(n.ReadonlyToken != nil) << 0) | (boolToByte(n.TypeParameter != nil) << 1) | (boolToByte(n.NameType != nil) << 2) | (boolToByte(n.QuestionToken != nil) << 3) | (boolToByte(n.Type != nil) << 4) | (boolToByte(n.Members != nil) << 5)
	case ast.KindTypeLiteral:
		n := node.AsTypeLiteralNode()
		return (boolToByte(n.Members != nil) << 0)
	case ast.KindTupleType:
		n := node.AsTupleTypeNode()
		return (boolToByte(n.Elements != nil) << 0)
	case ast.KindNamedTupleMember:
		n := node.AsNamedTupleMember()
		return (boolToByte(n.DotDotDotToken != nil) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.QuestionToken != nil) << 2) | (boolToByte(n.Type != nil) << 3)
	case ast.KindOptionalType:
		n := node.AsOptionalTypeNode()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindRestType:
		n := node.AsRestTypeNode()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindParenthesizedType:
		n := node.AsParenthesizedTypeNode()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindFunctionType:
		n := node.AsFunctionTypeNode()
		return (boolToByte(n.TypeParameters != nil) << 0) | (boolToByte(n.Parameters != nil) << 1) | (boolToByte(n.Type != nil) << 2)
	case ast.KindConstructorType:
		n := node.AsConstructorTypeNode()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.TypeParameters != nil) << 1) | (boolToByte(n.Parameters != nil) << 2) | (boolToByte(n.Type != nil) << 3)
	case ast.KindTemplateLiteralType:
		n := node.AsTemplateLiteralTypeNode()
		return (boolToByte(n.Head != nil) << 0) | (boolToByte(n.TemplateSpans != nil) << 1)
	case ast.KindTemplateLiteralTypeSpan:
		n := node.AsTemplateLiteralTypeSpan()
		return (boolToByte(n.Type != nil) << 0) | (boolToByte(n.Literal != nil) << 1)
	case ast.KindSyntheticExpression:
		n := node.AsSyntheticExpression()
		return (boolToByte(n.TupleNameSource != nil) << 0)
	case ast.KindPartiallyEmittedExpression:
		n := node.AsPartiallyEmittedExpression()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindJsxElement:
		n := node.AsJsxElement()
		return (boolToByte(n.OpeningElement != nil) << 0) | (boolToByte(n.Children != nil) << 1) | (boolToByte(n.ClosingElement != nil) << 2)
	case ast.KindJsxAttributes:
		n := node.AsJsxAttributes()
		return (boolToByte(n.Properties != nil) << 0)
	case ast.KindJsxNamespacedName:
		n := node.AsJsxNamespacedName()
		return (boolToByte(n.Namespace != nil) << 0) | (boolToByte(n.Name() != nil) << 1)
	case ast.KindJsxOpeningElement:
		n := node.AsJsxOpeningElement()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeArguments != nil) << 1) | (boolToByte(n.Attributes != nil) << 2)
	case ast.KindJsxSelfClosingElement:
		n := node.AsJsxSelfClosingElement()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeArguments != nil) << 1) | (boolToByte(n.Attributes != nil) << 2)
	case ast.KindJsxFragment:
		n := node.AsJsxFragment()
		return (boolToByte(n.OpeningFragment != nil) << 0) | (boolToByte(n.Children != nil) << 1) | (boolToByte(n.ClosingFragment != nil) << 2)
	case ast.KindJsxAttribute:
		n := node.AsJsxAttribute()
		return (boolToByte(n.Name() != nil) << 0) | (boolToByte(n.Initializer != nil) << 1)
	case ast.KindJsxSpreadAttribute:
		n := node.AsJsxSpreadAttribute()
		return (boolToByte(n.Expression != nil) << 0)
	case ast.KindJsxClosingElement:
		n := node.AsJsxClosingElement()
		return (boolToByte(n.TagName != nil) << 0)
	case ast.KindJsxExpression:
		n := node.AsJsxExpression()
		return (boolToByte(n.DotDotDotToken != nil) << 0) | (boolToByte(n.Expression != nil) << 1)
	case ast.KindSyntaxList:
		n := node.AsSyntaxList()
		return (boolToByte(len(n.Children) > 0) << 0)
	case ast.KindJSDoc:
		n := node.AsJSDoc()
		return (boolToByte(n.Comment != nil) << 0) | (boolToByte(n.Tags != nil) << 1)
	case ast.KindJSDocTypeExpression:
		n := node.AsJSDocTypeExpression()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindJSDocNonNullableType:
		n := node.AsJSDocNonNullableType()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindJSDocNullableType:
		n := node.AsJSDocNullableType()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindJSDocVariadicType:
		n := node.AsJSDocVariadicType()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindJSDocOptionalType:
		n := node.AsJSDocOptionalType()
		return (boolToByte(n.Type != nil) << 0)
	case ast.KindJSDocTypeTag:
		n := node.AsJSDocTypeTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeExpression != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocUnknownTag:
		n := node.AsJSDocUnknownTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Comment != nil) << 1)
	case ast.KindJSDocTemplateTag:
		n := node.AsJSDocTemplateTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Constraint != nil) << 1) | (boolToByte(n.TypeParameters != nil) << 2) | (boolToByte(n.Comment != nil) << 3)
	case ast.KindJSDocReturnTag:
		n := node.AsJSDocReturnTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeExpression != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocPublicTag:
		n := node.AsJSDocPublicTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Comment != nil) << 1)
	case ast.KindJSDocPrivateTag:
		n := node.AsJSDocPrivateTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Comment != nil) << 1)
	case ast.KindJSDocProtectedTag:
		n := node.AsJSDocProtectedTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Comment != nil) << 1)
	case ast.KindJSDocReadonlyTag:
		n := node.AsJSDocReadonlyTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Comment != nil) << 1)
	case ast.KindJSDocOverrideTag:
		n := node.AsJSDocOverrideTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Comment != nil) << 1)
	case ast.KindJSDocDeprecatedTag:
		n := node.AsJSDocDeprecatedTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Comment != nil) << 1)
	case ast.KindJSDocSeeTag:
		n := node.AsJSDocSeeTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.NameExpression != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocImplementsTag:
		n := node.AsJSDocImplementsTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.ClassName != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocAugmentsTag:
		n := node.AsJSDocAugmentsTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.ClassName != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocSatisfiesTag:
		n := node.AsJSDocSatisfiesTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeExpression != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocThrowsTag:
		n := node.AsJSDocThrowsTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeExpression != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocThisTag:
		n := node.AsJSDocThisTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeExpression != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocImportTag:
		n := node.AsJSDocImportTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.ImportClause != nil) << 1) | (boolToByte(n.ModuleSpecifier != nil) << 2) | (boolToByte(n.Attributes != nil) << 3) | (boolToByte(n.Comment != nil) << 4)
	case ast.KindJSDocCallbackTag:
		n := node.AsJSDocCallbackTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeExpression != nil) << 1) | (boolToByte(n.Name() != nil) << 2) | (boolToByte(n.Comment != nil) << 3)
	case ast.KindJSDocOverloadTag:
		n := node.AsJSDocOverloadTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeExpression != nil) << 1) | (boolToByte(n.Comment != nil) << 2)
	case ast.KindJSDocTypedefTag:
		n := node.AsJSDocTypedefTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.TypeExpression != nil) << 1) | (boolToByte(n.Name() != nil) << 2) | (boolToByte(n.Comment != nil) << 3)
	case ast.KindJSDocSignature:
		n := node.AsJSDocSignature()
		return (boolToByte(n.TypeParameters != nil) << 0) | (boolToByte(n.Parameters != nil) << 1) | (boolToByte(n.Type != nil) << 2)
	case ast.KindJSDocNameReference:
		n := node.AsJSDocNameReference()
		return (boolToByte(n.Name() != nil) << 0)
	case ast.KindModuleDeclaration:
		n := node.AsModuleDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.Body != nil) << 2)
	case ast.KindImportEqualsDeclaration:
		n := node.AsImportEqualsDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.ModuleReference != nil) << 2)
	case ast.KindExportDeclaration:
		n := node.AsExportDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.ExportClause != nil) << 1) | (boolToByte(n.ModuleSpecifier != nil) << 2) | (boolToByte(n.Attributes != nil) << 3)
	case ast.KindImportType:
		n := node.AsImportTypeNode()
		return (boolToByte(n.Argument != nil) << 0) | (boolToByte(n.Attributes != nil) << 1) | (boolToByte(n.Qualifier != nil) << 2) | (boolToByte(n.TypeArguments != nil) << 3)
	case ast.KindImportClause:
		n := node.AsImportClause()
		return (boolToByte(n.Name() != nil) << 0) | (boolToByte(n.NamedBindings != nil) << 1)
	case ast.KindImportSpecifier:
		n := node.AsImportSpecifier()
		return (boolToByte(n.PropertyName != nil) << 0) | (boolToByte(n.Name() != nil) << 1)
	case ast.KindJSDocLink:
		n := node.AsJSDocLink()
		return (boolToByte(n.Name() != nil) << 0)
	case ast.KindJSDocLinkPlain:
		n := node.AsJSDocLinkPlain()
		return (boolToByte(n.Name() != nil) << 0)
	case ast.KindJSDocLinkCode:
		n := node.AsJSDocLinkCode()
		return (boolToByte(n.Name() != nil) << 0)
	case ast.KindTypeParameter:
		n := node.AsTypeParameterDeclaration()
		return (boolToByte(hasModifiers(n.Modifiers())) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.Constraint != nil) << 2) | (boolToByte(n.Expression != nil) << 3) | (boolToByte(n.DefaultType != nil) << 4)
	case ast.KindSyntheticReferenceExpression:
		n := node.AsSyntheticReferenceExpression()
		return (boolToByte(n.Expression != nil) << 0) | (boolToByte(n.ThisArg != nil) << 1)
	case ast.KindJSDocTypeLiteral:
		n := node.AsJSDocTypeLiteral()
		return (boolToByte(len(n.JSDocPropertyTags) > 0) << 0)
	case ast.KindJSDocParameterTag, ast.KindJSDocPropertyTag:
		n := node.AsJSDocParameterOrPropertyTag()
		return (boolToByte(n.TagName != nil) << 0) | (boolToByte(n.Name() != nil) << 1) | (boolToByte(n.TypeExpression != nil) << 2) | (boolToByte(n.Comment != nil) << 3)
	default:
		return 0
	}
}

func getNodeCommonData(node *ast.Node) uint32 {
	switch node.Kind {
	case ast.KindBlock:
		n := node.AsBlock()
		return uint32(boolToByte(n.MultiLine)) << 24
	case ast.KindHeritageClause:
		n := node.AsHeritageClause()
		var tokenIdx uint32
		switch n.Token {
		case ast.KindImplementsKeyword:
			tokenIdx = 1
		}
		return tokenIdx << 24
	case ast.KindExportAssignment:
		n := node.AsExportAssignment()
		return uint32(boolToByte(n.IsExportEquals)) << 24
	case ast.KindExportSpecifier:
		n := node.AsExportSpecifier()
		return uint32(boolToByte(n.IsTypeOnly)) << 24
	case ast.KindPrefixUnaryExpression:
		n := node.AsPrefixUnaryExpression()
		var operatorIdx uint32
		switch n.Operator {
		case ast.KindMinusToken:
			operatorIdx = 1
		case ast.KindTildeToken:
			operatorIdx = 2
		case ast.KindExclamationToken:
			operatorIdx = 3
		case ast.KindPlusPlusToken:
			operatorIdx = 4
		case ast.KindMinusMinusToken:
			operatorIdx = 5
		}
		return operatorIdx << 24
	case ast.KindPostfixUnaryExpression:
		n := node.AsPostfixUnaryExpression()
		var operatorIdx uint32
		switch n.Operator {
		case ast.KindMinusMinusToken:
			operatorIdx = 1
		}
		return operatorIdx << 24
	case ast.KindMetaProperty:
		n := node.AsMetaProperty()
		var keywordTokenIdx uint32
		switch n.KeywordToken {
		case ast.KindNewKeyword:
			keywordTokenIdx = 1
		}
		return keywordTokenIdx << 24
	case ast.KindArrayLiteralExpression:
		n := node.AsArrayLiteralExpression()
		return uint32(boolToByte(n.MultiLine)) << 24
	case ast.KindObjectLiteralExpression:
		n := node.AsObjectLiteralExpression()
		return uint32(boolToByte(n.MultiLine)) << 24
	case ast.KindTypeOperator:
		n := node.AsTypeOperatorNode()
		var operatorIdx uint32
		switch n.Operator {
		case ast.KindReadonlyKeyword:
			operatorIdx = 1
		case ast.KindUniqueKeyword:
			operatorIdx = 2
		}
		return operatorIdx << 24
	case ast.KindImportAttributes:
		n := node.AsImportAttributes()
		var tokenIdx uint32
		switch n.Token {
		case ast.KindAssertKeyword:
			tokenIdx = 1
		}
		return uint32(boolToByte(n.MultiLine))<<24 | tokenIdx<<25
	case ast.KindSyntheticExpression:
		return getNodeCommonData_SyntheticExpression(node)
	case ast.KindJsxText:
		n := node.AsJsxText()
		return uint32(boolToByte(n.ContainsOnlyTriviaWhiteSpaces)) << 24
	case ast.KindModuleDeclaration:
		n := node.AsModuleDeclaration()
		var keywordIdx uint32
		switch n.Keyword {
		case ast.KindNamespaceKeyword:
			keywordIdx = 1
		}
		return keywordIdx << 24
	case ast.KindImportEqualsDeclaration:
		n := node.AsImportEqualsDeclaration()
		return uint32(boolToByte(n.IsTypeOnly)) << 24
	case ast.KindExportDeclaration:
		n := node.AsExportDeclaration()
		return uint32(boolToByte(n.IsTypeOnly)) << 24
	case ast.KindImportType:
		n := node.AsImportTypeNode()
		return uint32(boolToByte(n.IsTypeOf)) << 24
	case ast.KindImportClause:
		n := node.AsImportClause()
		var phaseModifierIdx uint32
		switch n.PhaseModifier {
		case ast.KindTypeKeyword:
			phaseModifierIdx = 1
		case ast.KindDeferKeyword:
			phaseModifierIdx = 2
		}
		return phaseModifierIdx << 24
	case ast.KindImportSpecifier:
		n := node.AsImportSpecifier()
		return uint32(boolToByte(n.IsTypeOnly)) << 24
	case ast.KindJSDocTypeLiteral:
		n := node.AsJSDocTypeLiteral()
		return uint32(boolToByte(n.IsArrayType)) << 24
	case ast.KindJSDocParameterTag, ast.KindJSDocPropertyTag:
		n := node.AsJSDocParameterOrPropertyTag()
		return uint32(boolToByte(n.IsBracketed))<<24 | uint32(boolToByte(n.IsNameFirst))<<25
	}
	return 0
}

func recordNodeStrings(node *ast.Node, strs *stringTable) uint32 {
	switch node.Kind {
	case ast.KindIdentifier:
		return strs.add(node.AsIdentifier().Text, node.Kind, node.Pos(), node.End())
	case ast.KindPrivateIdentifier:
		return strs.add(node.AsPrivateIdentifier().Text, node.Kind, node.Pos(), node.End())
	case ast.KindJsxText:
		return strs.add(node.AsJsxText().Text, node.Kind, node.Pos(), node.End())
	case ast.KindJSDocText:
		return strs.add(node.AsJSDocText().Text(), node.Kind, node.Pos(), node.End())
	case ast.KindJSDocLink:
		return strs.add(node.AsJSDocLink().Text(), node.Kind, node.Pos(), node.End())
	case ast.KindJSDocLinkPlain:
		return strs.add(node.AsJSDocLinkPlain().Text(), node.Kind, node.Pos(), node.End())
	case ast.KindJSDocLinkCode:
		return strs.add(node.AsJSDocLinkCode().Text(), node.Kind, node.Pos(), node.End())
	default:
		panic(fmt.Sprintf("Unexpected node kind %v", node.Kind))
	}
}

func recordExtendedData(node *ast.Node, strs *stringTable, positionMap *ast.PositionMap, extendedData *[]byte, structuredData *[]byte) uint32 {
	offset := uint32(len(*extendedData))
	switch node.Kind {
	case ast.KindStringLiteral:
		recordExtendedData_StringLiteral(node, strs, positionMap, extendedData, structuredData)
	case ast.KindNumericLiteral:
		recordExtendedData_NumericLiteral(node, strs, positionMap, extendedData, structuredData)
	case ast.KindBigIntLiteral:
		recordExtendedData_BigIntLiteral(node, strs, positionMap, extendedData, structuredData)
	case ast.KindRegularExpressionLiteral:
		recordExtendedData_RegularExpressionLiteral(node, strs, positionMap, extendedData, structuredData)
	case ast.KindNoSubstitutionTemplateLiteral:
		recordExtendedData_NoSubstitutionTemplateLiteral(node, strs, positionMap, extendedData, structuredData)
	case ast.KindTemplateHead:
		recordExtendedData_TemplateHead(node, strs, positionMap, extendedData, structuredData)
	case ast.KindTemplateMiddle:
		recordExtendedData_TemplateMiddle(node, strs, positionMap, extendedData, structuredData)
	case ast.KindTemplateTail:
		recordExtendedData_TemplateTail(node, strs, positionMap, extendedData, structuredData)
	case ast.KindSourceFile:
		recordExtendedData_SourceFile(node, strs, positionMap, extendedData, structuredData)
	default:
		panic(fmt.Sprintf("unknown extended data node kind %v", node.Kind))
	}
	return offset
}
