diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c9809acc781c2..c8be8ad0440cf 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7594,11 +7594,18 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return typeParameterToDeclarationWithConstraint(type, context, constraintNode); } - function symbolToParameterDeclaration(parameterSymbol: Symbol, context: NodeBuilderContext, preserveModifierFlags?: boolean, privateSymbolVisitor?: (s: Symbol) => void, bundledImports?: boolean): ParameterDeclaration { - let parameterDeclaration: ParameterDeclaration | JSDocParameterTag | undefined = getDeclarationOfKind(parameterSymbol, SyntaxKind.Parameter); - if (!parameterDeclaration && !isTransientSymbol(parameterSymbol)) { - parameterDeclaration = getDeclarationOfKind(parameterSymbol, SyntaxKind.JSDocParameterTag); + function getEffectiveParameterDeclaration(parameterSymbol: Symbol): ParameterDeclaration | JSDocParameterTag | undefined { + const parameterDeclaration: ParameterDeclaration | JSDocParameterTag | undefined = getDeclarationOfKind(parameterSymbol, SyntaxKind.Parameter); + if (parameterDeclaration) { + return parameterDeclaration; + } + if (!isTransientSymbol(parameterSymbol)) { + return getDeclarationOfKind(parameterSymbol, SyntaxKind.JSDocParameterTag); } + } + + function symbolToParameterDeclaration(parameterSymbol: Symbol, context: NodeBuilderContext, preserveModifierFlags?: boolean, privateSymbolVisitor?: (s: Symbol) => void, bundledImports?: boolean): ParameterDeclaration { + const parameterDeclaration = getEffectiveParameterDeclaration(parameterSymbol); let parameterType = getTypeOfSymbol(parameterSymbol); if (parameterDeclaration && isRequiredInitializedParameter(parameterDeclaration)) { @@ -7609,12 +7616,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { const modifiers = !(context.flags & NodeBuilderFlags.OmitParameterModifiers) && preserveModifierFlags && parameterDeclaration && canHaveModifiers(parameterDeclaration) ? map(getModifiers(parameterDeclaration), factory.cloneNode) : undefined; const isRest = parameterDeclaration && isRestParameter(parameterDeclaration) || getCheckFlags(parameterSymbol) & CheckFlags.RestParameter; const dotDotDotToken = isRest ? factory.createToken(SyntaxKind.DotDotDotToken) : undefined; - const name = parameterDeclaration ? parameterDeclaration.name ? - parameterDeclaration.name.kind === SyntaxKind.Identifier ? setEmitFlags(factory.cloneNode(parameterDeclaration.name), EmitFlags.NoAsciiEscaping) : - parameterDeclaration.name.kind === SyntaxKind.QualifiedName ? setEmitFlags(factory.cloneNode(parameterDeclaration.name.right), EmitFlags.NoAsciiEscaping) : - cloneBindingName(parameterDeclaration.name) : - symbolName(parameterSymbol) : - symbolName(parameterSymbol); + const name = parameterToParameterDeclarationName(parameterSymbol, parameterDeclaration, context); const isOptional = parameterDeclaration && isOptionalParameter(parameterDeclaration) || getCheckFlags(parameterSymbol) & CheckFlags.OptionalParameter; const questionToken = isOptional ? factory.createToken(SyntaxKind.QuestionToken) : undefined; const parameterNode = factory.createParameterDeclaration( @@ -7627,6 +7629,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { ); context.approximateLength += symbolName(parameterSymbol).length + 3; return parameterNode; + } + + function parameterToParameterDeclarationName(parameterSymbol: Symbol, parameterDeclaration: ParameterDeclaration | JSDocParameterTag | undefined, context: NodeBuilderContext) { + return parameterDeclaration ? parameterDeclaration.name ? + parameterDeclaration.name.kind === SyntaxKind.Identifier ? setEmitFlags(factory.cloneNode(parameterDeclaration.name), EmitFlags.NoAsciiEscaping) : + parameterDeclaration.name.kind === SyntaxKind.QualifiedName ? setEmitFlags(factory.cloneNode(parameterDeclaration.name.right), EmitFlags.NoAsciiEscaping) : + cloneBindingName(parameterDeclaration.name) : + symbolName(parameterSymbol) : + symbolName(parameterSymbol); function cloneBindingName(node: BindingName): BindingName { return elideInitializerAndSetEmitFlags(node) as BindingName; @@ -9779,6 +9790,23 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (p.flags & SymbolFlags.Accessor && useAccessors) { const result: AccessorDeclaration[] = []; if (p.flags & SymbolFlags.SetAccessor) { + const setter = p.declarations && forEach(p.declarations, d => { + if (d.kind === SyntaxKind.SetAccessor) { + return d as SetAccessorDeclaration; + } + if (isCallExpression(d) && isBindableObjectDefinePropertyCall(d)) { + return forEach(d.arguments[2].properties, propDecl => { + const id = getNameOfDeclaration(propDecl); + if (!!id && isIdentifier(id) && idText(id) === "set") { + return propDecl; + } + }); + } + }); + + Debug.assert(setter && isFunctionLikeDeclaration(setter)); + const paramSymbol: Symbol | undefined = getSignatureFromDeclaration(setter).parameters[0]; + result.push(setTextRange( factory.createSetAccessorDeclaration( factory.createModifiersFromModifierFlags(flag), @@ -9786,7 +9814,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { [factory.createParameterDeclaration( /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, - "arg", + paramSymbol ? parameterToParameterDeclarationName(paramSymbol, getEffectiveParameterDeclaration(paramSymbol), context) : "value", /*questionToken*/ undefined, isPrivate ? undefined : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled), )], diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.js b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.js new file mode 100644 index 0000000000000..a93409afece6f --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.js @@ -0,0 +1,26 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts] //// + +//// [foo.js] +// https://github.com/microsoft/TypeScript/issues/55391 + +export class Foo { + /** + * Bar. + * + * @param {string} baz Baz. + */ + set bar(baz) {} +} + + + + +//// [foo.d.ts] +export class Foo { + /** + * Bar. + * + * @param {string} baz Baz. + */ + set bar(baz: string); +} diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.symbols b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.symbols new file mode 100644 index 0000000000000..688aad0aba2de --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.symbols @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts] //// + +=== foo.js === +// https://github.com/microsoft/TypeScript/issues/55391 + +export class Foo { +>Foo : Symbol(Foo, Decl(foo.js, 0, 0)) + + /** + * Bar. + * + * @param {string} baz Baz. + */ + set bar(baz) {} +>bar : Symbol(Foo.bar, Decl(foo.js, 2, 18)) +>baz : Symbol(baz, Decl(foo.js, 8, 12)) +} + diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.types b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.types new file mode 100644 index 0000000000000..be39b7f5a696e --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.types @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts] //// + +=== foo.js === +// https://github.com/microsoft/TypeScript/issues/55391 + +export class Foo { +>Foo : Foo + + /** + * Bar. + * + * @param {string} baz Baz. + */ + set bar(baz) {} +>bar : string +>baz : string +} + diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.js b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.js new file mode 100644 index 0000000000000..3b5084b53fb2f --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.js @@ -0,0 +1,26 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts] //// + +//// [foo.js] +export class Foo { + /** + * Bar. + * + * @param {{ prop: string }} baz Baz. + */ + set bar({}) {} +} + + + + +//// [foo.d.ts] +export class Foo { + /** + * Bar. + * + * @param {{ prop: string }} baz Baz. + */ + set bar({}: { + prop: string; + }); +} diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.symbols b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.symbols new file mode 100644 index 0000000000000..03105d80e782c --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.symbols @@ -0,0 +1,15 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts] //// + +=== foo.js === +export class Foo { +>Foo : Symbol(Foo, Decl(foo.js, 0, 0)) + + /** + * Bar. + * + * @param {{ prop: string }} baz Baz. + */ + set bar({}) {} +>bar : Symbol(Foo.bar, Decl(foo.js, 0, 18)) +} + diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.types b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.types new file mode 100644 index 0000000000000..f362340211152 --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.types @@ -0,0 +1,15 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts] //// + +=== foo.js === +export class Foo { +>Foo : Foo + + /** + * Bar. + * + * @param {{ prop: string }} baz Baz. + */ + set bar({}) {} +>bar : { prop: string; } +} + diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.js b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.js new file mode 100644 index 0000000000000..385a7ea471123 --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.js @@ -0,0 +1,26 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts] //// + +//// [foo.js] +export class Foo { + /** + * Bar. + * + * @param {{ prop: string | undefined }} baz Baz. + */ + set bar({ prop = 'foo' }) {} +} + + + + +//// [foo.d.ts] +export class Foo { + /** + * Bar. + * + * @param {{ prop: string | undefined }} baz Baz. + */ + set bar({ prop }: { + prop: string | undefined; + }); +} diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.symbols b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.symbols new file mode 100644 index 0000000000000..7d6a53b7d6c61 --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.symbols @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts] //// + +=== foo.js === +export class Foo { +>Foo : Symbol(Foo, Decl(foo.js, 0, 0)) + + /** + * Bar. + * + * @param {{ prop: string | undefined }} baz Baz. + */ + set bar({ prop = 'foo' }) {} +>bar : Symbol(Foo.bar, Decl(foo.js, 0, 18)) +>prop : Symbol(prop, Decl(foo.js, 6, 13)) +} + diff --git a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.types b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.types new file mode 100644 index 0000000000000..641a52e3b0b63 --- /dev/null +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.types @@ -0,0 +1,17 @@ +//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts] //// + +=== foo.js === +export class Foo { +>Foo : Foo + + /** + * Bar. + * + * @param {{ prop: string | undefined }} baz Baz. + */ + set bar({ prop = 'foo' }) {} +>bar : { prop: string | undefined; } +>prop : string +>'foo' : "foo" +} + diff --git a/tests/baselines/reference/genericSetterInClassTypeJsDoc.js b/tests/baselines/reference/genericSetterInClassTypeJsDoc.js index 1d3546ab50df3..f1fe44969bf79 100644 --- a/tests/baselines/reference/genericSetterInClassTypeJsDoc.js +++ b/tests/baselines/reference/genericSetterInClassTypeJsDoc.js @@ -53,7 +53,7 @@ new Box(3).value = 3; declare class Box { /** @param {T} initialValue */ constructor(initialValue: T); - set value(arg: T); + set value(value: T); /** @type {T} */ get value(): T; #private; diff --git a/tests/baselines/reference/jsDeclarationsClasses.js b/tests/baselines/reference/jsDeclarationsClasses.js index ec208cded7d48..d2df8ba6729a1 100644 --- a/tests/baselines/reference/jsDeclarationsClasses.js +++ b/tests/baselines/reference/jsDeclarationsClasses.js @@ -487,7 +487,7 @@ export class E { /** * @param {string} _p */ - static set s1(arg: string); + static set s1(_p: string); /** * @return {string} */ @@ -499,7 +499,7 @@ export class E { /** * @param {string} _p */ - static set s3(arg: string); + static set s3(_p: string); /** * @param {T} a * @param {U} b @@ -518,7 +518,7 @@ export class E { /** * @param {U} _p */ - set f1(arg: U); + set f1(_p: U); /** * @return {U} */ @@ -530,7 +530,7 @@ export class E { /** * @param {U} _p */ - set f3(arg: U); + set f3(_p: U); } /** * @template T,U diff --git a/tests/baselines/reference/jsDeclarationsFunctionLikeClasses2.js b/tests/baselines/reference/jsDeclarationsFunctionLikeClasses2.js index 7e1a330654af8..3903dd0155c2b 100644 --- a/tests/baselines/reference/jsDeclarationsFunctionLikeClasses2.js +++ b/tests/baselines/reference/jsDeclarationsFunctionLikeClasses2.js @@ -189,12 +189,12 @@ export class Point2D { /** * @param {number} x */ - set x(arg: number); + set x(x: number); get x(): number; /** * @param {number} y */ - set y(arg: number); + set y(y: number); get y(): number; __proto__: typeof Vec; } diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.js b/tests/baselines/reference/jsDeclarationsGetterSetter.js index b281946bb0761..31941471c0399 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.js +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.js @@ -48,6 +48,19 @@ Object.defineProperty(F.prototype, "x", { */ set(_arg) {} }); + +export class G {} +Object.defineProperty(G.prototype, "x", { + /** + * @param {number[]} args + */ + set(...args) {} +}); + +export class H {} +Object.defineProperty(H.prototype, "x", { + set() {} +}); //// [index.js] @@ -96,6 +109,19 @@ Object.defineProperty(F.prototype, "x", { */ set(_arg) { } }); +export class G { +} +Object.defineProperty(G.prototype, "x", { + /** + * @param {number[]} args + */ + set(...args) { } +}); +export class H { +} +Object.defineProperty(H.prototype, "x", { + set() { } +}); //// [index.d.ts] @@ -106,19 +132,25 @@ export class B { /** * @param {number} _arg */ - set x(arg: number); + set x(_arg: number); } export class C { - set x(arg: number); + set x(_arg: number); get x(): number; } export class D { get x(): number; } export class E { - set x(arg: number); + set x(_arg: number); } export class F { - set x(arg: number); + set x(_arg: number); get x(): number; } +export class G { + set x(args: number); +} +export class H { + set x(value: any); +} diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.symbols b/tests/baselines/reference/jsDeclarationsGetterSetter.symbols index 6da563e8b5121..d0d98a8158cad 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.symbols +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.symbols @@ -103,3 +103,41 @@ Object.defineProperty(F.prototype, "x", { }); +export class G {} +>G : Symbol(G, Decl(index.js, 46, 3)) + +Object.defineProperty(G.prototype, "x", { +>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --)) +>G.prototype : Symbol(G.prototype) +>G : Symbol(G, Decl(index.js, 46, 3)) +>prototype : Symbol(G.prototype) +>"x" : Symbol(G.x, Decl(index.js, 48, 17)) + + /** + * @param {number[]} args + */ + set(...args) {} +>set : Symbol(set, Decl(index.js, 49, 41)) +>args : Symbol(args, Decl(index.js, 53, 8)) + +}); + +export class H {} +>H : Symbol(H, Decl(index.js, 54, 3)) + +Object.defineProperty(H.prototype, "x", { +>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --)) +>H.prototype : Symbol(H.prototype) +>H : Symbol(H, Decl(index.js, 54, 3)) +>prototype : Symbol(H.prototype) +>"x" : Symbol(H.x, Decl(index.js, 56, 17)) + + set() {} +>set : Symbol(set, Decl(index.js, 57, 41)) + +}); + diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.types b/tests/baselines/reference/jsDeclarationsGetterSetter.types index ec7ba37a05c4f..3b4ce59488509 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.types +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.types @@ -114,3 +114,45 @@ Object.defineProperty(F.prototype, "x", { }); +export class G {} +>G : G + +Object.defineProperty(G.prototype, "x", { +>Object.defineProperty(G.prototype, "x", { /** * @param {number[]} args */ set(...args) {}}) : G +>Object.defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>Object : ObjectConstructor +>defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>G.prototype : G +>G : typeof G +>prototype : G +>"x" : "x" +>{ /** * @param {number[]} args */ set(...args) {}} : { set(...args: number[]): void; } + + /** + * @param {number[]} args + */ + set(...args) {} +>set : (...args: number[]) => void +>args : number[] + +}); + +export class H {} +>H : H + +Object.defineProperty(H.prototype, "x", { +>Object.defineProperty(H.prototype, "x", { set() {}}) : H +>Object.defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>Object : ObjectConstructor +>defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>H.prototype : H +>H : typeof H +>prototype : H +>"x" : "x" +>{ set() {}} : { set(): void; } + + set() {} +>set : () => void + +}); + diff --git a/tests/baselines/reference/jsDeclarationsReusesExistingTypeAnnotations.js b/tests/baselines/reference/jsDeclarationsReusesExistingTypeAnnotations.js index 69f6ddaf3d6a3..bcd56a2f10fd0 100644 --- a/tests/baselines/reference/jsDeclarationsReusesExistingTypeAnnotations.js +++ b/tests/baselines/reference/jsDeclarationsReusesExistingTypeAnnotations.js @@ -211,29 +211,29 @@ declare class С2 { } declare class С3 { /** @param {string=} value */ - set p1(arg: string | undefined); + set p1(value: string | undefined); /** @type {string=} */ get p1(): string | undefined; /** @param {string | undefined} value */ - set p2(arg: string | undefined); + set p2(value: string | undefined); /** @type {string | undefined} */ get p2(): string | undefined; /** @param {?string} value */ - set p3(arg: string | null); + set p3(value: string | null); /** @type {?string} */ get p3(): string | null; /** @param {string | null} value */ - set p4(arg: string | null); + set p4(value: string | null); /** @type {string | null} */ get p4(): string | null; } declare class С4 { /** @param {string=} value */ - set p1(arg: string | undefined); + set p1(value: string | undefined); /** @param {string | undefined} value */ - set p2(arg: string | undefined); + set p2(value: string | undefined); /** @param {?string} value */ - set p3(arg: string | null); + set p3(value: string | null); /** @param {string | null} value */ - set p4(arg: string | null); + set p4(value: string | null); } diff --git a/tests/baselines/reference/jsdocAccessibilityTagsDeclarations.js b/tests/baselines/reference/jsdocAccessibilityTagsDeclarations.js index f45d936a58b2a..c24bf1a237634 100644 --- a/tests/baselines/reference/jsdocAccessibilityTagsDeclarations.js +++ b/tests/baselines/reference/jsdocAccessibilityTagsDeclarations.js @@ -86,7 +86,7 @@ declare class Protected { /** @protected */ protected m(): any; /** @protected */ - protected set p(arg: any); + protected set p(value: any); /** @protected */ protected get p(): any; } @@ -98,7 +98,7 @@ declare class Private { /** @private */ private m; /** @private */ - private set p(arg); + private set p(value); /** @private */ private get p(); } diff --git a/tests/baselines/reference/thisPropertyAssignmentInherited.js b/tests/baselines/reference/thisPropertyAssignmentInherited.js index a0c3f13a9caf8..0e069571afba4 100644 --- a/tests/baselines/reference/thisPropertyAssignmentInherited.js +++ b/tests/baselines/reference/thisPropertyAssignmentInherited.js @@ -25,7 +25,7 @@ export class TextElement extends HTMLElement { //// [thisPropertyAssignmentInherited.d.ts] export class Element { - set textContent(arg: string); + set textContent(x: string); /** * @returns {String} */ @@ -35,7 +35,7 @@ export class Element { export class HTMLElement extends Element { } export class TextElement extends HTMLElement { - set innerHTML(arg: string); + set innerHTML(html: string); get innerHTML(): string; toString(): void; } diff --git a/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts b/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts new file mode 100644 index 0000000000000..c4dda7074921a --- /dev/null +++ b/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts @@ -0,0 +1,16 @@ +// @declaration: true +// @emitDeclarationOnly: true +// @allowJs: true + +// @filename: foo.js + +// https://github.com/microsoft/TypeScript/issues/55391 + +export class Foo { + /** + * Bar. + * + * @param {string} baz Baz. + */ + set bar(baz) {} +} diff --git a/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts b/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts new file mode 100644 index 0000000000000..1faf11483e38d --- /dev/null +++ b/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts @@ -0,0 +1,14 @@ +// @declaration: true +// @emitDeclarationOnly: true +// @allowJs: true + +// @filename: foo.js + +export class Foo { + /** + * Bar. + * + * @param {{ prop: string }} baz Baz. + */ + set bar({}) {} +} diff --git a/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts b/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts new file mode 100644 index 0000000000000..e62f3908ade30 --- /dev/null +++ b/tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts @@ -0,0 +1,14 @@ +// @declaration: true +// @emitDeclarationOnly: true +// @allowJs: true + +// @filename: foo.js + +export class Foo { + /** + * Bar. + * + * @param {{ prop: string | undefined }} baz Baz. + */ + set bar({ prop = 'foo' }) {} +} diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts index 05d6769f050ab..f42dcf64573f2 100644 --- a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts @@ -51,3 +51,16 @@ Object.defineProperty(F.prototype, "x", { */ set(_arg) {} }); + +export class G {} +Object.defineProperty(G.prototype, "x", { + /** + * @param {number[]} args + */ + set(...args) {} +}); + +export class H {} +Object.defineProperty(H.prototype, "x", { + set() {} +});