diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 000861e55dd44..5812437d5c2ec 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -5992,15 +5992,25 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri } } - function shouldWriteComment(text: string, pos: number) { + function shouldWriteComment(text: string, pos: number, end?: number) { if (printerOptions.onlyPrintJsDocStyle) { - return (isJSDocLikeText(text, pos) || isPinnedComment(text, pos)); + if (!isJSDocLikeText(text, pos) && !isPinnedComment(text, pos)) { + return false; + } + // Skip @typedef and @callback comments - they're converted to type declarations + if (end !== undefined) { + const commentText = text.slice(pos, end); + if (commentText.includes("@typedef") || commentText.includes("@callback")) { + return false; + } + } + return true; } return true; } function emitLeadingComment(commentPos: number, commentEnd: number, kind: SyntaxKind, hasTrailingNewLine: boolean, rangePos: number) { - if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos)) return; + if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos, commentEnd)) return; if (!hasWrittenComment) { emitNewLineBeforeLeadingCommentOfPosition(getCurrentLineMap(), writer, rangePos, commentPos); hasWrittenComment = true; @@ -6032,7 +6042,7 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri } function emitTrailingComment(commentPos: number, commentEnd: number, _kind: SyntaxKind, hasTrailingNewLine: boolean) { - if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos)) return; + if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos, commentEnd)) return; // trailing comments are emitted at space/*trailing comment1 */space/*trailing comment2*/ if (!writer.isAtStartOfLine()) { writer.writeSpace(" "); @@ -6135,7 +6145,7 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri } function emitComment(text: string, lineMap: readonly number[], writer: EmitTextWriter, commentPos: number, commentEnd: number, newLine: string) { - if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos)) return; + if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos, commentEnd)) return; emitPos(commentPos); writeCommentRange(text, lineMap, writer, commentPos, commentEnd, newLine); emitPos(commentEnd); diff --git a/tests/baselines/reference/callbackTagNestedParameter.js b/tests/baselines/reference/callbackTagNestedParameter.js index 7bd2fbaa734d3..f826109339964 100644 --- a/tests/baselines/reference/callbackTagNestedParameter.js +++ b/tests/baselines/reference/callbackTagNestedParameter.js @@ -22,13 +22,6 @@ function eachPerson(callback) { //// [cb_nested.d.ts] -/** - * @callback WorksWithPeopleCallback - * @param {Object} person - * @param {string} person.name - * @param {number} [person.age] - * @returns {void} - */ /** * For each person, calls your callback. * @param {WorksWithPeopleCallback} callback diff --git a/tests/baselines/reference/callbackTagVariadicType.js b/tests/baselines/reference/callbackTagVariadicType.js index da31a9e954549..0ad0283d6abf4 100644 --- a/tests/baselines/reference/callbackTagVariadicType.js +++ b/tests/baselines/reference/callbackTagVariadicType.js @@ -28,11 +28,6 @@ var res = (0, exports.x)('a', 'b'); //// [callbackTagVariadicType.d.ts] -/** - * @callback Foo - * @param {...string} args - * @returns {number} - */ /** @type {Foo} */ export const x: Foo; export type Foo = (...args: string[]) => number; diff --git a/tests/baselines/reference/checkJsdocSatisfiesTag15.js b/tests/baselines/reference/checkJsdocSatisfiesTag15.js index 9bf48fb0c473b..d24bc638a3384 100644 --- a/tests/baselines/reference/checkJsdocSatisfiesTag15.js +++ b/tests/baselines/reference/checkJsdocSatisfiesTag15.js @@ -96,7 +96,6 @@ function fn7(uuid) { } /** @satisfies {(uuid: string) => void} */ export function fn7(uuid: any): void; export function fn1(uuid: string): void; -/** @typedef {Parameters} Foo */ /** @type Foo */ export const v1: Foo; /** @type Foo */ diff --git a/tests/baselines/reference/jsDeclarationEmitDoesNotRenameImport.js b/tests/baselines/reference/jsDeclarationEmitDoesNotRenameImport.js index c519ea52a7c7d..60bb4bab4279e 100644 --- a/tests/baselines/reference/jsDeclarationEmitDoesNotRenameImport.js +++ b/tests/baselines/reference/jsDeclarationEmitDoesNotRenameImport.js @@ -48,10 +48,6 @@ export default X; export type Options = { test?: typeof import("./Test.js").default | undefined; }; -/** - * @typedef {Object} Options - * @property {typeof import("./Test.js").default} [test] - */ declare class X extends Test { /** * @param {Options} options diff --git a/tests/baselines/reference/jsDeclarationsFunctionClassesCjsExportAssignment.js b/tests/baselines/reference/jsDeclarationsFunctionClassesCjsExportAssignment.js index 129d1c42d9aea..8e3bb8b6c5999 100644 --- a/tests/baselines/reference/jsDeclarationsFunctionClassesCjsExportAssignment.js +++ b/tests/baselines/reference/jsDeclarationsFunctionClassesCjsExportAssignment.js @@ -153,27 +153,6 @@ declare class Timer { } //// [context.d.ts] export = Context; -/** - * Imports - * - * @typedef {import("./timer")} Timer - * @typedef {import("./hook")} Hook - * @typedef {import("./hook").HookHandler} HookHandler - */ -/** - * Input type definition - * - * @typedef {Object} Input - * @prop {Timer} timer - * @prop {Hook} hook - */ -/** - * State type definition - * - * @typedef {Object} State - * @prop {Timer} timer - * @prop {Hook} hook - */ /** * New `Context` * @@ -182,27 +161,6 @@ export = Context; */ declare function Context(input: Input): Context; declare class Context { - /** - * Imports - * - * @typedef {import("./timer")} Timer - * @typedef {import("./hook")} Hook - * @typedef {import("./hook").HookHandler} HookHandler - */ - /** - * Input type definition - * - * @typedef {Object} Input - * @prop {Timer} timer - * @prop {Hook} hook - */ - /** - * State type definition - * - * @typedef {Object} State - * @prop {Timer} timer - * @prop {Hook} hook - */ /** * New `Context` * @@ -249,17 +207,11 @@ type State = { }; //// [hook.d.ts] export = Hook; -/** - * @typedef {(arg: import("./context")) => void} HookHandler - */ /** * @param {HookHandler} handle */ declare function Hook(handle: HookHandler): void; declare class Hook { - /** - * @typedef {(arg: import("./context")) => void} HookHandler - */ /** * @param {HookHandler} handle */ diff --git a/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespace.js b/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespace.js index f08a35dfa3a3d..b78661325603c 100644 --- a/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespace.js +++ b/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespace.js @@ -80,7 +80,6 @@ export const myTypes: { export namespace testFnTypes { type input = boolean | myTypes.typeC; } -/** @typedef {boolean|myTypes.typeC} testFnTypes.input */ /** * @function testFn * @description A test function. diff --git a/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.js b/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.js index bd27e71768a9e..47c98203fbbdd 100644 --- a/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.js +++ b/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.js @@ -77,7 +77,6 @@ export namespace myTypes { type typeC = myTypes.typeB | Function; } //// [file2.d.ts] -/** @typedef {boolean|myTypes.typeC} testFnTypes.input */ /** * @function testFn * @description A test function. diff --git a/tests/baselines/reference/jsDeclarationsImportNamespacedType.js b/tests/baselines/reference/jsDeclarationsImportNamespacedType.js index e1b892bb6cb15..65f2d270eac36 100644 --- a/tests/baselines/reference/jsDeclarationsImportNamespacedType.js +++ b/tests/baselines/reference/jsDeclarationsImportNamespacedType.js @@ -13,7 +13,6 @@ export var dummy = 1 //// [mod1.d.ts] -/** @typedef {number} Dotted.Name */ export const dummy: number; export namespace Dotted { type Name = number; diff --git a/tests/baselines/reference/jsDeclarationsImportTypeBundled.js b/tests/baselines/reference/jsDeclarationsImportTypeBundled.js index 13d62d4e18337..df4c047bbce35 100644 --- a/tests/baselines/reference/jsDeclarationsImportTypeBundled.js +++ b/tests/baselines/reference/jsDeclarationsImportTypeBundled.js @@ -31,9 +31,6 @@ module.exports = items; //// [out.d.ts] declare module "folder/mod1" { export = x; - /** - * @typedef {{x: number}} Item - */ /** * @type {Item}; */ diff --git a/tests/baselines/reference/jsDeclarationsInheritedTypes.js b/tests/baselines/reference/jsDeclarationsInheritedTypes.js index c23129f4a3ff7..66e2f0cdc6a63 100644 --- a/tests/baselines/reference/jsDeclarationsInheritedTypes.js +++ b/tests/baselines/reference/jsDeclarationsInheritedTypes.js @@ -36,14 +36,6 @@ class C3 extends C1 { //// [a.d.ts] -/** - * @typedef A - * @property {string} a - */ -/** - * @typedef B - * @property {number} b - */ declare class C1 { /** * @type {A} diff --git a/tests/baselines/reference/jsDeclarationsParameterTagReusesInputNodeInEmit1.js b/tests/baselines/reference/jsDeclarationsParameterTagReusesInputNodeInEmit1.js index 8227c8d04ee0e..b5de8b8d14232 100644 --- a/tests/baselines/reference/jsDeclarationsParameterTagReusesInputNodeInEmit1.js +++ b/tests/baselines/reference/jsDeclarationsParameterTagReusesInputNodeInEmit1.js @@ -74,11 +74,6 @@ type couldntThinkOfAny = { new (): {}; }; }; -/** @typedef {import('./base')} BaseFactory */ -/** - * @callback BaseFactoryFactory - * @param {import('./base')} factory - */ /** @enum {import('./base')} */ declare const couldntThinkOfAny: {}; /** diff --git a/tests/baselines/reference/jsDeclarationsParameterTagReusesInputNodeInEmit2.js b/tests/baselines/reference/jsDeclarationsParameterTagReusesInputNodeInEmit2.js index 3f566b066854c..1af5add7e22e3 100644 --- a/tests/baselines/reference/jsDeclarationsParameterTagReusesInputNodeInEmit2.js +++ b/tests/baselines/reference/jsDeclarationsParameterTagReusesInputNodeInEmit2.js @@ -56,7 +56,6 @@ declare namespace BaseFactory { declare class Base { } //// [file.d.ts] -/** @typedef {typeof import('./base')} BaseFactory */ /** * * @param {InstanceType} base diff --git a/tests/baselines/reference/jsDeclarationsTypeAliases.js b/tests/baselines/reference/jsDeclarationsTypeAliases.js index 16706495a77eb..7d2a9cc7e9370 100644 --- a/tests/baselines/reference/jsDeclarationsTypeAliases.js +++ b/tests/baselines/reference/jsDeclarationsTypeAliases.js @@ -122,9 +122,6 @@ export type Identity = (x: T) => T; export type SomeType = { x: string; } | number | LocalThing | ExportedThing; -/** - * @typedef {{x: string} | number | LocalThing | ExportedThing} SomeType - */ /** * @param {number} x * @returns {SomeType} diff --git a/tests/baselines/reference/jsDeclarationsTypedefAndImportTypes.js b/tests/baselines/reference/jsDeclarationsTypedefAndImportTypes.js index d1ddbafb7005f..c135df89c36db 100644 --- a/tests/baselines/reference/jsDeclarationsTypedefAndImportTypes.js +++ b/tests/baselines/reference/jsDeclarationsTypedefAndImportTypes.js @@ -68,9 +68,6 @@ module.exports = { //// [conn.d.ts] export = Conn; -/** - * @typedef {string | number} Whatever - */ declare class Conn { item: number; method(): void; @@ -81,9 +78,6 @@ declare namespace Conn { type Whatever = string | number; //// [usage.d.ts] export type Conn = import("./conn"); -/** - * @typedef {import("./conn")} Conn - */ export class Wrap { /** * @param {Conn} c diff --git a/tests/baselines/reference/jsDeclarationsTypedefFunction.js b/tests/baselines/reference/jsDeclarationsTypedefFunction.js index b6d99b242d8da..c70ebade668db 100644 --- a/tests/baselines/reference/jsDeclarationsTypedefFunction.js +++ b/tests/baselines/reference/jsDeclarationsTypedefFunction.js @@ -34,11 +34,6 @@ const send = handlers => new Promise((resolve, reject) => { //// [foo.d.ts] -/** - * @typedef {{ - * [id: string]: [Function, Function]; - * }} ResolveRejectMap - */ declare let id: number; /** * @param {ResolveRejectMap} handlers diff --git a/tests/baselines/reference/jsDeclarationsTypedefPropertyAndExportAssignment.js b/tests/baselines/reference/jsDeclarationsTypedefPropertyAndExportAssignment.js index 6e90297a1e46e..ba95ec7c80a2f 100644 --- a/tests/baselines/reference/jsDeclarationsTypedefPropertyAndExportAssignment.js +++ b/tests/baselines/reference/jsDeclarationsTypedefPropertyAndExportAssignment.js @@ -110,13 +110,6 @@ export type TaskGroup = { label: string; traceEventNames: string[]; }; -/** @typedef {'parseHTML'|'styleLayout'} TaskGroupIds */ -/** - * @typedef TaskGroup - * @property {TaskGroupIds} id - * @property {string} label - * @property {string[]} traceEventNames - */ /** * @type {{[P in TaskGroupIds]: {id: P, label: string}}} */ @@ -130,14 +123,6 @@ export const taskNameToGroup: { }; //// [index.d.ts] export = MainThreadTasks; -/** @typedef {import('./module.js').TaskGroup} TaskGroup */ -/** - * @typedef TaskNode - * @prop {TaskNode[]} children - * @prop {TaskNode|undefined} parent - * @prop {TaskGroup} group - */ -/** @typedef {{timers: Map}} PriorTaskData */ declare class MainThreadTasks { /** * @param {TaskGroup} x diff --git a/tests/baselines/reference/jsDocDeclarationEmitDoesNotUseNodeModulesPathWithoutError.js b/tests/baselines/reference/jsDocDeclarationEmitDoesNotUseNodeModulesPathWithoutError.js index e33afbfb1cec7..100f347975033 100644 --- a/tests/baselines/reference/jsDocDeclarationEmitDoesNotUseNodeModulesPathWithoutError.js +++ b/tests/baselines/reference/jsDocDeclarationEmitDoesNotUseNodeModulesPathWithoutError.js @@ -47,9 +47,6 @@ NewAjax.prototype.case6_unexpectedlyResolvesPathToNodeModules; //// [index.d.ts] -/** - * @typedef {import('@lion/ajax').LionRequestInit} LionRequestInit - */ export class NewAjax { /** * @param {LionRequestInit} [init] diff --git a/tests/baselines/reference/jsdocTemplateTagDefault.js b/tests/baselines/reference/jsdocTemplateTagDefault.js index f718ac3e56831..3cf84d8f5b5f4 100644 --- a/tests/baselines/reference/jsdocTemplateTagDefault.js +++ b/tests/baselines/reference/jsdocTemplateTagDefault.js @@ -128,29 +128,6 @@ function f3(a, b) { } //// [file.d.ts] -/** - * @template T - * @template [U=T] - ok: default can reference earlier type parameter - * @typedef {[T, U]} B - */ -/** - * @template {string | number} [T] - error: default requires an `=type` - * @typedef {[T]} C - */ -/** - * @template {string | number} [T=] - error: default requires a `type` - * @typedef {[T]} D - */ -/** - * @template {string | number} [T=string] - * @template U - error: Required type parameters cannot follow optional type parameters - * @typedef {[T, U]} E - */ -/** - * @template [T=U] - error: Type parameter defaults can only reference previously declared type parameters. - * @template [U=T] - * @typedef {[T, U]} G - */ /** * @template T * @template [U=T] - ok: default can reference earlier type parameter @@ -172,10 +149,6 @@ declare function f2(a: T, b: U): void; * @param {U} b */ declare function f3(a: T, b: U): void; -/** - * @template {string | number} [T=string] - ok: defaults are permitted - * @typedef {[T]} A - */ /** @type {A} */ declare const aDefault1: A; /** @type {A} */ declare const aDefault2: A; /** @type {A} */ declare const aString: A; diff --git a/tests/baselines/reference/linkTagEmit1.js b/tests/baselines/reference/linkTagEmit1.js index 9c847515badd2..6a72c464c8b6c 100644 --- a/tests/baselines/reference/linkTagEmit1.js +++ b/tests/baselines/reference/linkTagEmit1.js @@ -47,13 +47,6 @@ var see3 = true; //// [linkTagEmit1.d.ts] -/** @typedef {number} N */ -/** - * @typedef {Object} D1 - * @property {1} e Just link to {@link NS.R} this time - * @property {1} m Wyatt Earp loved {@link N integers} I bet. - */ -/** @typedef {number} Z @see N {@link N} */ /** * @param {number} integer {@link Z} */ diff --git a/tests/baselines/reference/recursiveTypeReferences2.js b/tests/baselines/reference/recursiveTypeReferences2.js index 3329d4df581d4..d8b79a25dcf8c 100644 --- a/tests/baselines/reference/recursiveTypeReferences2.js +++ b/tests/baselines/reference/recursiveTypeReferences2.js @@ -55,27 +55,6 @@ var p = {}; //// [bug39372.d.ts] -/** @typedef {ReadonlyArray} JsonArray */ -/** @typedef {{ readonly [key: string]: Json }} JsonRecord */ -/** @typedef {boolean | number | string | null | JsonRecord | JsonArray | readonly []} Json */ -/** - * @template T - * @typedef {{ - $A: { - [K in keyof T]?: XMLObject[] - }, - $O: { - [K in keyof T]?: { - $$?: Record - } & (T[K] extends string ? {$:string} : XMLObject) - }, - $$?: Record, - } & { - [K in keyof T]?: ( - T[K] extends string ? string - : XMLObject - ) -}} XMLObject */ /** @type {XMLObject<{foo:string}>} */ declare const p: XMLObject<{ foo: string; diff --git a/tests/baselines/reference/templateInsideCallback.js b/tests/baselines/reference/templateInsideCallback.js index fff1d3a0d96e8..6fc2a2210f32a 100644 --- a/tests/baselines/reference/templateInsideCallback.js +++ b/tests/baselines/reference/templateInsideCallback.js @@ -130,18 +130,6 @@ declare function flatMap(): any; * @returns {T[]} */ declare function flatMap(): any; -/** - * @typedef Oops - * @template T - * @property {T} a - * @property {T} b - */ -/** - * @callback Call - * @template T - * @param {T} x - * @returns {T} - */ /** * @template T * @type {Call} diff --git a/tests/baselines/reference/typeTagNoErasure.js b/tests/baselines/reference/typeTagNoErasure.js index fb3fdef2207c4..0fb32e9df6c61 100644 --- a/tests/baselines/reference/typeTagNoErasure.js +++ b/tests/baselines/reference/typeTagNoErasure.js @@ -19,7 +19,6 @@ test('hi'); // error, T=number //// [typeTagNoErasure.d.ts] -/** @template T @typedef {(data: T1) => T1} Test */ /** @type {Test} */ declare const test: Test; type Test = (data: T1) => T1;