diff --git a/src/compiler/factory/nodeFactory.ts b/src/compiler/factory/nodeFactory.ts index 8c427da2a19..ffb1cff041a 100644 --- a/src/compiler/factory/nodeFactory.ts +++ b/src/compiler/factory/nodeFactory.ts @@ -581,7 +581,6 @@ namespace ts { ); node.parameters = createNodeArray(parameters); node.type = type; - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildrenFlags(node.parameters) | propagateChildFlags(node.type); @@ -643,7 +642,6 @@ namespace ts { typeParameters ); node.heritageClauses = asNodeArray(heritageClauses); - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildrenFlags(node.heritageClauses); return node; } @@ -719,8 +717,6 @@ namespace ts { ) { const node = createBaseToken(kind); node.text = text; - node.hasExtendedUnicodeEscape = undefined; - node.isUnterminated = undefined; return node; } @@ -927,9 +923,6 @@ namespace ts { // 'this' indicates a lexical 'this' transformFlags = TransformFlags.ContainsLexicalThis; break; - case SyntaxKind.EndOfFileToken: - (node as EndOfFileToken).jsDoc = undefined; // extraneous node set by parser - break; } if (transformFlags) { node.transformFlags |= transformFlags; @@ -1048,7 +1041,6 @@ namespace ts { node.constraint = constraint; node.default = defaultType; node.transformFlags = TransformFlags.ContainsTypeScript; - node.expression = undefined; // extraneous node set by parser. return node; } @@ -1081,7 +1073,6 @@ namespace ts { ); node.dotDotDotToken = dotDotDotToken; node.questionToken = questionToken; - node.jsDoc = undefined; // extraneous node set by parser if (isThisIdentifier(node.name)) { node.transformFlags = TransformFlags.ContainsTypeScript; } @@ -1155,8 +1146,6 @@ namespace ts { ); node.type = type; node.questionToken = questionToken; - node.initializer = undefined; // extraneous node set by parser. - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags = TransformFlags.ContainsTypeScript; return node; } @@ -1196,7 +1185,6 @@ namespace ts { ); node.questionToken = questionOrExclamationToken && isQuestionToken(questionOrExclamationToken) ? questionOrExclamationToken : undefined; node.exclamationToken = questionOrExclamationToken && isExclamationToken(questionOrExclamationToken) ? questionOrExclamationToken : undefined; - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.questionToken) | propagateChildFlags(node.exclamationToken) | @@ -1298,7 +1286,6 @@ namespace ts { ); node.asteriskToken = asteriskToken; node.questionToken = questionToken; - node.exclamationToken = undefined; // extraneous node set by parser. node.transformFlags |= propagateChildFlags(node.asteriskToken) | propagateChildFlags(node.questionToken) | @@ -2027,9 +2014,6 @@ namespace ts { function createBaseExpression(kind: T["kind"]) { const node = createBaseNode(kind); // the following properties are commonly set by the checker/binder - node.contextualType = undefined; - node.inferenceContext = undefined; - node.flowNode = undefined; return node; } @@ -2275,7 +2259,6 @@ namespace ts { function createTaggedTemplateExpression(tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral) { const node = createBaseExpression(SyntaxKind.TaggedTemplateExpression); node.tag = parenthesizerRules().parenthesizeLeftSideOfAccess(tag); - node.questionDotToken = undefined; // extraneous node set by parser. node.typeArguments = asNodeArray(typeArguments); node.template = template; node.transformFlags |= @@ -2326,7 +2309,6 @@ namespace ts { const node = createBaseExpression(SyntaxKind.ParenthesizedExpression); node.expression = expression; node.transformFlags = propagateChildFlags(node.expression); - node.jsDoc = undefined; // extraneous node set by parser return node; } @@ -2945,7 +2927,6 @@ namespace ts { function createVariableStatement(modifiers: readonly Modifier[] | undefined, declarationList: VariableDeclarationList | readonly VariableDeclaration[]) { const node = createBaseDeclaration(SyntaxKind.VariableStatement, /*decorators*/ undefined, modifiers); node.declarationList = isArray(declarationList) ? createVariableDeclarationList(declarationList) : declarationList; - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.declarationList); if (modifiersToFlags(node.modifiers) & ModifierFlags.Ambient) { @@ -2971,7 +2952,6 @@ namespace ts { function createExpressionStatement(expression: Expression): ExpressionStatement { const node = createBaseNode(SyntaxKind.ExpressionStatement); node.expression = parenthesizerRules().parenthesizeExpressionOfExpressionStatement(expression); - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.expression); return node; } @@ -3213,7 +3193,6 @@ namespace ts { const node = createBaseNode(SyntaxKind.LabeledStatement); node.label = asName(label); node.statement = asEmbeddedStatement(statement); - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.label) | propagateChildFlags(node.statement); @@ -3497,7 +3476,6 @@ namespace ts { typeParameters ); node.type = type; - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags = TransformFlags.ContainsTypeScript; return node; } @@ -3534,7 +3512,6 @@ namespace ts { name ); node.members = createNodeArray(members); - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildrenFlags(node.members) | TransformFlags.ContainsTypeScript; @@ -3572,7 +3549,6 @@ namespace ts { node.flags |= flags & (NodeFlags.Namespace | NodeFlags.NestedNamespace | NodeFlags.GlobalAugmentation); node.name = name; node.body = body; - node.jsDoc = undefined; // extraneous node set by parser if (modifiersToFlags(node.modifiers) & ModifierFlags.Ambient) { node.transformFlags = TransformFlags.ContainsTypeScript; } @@ -3639,7 +3615,6 @@ namespace ts { /*modifiers*/ undefined, name ); - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags = TransformFlags.ContainsTypeScript; return node; } @@ -3665,7 +3640,6 @@ namespace ts { name ); node.moduleReference = moduleReference; - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.moduleReference); if (!isExternalModuleReference(node.moduleReference)) node.transformFlags |= TransformFlags.ContainsTypeScript; return node; @@ -3701,7 +3675,6 @@ namespace ts { ); node.importClause = importClause; node.moduleSpecifier = moduleSpecifier; - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.importClause) | propagateChildFlags(node.moduleSpecifier); @@ -3830,7 +3803,6 @@ namespace ts { node.expression = isExportEquals ? parenthesizerRules().parenthesizeRightSideOfBinary(SyntaxKind.EqualsToken, /*leftSide*/ undefined, expression) : parenthesizerRules().parenthesizeExpressionOfExportDefault(expression); - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.expression); return node; } @@ -3865,7 +3837,6 @@ namespace ts { node.isTypeOnly = isTypeOnly; node.exportClause = exportClause; node.moduleSpecifier = moduleSpecifier; - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.exportClause) | propagateChildFlags(node.moduleSpecifier); @@ -4652,10 +4623,7 @@ namespace ts { /*modifiers*/ undefined, name ); - node.questionToken = undefined; // extraneous node set by parser. - node.exclamationToken = undefined; // extraneous node set by parser. node.initializer = parenthesizerRules().parenthesizeExpressionForDisallowedComma(initializer); - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.name) | propagateChildFlags(node.initializer); @@ -4687,11 +4655,7 @@ namespace ts { /*modifiers*/ undefined, name ); - node.equalsToken = undefined; // extraneous node set by parser. node.objectAssignmentInitializer = objectAssignmentInitializer && parenthesizerRules().parenthesizeExpressionForDisallowedComma(objectAssignmentInitializer); - node.questionToken = undefined; // extraneous node set by parser. - node.exclamationToken = undefined; // extraneous node set by parser. - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.objectAssignmentInitializer) | TransformFlags.ContainsES2015; @@ -4720,7 +4684,6 @@ namespace ts { function createSpreadAssignment(expression: Expression) { const node = createBaseNode(SyntaxKind.SpreadAssignment); node.expression = parenthesizerRules().parenthesizeExpressionForDisallowedComma(expression); - node.jsDoc = undefined; // extraneous node set by parser node.transformFlags |= propagateChildFlags(node.expression) | TransformFlags.ContainsES2018 | @@ -4780,8 +4743,6 @@ namespace ts { node.scriptKind = 0; node.isDeclarationFile = false; node.hasNoDefaultLib = false; - node.externalModuleIndicator = undefined; - node.commonJsModuleIndicator = undefined; node.transformFlags |= propagateChildrenFlags(node.statements) | propagateChildFlags(node.endOfFileToken); @@ -4860,15 +4821,8 @@ namespace ts { node.texts = texts; node.fileName = ""; node.text = ""; - node.helpers = undefined; node.referencedFiles = emptyArray; - node.typeReferenceDirectives = undefined; node.libReferenceDirectives = emptyArray; - node.hasNoDefaultLib = undefined; - node.sourceMapPath = undefined; - node.sourceMapText = undefined; - node.oldFileOfCurrentEmit = undefined; - node.parsedSourceMap = undefined; node.getLineAndCharacterOfPosition = pos => getLineAndCharacterOfPosition(node, pos); return node; } @@ -4907,17 +4861,8 @@ namespace ts { // @api function createInputFiles(): InputFiles { const node = createBaseNode(SyntaxKind.InputFiles); - node.javascriptPath = undefined; node.javascriptText = ""; - node.javascriptMapPath = undefined; - node.javascriptMapText = undefined; - node.declarationPath = undefined; node.declarationText = ""; - node.declarationMapPath = undefined; - node.declarationMapText = undefined; - node.buildInfoPath = undefined; - node.buildInfo = undefined; - node.oldFileOfCurrentEmit = undefined; return node; } diff --git a/src/compiler/forEachChild.ts b/src/compiler/forEachChild.ts index 24e1a550908..373f5df430e 100644 --- a/src/compiler/forEachChild.ts +++ b/src/compiler/forEachChild.ts @@ -17,6 +17,731 @@ namespace ts { } } + function forEachChildOfQualifiedName(node: QualifiedName, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.left) || + visitNode(cbNode, node.right); + } + + function forEachChildOfTypeParameter(node: TypeParameterDeclaration, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.name) || + visitNode(cbNode, node.constraint) || + visitNode(cbNode, node.default) || + visitNode(cbNode, node.expression); + } + + function forEachChildOfShorthandPropertyAssignment(node: ShorthandPropertyAssignment, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.exclamationToken) || + visitNode(cbNode, node.equalsToken) || + visitNode(cbNode, node.objectAssignmentInitializer); + } + + function forEachChildOfSpreadAssignment(node: SpreadAssignment, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfParameter(node: ParameterDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.dotDotDotToken) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.initializer); + } + + function forEachChildOfPropertyDeclaration(node: PropertyDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.exclamationToken) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.initializer); + } + + function forEachChildOfPropertySignature(node: PropertySignature, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.initializer); + } + + function forEachChildOfPropertyAssignment(node: PropertyAssignment, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.initializer); + } + + function forEachChildOfVariableDeclaration(node: VariableDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.exclamationToken) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.initializer); + } + + function forEachChildOfBindingElement(node: BindingElement, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.dotDotDotToken) || + visitNode(cbNode, node.propertyName) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.initializer); + } + + function forEachChildOfFunctionOrConstructorTypeOrCallConstructOrIndexSignature(node: FunctionTypeNode | ConstructorTypeNode | CallSignatureDeclaration | ConstructSignatureDeclaration | IndexSignatureDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type); + } + + function forEachChildOfMethodDeclaration(node: MethodDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.asteriskToken) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.exclamationToken) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.body); + } + + function forEachChildOfMethodSignature(node: MethodSignature, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type); + } + + function forEachChildOfConstructor(node: ConstructorDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.body); + } + + function forEachChildOfGetAccessor(node: GetAccessorDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.exclamationToken) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.body); + } + + function forEachChildOfSetAccessor(node: SetAccessorDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.exclamationToken) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.body); + } + + function forEachChildOfFunctionExpression(node: FunctionExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.asteriskToken) || + visitNode(cbNode, node.name) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.body); + } + + function forEachChildOfFunctionDeclaration(node: FunctionDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.asteriskToken) || + visitNode(cbNode, node.name) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.body); + } + + function forEachChildOfArrowFunction(node: ArrowFunction, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type) || + visitNode(cbNode, node.equalsGreaterThanToken) || + visitNode(cbNode, node.body); + } + + function forEachChildOfTypeReference(node: TypeReferenceNode, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.typeName) || + visitNodes(cbNode, cbNodes, node.typeArguments); + } + + function forEachChildOfTypePredicate(node: TypePredicateNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.assertsModifier) || + visitNode(cbNode, node.parameterName) || + visitNode(cbNode, node.type); + } + + function forEachChildOfTypeQuery(node: TypeQueryNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.exprName); + } + + function forEachChildOfTypeLiteral(node: TypeLiteralNode, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.members); + } + + function forEachChildOfArrayType(node: ArrayTypeNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.elementType); + } + + function forEachChildOfTupleType(node: TupleTypeNode, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.elementTypes); + } + + function forEachChildOfUnionOrIntersectionType(node: UnionTypeNode | IntersectionTypeNode, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.types); + } + + function forEachChildOfConditionalType(node: ConditionalTypeNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.checkType) || + visitNode(cbNode, node.extendsType) || + visitNode(cbNode, node.trueType) || + visitNode(cbNode, node.falseType); + } + + function forEachChildOfInferType(node: InferTypeNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.typeParameter); + } + + function forEachChildOfImportType(node: ImportTypeNode, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.argument) || + visitNode(cbNode, node.qualifier) || + visitNodes(cbNode, cbNodes, node.typeArguments); + } + + function forEachChildOfParenthesizedTypeOrTypeOperator(node: ParenthesizedTypeNode | TypeOperatorNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.type); + } + + function forEachChildOfIndexedAccessType(node: IndexedAccessTypeNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.objectType) || + visitNode(cbNode, node.indexType); + } + + function forEachChildOfMappedType(node: MappedTypeNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.readonlyToken) || + visitNode(cbNode, node.typeParameter) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.type); + } + + function forEachChildOfLiteralType(node: LiteralTypeNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.literal); + } + + function forEachChildOfObjectOrArrayBindingPattern(node: ObjectBindingPattern | ArrayBindingPattern, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.elements); + } + + function forEachChildOfArrayLiteralExpression(node: ArrayLiteralExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.elements); + } + + function forEachChildOfObjectLiteralExpression(node: ObjectLiteralExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.properties); + } + + function forEachChildOfPropertyAccessExpression(node: PropertyAccessExpression, cbNode: (node: Node) => T | undefined, _cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNode(cbNode, node.questionDotToken) || + visitNode(cbNode, node.name); + } + + function forEachChildOfElementAccessExpression(node: ElementAccessExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNode(cbNode, node.questionDotToken) || + visitNode(cbNode, node.argumentExpression); + } + + function forEachChildOfCallExpression(node: CallExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNode(cbNode, node.questionDotToken) || + visitNodes(cbNode, cbNodes, node.typeArguments) || + visitNodes(cbNode, cbNodes, node.arguments); + } + + function forEachChildOfNewExpression(node: NewExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNodes(cbNode, cbNodes, node.typeArguments) || + visitNodes(cbNode, cbNodes, node.arguments); + } + + function forEachChildOfTaggedTemplateExpression(node: TaggedTemplateExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.tag) || + visitNode(cbNode, node.questionDotToken) || + visitNodes(cbNode, cbNodes, node.typeArguments) || + visitNode(cbNode, node.template); + } + + function forEachChildOfTypeAssertion(node: TypeAssertion, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.type) || + visitNode(cbNode, node.expression); + } + + function forEachChildOfParenthesizedExpression(node: ParenthesizedExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfDeleteExpression(node: DeleteExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfTypeOfExpression(node: TypeOfExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfVoidExpression(node: VoidExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfPrefixUnaryExpression(node: PrefixUnaryExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.operand); + } + + function forEachChildOfYieldExpression(node: YieldExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.asteriskToken) || + visitNode(cbNode, node.expression); + } + + function forEachChildOfAwaitExpression(node: AwaitExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfPostfixUnaryExpression(node: PostfixUnaryExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.operand); + } + + function forEachChildOfBinaryExpression(node: BinaryExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.left) || + visitNode(cbNode, node.operatorToken) || + visitNode(cbNode, node.right); + } + + function forEachChildOfAsExpression(node: AsExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNode(cbNode, node.type); + } + + function forEachChildOfNonNullExpression(node: NonNullExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfMetaProperty(node: MetaProperty, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.name); + } + + function forEachChildOfConditionalExpression(node: ConditionalExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.condition) || + visitNode(cbNode, node.questionToken) || + visitNode(cbNode, node.whenTrue) || + visitNode(cbNode, node.colonToken) || + visitNode(cbNode, node.whenFalse); + } + + function forEachChildOfSpreadElement(node: SpreadElement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfBlockOrModuleBlock(node: Block | ModuleBlock, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.statements); + } + + function forEachChildOfSourceFile(node: SourceFile, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.statements) || + visitNode(cbNode, node.endOfFileToken); + } + + function forEachChildOfVariableStatement(node: VariableStatement, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.declarationList); + } + + function forEachChildOfVariableDeclarationList(node: VariableDeclarationList, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.declarations); + } + + function forEachChildOfExpressionStatement(node: ExpressionStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfIfStatement(node: IfStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNode(cbNode, node.thenStatement) || + visitNode(cbNode, node.elseStatement); + } + + function forEachChildOfDoStatement(node: DoStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.statement) || + visitNode(cbNode, node.expression); + } + + function forEachChildOfWhileStatement(node: WhileStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNode(cbNode, node.statement); + } + + function forEachChildOfForStatement(node: ForStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.initializer) || + visitNode(cbNode, node.condition) || + visitNode(cbNode, node.incrementor) || + visitNode(cbNode, node.statement); + } + + function forEachChildOfForInStatement(node: ForInStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.initializer) || + visitNode(cbNode, node.expression) || + visitNode(cbNode, node.statement); + } + + function forEachChildOfForOfStatement(node: ForOfStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.awaitModifier) || + visitNode(cbNode, node.initializer) || + visitNode(cbNode, node.expression) || + visitNode(cbNode, node.statement); + } + + function forEachChildOfContinueOrBreakStatement(node: ContinueStatement | BreakStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.label); + } + + function forEachChildOfReturnStatement(node: ReturnStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfWithStatement(node: WithStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNode(cbNode, node.statement); + } + + function forEachChildOfSwitchStatement(node: SwitchStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNode(cbNode, node.caseBlock); + } + + function forEachChildOfCaseBlock(node: CaseBlock, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.clauses); + } + + function forEachChildOfCaseClause(node: CaseClause, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNodes(cbNode, cbNodes, node.statements); + } + + function forEachChildOfDefaultClause(node: DefaultClause, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.statements); + } + + function forEachChildOfLabeledStatement(node: LabeledStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.label) || + visitNode(cbNode, node.statement); + } + + function forEachChildOfThrowStatement(node: ThrowStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfTryStatement(node: TryStatement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tryBlock) || + visitNode(cbNode, node.catchClause) || + visitNode(cbNode, node.finallyBlock); + } + + function forEachChildOfCatchClause(node: CatchClause, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.variableDeclaration) || + visitNode(cbNode, node.block); + } + + function forEachChildOfDecorator(node: Decorator, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfClassDeclarationOrExpression(node: ClassDeclaration | ClassExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.heritageClauses) || + visitNodes(cbNode, cbNodes, node.members); + } + + function forEachChildOfInterfaceDeclaration(node: InterfaceDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNodes(cbNode, cbNodes, node.heritageClauses) || + visitNodes(cbNode, cbNodes, node.members); + } + + function forEachChildOfTypeAliasDeclaration(node: TypeAliasDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNodes(cbNode, cbNodes, node.typeParameters) || + visitNode(cbNode, node.type); + } + + function forEachChildOfEnumDeclaration(node: EnumDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNodes(cbNode, cbNodes, node.members); + } + + function forEachChildOfEnumMember(node: EnumMember, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.name) || + visitNode(cbNode, node.initializer); + } + + function forEachChildOfModuleDeclaration(node: ModuleDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.body); + } + + function forEachChildOfImportEqualsDeclaration(node: ImportEqualsDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.name) || + visitNode(cbNode, node.moduleReference); + } + + function forEachChildOfImportDeclaration(node: ImportDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.importClause) || + visitNode(cbNode, node.moduleSpecifier); + } + + function forEachChildOfImportClause(node: ImportClause, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.name) || + visitNode(cbNode, node.namedBindings); + } + + function forEachChildOfNamespaceExportDeclaration(node: NamespaceExportDeclaration, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.name); + + } + + function forEachChildOfNamespaceImport(node: NamespaceImport, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.name); + } + + function forEachChildOfNamespaceExport(node: NamespaceExport, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.name); + } + + function forEachChildOfNamedImportsOrExports(node: NamedImports | NamedExports, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.elements); + } + + function forEachChildOfExportDeclaration(node: ExportDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.exportClause) || + visitNode(cbNode, node.moduleSpecifier); + } + + function forEachChildOfImportOrExportSpecifier(node: ImportSpecifier | ExportSpecifier, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.propertyName) || + visitNode(cbNode, node.name); + } + + function forEachChildOfExportAssignment(node: ExportAssignment, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators) || + visitNodes(cbNode, cbNodes, node.modifiers) || + visitNode(cbNode, node.expression); + } + + function forEachChildOfTemplateExpression(node: TemplateExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.head) || visitNodes(cbNode, cbNodes, node.templateSpans); + } + + function forEachChildOfTemplateSpan(node: TemplateSpan, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || visitNode(cbNode, node.literal); + } + + function forEachChildOfComputedPropertyName(node: ComputedPropertyName, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfHeritageClause(node: HeritageClause, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.types); + } + + function forEachChildOfExpressionWithTypeArguments(node: ExpressionWithTypeArguments, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression) || + visitNodes(cbNode, cbNodes, node.typeArguments); + } + + function forEachChildOfExternalModuleReference(node: ExternalModuleReference, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfMissingDeclaration(node: MissingDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.decorators); + } + + function forEachChildOfCommaListExpression(node: CommaListExpression, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.elements); + } + + function forEachChildOfJsxElement(node: JsxElement, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.openingElement) || + visitNodes(cbNode, cbNodes, node.children) || + visitNode(cbNode, node.closingElement); + } + + function forEachChildOfJsxFragment(node: JsxFragment, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.openingFragment) || + visitNodes(cbNode, cbNodes, node.children) || + visitNode(cbNode, node.closingFragment); + } + + function forEachChildOfJsxOpeningOrSelfClosingElement(node: JsxOpeningElement | JsxSelfClosingElement, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName) || + visitNodes(cbNode, cbNodes, node.typeArguments) || + visitNode(cbNode, node.attributes); + } + + function forEachChildOfJsxAttributes(node: JsxAttributes, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.properties); + } + + function forEachChildOfJsxAttribute(node: JsxAttribute, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.name) || + visitNode(cbNode, node.initializer); + } + + function forEachChildOfJsxSpreadAttribute(node: JsxSpreadAttribute, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + + function forEachChildOfJsxExpression(node: JsxExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.dotDotDotToken) || + visitNode(cbNode, node.expression); + } + + function forEachChildOfJsxClosingElement(node: JsxClosingElement, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName); + } + + function forEachChildOfOptionalOrRestOrJSDocTypeLike(node: OptionalTypeNode | RestTypeNode | JSDocTypeExpression | JSDocTypeReferencingNode, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.type); + } + + function forEachChildOfJSDocFunctionType(node: JSDocFunctionType, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.parameters) || + visitNode(cbNode, node.type); + } + + function forEachChildOfJSDocComment(node: JSDoc, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNodes(cbNode, cbNodes, node.tags); + } + + function forEachChildOfJSDocPropertyOrParameterTag(node: JSDocPropertyTag | JSDocParameterTag, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName) || + (node.isNameFirst + ? visitNode(cbNode, node.name) || + visitNode(cbNode, node.typeExpression) + : visitNode(cbNode, node.typeExpression) || + visitNode(cbNode, node.name)); + } + + function forEachChildOfJSDocAuthorTag(node: JSDocAuthorTag, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName); + } + + function forEachChildOfJSDocImplementsTag(node: JSDocImplementsTag, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName) || + visitNode(cbNode, node.class); + } + + function forEachChildOfJSDocAugmentsTag(node: JSDocAugmentsTag, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName) || + visitNode(cbNode, node.class); + } + + function forEachChildOfJSDocTemplateTag(node: JSDocTemplateTag, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName) || + visitNode(cbNode, node.constraint) || + visitNodes(cbNode, cbNodes, node.typeParameters); + } + + function forEachChildOfJSDocTypedefTag(node: JSDocTypedefTag, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName) || + (node.typeExpression?.kind === SyntaxKind.JSDocTypeExpression + ? visitNode(cbNode, node.typeExpression) || + visitNode(cbNode, node.fullName) + : visitNode(cbNode, node.fullName) || + visitNode(cbNode, node.typeExpression)); + } + + function forEachChildOfJSDocCallbackTag(node: JSDocCallbackTag, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName) || + visitNode(cbNode, node.fullName) || + visitNode(cbNode, node.typeExpression); + } + + function forEachChildOfJSDocReturnOrTypeOrThisOrEnumTag(node: JSDocReturnTag | JSDocTypeTag | JSDocThisTag | JSDocEnumTag, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName) || + visitNode(cbNode, node.typeExpression); + } + + function forEachChildOfJSDocSignature(node: JSDocSignature, cbNode: (node: Node) => T | undefined): T | undefined { + return forEach(node.typeParameters, cbNode) || + forEach(node.parameters, cbNode) || + visitNode(cbNode, node.type); + } + + function forEachChildOfJSDocTypeLiteral(node: JSDocTypeLiteral, cbNode: (node: Node) => T | undefined): T | undefined { + return forEach(node.jsDocPropertyTags, cbNode); + } + + function forEachChildOfJSDocUnknownOrClassOrPublicOrPrivateOrProtectedOrReadonlyTag(node: JSDocUnknownTag | JSDocClassTag | JSDocPublicTag | JSDocPrivateTag | JSDocProtectedTag | JSDocReadonlyTag, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.tagName); + } + + function forEachChildOfPartiallyEmittedExpression(node: PartiallyEmittedExpression, cbNode: (node: Node) => T | undefined): T | undefined { + return visitNode(cbNode, node.expression); + } + /** * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes * stored in properties. If a 'cbNodes' callback is specified, it is invoked for embedded arrays; otherwise, @@ -36,386 +761,240 @@ namespace ts { } switch (node.kind) { case SyntaxKind.QualifiedName: - return visitNode(cbNode, (node).left) || - visitNode(cbNode, (node).right); + return forEachChildOfQualifiedName(node as QualifiedName, cbNode); case SyntaxKind.TypeParameter: - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).constraint) || - visitNode(cbNode, (node).default) || - visitNode(cbNode, (node).expression); + return forEachChildOfTypeParameter(node as TypeParameterDeclaration, cbNode); case SyntaxKind.ShorthandPropertyAssignment: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).exclamationToken) || - visitNode(cbNode, (node).equalsToken) || - visitNode(cbNode, (node).objectAssignmentInitializer); + return forEachChildOfShorthandPropertyAssignment(node as ShorthandPropertyAssignment, cbNode, cbNodes); case SyntaxKind.SpreadAssignment: - return visitNode(cbNode, (node).expression); + return forEachChildOfSpreadAssignment(node as SpreadAssignment, cbNode); case SyntaxKind.Parameter: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).dotDotDotToken) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).initializer); + return forEachChildOfParameter(node as ParameterDeclaration, cbNode, cbNodes); case SyntaxKind.PropertyDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).exclamationToken) || - visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).initializer); + return forEachChildOfPropertyDeclaration(node as PropertyDeclaration, cbNode, cbNodes); case SyntaxKind.PropertySignature: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).initializer); + return forEachChildOfPropertySignature(node as PropertySignature, cbNode, cbNodes); case SyntaxKind.PropertyAssignment: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).initializer); + return forEachChildOfPropertyAssignment(node as PropertyAssignment, cbNode, cbNodes); case SyntaxKind.VariableDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).exclamationToken) || - visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).initializer); + return forEachChildOfVariableDeclaration(node as VariableDeclaration, cbNode, cbNodes); case SyntaxKind.BindingElement: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).dotDotDotToken) || - visitNode(cbNode, (node).propertyName) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).initializer); + return forEachChildOfBindingElement(node as BindingElement, cbNode, cbNodes); case SyntaxKind.FunctionType: case SyntaxKind.ConstructorType: case SyntaxKind.CallSignature: case SyntaxKind.ConstructSignature: case SyntaxKind.IndexSignature: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNodes(cbNode, cbNodes, (node).parameters) || - visitNode(cbNode, (node).type); + return forEachChildOfFunctionOrConstructorTypeOrCallConstructOrIndexSignature(node as FunctionTypeNode | ConstructorTypeNode | CallSignatureDeclaration | ConstructSignatureDeclaration | IndexSignatureDeclaration, cbNode, cbNodes); case SyntaxKind.MethodDeclaration: + return forEachChildOfMethodDeclaration(node as MethodDeclaration, cbNode, cbNodes); case SyntaxKind.MethodSignature: + return forEachChildOfMethodSignature(node as MethodSignature, cbNode, cbNodes); case SyntaxKind.Constructor: + return forEachChildOfConstructor(node as ConstructorDeclaration, cbNode, cbNodes); case SyntaxKind.GetAccessor: + return forEachChildOfGetAccessor(node as GetAccessorDeclaration, cbNode, cbNodes); case SyntaxKind.SetAccessor: + return forEachChildOfSetAccessor(node as SetAccessorDeclaration, cbNode, cbNodes); case SyntaxKind.FunctionExpression: + return forEachChildOfFunctionExpression(node as FunctionExpression, cbNode, cbNodes); case SyntaxKind.FunctionDeclaration: + return forEachChildOfFunctionDeclaration(node as FunctionDeclaration, cbNode, cbNodes); case SyntaxKind.ArrowFunction: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).asteriskToken) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).exclamationToken) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNodes(cbNode, cbNodes, (node).parameters) || - visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).equalsGreaterThanToken) || - visitNode(cbNode, (node).body); + return forEachChildOfArrowFunction(node as ArrowFunction, cbNode, cbNodes); case SyntaxKind.TypeReference: - return visitNode(cbNode, (node).typeName) || - visitNodes(cbNode, cbNodes, (node).typeArguments); + return forEachChildOfTypeReference(node as TypeReferenceNode, cbNode, cbNodes); case SyntaxKind.TypePredicate: - return visitNode(cbNode, (node).assertsModifier) || - visitNode(cbNode, (node).parameterName) || - visitNode(cbNode, (node).type); + return forEachChildOfTypePredicate(node as TypePredicateNode, cbNode); case SyntaxKind.TypeQuery: - return visitNode(cbNode, (node).exprName); + return forEachChildOfTypeQuery(node as TypeQueryNode, cbNode); case SyntaxKind.TypeLiteral: - return visitNodes(cbNode, cbNodes, (node).members); + return forEachChildOfTypeLiteral(node as TypeLiteralNode, cbNode, cbNodes); case SyntaxKind.ArrayType: - return visitNode(cbNode, (node).elementType); + return forEachChildOfArrayType(node as ArrayTypeNode, cbNode); case SyntaxKind.TupleType: - return visitNodes(cbNode, cbNodes, (node).elementTypes); + return forEachChildOfTupleType(node as TupleTypeNode, cbNode, cbNodes); case SyntaxKind.UnionType: case SyntaxKind.IntersectionType: - return visitNodes(cbNode, cbNodes, (node).types); + return forEachChildOfUnionOrIntersectionType(node as IntersectionTypeNode, cbNode, cbNodes); case SyntaxKind.ConditionalType: - return visitNode(cbNode, (node).checkType) || - visitNode(cbNode, (node).extendsType) || - visitNode(cbNode, (node).trueType) || - visitNode(cbNode, (node).falseType); + return forEachChildOfConditionalType(node as ConditionalTypeNode, cbNode); case SyntaxKind.InferType: - return visitNode(cbNode, (node).typeParameter); + return forEachChildOfInferType(node as InferTypeNode, cbNode); case SyntaxKind.ImportType: - return visitNode(cbNode, (node).argument) || - visitNode(cbNode, (node).qualifier) || - visitNodes(cbNode, cbNodes, (node).typeArguments); + return forEachChildOfImportType(node as ImportTypeNode, cbNode, cbNodes); case SyntaxKind.ParenthesizedType: case SyntaxKind.TypeOperator: - return visitNode(cbNode, (node).type); + return forEachChildOfParenthesizedTypeOrTypeOperator(node as TypeOperatorNode, cbNode); case SyntaxKind.IndexedAccessType: - return visitNode(cbNode, (node).objectType) || - visitNode(cbNode, (node).indexType); + return forEachChildOfIndexedAccessType(node as IndexedAccessTypeNode, cbNode); case SyntaxKind.MappedType: - return visitNode(cbNode, (node).readonlyToken) || - visitNode(cbNode, (node).typeParameter) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).type); + return forEachChildOfMappedType(node as MappedTypeNode, cbNode); case SyntaxKind.LiteralType: - return visitNode(cbNode, (node).literal); + return forEachChildOfLiteralType(node as LiteralTypeNode, cbNode); case SyntaxKind.ObjectBindingPattern: case SyntaxKind.ArrayBindingPattern: - return visitNodes(cbNode, cbNodes, (node).elements); + return forEachChildOfObjectOrArrayBindingPattern(node as ArrayBindingPattern, cbNode, cbNodes); case SyntaxKind.ArrayLiteralExpression: - return visitNodes(cbNode, cbNodes, (node).elements); + return forEachChildOfArrayLiteralExpression(node as ArrayLiteralExpression, cbNode, cbNodes); case SyntaxKind.ObjectLiteralExpression: - return visitNodes(cbNode, cbNodes, (node).properties); + return forEachChildOfObjectLiteralExpression(node as ObjectLiteralExpression, cbNode, cbNodes); case SyntaxKind.PropertyAccessExpression: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).questionDotToken) || - visitNode(cbNode, (node).name); + return forEachChildOfPropertyAccessExpression(node as PropertyAccessExpression, cbNode, cbNodes); case SyntaxKind.ElementAccessExpression: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).questionDotToken) || - visitNode(cbNode, (node).argumentExpression); + return forEachChildOfElementAccessExpression(node as ElementAccessExpression, cbNode); case SyntaxKind.CallExpression: + return forEachChildOfCallExpression(node as CallExpression, cbNode, cbNodes); case SyntaxKind.NewExpression: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).questionDotToken) || - visitNodes(cbNode, cbNodes, (node).typeArguments) || - visitNodes(cbNode, cbNodes, (node).arguments); + return forEachChildOfNewExpression(node as NewExpression, cbNode, cbNodes); case SyntaxKind.TaggedTemplateExpression: - return visitNode(cbNode, (node).tag) || - visitNode(cbNode, (node).questionDotToken) || - visitNodes(cbNode, cbNodes, (node).typeArguments) || - visitNode(cbNode, (node).template); + return forEachChildOfTaggedTemplateExpression(node as TaggedTemplateExpression, cbNode, cbNodes); case SyntaxKind.TypeAssertionExpression: - return visitNode(cbNode, (node).type) || - visitNode(cbNode, (node).expression); + return forEachChildOfTypeAssertion(node as TypeAssertion, cbNode); case SyntaxKind.ParenthesizedExpression: - return visitNode(cbNode, (node).expression); + return forEachChildOfParenthesizedExpression(node as ParenthesizedExpression, cbNode); case SyntaxKind.DeleteExpression: - return visitNode(cbNode, (node).expression); + return forEachChildOfDeleteExpression(node as DeleteExpression, cbNode); case SyntaxKind.TypeOfExpression: - return visitNode(cbNode, (node).expression); + return forEachChildOfTypeOfExpression(node as TypeOfExpression, cbNode); case SyntaxKind.VoidExpression: - return visitNode(cbNode, (node).expression); + return forEachChildOfVoidExpression(node as VoidExpression, cbNode); case SyntaxKind.PrefixUnaryExpression: - return visitNode(cbNode, (node).operand); + return forEachChildOfPrefixUnaryExpression(node as PrefixUnaryExpression, cbNode); case SyntaxKind.YieldExpression: - return visitNode(cbNode, (node).asteriskToken) || - visitNode(cbNode, (node).expression); + return forEachChildOfYieldExpression(node as YieldExpression, cbNode); case SyntaxKind.AwaitExpression: - return visitNode(cbNode, (node).expression); + return forEachChildOfAwaitExpression(node as AwaitExpression, cbNode); case SyntaxKind.PostfixUnaryExpression: - return visitNode(cbNode, (node).operand); + return forEachChildOfPostfixUnaryExpression(node as PostfixUnaryExpression, cbNode); case SyntaxKind.BinaryExpression: - return visitNode(cbNode, (node).left) || - visitNode(cbNode, (node).operatorToken) || - visitNode(cbNode, (node).right); + return forEachChildOfBinaryExpression(node as BinaryExpression, cbNode); case SyntaxKind.AsExpression: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).type); + return forEachChildOfAsExpression(node as AsExpression, cbNode); case SyntaxKind.NonNullExpression: - return visitNode(cbNode, (node).expression); + return forEachChildOfNonNullExpression(node as NonNullExpression, cbNode); case SyntaxKind.MetaProperty: - return visitNode(cbNode, (node).name); + return forEachChildOfMetaProperty(node as MetaProperty, cbNode); case SyntaxKind.ConditionalExpression: - return visitNode(cbNode, (node).condition) || - visitNode(cbNode, (node).questionToken) || - visitNode(cbNode, (node).whenTrue) || - visitNode(cbNode, (node).colonToken) || - visitNode(cbNode, (node).whenFalse); + return forEachChildOfConditionalExpression(node as ConditionalExpression, cbNode); case SyntaxKind.SpreadElement: - return visitNode(cbNode, (node).expression); + return forEachChildOfSpreadElement(node as SpreadElement, cbNode); case SyntaxKind.Block: case SyntaxKind.ModuleBlock: - return visitNodes(cbNode, cbNodes, (node).statements); + return forEachChildOfBlockOrModuleBlock(node as ModuleBlock, cbNode, cbNodes); case SyntaxKind.SourceFile: - return visitNodes(cbNode, cbNodes, (node).statements) || - visitNode(cbNode, (node).endOfFileToken); + return forEachChildOfSourceFile(node as SourceFile, cbNode, cbNodes); case SyntaxKind.VariableStatement: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).declarationList); + return forEachChildOfVariableStatement(node as VariableStatement, cbNode, cbNodes); case SyntaxKind.VariableDeclarationList: - return visitNodes(cbNode, cbNodes, (node).declarations); + return forEachChildOfVariableDeclarationList(node as VariableDeclarationList, cbNode, cbNodes); case SyntaxKind.ExpressionStatement: - return visitNode(cbNode, (node).expression); + return forEachChildOfExpressionStatement(node as ExpressionStatement, cbNode); case SyntaxKind.IfStatement: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).thenStatement) || - visitNode(cbNode, (node).elseStatement); + return forEachChildOfIfStatement(node as IfStatement, cbNode); case SyntaxKind.DoStatement: - return visitNode(cbNode, (node).statement) || - visitNode(cbNode, (node).expression); + return forEachChildOfDoStatement(node as DoStatement, cbNode); case SyntaxKind.WhileStatement: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).statement); + return forEachChildOfWhileStatement(node as WhileStatement, cbNode); case SyntaxKind.ForStatement: - return visitNode(cbNode, (node).initializer) || - visitNode(cbNode, (node).condition) || - visitNode(cbNode, (node).incrementor) || - visitNode(cbNode, (node).statement); + return forEachChildOfForStatement(node as ForStatement, cbNode); case SyntaxKind.ForInStatement: - return visitNode(cbNode, (node).initializer) || - visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).statement); + return forEachChildOfForInStatement(node as ForInStatement, cbNode); case SyntaxKind.ForOfStatement: - return visitNode(cbNode, (node).awaitModifier) || - visitNode(cbNode, (node).initializer) || - visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).statement); + return forEachChildOfForOfStatement(node as ForOfStatement, cbNode); case SyntaxKind.ContinueStatement: case SyntaxKind.BreakStatement: - return visitNode(cbNode, (node).label); + return forEachChildOfContinueOrBreakStatement(node as BreakStatement, cbNode); case SyntaxKind.ReturnStatement: - return visitNode(cbNode, (node).expression); + return forEachChildOfReturnStatement(node as ReturnStatement, cbNode); case SyntaxKind.WithStatement: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).statement); + return forEachChildOfWithStatement(node as WithStatement, cbNode); case SyntaxKind.SwitchStatement: - return visitNode(cbNode, (node).expression) || - visitNode(cbNode, (node).caseBlock); + return forEachChildOfSwitchStatement(node as SwitchStatement, cbNode); case SyntaxKind.CaseBlock: - return visitNodes(cbNode, cbNodes, (node).clauses); + return forEachChildOfCaseBlock(node as CaseBlock, cbNode, cbNodes); case SyntaxKind.CaseClause: - return visitNode(cbNode, (node).expression) || - visitNodes(cbNode, cbNodes, (node).statements); + return forEachChildOfCaseClause(node as CaseClause, cbNode, cbNodes); case SyntaxKind.DefaultClause: - return visitNodes(cbNode, cbNodes, (node).statements); + return forEachChildOfDefaultClause(node as DefaultClause, cbNode, cbNodes); case SyntaxKind.LabeledStatement: - return visitNode(cbNode, (node).label) || - visitNode(cbNode, (node).statement); + return forEachChildOfLabeledStatement(node as LabeledStatement, cbNode); case SyntaxKind.ThrowStatement: - return visitNode(cbNode, (node).expression); + return forEachChildOfThrowStatement(node as ThrowStatement, cbNode); case SyntaxKind.TryStatement: - return visitNode(cbNode, (node).tryBlock) || - visitNode(cbNode, (node).catchClause) || - visitNode(cbNode, (node).finallyBlock); + return forEachChildOfTryStatement(node as TryStatement, cbNode); case SyntaxKind.CatchClause: - return visitNode(cbNode, (node).variableDeclaration) || - visitNode(cbNode, (node).block); + return forEachChildOfCatchClause(node as CatchClause, cbNode); case SyntaxKind.Decorator: - return visitNode(cbNode, (node).expression); + return forEachChildOfDecorator(node as Decorator, cbNode); case SyntaxKind.ClassDeclaration: case SyntaxKind.ClassExpression: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNodes(cbNode, cbNodes, (node).heritageClauses) || - visitNodes(cbNode, cbNodes, (node).members); + return forEachChildOfClassDeclarationOrExpression(node as ClassExpression, cbNode, cbNodes); case SyntaxKind.InterfaceDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNodes(cbNode, cbNodes, (node).heritageClauses) || - visitNodes(cbNode, cbNodes, (node).members); + return forEachChildOfInterfaceDeclaration(node as InterfaceDeclaration, cbNode, cbNodes); case SyntaxKind.TypeAliasDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNodes(cbNode, cbNodes, (node).typeParameters) || - visitNode(cbNode, (node).type); + return forEachChildOfTypeAliasDeclaration(node as TypeAliasDeclaration, cbNode, cbNodes); case SyntaxKind.EnumDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNodes(cbNode, cbNodes, (node).members); + return forEachChildOfEnumDeclaration(node as EnumDeclaration, cbNode, cbNodes); case SyntaxKind.EnumMember: - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).initializer); + return forEachChildOfEnumMember(node as EnumMember, cbNode); case SyntaxKind.ModuleDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).body); + return forEachChildOfModuleDeclaration(node as ModuleDeclaration, cbNode, cbNodes); case SyntaxKind.ImportEqualsDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).moduleReference); + return forEachChildOfImportEqualsDeclaration(node as ImportEqualsDeclaration, cbNode, cbNodes); case SyntaxKind.ImportDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).importClause) || - visitNode(cbNode, (node).moduleSpecifier); + return forEachChildOfImportDeclaration(node as ImportDeclaration, cbNode, cbNodes); case SyntaxKind.ImportClause: - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).namedBindings); + return forEachChildOfImportClause(node as ImportClause, cbNode); case SyntaxKind.NamespaceExportDeclaration: - return visitNode(cbNode, (node).name); - + return forEachChildOfNamespaceExportDeclaration(node as NamespaceExportDeclaration, cbNode); case SyntaxKind.NamespaceImport: - return visitNode(cbNode, (node).name); + return forEachChildOfNamespaceImport(node as NamespaceImport, cbNode); case SyntaxKind.NamespaceExport: - return visitNode(cbNode, (node).name); + return forEachChildOfNamespaceExport(node as NamespaceExport, cbNode); case SyntaxKind.NamedImports: case SyntaxKind.NamedExports: - return visitNodes(cbNode, cbNodes, (node).elements); + return forEachChildOfNamedImportsOrExports(node as NamedImports | NamedExports, cbNode, cbNodes); case SyntaxKind.ExportDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).exportClause) || - visitNode(cbNode, (node).moduleSpecifier); + return forEachChildOfExportDeclaration(node as ExportDeclaration, cbNode, cbNodes); case SyntaxKind.ImportSpecifier: case SyntaxKind.ExportSpecifier: - return visitNode(cbNode, (node).propertyName) || - visitNode(cbNode, (node).name); + return forEachChildOfImportOrExportSpecifier(node as ExportSpecifier, cbNode); case SyntaxKind.ExportAssignment: - return visitNodes(cbNode, cbNodes, node.decorators) || - visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, (node).expression); + return forEachChildOfExportAssignment(node as ExportAssignment, cbNode, cbNodes); case SyntaxKind.TemplateExpression: - return visitNode(cbNode, (node).head) || visitNodes(cbNode, cbNodes, (node).templateSpans); + return forEachChildOfTemplateExpression(node as TemplateExpression, cbNode, cbNodes); case SyntaxKind.TemplateSpan: - return visitNode(cbNode, (node).expression) || visitNode(cbNode, (node).literal); + return forEachChildOfTemplateSpan(node as TemplateSpan, cbNode); case SyntaxKind.ComputedPropertyName: - return visitNode(cbNode, (node).expression); + return forEachChildOfComputedPropertyName(node as ComputedPropertyName, cbNode); case SyntaxKind.HeritageClause: - return visitNodes(cbNode, cbNodes, (node).types); + return forEachChildOfHeritageClause(node as HeritageClause, cbNode, cbNodes); case SyntaxKind.ExpressionWithTypeArguments: - return visitNode(cbNode, (node).expression) || - visitNodes(cbNode, cbNodes, (node).typeArguments); + return forEachChildOfExpressionWithTypeArguments(node as ExpressionWithTypeArguments, cbNode, cbNodes); case SyntaxKind.ExternalModuleReference: - return visitNode(cbNode, (node).expression); + return forEachChildOfExternalModuleReference(node as ExternalModuleReference, cbNode); case SyntaxKind.MissingDeclaration: - return visitNodes(cbNode, cbNodes, node.decorators); + return forEachChildOfMissingDeclaration(node as MissingDeclaration, cbNode, cbNodes); case SyntaxKind.CommaListExpression: - return visitNodes(cbNode, cbNodes, (node).elements); - + return forEachChildOfCommaListExpression(node as CommaListExpression, cbNode, cbNodes); case SyntaxKind.JsxElement: - return visitNode(cbNode, (node).openingElement) || - visitNodes(cbNode, cbNodes, (node).children) || - visitNode(cbNode, (node).closingElement); + return forEachChildOfJsxElement(node as JsxElement, cbNode, cbNodes); case SyntaxKind.JsxFragment: - return visitNode(cbNode, (node).openingFragment) || - visitNodes(cbNode, cbNodes, (node).children) || - visitNode(cbNode, (node).closingFragment); + return forEachChildOfJsxFragment(node as JsxFragment, cbNode, cbNodes); case SyntaxKind.JsxSelfClosingElement: case SyntaxKind.JsxOpeningElement: - return visitNode(cbNode, (node).tagName) || - visitNodes(cbNode, cbNodes, (node).typeArguments) || - visitNode(cbNode, (node).attributes); + return forEachChildOfJsxOpeningOrSelfClosingElement(node as JsxOpeningElement, cbNode, cbNodes); case SyntaxKind.JsxAttributes: - return visitNodes(cbNode, cbNodes, (node).properties); + return forEachChildOfJsxAttributes(node as JsxAttributes, cbNode, cbNodes); case SyntaxKind.JsxAttribute: - return visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).initializer); + return forEachChildOfJsxAttribute(node as JsxAttribute, cbNode); case SyntaxKind.JsxSpreadAttribute: - return visitNode(cbNode, (node).expression); + return forEachChildOfJsxSpreadAttribute(node as JsxSpreadAttribute, cbNode); case SyntaxKind.JsxExpression: - return visitNode(cbNode, (node as JsxExpression).dotDotDotToken) || - visitNode(cbNode, (node as JsxExpression).expression); + return forEachChildOfJsxExpression(node as JsxExpression, cbNode); case SyntaxKind.JsxClosingElement: - return visitNode(cbNode, (node).tagName); - + return forEachChildOfJsxClosingElement(node as JsxClosingElement, cbNode); case SyntaxKind.OptionalType: case SyntaxKind.RestType: case SyntaxKind.JSDocTypeExpression: @@ -423,68 +1002,47 @@ namespace ts { case SyntaxKind.JSDocNullableType: case SyntaxKind.JSDocOptionalType: case SyntaxKind.JSDocVariadicType: - return visitNode(cbNode, (node).type); + return forEachChildOfOptionalOrRestOrJSDocTypeLike(node as JSDocVariadicType, cbNode); case SyntaxKind.JSDocFunctionType: - return visitNodes(cbNode, cbNodes, (node).parameters) || - visitNode(cbNode, (node).type); + return forEachChildOfJSDocFunctionType(node as JSDocFunctionType, cbNode, cbNodes); case SyntaxKind.JSDocComment: - return visitNodes(cbNode, cbNodes, (node).tags); + return forEachChildOfJSDocComment(node as JSDoc, cbNode, cbNodes); case SyntaxKind.JSDocParameterTag: case SyntaxKind.JSDocPropertyTag: - return visitNode(cbNode, (node as JSDocTag).tagName) || - ((node as JSDocPropertyLikeTag).isNameFirst - ? visitNode(cbNode, (node).name) || - visitNode(cbNode, (node).typeExpression) - : visitNode(cbNode, (node).typeExpression) || - visitNode(cbNode, (node).name)); + return forEachChildOfJSDocPropertyOrParameterTag(node as JSDocPropertyTag, cbNode); case SyntaxKind.JSDocAuthorTag: - return visitNode(cbNode, (node as JSDocTag).tagName); + return forEachChildOfJSDocAuthorTag(node as JSDocAuthorTag, cbNode); case SyntaxKind.JSDocImplementsTag: - return visitNode(cbNode, (node as JSDocTag).tagName) || - visitNode(cbNode, (node).class); + return forEachChildOfJSDocImplementsTag(node as JSDocImplementsTag, cbNode); case SyntaxKind.JSDocAugmentsTag: - return visitNode(cbNode, (node as JSDocTag).tagName) || - visitNode(cbNode, (node).class); + return forEachChildOfJSDocAugmentsTag(node as JSDocAugmentsTag, cbNode); case SyntaxKind.JSDocTemplateTag: - return visitNode(cbNode, (node as JSDocTag).tagName) || - visitNode(cbNode, (node).constraint) || - visitNodes(cbNode, cbNodes, (node).typeParameters); + return forEachChildOfJSDocTemplateTag(node as JSDocTemplateTag, cbNode, cbNodes); case SyntaxKind.JSDocTypedefTag: - return visitNode(cbNode, (node as JSDocTag).tagName) || - ((node as JSDocTypedefTag).typeExpression && - (node as JSDocTypedefTag).typeExpression!.kind === SyntaxKind.JSDocTypeExpression - ? visitNode(cbNode, (node).typeExpression) || - visitNode(cbNode, (node).fullName) - : visitNode(cbNode, (node).fullName) || - visitNode(cbNode, (node).typeExpression)); + return forEachChildOfJSDocTypedefTag(node as JSDocTypedefTag, cbNode); case SyntaxKind.JSDocCallbackTag: - return visitNode(cbNode, (node as JSDocTag).tagName) || - visitNode(cbNode, (node as JSDocCallbackTag).fullName) || - visitNode(cbNode, (node as JSDocCallbackTag).typeExpression); + return forEachChildOfJSDocCallbackTag(node as JSDocCallbackTag, cbNode); case SyntaxKind.JSDocReturnTag: case SyntaxKind.JSDocTypeTag: case SyntaxKind.JSDocThisTag: case SyntaxKind.JSDocEnumTag: - return visitNode(cbNode, (node as JSDocTag).tagName) || - visitNode(cbNode, (node as JSDocReturnTag | JSDocTypeTag | JSDocThisTag | JSDocEnumTag).typeExpression); + return forEachChildOfJSDocReturnOrTypeOrThisOrEnumTag(node as JSDocEnumTag, cbNode); case SyntaxKind.JSDocSignature: - return forEach((node).typeParameters, cbNode) || - forEach((node).parameters, cbNode) || - visitNode(cbNode, (node).type); + return forEachChildOfJSDocSignature(node as JSDocSignature, cbNode); case SyntaxKind.JSDocTypeLiteral: - return forEach((node as JSDocTypeLiteral).jsDocPropertyTags, cbNode); + return forEachChildOfJSDocTypeLiteral(node as JSDocTypeLiteral, cbNode); case SyntaxKind.JSDocTag: case SyntaxKind.JSDocClassTag: case SyntaxKind.JSDocPublicTag: case SyntaxKind.JSDocPrivateTag: case SyntaxKind.JSDocProtectedTag: case SyntaxKind.JSDocReadonlyTag: - return visitNode(cbNode, (node as JSDocTag).tagName); + return forEachChildOfJSDocUnknownOrClassOrPublicOrPrivateOrProtectedOrReadonlyTag(node as JSDocReadonlyTag, cbNode); case SyntaxKind.PartiallyEmittedExpression: - return visitNode(cbNode, (node).expression); + return forEachChildOfPartiallyEmittedExpression(node as PartiallyEmittedExpression, cbNode); } } - + /** @internal */ /** * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index d4a1c182275..b0017e5e86b 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -5486,7 +5486,31 @@ namespace ts { } } - function Node(this: Mutable, kind: SyntaxKind, pos: number, end: number) { + interface MutableNode extends Mutable { + _seldomUsedFields?: Mutable> & { + endFlowNode?: FlowNode; + returnFlowNode?: FlowNode; + }; + }; + + function defineSeldomUsedField> }, K extends keyof NonNullable>(node: T, key: K, defaultValue?: NonNullable[K]) { + Object.defineProperty(node, key, { + enumerable: true, + configurable: true, + get(this: T & { _seldomUsedFields?: NonNullable }) { + return this._seldomUsedFields?.[key] ?? defaultValue; + }, + set(this: T & { _seldomUsedFields?: NonNullable }, value: NonNullable[K]) { + if (!this._seldomUsedFields) { + if (value === undefined) return; + this._seldomUsedFields = {} as NonNullable; + } + this._seldomUsedFields[key] = value; + }, + }) + } + + function Node(this: MutableNode, kind: SyntaxKind, pos: number, end: number) { this.pos = pos; this.end = end; this.kind = kind; @@ -5495,11 +5519,23 @@ namespace ts { this.modifierFlagsCache = ModifierFlags.None; this.transformFlags = TransformFlags.None; this.parent = undefined!; - this.original = undefined; - this.emitNode = undefined; + this.original = undefined!; + this._seldomUsedFields = undefined; } - function Token(this: Mutable, kind: SyntaxKind, pos: number, end: number) { + // Move these seldom used fields to an internal object to reduce polymorphism + defineSeldomUsedField(Node.prototype as MutableNode, "emitNode"); + defineSeldomUsedField(Node.prototype as MutableNode, "flowNode"); + defineSeldomUsedField(Node.prototype as MutableNode, "endFlowNode"); + defineSeldomUsedField(Node.prototype as MutableNode, "returnFlowNode"); + defineSeldomUsedField(Node.prototype as MutableNode, "symbol"); + defineSeldomUsedField(Node.prototype as MutableNode, "locals"); + defineSeldomUsedField(Node.prototype as MutableNode, "nextContainer"); + defineSeldomUsedField(Node.prototype as MutableNode, "localSymbol"); + defineSeldomUsedField(Node.prototype as MutableNode, "contextualType"); + defineSeldomUsedField(Node.prototype as MutableNode, "inferenceContext"); + + function Token(this: MutableNode, kind: SyntaxKind, pos: number, end: number) { this.pos = pos; this.end = end; this.kind = kind; @@ -5507,10 +5543,16 @@ namespace ts { this.flags = NodeFlags.None; this.transformFlags = TransformFlags.None; this.parent = undefined!; - this.emitNode = undefined; + this._seldomUsedFields = undefined; } - function Identifier(this: Mutable, kind: SyntaxKind, pos: number, end: number) { + // Move these seldom used fields to an internal object to reduce polymorphism + defineSeldomUsedField(Token.prototype as MutableNode, "emitNode"); + defineSeldomUsedField(Token.prototype as MutableNode, "flowNode"); + defineSeldomUsedField(Token.prototype as MutableNode, "contextualType"); + defineSeldomUsedField(Token.prototype as MutableNode, "inferenceContext"); + + function Identifier(this: MutableNode, kind: SyntaxKind, pos: number, end: number) { this.pos = pos; this.end = end; this.kind = kind; @@ -5518,11 +5560,16 @@ namespace ts { this.flags = NodeFlags.None; this.transformFlags = TransformFlags.None; this.parent = undefined!; - this.original = undefined; - this.emitNode = undefined; - this.flowNode = undefined; + this._seldomUsedFields = undefined; } + // Move these seldom used fields to an internal object to reduce polymorphism + defineSeldomUsedField(Identifier.prototype as MutableNode, "emitNode"); + defineSeldomUsedField(Identifier.prototype as MutableNode, "flowNode"); + defineSeldomUsedField(Identifier.prototype as MutableNode, "symbol"); + defineSeldomUsedField(Identifier.prototype as MutableNode, "contextualType"); + defineSeldomUsedField(Identifier.prototype as MutableNode, "inferenceContext"); + function SourceMapSource(this: SourceMapSource, fileName: string, text: string, skipTrivia?: (pos: number) => number) { this.fileName = fileName; this.text = text;