Skip to content

Commit cc2dd24

Browse files
committed
feat: Add workaround way for inserting name of completion. Enable it via experimental.enableInsertNameOfSuggestionFix
1 parent dad4d6e commit cc2dd24

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

src/configurationType.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,12 @@ export type Configuration = {
605605
typeAlias: string
606606
interface: string
607607
}
608+
/**
609+
* Use workaround method for inserting name of TypeScript suggestion.
610+
* If you move to next suggestion and then to previous, and then run *insert name of completion* via keybinding, name of **last resolved** completion will be inserted, so you might prefer to enable this setting. Also it makes this feature work in Vue.
611+
* @default false
612+
*/
613+
'experimental.enableInsertNameOfSuggestionFix': boolean
608614
}
609615

610616
// scrapped using search editor. config: caseInsesetive, context lines: 0, regex: const fix\w+ = "[^ ]+"

src/onCompletionAccepted.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ import { getActiveRegularEditor } from '@zardoy/vscode-utils'
33
import { expandPosition } from '@zardoy/vscode-utils/build/position'
44
import { getExtensionSetting, registerExtensionCommand } from 'vscode-framework'
55
import { oneOf } from '@zardoy/utils'
6-
import { RequestOptionsTypes, RequestResponseTypes } from '../typescript/src/ipcTypes'
7-
import { sendCommand } from './sendCommand'
6+
7+
export const onCompletionAcceptedOverride: { value: ((item: any) => void) | undefined } = { value: undefined }
88

99
export default (tsApi: { onCompletionAccepted }) => {
1010
let inFlightMethodSnippetOperation: undefined | AbortController
1111
let justAcceptedReturnKeywordSuggestion = false
1212
let lastAcceptedAmbiguousMethodSnippetSuggestion: string | undefined
13-
let onCompletionAcceptedOverride: ((item: any) => void) | undefined
1413

1514
// eslint-disable-next-line complexity
1615
tsApi.onCompletionAccepted(async (item: vscode.CompletionItem & { document: vscode.TextDocument; tsEntry }) => {
17-
if (onCompletionAcceptedOverride) {
18-
onCompletionAcceptedOverride(item)
16+
if (onCompletionAcceptedOverride.value) {
17+
onCompletionAcceptedOverride.value(item)
18+
onCompletionAcceptedOverride.value = undefined
1919
return
2020
}
2121

@@ -100,10 +100,9 @@ export default (tsApi: { onCompletionAccepted }) => {
100100
async (_progress, token) => {
101101
const accepted = await new Promise<boolean>(resolve => {
102102
token.onCancellationRequested(() => {
103-
onCompletionAcceptedOverride = undefined
104103
resolve(false)
105104
})
106-
onCompletionAcceptedOverride = item => {
105+
onCompletionAcceptedOverride.value = item => {
107106
console.dir(item, { depth: 4 })
108107
resolve(true)
109108
}

src/specialCommands.ts

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import * as vscode from 'vscode'
22
import { getActiveRegularEditor } from '@zardoy/vscode-utils'
3-
import { getExtensionCommandId, registerExtensionCommand, VSCodeQuickPickItem } from 'vscode-framework'
3+
import { getExtensionCommandId, getExtensionSetting, registerExtensionCommand, VSCodeQuickPickItem } from 'vscode-framework'
44
import { showQuickPick } from '@zardoy/vscode-utils/build/quickPick'
55
import _ from 'lodash'
66
import { compact } from '@zardoy/utils'
7+
import { offsetPosition } from '@zardoy/vscode-utils/build/position'
78
import { RequestOptionsTypes, RequestResponseTypes } from '../typescript/src/ipcTypes'
89
import { sendCommand } from './sendCommand'
910
import { tsRangeToVscode, tsRangeToVscodeSelection } from './util'
11+
import { onCompletionAcceptedOverride } from './onCompletionAccepted'
1012

1113
export default () => {
1214
registerExtensionCommand('removeFunctionArgumentsTypesInSelection', async () => {
@@ -241,8 +243,37 @@ export default () => {
241243
registerExtensionCommand('insertNameOfCompletion', async () => {
242244
const editor = vscode.window.activeTextEditor
243245
if (!editor) return
244-
const result = await sendCommand<RequestResponseTypes['getLastResolvedCompletion']>('getLastResolvedCompletion')
245-
if (!result) return
246-
await editor.insertSnippet(new vscode.SnippetString().appendText(result.name))
246+
if (!getExtensionSetting('experimental.enableInsertNameOfSuggestionFix')) {
247+
const result = await sendCommand<RequestResponseTypes['getLastResolvedCompletion']>('getLastResolvedCompletion')
248+
if (!result) return
249+
await editor.insertSnippet(new vscode.SnippetString().appendText(result.name))
250+
return
251+
}
252+
253+
onCompletionAcceptedOverride.value = () => {}
254+
const { ranges, text } = await new Promise<{ text: string; ranges: vscode.Range[] }>(resolve => {
255+
vscode.workspace.onDidChangeTextDocument(({ document, contentChanges }) => {
256+
if (document !== editor.document || contentChanges.length === 0) return
257+
const ranges = contentChanges.map(
258+
change => new vscode.Range(change.range.start, offsetPosition(document, change.range.start, change.text.length)),
259+
)
260+
resolve({ ranges, text: contentChanges[0]!.text })
261+
})
262+
void vscode.commands.executeCommand('acceptSelectedSuggestion')
263+
})
264+
const needle = ['(', ': '].find(needle => text.includes(needle))
265+
if (!needle) return
266+
const cleanedText = text.slice(0, text.indexOf(needle))
267+
await editor.edit(
268+
e => {
269+
for (const range of ranges) {
270+
e.replace(range, cleanedText)
271+
}
272+
},
273+
{
274+
undoStopBefore: false,
275+
undoStopAfter: false,
276+
},
277+
)
247278
})
248279
}

0 commit comments

Comments
 (0)