Skip to content

Commit 15bee04

Browse files
author
Ilya Golovin
committed
feat(getArgumentReferencesFromCurrentParameter): add getArgumentReferencesFromCurrentParameter special command
1 parent 20dd2f4 commit 15bee04

4 files changed

Lines changed: 52 additions & 0 deletions

File tree

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@
6262
{
6363
"command": "replaceGlobalTypescriptWithLocalVersion",
6464
"title": "Replace Global Typescript with Local Version"
65+
},
66+
{
67+
"command": "getArgumentReferencesFromCurrentParameter",
68+
"title": "Get Argument References from Current Parameter"
6569
}
6670
],
6771
"keybindings": [

src/specialCommands.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,21 @@ export default () => {
289289
await vscode.env.clipboard.writeText(text)
290290
})
291291

292+
registerExtensionCommand('getArgumentReferencesFromCurrentParameter', async () => {
293+
const result = await sendCommand<RequestResponseTypes['getArgumentReferencesFromCurrentParameter']>('getArgumentReferencesFromCurrentParameter')
294+
if (!result) return
295+
const editor = vscode.window.activeTextEditor!
296+
const { uri } = editor.document
297+
await vscode.commands.executeCommand(
298+
'editor.action.goToLocations',
299+
uri,
300+
editor.selection.active,
301+
result.map(({ filename, line, character }) => new vscode.Location(vscode.Uri.file(filename), new vscode.Position(line, character))),
302+
vscode.workspace.getConfiguration('editor').get('gotoLocation.multipleReferences') ?? 'peek',
303+
'No references',
304+
)
305+
})
306+
292307
// registerExtensionCommand('insertImportFlatten', () => {
293308
// // got -> default, got
294309
// type A = ts.Type

typescript/src/ipcTypes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const triggerCharacterCommands = [
1515
'acceptRenameWithParams',
1616
'getExtendedCodeActionEdits',
1717
'getLastResolvedCompletion',
18+
'getArgumentReferencesFromCurrentParameter',
1819
] as const
1920

2021
export type TriggerCharacterCommand = (typeof triggerCharacterCommands)[number]
@@ -84,6 +85,7 @@ export type RequestResponseTypes = {
8485
getFullType: {
8586
text: string
8687
}
88+
getArgumentReferencesFromCurrentParameter: Array<{ line: number; character: number; filename: string }>
8789
}
8890

8991
// INPUT

typescript/src/specialCommands/handle.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,37 @@ export default (
246246
text: checker.typeToString(type, undefined, ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.NoTypeReduction),
247247
}
248248
}
249+
if (specialCommand === 'getArgumentReferencesFromCurrentParameter') {
250+
const node = findChildContainingExactPosition(sourceFile, position)
251+
if (!node || !ts.isIdentifier(node) || !ts.isParameter(node.parent) || !ts.isFunctionLike(node.parent.parent)) return
252+
let functionDecl = node.parent.parent as ts.Node
253+
const functionParameters = node.parent.parent.parameters
254+
if (ts.isVariableDeclaration(functionDecl.parent)) {
255+
functionDecl = functionDecl.parent
256+
}
257+
const parameterIndex = functionParameters.indexOf(node.parent)
258+
const references = languageService.findReferences(fileName, functionDecl.pos + functionDecl.getLeadingTriviaWidth(sourceFile))
259+
if (!references) return
260+
261+
return compact(
262+
references.flatMap(({ references }) => {
263+
return references.map(reference => {
264+
const sourceFile = languageService.getProgram()!.getSourceFile(reference.fileName)!
265+
const position = reference.textSpan.start
266+
267+
const node = findChildContainingExactPosition(sourceFile, position)
268+
if (!node || !ts.isIdentifier(node) || !ts.isCallExpression(node.parent)) return
269+
270+
const arg = node.parent.arguments[parameterIndex]
271+
if (!arg) return
272+
return {
273+
filename: reference.fileName,
274+
...sourceFile.getLineAndCharacterOfPosition(arg.pos + arg.getLeadingTriviaWidth(sourceFile)),
275+
}
276+
})
277+
}),
278+
)
279+
}
249280

250281
return null
251282
}

0 commit comments

Comments
 (0)