Skip to content

Commit 97d8c83

Browse files
authored
Fixed serialization of param names in setters from JS files (#55393)
1 parent 5439c81 commit 97d8c83

23 files changed

+408
-34
lines changed

src/compiler/checker.ts

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7594,11 +7594,18 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
75947594
return typeParameterToDeclarationWithConstraint(type, context, constraintNode);
75957595
}
75967596

7597-
function symbolToParameterDeclaration(parameterSymbol: Symbol, context: NodeBuilderContext, preserveModifierFlags?: boolean, privateSymbolVisitor?: (s: Symbol) => void, bundledImports?: boolean): ParameterDeclaration {
7598-
let parameterDeclaration: ParameterDeclaration | JSDocParameterTag | undefined = getDeclarationOfKind<ParameterDeclaration>(parameterSymbol, SyntaxKind.Parameter);
7599-
if (!parameterDeclaration && !isTransientSymbol(parameterSymbol)) {
7600-
parameterDeclaration = getDeclarationOfKind<JSDocParameterTag>(parameterSymbol, SyntaxKind.JSDocParameterTag);
7597+
function getEffectiveParameterDeclaration(parameterSymbol: Symbol): ParameterDeclaration | JSDocParameterTag | undefined {
7598+
const parameterDeclaration: ParameterDeclaration | JSDocParameterTag | undefined = getDeclarationOfKind<ParameterDeclaration>(parameterSymbol, SyntaxKind.Parameter);
7599+
if (parameterDeclaration) {
7600+
return parameterDeclaration;
7601+
}
7602+
if (!isTransientSymbol(parameterSymbol)) {
7603+
return getDeclarationOfKind<JSDocParameterTag>(parameterSymbol, SyntaxKind.JSDocParameterTag);
76017604
}
7605+
}
7606+
7607+
function symbolToParameterDeclaration(parameterSymbol: Symbol, context: NodeBuilderContext, preserveModifierFlags?: boolean, privateSymbolVisitor?: (s: Symbol) => void, bundledImports?: boolean): ParameterDeclaration {
7608+
const parameterDeclaration = getEffectiveParameterDeclaration(parameterSymbol);
76027609

76037610
let parameterType = getTypeOfSymbol(parameterSymbol);
76047611
if (parameterDeclaration && isRequiredInitializedParameter(parameterDeclaration)) {
@@ -7609,12 +7616,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
76097616
const modifiers = !(context.flags & NodeBuilderFlags.OmitParameterModifiers) && preserveModifierFlags && parameterDeclaration && canHaveModifiers(parameterDeclaration) ? map(getModifiers(parameterDeclaration), factory.cloneNode) : undefined;
76107617
const isRest = parameterDeclaration && isRestParameter(parameterDeclaration) || getCheckFlags(parameterSymbol) & CheckFlags.RestParameter;
76117618
const dotDotDotToken = isRest ? factory.createToken(SyntaxKind.DotDotDotToken) : undefined;
7612-
const name = parameterDeclaration ? parameterDeclaration.name ?
7613-
parameterDeclaration.name.kind === SyntaxKind.Identifier ? setEmitFlags(factory.cloneNode(parameterDeclaration.name), EmitFlags.NoAsciiEscaping) :
7614-
parameterDeclaration.name.kind === SyntaxKind.QualifiedName ? setEmitFlags(factory.cloneNode(parameterDeclaration.name.right), EmitFlags.NoAsciiEscaping) :
7615-
cloneBindingName(parameterDeclaration.name) :
7616-
symbolName(parameterSymbol) :
7617-
symbolName(parameterSymbol);
7619+
const name = parameterToParameterDeclarationName(parameterSymbol, parameterDeclaration, context);
76187620
const isOptional = parameterDeclaration && isOptionalParameter(parameterDeclaration) || getCheckFlags(parameterSymbol) & CheckFlags.OptionalParameter;
76197621
const questionToken = isOptional ? factory.createToken(SyntaxKind.QuestionToken) : undefined;
76207622
const parameterNode = factory.createParameterDeclaration(
@@ -7627,6 +7629,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
76277629
);
76287630
context.approximateLength += symbolName(parameterSymbol).length + 3;
76297631
return parameterNode;
7632+
}
7633+
7634+
function parameterToParameterDeclarationName(parameterSymbol: Symbol, parameterDeclaration: ParameterDeclaration | JSDocParameterTag | undefined, context: NodeBuilderContext) {
7635+
return parameterDeclaration ? parameterDeclaration.name ?
7636+
parameterDeclaration.name.kind === SyntaxKind.Identifier ? setEmitFlags(factory.cloneNode(parameterDeclaration.name), EmitFlags.NoAsciiEscaping) :
7637+
parameterDeclaration.name.kind === SyntaxKind.QualifiedName ? setEmitFlags(factory.cloneNode(parameterDeclaration.name.right), EmitFlags.NoAsciiEscaping) :
7638+
cloneBindingName(parameterDeclaration.name) :
7639+
symbolName(parameterSymbol) :
7640+
symbolName(parameterSymbol);
76307641

76317642
function cloneBindingName(node: BindingName): BindingName {
76327643
return elideInitializerAndSetEmitFlags(node) as BindingName;
@@ -9779,14 +9790,31 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
97799790
if (p.flags & SymbolFlags.Accessor && useAccessors) {
97809791
const result: AccessorDeclaration[] = [];
97819792
if (p.flags & SymbolFlags.SetAccessor) {
9793+
const setter = p.declarations && forEach(p.declarations, d => {
9794+
if (d.kind === SyntaxKind.SetAccessor) {
9795+
return d as SetAccessorDeclaration;
9796+
}
9797+
if (isCallExpression(d) && isBindableObjectDefinePropertyCall(d)) {
9798+
return forEach(d.arguments[2].properties, propDecl => {
9799+
const id = getNameOfDeclaration(propDecl);
9800+
if (!!id && isIdentifier(id) && idText(id) === "set") {
9801+
return propDecl;
9802+
}
9803+
});
9804+
}
9805+
});
9806+
9807+
Debug.assert(setter && isFunctionLikeDeclaration(setter));
9808+
const paramSymbol: Symbol | undefined = getSignatureFromDeclaration(setter).parameters[0];
9809+
97829810
result.push(setTextRange(
97839811
factory.createSetAccessorDeclaration(
97849812
factory.createModifiersFromModifierFlags(flag),
97859813
name,
97869814
[factory.createParameterDeclaration(
97879815
/*modifiers*/ undefined,
97889816
/*dotDotDotToken*/ undefined,
9789-
"arg",
9817+
paramSymbol ? parameterToParameterDeclarationName(paramSymbol, getEffectiveParameterDeclaration(paramSymbol), context) : "value",
97909818
/*questionToken*/ undefined,
97919819
isPrivate ? undefined : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled),
97929820
)],
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts] ////
2+
3+
//// [foo.js]
4+
// https://github.com/microsoft/TypeScript/issues/55391
5+
6+
export class Foo {
7+
/**
8+
* Bar.
9+
*
10+
* @param {string} baz Baz.
11+
*/
12+
set bar(baz) {}
13+
}
14+
15+
16+
17+
18+
//// [foo.d.ts]
19+
export class Foo {
20+
/**
21+
* Bar.
22+
*
23+
* @param {string} baz Baz.
24+
*/
25+
set bar(baz: string);
26+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts] ////
2+
3+
=== foo.js ===
4+
// https://github.com/microsoft/TypeScript/issues/55391
5+
6+
export class Foo {
7+
>Foo : Symbol(Foo, Decl(foo.js, 0, 0))
8+
9+
/**
10+
* Bar.
11+
*
12+
* @param {string} baz Baz.
13+
*/
14+
set bar(baz) {}
15+
>bar : Symbol(Foo.bar, Decl(foo.js, 2, 18))
16+
>baz : Symbol(baz, Decl(foo.js, 8, 12))
17+
}
18+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs.ts] ////
2+
3+
=== foo.js ===
4+
// https://github.com/microsoft/TypeScript/issues/55391
5+
6+
export class Foo {
7+
>Foo : Foo
8+
9+
/**
10+
* Bar.
11+
*
12+
* @param {string} baz Baz.
13+
*/
14+
set bar(baz) {}
15+
>bar : string
16+
>baz : string
17+
}
18+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts] ////
2+
3+
//// [foo.js]
4+
export class Foo {
5+
/**
6+
* Bar.
7+
*
8+
* @param {{ prop: string }} baz Baz.
9+
*/
10+
set bar({}) {}
11+
}
12+
13+
14+
15+
16+
//// [foo.d.ts]
17+
export class Foo {
18+
/**
19+
* Bar.
20+
*
21+
* @param {{ prop: string }} baz Baz.
22+
*/
23+
set bar({}: {
24+
prop: string;
25+
});
26+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts] ////
2+
3+
=== foo.js ===
4+
export class Foo {
5+
>Foo : Symbol(Foo, Decl(foo.js, 0, 0))
6+
7+
/**
8+
* Bar.
9+
*
10+
* @param {{ prop: string }} baz Baz.
11+
*/
12+
set bar({}) {}
13+
>bar : Symbol(Foo.bar, Decl(foo.js, 0, 18))
14+
}
15+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs2.ts] ////
2+
3+
=== foo.js ===
4+
export class Foo {
5+
>Foo : Foo
6+
7+
/**
8+
* Bar.
9+
*
10+
* @param {{ prop: string }} baz Baz.
11+
*/
12+
set bar({}) {}
13+
>bar : { prop: string; }
14+
}
15+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts] ////
2+
3+
//// [foo.js]
4+
export class Foo {
5+
/**
6+
* Bar.
7+
*
8+
* @param {{ prop: string | undefined }} baz Baz.
9+
*/
10+
set bar({ prop = 'foo' }) {}
11+
}
12+
13+
14+
15+
16+
//// [foo.d.ts]
17+
export class Foo {
18+
/**
19+
* Bar.
20+
*
21+
* @param {{ prop: string | undefined }} baz Baz.
22+
*/
23+
set bar({ prop }: {
24+
prop: string | undefined;
25+
});
26+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts] ////
2+
3+
=== foo.js ===
4+
export class Foo {
5+
>Foo : Symbol(Foo, Decl(foo.js, 0, 0))
6+
7+
/**
8+
* Bar.
9+
*
10+
* @param {{ prop: string | undefined }} baz Baz.
11+
*/
12+
set bar({ prop = 'foo' }) {}
13+
>bar : Symbol(Foo.bar, Decl(foo.js, 0, 18))
14+
>prop : Symbol(prop, Decl(foo.js, 6, 13))
15+
}
16+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//// [tests/cases/compiler/declarationEmitClassSetAccessorParamNameInJs3.ts] ////
2+
3+
=== foo.js ===
4+
export class Foo {
5+
>Foo : Foo
6+
7+
/**
8+
* Bar.
9+
*
10+
* @param {{ prop: string | undefined }} baz Baz.
11+
*/
12+
set bar({ prop = 'foo' }) {}
13+
>bar : { prop: string | undefined; }
14+
>prop : string
15+
>'foo' : "foo"
16+
}
17+

0 commit comments

Comments
 (0)