diff --git a/src/services/symbolDisplay.ts b/src/services/symbolDisplay.ts index 0524d150972bc..8a0a9719a940f 100644 --- a/src/services/symbolDisplay.ts +++ b/src/services/symbolDisplay.ts @@ -1,4 +1,5 @@ import { + AccessorDeclaration, addRange, arrayFrom, BinaryExpression, @@ -16,7 +17,6 @@ import { first, firstDefined, forEach, - GetAccessorDeclaration, getCombinedLocalAndExportSymbolFlags, getDeclarationOfKind, getExternalModuleImportEqualsDeclarationExpression, @@ -83,7 +83,6 @@ import { ScriptElementKind, ScriptElementKindModifier, SemanticMeaning, - SetAccessorDeclaration, Signature, SignatureDeclaration, SignatureFlags, @@ -276,7 +275,14 @@ function getSymbolDisplayPartsDocumentationAndSymbolKindWorker(typeChecker: Type if (symbolKind !== ScriptElementKind.unknown || symbolFlags & SymbolFlags.Class || symbolFlags & SymbolFlags.Alias) { // If symbol is accessor, they are allowed only if location is at declaration identifier of the accessor if (symbolKind === ScriptElementKind.memberGetAccessorElement || symbolKind === ScriptElementKind.memberSetAccessorElement) { - const declaration = find(symbol.declarations as ((GetAccessorDeclaration | SetAccessorDeclaration | PropertyDeclaration)[]), declaration => declaration.name === location); + const declaration = find( + symbol.declarations as (AccessorDeclaration | PropertyDeclaration | PropertyAccessExpression)[], + (declaration): declaration is AccessorDeclaration | PropertyDeclaration => + declaration.name === location + // an expando member could have been added to an object with a set accessor + // we need to ignore such write location as it shouldn't be displayed as `(setter)` anyway + && declaration.kind !== SyntaxKind.PropertyAccessExpression, + ); if (declaration) { switch (declaration.kind) { case SyntaxKind.GetAccessor: diff --git a/tests/cases/fourslash/quickInfoOnExpandoLikePropertyWithSetterDeclarationJs1.ts b/tests/cases/fourslash/quickInfoOnExpandoLikePropertyWithSetterDeclarationJs1.ts new file mode 100644 index 0000000000000..70fdf451007fd --- /dev/null +++ b/tests/cases/fourslash/quickInfoOnExpandoLikePropertyWithSetterDeclarationJs1.ts @@ -0,0 +1,16 @@ +/// + +// @strict: true +// @checkJs: true +// @filename: index.js + +//// const x = {}; +//// +//// Object.defineProperty(x, "foo", { +//// /** @param {number} v */ +//// set(v) {}, +//// }); +//// +//// x.foo/**/ = 1; + +verify.quickInfoAt("", "(property) x.foo: number"); diff --git a/tests/cases/fourslash/quickInfoOnExpandoLikePropertyWithSetterDeclarationJs2.ts b/tests/cases/fourslash/quickInfoOnExpandoLikePropertyWithSetterDeclarationJs2.ts new file mode 100644 index 0000000000000..9bd9548be8aa1 --- /dev/null +++ b/tests/cases/fourslash/quickInfoOnExpandoLikePropertyWithSetterDeclarationJs2.ts @@ -0,0 +1,19 @@ +/// + +// @strict: true +// @checkJs: true +// @filename: index.js + +//// const obj = {}; +//// let val = 10; +//// Object.defineProperty(obj, "a", { +//// configurable: true, +//// enumerable: true, +//// set(v) { +//// val = v; +//// }, +//// }); +//// +//// obj.a/**/ = 100; + +verify.quickInfoAt("", "(property) obj.a: any");