@@ -7594,11 +7594,18 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
7594
7594
return typeParameterToDeclarationWithConstraint(type, context, constraintNode);
7595
7595
}
7596
7596
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);
7601
7604
}
7605
+ }
7606
+
7607
+ function symbolToParameterDeclaration(parameterSymbol: Symbol, context: NodeBuilderContext, preserveModifierFlags?: boolean, privateSymbolVisitor?: (s: Symbol) => void, bundledImports?: boolean): ParameterDeclaration {
7608
+ const parameterDeclaration = getEffectiveParameterDeclaration(parameterSymbol);
7602
7609
7603
7610
let parameterType = getTypeOfSymbol(parameterSymbol);
7604
7611
if (parameterDeclaration && isRequiredInitializedParameter(parameterDeclaration)) {
@@ -7609,12 +7616,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
7609
7616
const modifiers = !(context.flags & NodeBuilderFlags.OmitParameterModifiers) && preserveModifierFlags && parameterDeclaration && canHaveModifiers(parameterDeclaration) ? map(getModifiers(parameterDeclaration), factory.cloneNode) : undefined;
7610
7617
const isRest = parameterDeclaration && isRestParameter(parameterDeclaration) || getCheckFlags(parameterSymbol) & CheckFlags.RestParameter;
7611
7618
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);
7618
7620
const isOptional = parameterDeclaration && isOptionalParameter(parameterDeclaration) || getCheckFlags(parameterSymbol) & CheckFlags.OptionalParameter;
7619
7621
const questionToken = isOptional ? factory.createToken(SyntaxKind.QuestionToken) : undefined;
7620
7622
const parameterNode = factory.createParameterDeclaration(
@@ -7627,6 +7629,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
7627
7629
);
7628
7630
context.approximateLength += symbolName(parameterSymbol).length + 3;
7629
7631
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);
7630
7641
7631
7642
function cloneBindingName(node: BindingName): BindingName {
7632
7643
return elideInitializerAndSetEmitFlags(node) as BindingName;
@@ -9779,14 +9790,31 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
9779
9790
if (p.flags & SymbolFlags.Accessor && useAccessors) {
9780
9791
const result: AccessorDeclaration[] = [];
9781
9792
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
+
9782
9810
result.push(setTextRange(
9783
9811
factory.createSetAccessorDeclaration(
9784
9812
factory.createModifiersFromModifierFlags(flag),
9785
9813
name,
9786
9814
[factory.createParameterDeclaration(
9787
9815
/*modifiers*/ undefined,
9788
9816
/*dotDotDotToken*/ undefined,
9789
- "arg ",
9817
+ paramSymbol ? parameterToParameterDeclarationName(paramSymbol, getEffectiveParameterDeclaration(paramSymbol), context) : "value ",
9790
9818
/*questionToken*/ undefined,
9791
9819
isPrivate ? undefined : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled),
9792
9820
)],
0 commit comments