From 9e9f03b6b62c494f1a2248ffe0129c7ee9f8766c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 16 Aug 2023 12:07:25 +0200 Subject: [PATCH 01/11] Fixed serialization of param names in setters from JS files --- src/compiler/checker.ts | 2 +- ...rationEmitClassSetAccessorParamNameInJs.js | 26 +++++++++++++++++++ ...nEmitClassSetAccessorParamNameInJs.symbols | 18 +++++++++++++ ...ionEmitClassSetAccessorParamNameInJs.types | 18 +++++++++++++ ...rationEmitClassSetAccessorParamNameInJs.ts | 16 ++++++++++++ 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.js create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.symbols create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.types create mode 100644 tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 918da100936a7..3e0a7d854b2ac 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9601,7 +9601,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { [factory.createParameterDeclaration( /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, - "arg", + unescapeLeadingUnderscores(p.escapedName), /*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..28430d3a37d3c --- /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(bar: 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/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) {} +} From dbbe67f07b762d6986cf6ff796f0345ecc3c48c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 16 Aug 2023 12:54:22 +0200 Subject: [PATCH 02/11] actually fix it this time --- src/compiler/checker.ts | 5 ++++- ...clarationEmitClassSetAccessorParamNameInJs.js | 2 +- .../reference/genericSetterInClassTypeJsDoc.js | 2 +- .../baselines/reference/jsDeclarationsClasses.js | 8 ++++---- .../jsDeclarationsFunctionLikeClasses2.js | 4 ++-- .../reference/jsDeclarationsGetterSetter.js | 8 ++++---- ...sDeclarationsReusesExistingTypeAnnotations.js | 16 ++++++++-------- .../jsdocAccessibilityTagsDeclarations.js | 4 ++-- .../reference/thisPropertyAssignmentInherited.js | 4 ++-- 9 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3e0a7d854b2ac..9271939daec4c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9595,13 +9595,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (p.flags & SymbolFlags.Accessor && useAccessors) { const result: AccessorDeclaration[] = []; if (p.flags & SymbolFlags.SetAccessor) { + const setter = getDeclarationOfKind(p, SyntaxKind.SetAccessor)!; + const setterSignature = getSignatureFromDeclaration(setter); + const paramName = getParameterNameAtPosition(setterSignature, 0); result.push(setTextRange(factory.createSetAccessorDeclaration( factory.createModifiersFromModifierFlags(flag), name, [factory.createParameterDeclaration( /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, - unescapeLeadingUnderscores(p.escapedName), + unescapeLeadingUnderscores(paramName), /*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 index 28430d3a37d3c..a93409afece6f 100644 --- a/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.js +++ b/tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs.js @@ -22,5 +22,5 @@ export class Foo { * * @param {string} baz Baz. */ - set bar(bar: string); + set bar(baz: string); } 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..e0d2fc16052db 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.js +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.js @@ -106,19 +106,19 @@ export class B { /** * @param {number} _arg */ - set x(arg: number); + set x(x: number); } export class C { - set x(arg: number); + set x(x: number); get x(): number; } export class D { get x(): number; } export class E { - set x(arg: number); + set x(x: number); } export class F { - set x(arg: number); + set x(x: number); get x(): number; } 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; } From e603c7db8db979fd38d701b2335fa7369927b972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 16 Aug 2023 13:11:07 +0200 Subject: [PATCH 03/11] preserve binding pattern style --- src/compiler/checker.ts | 3 +-- ...ationEmitClassSetAccessorParamNameInJs2.js | 26 +++++++++++++++++++ ...EmitClassSetAccessorParamNameInJs2.symbols | 15 +++++++++++ ...onEmitClassSetAccessorParamNameInJs2.types | 15 +++++++++++ ...ationEmitClassSetAccessorParamNameInJs2.ts | 14 ++++++++++ 5 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.js create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.symbols create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs2.types create mode 100644 tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9271939daec4c..48db883b541a9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9597,14 +9597,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (p.flags & SymbolFlags.SetAccessor) { const setter = getDeclarationOfKind(p, SyntaxKind.SetAccessor)!; const setterSignature = getSignatureFromDeclaration(setter); - const paramName = getParameterNameAtPosition(setterSignature, 0); result.push(setTextRange(factory.createSetAccessorDeclaration( factory.createModifiersFromModifierFlags(flag), name, [factory.createParameterDeclaration( /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, - unescapeLeadingUnderscores(paramName), + (setterSignature.parameters[0].valueDeclaration as BindingName | undefined) || "arg", /*questionToken*/ undefined, isPrivate ? undefined : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled) )], 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/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({}) {} +} From 30a3f56283c2b901a8a8f8e073bb27c28e7ebd3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 16 Aug 2023 13:28:14 +0200 Subject: [PATCH 04/11] fixed setters from Object.defineProperty calls --- src/compiler/checker.ts | 12 +++++++++--- .../reference/jsDeclarationsGetterSetter.js | 8 ++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 48db883b541a9..c50a319bf3eab 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9595,15 +9595,21 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (p.flags & SymbolFlags.Accessor && useAccessors) { const result: AccessorDeclaration[] = []; if (p.flags & SymbolFlags.SetAccessor) { - const setter = getDeclarationOfKind(p, SyntaxKind.SetAccessor)!; - const setterSignature = getSignatureFromDeclaration(setter); + const setter = p.declarations?.find((d): d is SignatureDeclaration => { + if (d.kind === SyntaxKind.SetAccessor) { + return true; + } + const id = getNameOfDeclaration(d); + return !!id && isIdentifier(id) && idText(id) === "set"; + }); + const setterSignature = setter && getSignatureFromDeclaration(setter); result.push(setTextRange(factory.createSetAccessorDeclaration( factory.createModifiersFromModifierFlags(flag), name, [factory.createParameterDeclaration( /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, - (setterSignature.parameters[0].valueDeclaration as BindingName | undefined) || "arg", + (setterSignature?.parameters[0].valueDeclaration as BindingName | undefined) || "arg", /*questionToken*/ undefined, isPrivate ? undefined : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled) )], diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.js b/tests/baselines/reference/jsDeclarationsGetterSetter.js index e0d2fc16052db..318e8c35ad74c 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.js +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.js @@ -106,19 +106,19 @@ export class B { /** * @param {number} _arg */ - set x(x: number); + set x(_arg: number); } export class C { - set x(x: number); + set x(_arg: number); get x(): number; } export class D { get x(): number; } export class E { - set x(x: number); + set x(arg: number); } export class F { - set x(x: number); + set x(arg: number); get x(): number; } From 68368f4d5713f2992569a3a7de8625d64b160be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Thu, 17 Aug 2023 00:39:37 +0200 Subject: [PATCH 05/11] fixed a case with binding patterns with initializers --- src/compiler/checker.ts | 4 +-- ...ationEmitClassSetAccessorParamNameInJs3.js | 26 +++++++++++++++++++ ...EmitClassSetAccessorParamNameInJs3.symbols | 16 ++++++++++++ ...onEmitClassSetAccessorParamNameInJs3.types | 17 ++++++++++++ ...ationEmitClassSetAccessorParamNameInJs3.ts | 14 ++++++++++ 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.js create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.symbols create mode 100644 tests/baselines/reference/declarationEmitClassSetAccessorParamNameInJs3.types create mode 100644 tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8f7cc1cb05a2d..b556bb2d8d7f9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9786,7 +9786,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { const id = getNameOfDeclaration(d); return !!id && isIdentifier(id) && idText(id) === "set"; }); - const setterSignature = setter && getSignatureFromDeclaration(setter); + const paramSymbol = setter && getSignatureFromDeclaration(setter)?.parameters[0]; result.push(setTextRange( factory.createSetAccessorDeclaration( factory.createModifiersFromModifierFlags(flag), @@ -9794,7 +9794,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { [factory.createParameterDeclaration( /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, - (setterSignature?.parameters[0].valueDeclaration as BindingName | undefined) || "arg", + paramSymbol ? symbolToParameterDeclaration(paramSymbol, context).name : "arg", /*questionToken*/ undefined, isPrivate ? undefined : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled), )], 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/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' }) {} +} From 18fb528a3502c7ff0cbd7a93f08c0345747eb02b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 18 Aug 2023 00:24:44 +0200 Subject: [PATCH 06/11] Fixed issue with bindable object define property call --- src/compiler/checker.ts | 31 ++++++++++++++----- .../reference/jsDeclarationsGetterSetter.js | 4 +-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b556bb2d8d7f9..ebc4d9ac779d2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9779,14 +9779,31 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (p.flags & SymbolFlags.Accessor && useAccessors) { const result: AccessorDeclaration[] = []; if (p.flags & SymbolFlags.SetAccessor) { - const setter = p.declarations?.find((d): d is SignatureDeclaration => { - if (d.kind === SyntaxKind.SetAccessor) { - return true; + let setter: Declaration | undefined; + + if (p.declarations) { + for (const d of p.declarations) { + if (d.kind === SyntaxKind.SetAccessor) { + setter = d; + break; + } + if (isCallExpression(d) && isBindableObjectDefinePropertyCall(d)) { + const found = d.arguments[2].properties.find(p => { + const id = getNameOfDeclaration(p); + return !!id && isIdentifier(id) && idText(id) === "set"; + }); + if (found) { + setter = found; + break; + } + continue; + } } - const id = getNameOfDeclaration(d); - return !!id && isIdentifier(id) && idText(id) === "set"; - }); - const paramSymbol = setter && getSignatureFromDeclaration(setter)?.parameters[0]; + } + + Debug.assert(setter && isFunctionLikeDeclaration(setter)); + const paramSymbol = getSignatureFromDeclaration(setter).parameters[0]; + result.push(setTextRange( factory.createSetAccessorDeclaration( factory.createModifiersFromModifierFlags(flag), diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.js b/tests/baselines/reference/jsDeclarationsGetterSetter.js index 318e8c35ad74c..a582dca3a95cb 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.js +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.js @@ -116,9 +116,9 @@ 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; } From 13ef02169279410b6f8bd04b781069756a3cb9f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 18 Aug 2023 00:26:11 +0200 Subject: [PATCH 07/11] Reuse `symbolToParameterDeclaration` even more --- src/compiler/checker.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ebc4d9ac779d2..1f77bf9a25d38 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9808,13 +9808,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { factory.createSetAccessorDeclaration( factory.createModifiersFromModifierFlags(flag), name, - [factory.createParameterDeclaration( - /*modifiers*/ undefined, - /*dotDotDotToken*/ undefined, - paramSymbol ? symbolToParameterDeclaration(paramSymbol, context).name : "arg", - /*questionToken*/ undefined, - isPrivate ? undefined : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled), - )], + [symbolToParameterDeclaration(paramSymbol, context)], /*body*/ undefined, ), p.declarations?.find(isSetAccessor) || firstPropertyLikeDecl, From 05cc0897d54ba0cae362881178dfa7d50ddb004b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 18 Aug 2023 00:47:11 +0200 Subject: [PATCH 08/11] Use almighty forEach --- src/compiler/checker.ts | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1f77bf9a25d38..c5d3211cce21d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9779,27 +9779,19 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (p.flags & SymbolFlags.Accessor && useAccessors) { const result: AccessorDeclaration[] = []; if (p.flags & SymbolFlags.SetAccessor) { - let setter: Declaration | undefined; - - if (p.declarations) { - for (const d of p.declarations) { - if (d.kind === SyntaxKind.SetAccessor) { - setter = d; - break; - } - if (isCallExpression(d) && isBindableObjectDefinePropertyCall(d)) { - const found = d.arguments[2].properties.find(p => { - const id = getNameOfDeclaration(p); - return !!id && isIdentifier(id) && idText(id) === "set"; - }); - if (found) { - setter = found; - break; + 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; } - continue; - } + }); } - } + }); Debug.assert(setter && isFunctionLikeDeclaration(setter)); const paramSymbol = getSignatureFromDeclaration(setter).parameters[0]; From 9509273ed2ba248c601c3559f56e8ba7a56e1c37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 18 Aug 2023 11:55:58 +0200 Subject: [PATCH 09/11] Reuse only the bits of the existing helper --- src/compiler/checker.ts | 69 ++++++++++++------- .../reference/jsDeclarationsGetterSetter.js | 19 +++++ .../jsDeclarationsGetterSetter.symbols | 21 ++++++ .../jsDeclarationsGetterSetter.types | 23 +++++++ .../jsDeclarationsGetterSetter.ts | 8 +++ 5 files changed, 114 insertions(+), 26 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c5d3211cce21d..d742e6c6c57da 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7594,39 +7594,23 @@ 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; } - - let parameterType = getTypeOfSymbol(parameterSymbol); - if (parameterDeclaration && isRequiredInitializedParameter(parameterDeclaration)) { - parameterType = getOptionalType(parameterType); + if (!isTransientSymbol(parameterSymbol)) { + return getDeclarationOfKind(parameterSymbol, SyntaxKind.JSDocParameterTag); } - const parameterTypeNode = serializeTypeForDeclaration(context, parameterType, parameterSymbol, context.enclosingDeclaration, privateSymbolVisitor, bundledImports); + } - 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 ? + 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); - const isOptional = parameterDeclaration && isOptionalParameter(parameterDeclaration) || getCheckFlags(parameterSymbol) & CheckFlags.OptionalParameter; - const questionToken = isOptional ? factory.createToken(SyntaxKind.QuestionToken) : undefined; - const parameterNode = factory.createParameterDeclaration( - modifiers, - dotDotDotToken, - name, - questionToken, - parameterTypeNode, - /*initializer*/ undefined, - ); - context.approximateLength += symbolName(parameterSymbol).length + 3; - return parameterNode; function cloneBindingName(node: BindingName): BindingName { return elideInitializerAndSetEmitFlags(node) as BindingName; @@ -7652,6 +7636,33 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } + 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)) { + parameterType = getOptionalType(parameterType); + } + const parameterTypeNode = serializeTypeForDeclaration(context, parameterType, parameterSymbol, context.enclosingDeclaration, privateSymbolVisitor, bundledImports); + + 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 = 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( + modifiers, + dotDotDotToken, + name, + questionToken, + parameterTypeNode, + /*initializer*/ undefined, + ); + context.approximateLength += symbolName(parameterSymbol).length + 3; + return parameterNode; + } + function trackComputedName(accessExpression: EntityNameOrEntityNameExpression, enclosingDeclaration: Node | undefined, context: NodeBuilderContext) { if (!context.tracker.canTrackSymbol) return; // get symbol of the first identifier of the entityName @@ -9800,7 +9811,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { factory.createSetAccessorDeclaration( factory.createModifiersFromModifierFlags(flag), name, - [symbolToParameterDeclaration(paramSymbol, context)], + [factory.createParameterDeclaration( + /*modifiers*/ undefined, + /*dotDotDotToken*/ undefined, + parameterToParameterDeclarationName(paramSymbol, getEffectiveParameterDeclaration(paramSymbol), context), + /*questionToken*/ undefined, + isPrivate ? undefined : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled), + )], /*body*/ undefined, ), p.declarations?.find(isSetAccessor) || firstPropertyLikeDecl, diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.js b/tests/baselines/reference/jsDeclarationsGetterSetter.js index a582dca3a95cb..bf18f77f78066 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.js +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.js @@ -48,6 +48,14 @@ Object.defineProperty(F.prototype, "x", { */ set(_arg) {} }); + +export class G {} +Object.defineProperty(G.prototype, "x", { + /** + * @param {number[]} args + */ + set(...args) {} +}); //// [index.js] @@ -96,6 +104,14 @@ Object.defineProperty(F.prototype, "x", { */ set(_arg) { } }); +export class G { +} +Object.defineProperty(G.prototype, "x", { + /** + * @param {number[]} args + */ + set(...args) { } +}); //// [index.d.ts] @@ -122,3 +138,6 @@ export class F { set x(_arg: number); get x(): number; } +export class G { + set x(args: number); +} diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.symbols b/tests/baselines/reference/jsDeclarationsGetterSetter.symbols index 6da563e8b5121..18a3e56478ff0 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.symbols +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.symbols @@ -103,3 +103,24 @@ 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)) + +}); + diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.types b/tests/baselines/reference/jsDeclarationsGetterSetter.types index ec7ba37a05c4f..c5855ea9cc56c 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.types +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.types @@ -114,3 +114,26 @@ 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[] + +}); + diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts index 05d6769f050ab..72de86bc4955c 100644 --- a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts @@ -51,3 +51,11 @@ Object.defineProperty(F.prototype, "x", { */ set(_arg) {} }); + +export class G {} +Object.defineProperty(G.prototype, "x", { + /** + * @param {number[]} args + */ + set(...args) {} +}); From 202eff75d015f55204eba9d55028f64fdcbfdcc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 20 Aug 2023 11:00:57 +0200 Subject: [PATCH 10/11] fix an issue with no declarated setter param in JS files --- src/compiler/checker.ts | 4 ++-- .../reference/jsDeclarationsGetterSetter.js | 13 +++++++++++++ .../jsDeclarationsGetterSetter.symbols | 17 +++++++++++++++++ .../jsDeclarationsGetterSetter.types | 19 +++++++++++++++++++ .../jsDeclarationsGetterSetter.ts | 5 +++++ 5 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d742e6c6c57da..dd14e3b4e778d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9805,7 +9805,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { }); Debug.assert(setter && isFunctionLikeDeclaration(setter)); - const paramSymbol = getSignatureFromDeclaration(setter).parameters[0]; + const paramSymbol: Symbol | undefined = getSignatureFromDeclaration(setter).parameters[0]; result.push(setTextRange( factory.createSetAccessorDeclaration( @@ -9814,7 +9814,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { [factory.createParameterDeclaration( /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, - parameterToParameterDeclarationName(paramSymbol, getEffectiveParameterDeclaration(paramSymbol), context), + 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/jsDeclarationsGetterSetter.js b/tests/baselines/reference/jsDeclarationsGetterSetter.js index bf18f77f78066..31941471c0399 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.js +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.js @@ -56,6 +56,11 @@ Object.defineProperty(G.prototype, "x", { */ set(...args) {} }); + +export class H {} +Object.defineProperty(H.prototype, "x", { + set() {} +}); //// [index.js] @@ -112,6 +117,11 @@ Object.defineProperty(G.prototype, "x", { */ set(...args) { } }); +export class H { +} +Object.defineProperty(H.prototype, "x", { + set() { } +}); //// [index.d.ts] @@ -141,3 +151,6 @@ export class F { 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 18a3e56478ff0..d0d98a8158cad 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.symbols +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.symbols @@ -124,3 +124,20 @@ Object.defineProperty(G.prototype, "x", { }); +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 c5855ea9cc56c..3b4ce59488509 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.types +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.types @@ -137,3 +137,22 @@ Object.defineProperty(G.prototype, "x", { }); +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/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts index 72de86bc4955c..f42dcf64573f2 100644 --- a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts @@ -59,3 +59,8 @@ Object.defineProperty(G.prototype, "x", { */ set(...args) {} }); + +export class H {} +Object.defineProperty(H.prototype, "x", { + set() {} +}); From ebfcbc92fee12defa239c12f4824cea12daa04cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 22 Aug 2023 09:18:52 +0200 Subject: [PATCH 11/11] reorder functions for a better diff --- src/compiler/checker.ts | 54 ++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index dd14e3b4e778d..c8be8ad0440cf 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7604,6 +7604,33 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } + 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)) { + parameterType = getOptionalType(parameterType); + } + const parameterTypeNode = serializeTypeForDeclaration(context, parameterType, parameterSymbol, context.enclosingDeclaration, privateSymbolVisitor, bundledImports); + + 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 = 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( + modifiers, + dotDotDotToken, + name, + questionToken, + parameterTypeNode, + /*initializer*/ undefined, + ); + 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) : @@ -7636,33 +7663,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } - 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)) { - parameterType = getOptionalType(parameterType); - } - const parameterTypeNode = serializeTypeForDeclaration(context, parameterType, parameterSymbol, context.enclosingDeclaration, privateSymbolVisitor, bundledImports); - - 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 = 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( - modifiers, - dotDotDotToken, - name, - questionToken, - parameterTypeNode, - /*initializer*/ undefined, - ); - context.approximateLength += symbolName(parameterSymbol).length + 3; - return parameterNode; - } - function trackComputedName(accessExpression: EntityNameOrEntityNameExpression, enclosingDeclaration: Node | undefined, context: NodeBuilderContext) { if (!context.tracker.canTrackSymbol) return; // get symbol of the first identifier of the entityName