From f07c0dd637eb1fb21893768d62070f6c53f09cd2 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Fri, 17 Nov 2023 23:46:42 +0200 Subject: [PATCH] fix(54268): Renaming JSDoc @param symbol only renames the first instance (#56226) --- src/services/findAllReferences.ts | 25 +++++++++++++++++++ .../renameJsDocTypeLiteral.baseline.jsonc | 8 ++++++ .../cases/fourslash/renameJsDocTypeLiteral.ts | 14 +++++++++++ 3 files changed, 47 insertions(+) create mode 100644 tests/baselines/reference/renameJsDocTypeLiteral.baseline.jsonc create mode 100644 tests/cases/fourslash/renameJsDocTypeLiteral.ts diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 9dc0f88bf85..4ff456f685b 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -41,6 +41,7 @@ import { firstDefined, firstOrUndefined, flatMap, + forEach, forEachChild, forEachChildRecursively, forEachReturnStatement, @@ -131,7 +132,9 @@ import { isInString, isInterfaceDeclaration, isJSDocMemberName, + isJSDocPropertyLikeTag, isJSDocTag, + isJSDocTypeLiteral, isJsxClosingElement, isJsxElement, isJsxFragment, @@ -185,7 +188,9 @@ import { isVariableStatement, isVoidExpression, isWriteAccess, + JSDocPropertyLikeTag, JSDocTag, + length, map, mapDefined, MethodDeclaration, @@ -1928,6 +1933,15 @@ export namespace Core { return; } + if ( + isJSDocPropertyLikeTag(parent) && parent.isNameFirst && + parent.typeExpression && isJSDocTypeLiteral(parent.typeExpression.type) && + parent.typeExpression.type.jsDocPropertyTags && length(parent.typeExpression.type.jsDocPropertyTags) + ) { + getReferencesAtJSDocTypeLiteral(parent.typeExpression.type.jsDocPropertyTags, referenceLocation, search, state); + return; + } + const relatedSymbol = getRelatedSymbol(search, referenceSymbol, referenceLocation, state); if (!relatedSymbol) { getReferenceForShorthandProperty(referenceSymbol, search, state); @@ -1963,6 +1977,17 @@ export namespace Core { getImportOrExportReferences(referenceLocation, referenceSymbol, search, state); } + function getReferencesAtJSDocTypeLiteral(jsDocPropertyTags: readonly JSDocPropertyLikeTag[], referenceLocation: Node, search: Search, state: State) { + const addRef = state.referenceAdder(search.symbol); + + addReference(referenceLocation, search.symbol, state); + forEach(jsDocPropertyTags, propTag => { + if (isQualifiedName(propTag.name)) { + addRef(propTag.name.left); + } + }); + } + function getReferencesAtExportSpecifier( referenceLocation: Identifier, referenceSymbol: Symbol, diff --git a/tests/baselines/reference/renameJsDocTypeLiteral.baseline.jsonc b/tests/baselines/reference/renameJsDocTypeLiteral.baseline.jsonc new file mode 100644 index 00000000000..093e8d30a26 --- /dev/null +++ b/tests/baselines/reference/renameJsDocTypeLiteral.baseline.jsonc @@ -0,0 +1,8 @@ +// === findRenameLocations === +// === /a.js === +// /** +// * @param {Object} [|optionsRENAME|] +// * @param {string} [|optionsRENAME|].foo +// * @param {number} [|optionsRENAME|].bar +// */ +// function foo(/*RENAME*/[|optionsRENAME|]) {} \ No newline at end of file diff --git a/tests/cases/fourslash/renameJsDocTypeLiteral.ts b/tests/cases/fourslash/renameJsDocTypeLiteral.ts new file mode 100644 index 00000000000..62609802fc4 --- /dev/null +++ b/tests/cases/fourslash/renameJsDocTypeLiteral.ts @@ -0,0 +1,14 @@ +/// + +// @allowJs: true +// @checkJs: true +// @filename: /a.js +/////** +//// * @param {Object} options +//// * @param {string} options.foo +//// * @param {number} options.bar +//// */ +////function foo(/**/options) {} + +goTo.file("/a.js"); +verify.baselineRename("", { });