From 79d74c1d499a489d8951ed13df68916118946459 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:32:48 -0800 Subject: [PATCH 1/8] Export isInternalDeclaration and isDeclarationStatement --- src/compiler/transformers/declarations.ts | 1 - src/compiler/utilitiesPublic.ts | 1 - tests/baselines/reference/api/tsserverlibrary.d.ts | 2 ++ tests/baselines/reference/api/typescript.d.ts | 2 ++ 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index 6f8b17aaca33e..0da108e269dd1 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -233,7 +233,6 @@ function hasInternalAnnotation(range: CommentRange, currentSourceFile: SourceFil return stringContains(comment, "@internal"); } -/** @internal */ export function isInternalDeclaration(node: Node, currentSourceFile: SourceFile) { const parseTreeNode = getParseTreeNode(node); if (parseTreeNode && parseTreeNode.kind === SyntaxKind.Parameter) { diff --git a/src/compiler/utilitiesPublic.ts b/src/compiler/utilitiesPublic.ts index 8a11f5f0f97f4..3e0a8352b0460 100644 --- a/src/compiler/utilitiesPublic.ts +++ b/src/compiler/utilitiesPublic.ts @@ -2348,7 +2348,6 @@ export function isDeclaration(node: Node): node is NamedDeclaration { return isDeclarationKind(node.kind); } -/** @internal */ export function isDeclarationStatement(node: Node): node is DeclarationStatement { return isDeclarationStatementKind(node.kind); } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 34006d63b2ea5..c5502e53c356a 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -8668,6 +8668,7 @@ declare namespace ts { function isForInitializer(node: Node): node is ForInitializer; function isModuleBody(node: Node): node is ModuleBody; function isNamedImportBindings(node: Node): node is NamedImportBindings; + function isDeclarationStatement(node: Node): node is DeclarationStatement; function isStatement(node: Node): node is Statement; function isModuleReference(node: Node): node is ModuleReference; function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression; @@ -9313,6 +9314,7 @@ declare namespace ts { * @param context A lexical environment context for the visitor. */ function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; + function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean | 0 | undefined; function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 2201712f7c4eb..917f28319549d 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4693,6 +4693,7 @@ declare namespace ts { function isForInitializer(node: Node): node is ForInitializer; function isModuleBody(node: Node): node is ModuleBody; function isNamedImportBindings(node: Node): node is NamedImportBindings; + function isDeclarationStatement(node: Node): node is DeclarationStatement; function isStatement(node: Node): node is Statement; function isModuleReference(node: Node): node is ModuleReference; function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression; @@ -5338,6 +5339,7 @@ declare namespace ts { * @param context A lexical environment context for the visitor. */ function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; + function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean | 0 | undefined; function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; From 4bd6b7659f153d737ca8ccb884eb6f54cbfab0f8 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:35:24 -0800 Subject: [PATCH 2/8] Make return value alwyas boolean --- src/compiler/transformers/declarations.ts | 2 +- tests/baselines/reference/api/tsserverlibrary.d.ts | 2 +- tests/baselines/reference/api/typescript.d.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index 0da108e269dd1..1efd57c594c0a 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -248,7 +248,7 @@ export function isInternalDeclaration(node: Node, currentSourceFile: SourceFile) getLeadingCommentRanges(text, node.pos) ) : getTrailingCommentRanges(text, skipTrivia(text, node.pos, /* stopAfterLineBreak */ false, /* stopAtComments */ true)); - return commentRanges && commentRanges.length && hasInternalAnnotation(last(commentRanges), currentSourceFile); + return some(commentRanges) && hasInternalAnnotation(last(commentRanges), currentSourceFile); } const leadingCommentRanges = parseTreeNode && getLeadingCommentRangesOfNode(parseTreeNode, currentSourceFile); return !!forEach(leadingCommentRanges, range => { diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index c5502e53c356a..60029c91f41ff 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -9314,7 +9314,7 @@ declare namespace ts { * @param context A lexical environment context for the visitor. */ function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; - function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean | 0 | undefined; + function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean; function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 917f28319549d..d555cbe73b580 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -5339,7 +5339,7 @@ declare namespace ts { * @param context A lexical environment context for the visitor. */ function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; - function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean | 0 | undefined; + function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean; function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; From 9e113c39628956c49a590752e6e5d628d95e03f2 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 22 Sep 2023 15:03:53 -0700 Subject: [PATCH 3/8] Move function to utilitiesPublic --- src/compiler/transformers/declarations.ts | 36 +----------------- src/compiler/utilitiesPublic.ts | 37 +++++++++++++++++++ tests/baselines/reference/api/typescript.d.ts | 2 +- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index df2dd5c2d3f35..f7d5f03fc58e6 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -15,7 +15,6 @@ import { canHaveModifiers, canProduceDiagnostics, ClassDeclaration, - CommentRange, compact, concatenate, ConditionalTypeNode, @@ -62,8 +61,6 @@ import { getExternalModuleImportEqualsDeclarationExpression, getExternalModuleNameFromDeclaration, getFirstConstructorWithBody, - getLeadingCommentRanges, - getLeadingCommentRangesOfNode, getLineAndCharacterOfPosition, getNameOfDeclaration, getOriginalNodeId, @@ -77,7 +74,6 @@ import { GetSymbolAccessibilityDiagnostic, getTextOfNode, getThisParameter, - getTrailingCommentRanges, hasDynamicName, hasEffectiveModifier, hasExtension, @@ -122,6 +118,7 @@ import { isImportEqualsDeclaration, isIndexSignatureDeclaration, isInterfaceDeclaration, + isInternalDeclaration, isJsonSourceFile, isLateVisibilityPaintedStatement, isLiteralImportTypeNode, @@ -153,7 +150,6 @@ import { isVarAwaitUsing, isVariableDeclaration, isVarUsing, - last, LateBoundDeclaration, LateVisibilityPaintedStatement, length, @@ -195,8 +191,6 @@ import { setOriginalNode, setParent, setTextRange, - SignatureDeclaration, - skipTrivia, some, SourceFile, startsWith, @@ -237,34 +231,6 @@ export function getDeclarationDiagnostics(host: EmitHost, resolver: EmitResolver return result.diagnostics; } -function hasInternalAnnotation(range: CommentRange, currentSourceFile: SourceFile) { - const comment = currentSourceFile.text.substring(range.pos, range.end); - return comment.includes("@internal"); -} - -export function isInternalDeclaration(node: Node, currentSourceFile: SourceFile) { - const parseTreeNode = getParseTreeNode(node); - if (parseTreeNode && parseTreeNode.kind === SyntaxKind.Parameter) { - const paramIdx = (parseTreeNode.parent as SignatureDeclaration).parameters.indexOf(parseTreeNode as ParameterDeclaration); - const previousSibling = paramIdx > 0 ? (parseTreeNode.parent as SignatureDeclaration).parameters[paramIdx - 1] : undefined; - const text = currentSourceFile.text; - const commentRanges = previousSibling - ? concatenate( - // to handle - // ... parameters, /** @internal */ - // public param: string - getTrailingCommentRanges(text, skipTrivia(text, previousSibling.end + 1, /*stopAfterLineBreak*/ false, /*stopAtComments*/ true)), - getLeadingCommentRanges(text, node.pos), - ) - : getTrailingCommentRanges(text, skipTrivia(text, node.pos, /*stopAfterLineBreak*/ false, /*stopAtComments*/ true)); - return some(commentRanges) && hasInternalAnnotation(last(commentRanges), currentSourceFile); - } - const leadingCommentRanges = parseTreeNode && getLeadingCommentRangesOfNode(parseTreeNode, currentSourceFile); - return !!forEach(leadingCommentRanges, range => { - return hasInternalAnnotation(range, currentSourceFile); - }); -} - const declarationEmitNodeBuilderFlags = NodeBuilderFlags.MultilineObjectLiterals | NodeBuilderFlags.WriteClassExpressionAsTypeLiteral | NodeBuilderFlags.UseTypeOfFunction | diff --git a/src/compiler/utilitiesPublic.ts b/src/compiler/utilitiesPublic.ts index 7e9ff971f3c18..b5652ba0265dd 100644 --- a/src/compiler/utilitiesPublic.ts +++ b/src/compiler/utilitiesPublic.ts @@ -32,8 +32,10 @@ import { ClassLikeDeclaration, ClassStaticBlockDeclaration, combinePaths, + CommentRange, compareDiagnostics, CompilerOptions, + concatenate, ConciseBody, ConstructorDeclaration, ConstructorTypeNode, @@ -62,6 +64,7 @@ import { filter, find, flatMap, + forEach, ForInitializer, ForInOrOfStatement, FunctionBody, @@ -80,6 +83,9 @@ import { getJSDocCommentsAndTags, getJSDocRoot, getJSDocTypeParameterDeclarations, + getLeadingCommentRanges, + getLeadingCommentRangesOfNode, + getTrailingCommentRanges, hasAccessorModifier, HasDecorators, hasDecorators, @@ -197,6 +203,7 @@ import { JsxTagNameExpression, KeywordSyntaxKind, LabeledStatement, + last, lastOrUndefined, LeftHandSideExpression, length, @@ -251,9 +258,11 @@ import { setUILocale, SignatureDeclaration, skipOuterExpressions, + skipTrivia, some, sortAndDeduplicate, SortedReadonlyArray, + SourceFile, Statement, StringLiteral, StringLiteralLike, @@ -2585,3 +2594,31 @@ export function isRestParameter(node: ParameterDeclaration | JSDocParameterTag): const type = isJSDocParameterTag(node) ? (node.typeExpression && node.typeExpression.type) : node.type; return (node as ParameterDeclaration).dotDotDotToken !== undefined || !!type && type.kind === SyntaxKind.JSDocVariadicType; } + +function hasInternalAnnotation(range: CommentRange, currentSourceFile: SourceFile) { + const comment = currentSourceFile.text.substring(range.pos, range.end); + return comment.includes("@internal"); +} + +export function isInternalDeclaration(node: Node, currentSourceFile: SourceFile) { + const parseTreeNode = getParseTreeNode(node); + if (parseTreeNode && parseTreeNode.kind === SyntaxKind.Parameter) { + const paramIdx = (parseTreeNode.parent as SignatureDeclaration).parameters.indexOf(parseTreeNode as ParameterDeclaration); + const previousSibling = paramIdx > 0 ? (parseTreeNode.parent as SignatureDeclaration).parameters[paramIdx - 1] : undefined; + const text = currentSourceFile.text; + const commentRanges = previousSibling + ? concatenate( + // to handle + // ... parameters, /** @internal */ + // public param: string + getTrailingCommentRanges(text, skipTrivia(text, previousSibling.end + 1, /*stopAfterLineBreak*/ false, /*stopAtComments*/ true)), + getLeadingCommentRanges(text, node.pos), + ) + : getTrailingCommentRanges(text, skipTrivia(text, node.pos, /*stopAfterLineBreak*/ false, /*stopAtComments*/ true)); + return some(commentRanges) && hasInternalAnnotation(last(commentRanges), currentSourceFile); + } + const leadingCommentRanges = parseTreeNode && getLeadingCommentRangesOfNode(parseTreeNode, currentSourceFile); + return !!forEach(leadingCommentRanges, range => { + return hasInternalAnnotation(range, currentSourceFile); + }); +} diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 45e415393cc3d..2e842ed708d5d 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -9153,6 +9153,7 @@ declare namespace ts { function isJSDocLinkLike(node: Node): node is JSDocLink | JSDocLinkCode | JSDocLinkPlain; function hasRestParameter(s: SignatureDeclaration | JSDocSignature): boolean; function isRestParameter(node: ParameterDeclaration | JSDocParameterTag): boolean; + function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean; let unchangedTextChangeRange: TextChangeRange; type ParameterPropertyDeclaration = ParameterDeclaration & { parent: ConstructorDeclaration; @@ -9801,7 +9802,6 @@ declare namespace ts { * @param context A lexical environment context for the visitor. */ function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; - function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean; function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; From 1a1dc0346c9d88f289da5fb630b27cfa326c3d78 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 22 Sep 2023 15:07:34 -0700 Subject: [PATCH 4/8] Make sourceFile optional --- src/compiler/utilitiesPublic.ts | 16 +++++++++------- tests/baselines/reference/api/typescript.d.ts | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/compiler/utilitiesPublic.ts b/src/compiler/utilitiesPublic.ts index b5652ba0265dd..334d6d32526fc 100644 --- a/src/compiler/utilitiesPublic.ts +++ b/src/compiler/utilitiesPublic.ts @@ -85,6 +85,7 @@ import { getJSDocTypeParameterDeclarations, getLeadingCommentRanges, getLeadingCommentRangesOfNode, + getSourceFileOfNode, getTrailingCommentRanges, hasAccessorModifier, HasDecorators, @@ -2595,17 +2596,18 @@ export function isRestParameter(node: ParameterDeclaration | JSDocParameterTag): return (node as ParameterDeclaration).dotDotDotToken !== undefined || !!type && type.kind === SyntaxKind.JSDocVariadicType; } -function hasInternalAnnotation(range: CommentRange, currentSourceFile: SourceFile) { - const comment = currentSourceFile.text.substring(range.pos, range.end); +function hasInternalAnnotation(range: CommentRange, sourceFile: SourceFile) { + const comment = sourceFile.text.substring(range.pos, range.end); return comment.includes("@internal"); } -export function isInternalDeclaration(node: Node, currentSourceFile: SourceFile) { +export function isInternalDeclaration(node: Node, sourceFile?: SourceFile) { + sourceFile ??= getSourceFileOfNode(node); const parseTreeNode = getParseTreeNode(node); if (parseTreeNode && parseTreeNode.kind === SyntaxKind.Parameter) { const paramIdx = (parseTreeNode.parent as SignatureDeclaration).parameters.indexOf(parseTreeNode as ParameterDeclaration); const previousSibling = paramIdx > 0 ? (parseTreeNode.parent as SignatureDeclaration).parameters[paramIdx - 1] : undefined; - const text = currentSourceFile.text; + const text = sourceFile.text; const commentRanges = previousSibling ? concatenate( // to handle @@ -2615,10 +2617,10 @@ export function isInternalDeclaration(node: Node, currentSourceFile: SourceFile) getLeadingCommentRanges(text, node.pos), ) : getTrailingCommentRanges(text, skipTrivia(text, node.pos, /*stopAfterLineBreak*/ false, /*stopAtComments*/ true)); - return some(commentRanges) && hasInternalAnnotation(last(commentRanges), currentSourceFile); + return some(commentRanges) && hasInternalAnnotation(last(commentRanges), sourceFile); } - const leadingCommentRanges = parseTreeNode && getLeadingCommentRangesOfNode(parseTreeNode, currentSourceFile); + const leadingCommentRanges = parseTreeNode && getLeadingCommentRangesOfNode(parseTreeNode, sourceFile); return !!forEach(leadingCommentRanges, range => { - return hasInternalAnnotation(range, currentSourceFile); + return hasInternalAnnotation(range, sourceFile!); }); } diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 2e842ed708d5d..d6697d07f01bf 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -9153,7 +9153,7 @@ declare namespace ts { function isJSDocLinkLike(node: Node): node is JSDocLink | JSDocLinkCode | JSDocLinkPlain; function hasRestParameter(s: SignatureDeclaration | JSDocSignature): boolean; function isRestParameter(node: ParameterDeclaration | JSDocParameterTag): boolean; - function isInternalDeclaration(node: Node, currentSourceFile: SourceFile): boolean; + function isInternalDeclaration(node: Node, sourceFile?: SourceFile): boolean; let unchangedTextChangeRange: TextChangeRange; type ParameterPropertyDeclaration = ParameterDeclaration & { parent: ConstructorDeclaration; From ef532e4f1d470d0303349e749f06bd75fcee7a06 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 27 Oct 2023 11:14:07 -0700 Subject: [PATCH 5/8] Export isPartOfTypeNode --- src/compiler/utilities.ts | 1 - tests/baselines/reference/api/typescript.d.ts | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index ac4e6cb95d575..ffe2a30e17d47 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2427,7 +2427,6 @@ export const fullTripleSlashAMDReferencePathRegEx = /^(\/\/\/\s*/; const defaultLibReferenceRegEx = /^(\/\/\/\s*/; -/** @internal */ export function isPartOfTypeNode(node: Node): boolean { if (SyntaxKind.FirstTypeNode <= node.kind && node.kind <= SyntaxKind.LastTypeNode) { return true; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index db98e1fc76449..47e4658d91b6c 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -9193,6 +9193,7 @@ declare namespace ts { parent: ConstructorDeclaration; name: Identifier; }; + function isPartOfTypeNode(node: Node): boolean; /** * This function checks multiple locations for JSDoc comments that apply to a host node. * At each location, the whole comment may apply to the node, or only a specific tag in From 924d18f9dd19dca2213c5b41f667791d0dd738f5 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 27 Oct 2023 11:16:11 -0700 Subject: [PATCH 6/8] Make context optional in visitEachChild --- src/compiler/visitorPublic.ts | 11 ++++++----- tests/baselines/reference/api/typescript.d.ts | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/compiler/visitorPublic.ts b/src/compiler/visitorPublic.ts index c5e99d170911c..3e108ff4a1725 100644 --- a/src/compiler/visitorPublic.ts +++ b/src/compiler/visitorPublic.ts @@ -90,6 +90,7 @@ import { NodeArray, NodesVisitor, NodeVisitor, + nullTransformationContext, ParameterDeclaration, ScriptTarget, setEmitFlags, @@ -580,9 +581,9 @@ export function visitCommaListElements(elements: NodeArray, visitor: * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ -export function visitEachChild(node: T, visitor: Visitor, context: TransformationContext): T; +export function visitEachChild(node: T, visitor: Visitor, context?: TransformationContext): T; /** @internal */ -export function visitEachChild(node: T, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T; // eslint-disable-line @typescript-eslint/unified-signatures +export function visitEachChild(node: T, visitor: Visitor, context?: TransformationContext, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T; // eslint-disable-line @typescript-eslint/unified-signatures /** * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. * @@ -590,10 +591,10 @@ export function visitEachChild(node: T, visitor: Visitor, contex * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ -export function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; +export function visitEachChild(node: T | undefined, visitor: Visitor, context?: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; /** @internal */ -export function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T | undefined; -export function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor = visitNodes, tokenVisitor?: Visitor, nodeVisitor: NodeVisitor = visitNode): T | undefined { +export function visitEachChild(node: T | undefined, visitor: Visitor, context?: TransformationContext, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T | undefined; +export function visitEachChild(node: T | undefined, visitor: Visitor, context = nullTransformationContext, nodesVisitor = visitNodes, tokenVisitor?: Visitor, nodeVisitor: NodeVisitor = visitNode): T | undefined { if (node === undefined) { return undefined; } diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 47e4658d91b6c..9d1d51027ae30 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -9832,7 +9832,7 @@ declare namespace ts { * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ - function visitEachChild(node: T, visitor: Visitor, context: TransformationContext): T; + function visitEachChild(node: T, visitor: Visitor, context?: TransformationContext): T; /** * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. * @@ -9840,7 +9840,7 @@ declare namespace ts { * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ - function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; + function visitEachChild(node: T | undefined, visitor: Visitor, context?: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; From eedbc5299e4e0ab5700b0f2c92cee9891dd1d976 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 27 Oct 2023 11:20:13 -0700 Subject: [PATCH 7/8] Remove use of nullTransformationContext --- src/compiler/checker.ts | 9 ++++----- src/compiler/transformers/es2015.ts | 9 ++++----- src/services/codefixes/annotateWithTypeFromJSDoc.ts | 3 +-- src/services/codefixes/helpers.ts | 3 +-- src/services/refactors/extractSymbol.ts | 5 ++--- src/services/utilities.ts | 3 +-- 6 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 186a63471e011..f5ea12e00f6f3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -869,7 +869,6 @@ import { NonNullExpression, not, noTruncationMaximumTruncationLength, - nullTransformationContext, NumberLiteralType, NumericLiteral, objectAllocator, @@ -2350,7 +2349,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function markAsSynthetic(node: T): VisitResult { setTextRangePosEnd(node, -1, -1); - return visitEachChild(node, markAsSynthetic, nullTransformationContext); + return visitEachChild(node, markAsSynthetic); } function getEmitResolver(sourceFile: SourceFile, cancellationToken: CancellationToken) { @@ -6970,7 +6969,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (!nodeIsSynthesized(node) && getParseTreeNode(node) === node) { return node; } - return setTextRange(factory.cloneNode(visitEachChild(node, deepCloneOrReuseNode, nullTransformationContext, deepCloneOrReuseNodes)), node); + return setTextRange(factory.cloneNode(visitEachChild(node, deepCloneOrReuseNode, /*context*/ undefined, deepCloneOrReuseNodes)), node); } function deepCloneOrReuseNodes( @@ -7732,7 +7731,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (context.tracker.canTrackSymbol && isComputedPropertyName(node) && isLateBindableName(node)) { trackComputedName(node.expression, context.enclosingDeclaration, context); } - let visited = visitEachChild(node, elideInitializerAndSetEmitFlags, nullTransformationContext, /*nodesVisitor*/ undefined, elideInitializerAndSetEmitFlags)!; + let visited = visitEachChild(node, elideInitializerAndSetEmitFlags, /*context*/ undefined, /*nodesVisitor*/ undefined, elideInitializerAndSetEmitFlags)!; if (isBindingElement(visited)) { visited = factory.updateBindingElement( visited, @@ -8569,7 +8568,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { setEmitFlags(node, EmitFlags.SingleLine); } - return visitEachChild(node, visitExistingNodeTreeSymbols, nullTransformationContext); + return visitEachChild(node, visitExistingNodeTreeSymbols, /*context*/ undefined); function getEffectiveDotDotDotForParameter(p: ParameterDeclaration) { return p.dotDotDotToken || (p.type && isJSDocVariadicType(p.type) ? factory.createToken(SyntaxKind.DotDotDotToken) : undefined); diff --git a/src/compiler/transformers/es2015.ts b/src/compiler/transformers/es2015.ts index e715a2dd815e4..b1bbb208949e1 100644 --- a/src/compiler/transformers/es2015.ts +++ b/src/compiler/transformers/es2015.ts @@ -156,7 +156,6 @@ import { NodeCheckFlags, NodeFlags, nodeIsSynthesized, - nullTransformationContext, NumericLiteral, ObjectLiteralElementLike, ObjectLiteralExpression, @@ -1642,12 +1641,12 @@ export function transformES2015(context: TransformationContext): (x: SourceFile case SyntaxKind.PropertyDeclaration: { const named = node as AccessorDeclaration | MethodDeclaration | PropertyDeclaration; if (isComputedPropertyName(named.name)) { - return factory.replacePropertyName(named, visitEachChild(named.name, elideUnusedThisCaptureWorker, nullTransformationContext)); + return factory.replacePropertyName(named, visitEachChild(named.name, elideUnusedThisCaptureWorker)); } return node; } } - return visitEachChild(node, elideUnusedThisCaptureWorker, nullTransformationContext); + return visitEachChild(node, elideUnusedThisCaptureWorker); } /** @@ -1728,12 +1727,12 @@ export function transformES2015(context: TransformationContext): (x: SourceFile case SyntaxKind.PropertyDeclaration: { const named = node as AccessorDeclaration | MethodDeclaration | PropertyDeclaration; if (isComputedPropertyName(named.name)) { - return factory.replacePropertyName(named, visitEachChild(named.name, injectSuperPresenceCheckWorker, nullTransformationContext)); + return factory.replacePropertyName(named, visitEachChild(named.name, injectSuperPresenceCheckWorker)); } return node; } } - return visitEachChild(node, injectSuperPresenceCheckWorker, nullTransformationContext); + return visitEachChild(node, injectSuperPresenceCheckWorker); } /** diff --git a/src/services/codefixes/annotateWithTypeFromJSDoc.ts b/src/services/codefixes/annotateWithTypeFromJSDoc.ts index f989025b5cc4c..a604e4e373fcf 100644 --- a/src/services/codefixes/annotateWithTypeFromJSDoc.ts +++ b/src/services/codefixes/annotateWithTypeFromJSDoc.ts @@ -27,7 +27,6 @@ import { last, map, Node, - nullTransformationContext, ParameterDeclaration, PropertyDeclaration, PropertySignature, @@ -144,7 +143,7 @@ function transformJSDocType(node: Node): Node { case SyntaxKind.JSDocTypeLiteral: return transformJSDocTypeLiteral(node as JSDocTypeLiteral); default: - const visited = visitEachChild(node, transformJSDocType, nullTransformationContext); + const visited = visitEachChild(node, transformJSDocType); setEmitFlags(visited, EmitFlags.SingleLine); return visited; } diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 804e87040f48b..6a5598242f5f8 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -70,7 +70,6 @@ import { NodeArray, NodeBuilderFlags, NodeFlags, - nullTransformationContext, ObjectFlags, ObjectLiteralExpression, ObjectType, @@ -913,7 +912,7 @@ export function tryGetAutoImportableReferenceFromTypeNode(importTypeNode: TypeNo const typeArguments = visitNodes(node.typeArguments, visit, isTypeNode); return factory.createTypeReferenceNode(qualifier, typeArguments); } - return visitEachChild(node, visit, nullTransformationContext); + return visitEachChild(node, visit); } } diff --git a/src/services/refactors/extractSymbol.ts b/src/services/refactors/extractSymbol.ts index f25098e2c060a..e5763fcd63743 100644 --- a/src/services/refactors/extractSymbol.ts +++ b/src/services/refactors/extractSymbol.ts @@ -120,7 +120,6 @@ import { Node, NodeBuilderFlags, NodeFlags, - nullTransformationContext, ObjectLiteralElementLike, ParameterDeclaration, positionIsSynthesized, @@ -1648,7 +1647,7 @@ function transformFunctionBody(body: Node, exposedVariableDeclarations: readonly const oldIgnoreReturns = ignoreReturns; ignoreReturns = ignoreReturns || isFunctionLikeDeclaration(node) || isClassLike(node); const substitution = substitutions.get(getNodeId(node).toString()); - const result = substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor, nullTransformationContext); + const result = substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor); ignoreReturns = oldIgnoreReturns; return result; } @@ -1662,7 +1661,7 @@ function transformConstantInitializer(initializer: Expression, substitutions: Re function visitor(node: Node): VisitResult { const substitution = substitutions.get(getNodeId(node).toString()); - return substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor, nullTransformationContext); + return substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor); } } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index b14d16bd671c2..5bfcb00742559 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -291,7 +291,6 @@ import { normalizePath, NoSubstitutionTemplateLiteral, notImplemented, - nullTransformationContext, NumericLiteral, or, OrganizeImports, @@ -3162,7 +3161,7 @@ function getSynthesizedDeepCloneWorker(node: T, replaceNode?: (n const nodesClone: (ns: NodeArray | undefined) => NodeArray | undefined = replaceNode ? ns => ns && getSynthesizedDeepClonesWithReplacements(ns, /*includeTrivia*/ true, replaceNode) : ns => ns && getSynthesizedDeepClones(ns); - const visited = visitEachChild(node, nodeClone, nullTransformationContext, nodesClone, nodeClone); + const visited = visitEachChild(node, nodeClone, /*context*/ undefined, nodesClone, nodeClone); if (visited === node) { // This only happens for leaf nodes - internal nodes always see their children change. From 5d2940444ad18da60fbde2010807cae218f0a4fc Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:31:38 -0700 Subject: [PATCH 8/8] Make context required --- src/compiler/checker.ts | 2 +- src/compiler/transformers/es2015.ts | 8 ++++---- src/compiler/visitorPublic.ts | 8 ++++---- src/services/codefixes/annotateWithTypeFromJSDoc.ts | 2 +- src/services/codefixes/helpers.ts | 2 +- src/services/refactors/extractSymbol.ts | 4 ++-- tests/baselines/reference/api/typescript.d.ts | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index aca1b6de070c9..ebf7b2e9dfec3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2349,7 +2349,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function markAsSynthetic(node: T): VisitResult { setTextRangePosEnd(node, -1, -1); - return visitEachChild(node, markAsSynthetic); + return visitEachChild(node, markAsSynthetic, /*context*/ undefined); } function getEmitResolver(sourceFile: SourceFile, cancellationToken: CancellationToken) { diff --git a/src/compiler/transformers/es2015.ts b/src/compiler/transformers/es2015.ts index b1bbb208949e1..f8849b8cb23f7 100644 --- a/src/compiler/transformers/es2015.ts +++ b/src/compiler/transformers/es2015.ts @@ -1641,12 +1641,12 @@ export function transformES2015(context: TransformationContext): (x: SourceFile case SyntaxKind.PropertyDeclaration: { const named = node as AccessorDeclaration | MethodDeclaration | PropertyDeclaration; if (isComputedPropertyName(named.name)) { - return factory.replacePropertyName(named, visitEachChild(named.name, elideUnusedThisCaptureWorker)); + return factory.replacePropertyName(named, visitEachChild(named.name, elideUnusedThisCaptureWorker, /*context*/ undefined)); } return node; } } - return visitEachChild(node, elideUnusedThisCaptureWorker); + return visitEachChild(node, elideUnusedThisCaptureWorker, /*context*/ undefined); } /** @@ -1727,12 +1727,12 @@ export function transformES2015(context: TransformationContext): (x: SourceFile case SyntaxKind.PropertyDeclaration: { const named = node as AccessorDeclaration | MethodDeclaration | PropertyDeclaration; if (isComputedPropertyName(named.name)) { - return factory.replacePropertyName(named, visitEachChild(named.name, injectSuperPresenceCheckWorker)); + return factory.replacePropertyName(named, visitEachChild(named.name, injectSuperPresenceCheckWorker, /*context*/ undefined)); } return node; } } - return visitEachChild(node, injectSuperPresenceCheckWorker); + return visitEachChild(node, injectSuperPresenceCheckWorker, /*context*/ undefined); } /** diff --git a/src/compiler/visitorPublic.ts b/src/compiler/visitorPublic.ts index 3e108ff4a1725..0a4c746c2e7c6 100644 --- a/src/compiler/visitorPublic.ts +++ b/src/compiler/visitorPublic.ts @@ -581,9 +581,9 @@ export function visitCommaListElements(elements: NodeArray, visitor: * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ -export function visitEachChild(node: T, visitor: Visitor, context?: TransformationContext): T; +export function visitEachChild(node: T, visitor: Visitor, context: TransformationContext | undefined): T; /** @internal */ -export function visitEachChild(node: T, visitor: Visitor, context?: TransformationContext, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T; // eslint-disable-line @typescript-eslint/unified-signatures +export function visitEachChild(node: T, visitor: Visitor, context: TransformationContext | undefined, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T; // eslint-disable-line @typescript-eslint/unified-signatures /** * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. * @@ -591,9 +591,9 @@ export function visitEachChild(node: T, visitor: Visitor, contex * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ -export function visitEachChild(node: T | undefined, visitor: Visitor, context?: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; +export function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext | undefined, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; /** @internal */ -export function visitEachChild(node: T | undefined, visitor: Visitor, context?: TransformationContext, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T | undefined; +export function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext | undefined, nodesVisitor?: NodesVisitor, tokenVisitor?: Visitor, nodeVisitor?: NodeVisitor): T | undefined; export function visitEachChild(node: T | undefined, visitor: Visitor, context = nullTransformationContext, nodesVisitor = visitNodes, tokenVisitor?: Visitor, nodeVisitor: NodeVisitor = visitNode): T | undefined { if (node === undefined) { return undefined; diff --git a/src/services/codefixes/annotateWithTypeFromJSDoc.ts b/src/services/codefixes/annotateWithTypeFromJSDoc.ts index a604e4e373fcf..a73a19abffe60 100644 --- a/src/services/codefixes/annotateWithTypeFromJSDoc.ts +++ b/src/services/codefixes/annotateWithTypeFromJSDoc.ts @@ -143,7 +143,7 @@ function transformJSDocType(node: Node): Node { case SyntaxKind.JSDocTypeLiteral: return transformJSDocTypeLiteral(node as JSDocTypeLiteral); default: - const visited = visitEachChild(node, transformJSDocType); + const visited = visitEachChild(node, transformJSDocType, /*context*/ undefined); setEmitFlags(visited, EmitFlags.SingleLine); return visited; } diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 6a5598242f5f8..5e6dd79755636 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -912,7 +912,7 @@ export function tryGetAutoImportableReferenceFromTypeNode(importTypeNode: TypeNo const typeArguments = visitNodes(node.typeArguments, visit, isTypeNode); return factory.createTypeReferenceNode(qualifier, typeArguments); } - return visitEachChild(node, visit); + return visitEachChild(node, visit, /*context*/ undefined); } } diff --git a/src/services/refactors/extractSymbol.ts b/src/services/refactors/extractSymbol.ts index e5763fcd63743..e55e4e37f7af5 100644 --- a/src/services/refactors/extractSymbol.ts +++ b/src/services/refactors/extractSymbol.ts @@ -1647,7 +1647,7 @@ function transformFunctionBody(body: Node, exposedVariableDeclarations: readonly const oldIgnoreReturns = ignoreReturns; ignoreReturns = ignoreReturns || isFunctionLikeDeclaration(node) || isClassLike(node); const substitution = substitutions.get(getNodeId(node).toString()); - const result = substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor); + const result = substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor, /*context*/ undefined); ignoreReturns = oldIgnoreReturns; return result; } @@ -1661,7 +1661,7 @@ function transformConstantInitializer(initializer: Expression, substitutions: Re function visitor(node: Node): VisitResult { const substitution = substitutions.get(getNodeId(node).toString()); - return substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor); + return substitution ? getSynthesizedDeepClone(substitution) : visitEachChild(node, visitor, /*context*/ undefined); } } diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index c5751a468b1a3..e98dd3d831f95 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -9832,7 +9832,7 @@ declare namespace ts { * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ - function visitEachChild(node: T, visitor: Visitor, context?: TransformationContext): T; + function visitEachChild(node: T, visitor: Visitor, context: TransformationContext | undefined): T; /** * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. * @@ -9840,7 +9840,7 @@ declare namespace ts { * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ - function visitEachChild(node: T | undefined, visitor: Visitor, context?: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; + function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext | undefined, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer;