Skip to content

Commit 58c444a

Browse files
committed
fix: methodSnippetsInsertText before . sorting workaround
fixes #161
1 parent f7d7901 commit 58c444a

4 files changed

Lines changed: 31 additions & 13 deletions

File tree

src/extension.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
/* eslint-disable @typescript-eslint/no-require-imports */
22
import * as vscode from 'vscode'
33
import { defaultJsSupersetLangs } from '@zardoy/vscode-utils/build/langs'
4-
import { Settings, extensionCtx, getExtensionSetting, getExtensionSettingId, registerExtensionCommand } from 'vscode-framework'
4+
import { extensionCtx, getExtensionSetting, getExtensionSettingId } from 'vscode-framework'
55
import { pickObj } from '@zardoy/utils'
66
import { watchExtensionSettings } from '@zardoy/vscode-utils/build/settings'
7-
import { ConditionalPick } from 'type-fest'
87
import webImports from './webImports'
98
import { sendCommand } from './sendCommand'
109
import { registerEmmet } from './emmet'
@@ -27,13 +26,21 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
2726
isActivated = true
2827
let webWaitingForConfigSync = false
2928

29+
const getResolvedConfig = () => {
30+
const configuration = vscode.workspace.getConfiguration()
31+
const config: any = {
32+
...configuration.get(process.env.IDS_PREFIX!),
33+
editorSuggestInsertModeReplace: configuration.get('editor.suggest.insertMode') === 'replace',
34+
}
35+
mergeSettingsFromScopes(config, 'typescript', extensionCtx.extension.packageJSON)
36+
return config
37+
}
38+
3039
const syncConfig = () => {
3140
if (!tsApi) return
3241
console.log('sending configure request for typescript-essential-plugins')
33-
const config: any = { ...vscode.workspace.getConfiguration().get(process.env.IDS_PREFIX!) }
3442
// todo implement language-specific settings
35-
mergeSettingsFromScopes(config, 'typescript', extensionCtx.extension.packageJSON)
36-
43+
const config = getResolvedConfig()
3744
tsApi.configurePlugin('typescript-essential-plugins', config)
3845

3946
if (process.env.PLATFORM === 'node') {
@@ -50,7 +57,7 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
5057
}
5158

5259
vscode.workspace.onDidChangeConfiguration(async ({ affectsConfiguration }) => {
53-
if (affectsConfiguration(process.env.IDS_PREFIX!)) {
60+
if (affectsConfiguration(process.env.IDS_PREFIX!) || affectsConfiguration('editor.suggest.insertMode')) {
5461
syncConfig()
5562
if (
5663
process.env.PLATFORM === 'node' &&
@@ -72,7 +79,7 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
7279
if (!activeTextEditor || !vscode.languages.match(defaultJsSupersetLangs, activeTextEditor.document)) return
7380
if (!webWaitingForConfigSync) return
7481
// webWaitingForConfigSync = false
75-
const config = vscode.workspace.getConfiguration().get(process.env.IDS_PREFIX!)
82+
const config = getResolvedConfig()
7683
void sendCommand(`updateConfig${JSON.stringify(config)}` as any)
7784
}
7885

typescript/src/completions/functionCompletions.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { oneOf } from '@zardoy/utils'
22
import constructMethodSnippet from '../constructMethodSnippet'
3-
import { insertTextAfterEntry } from '../utils'
3+
import { insertTextAfterEntry, wordRangeAtPos } from '../utils'
44
import { sharedCompletionContext } from './sharedContext'
55

66
export default (entries: ts.CompletionEntry[]) => {
7-
const { languageService, c, sourceFile, position } = sharedCompletionContext
7+
const { languageService, c, sourceFile, position, prior } = sharedCompletionContext
88

99
const methodSnippetInsertTextMode = c('methodSnippetsInsertText')
10-
const nextChar = sourceFile.getFullText().slice(position, position + 1)
10+
const fullText = sourceFile.getFullText()
11+
const nextChar = fullText.slice(position, position + 1)
12+
const prevChar = fullText.slice(position - 1, position)
1113
const isMethodSnippetInsertTextModeEnabled = methodSnippetInsertTextMode !== 'disable'
1214

1315
const enableResolvingInsertText = !['(', '.', '`'].includes(nextChar) && c('enableMethodSnippets') && isMethodSnippetInsertTextModeEnabled
@@ -47,13 +49,21 @@ export default (entries: ts.CompletionEntry[]) => {
4749
if (!methodSnippet || resolveData.isAmbiguous) return
4850
const originalText = entry.insertText ?? entry.name
4951
const insertTextSnippetAdd = `(${methodSnippet.map((x, i) => `$\{${i + 1}:${x}}`).join(', ')})`
52+
// https://github.com/zardoy/typescript-vscode-plugins/issues/161
53+
const beforeDotWorkaround = prior.isMemberCompletion && prevChar === '.'
5054
return {
5155
...entry,
52-
insertText: insertTextAfterEntry(originalText, insertTextSnippetAdd),
56+
insertText: (beforeDotWorkaround ? '.' : '') + insertTextAfterEntry(originalText, insertTextSnippetAdd),
5357
labelDetails: {
5458
detail: `(${methodSnippet.join(', ')})`,
5559
description: ts.displayPartsToString(entry.sourceDisplay),
5660
},
61+
replacementSpan: beforeDotWorkaround
62+
? {
63+
start: position - 1,
64+
length: (c('editorSuggestInsertModeReplace') ? wordRangeAtPos(fullText, position).length : 0) + 1,
65+
}
66+
: undefined,
5767
kind: ts.ScriptElementKind.functionElement,
5868
isSnippet: true,
5969
}

typescript/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ConditionalPick } from 'type-fest'
33
//@ts-expect-error
44
import type { Configuration } from '../../src/configurationType'
55
// eslint-disable-next-line @typescript-eslint/no-redeclare
6-
export type Configuration = Configuration
6+
export type Configuration = Configuration & { editorSuggestInsertModeReplace: boolean }
77
export type GetConfig = <T extends keyof Configuration>(key: T) => Configuration[T]
88
export type LanguageServiceMethodWithConfig<T extends keyof ConditionalPick<ts.LanguageService, (...args) => any>> = (
99
c: GetConfig,

typescript/src/volarConfig.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ const plugin: (...args: Parameters<import('@vue/language-service').Service>) =>
6767

6868
const getResolvedUserConfig = async () => {
6969
const regularConfig = await configurationHost.getConfiguration!<any>('tsEssentialPlugins')
70+
const editorSuggestInsertModeReplace = (await configurationHost.getConfiguration!<any>('editor.suggest.insertMode')) === 'replace'
7071
const _vueSpecificConfig = (await configurationHost.getConfiguration!<any>('[vue]')) || {}
7172

7273
const vueSpecificConfig = Object.fromEntries(
@@ -76,7 +77,7 @@ const plugin: (...args: Parameters<import('@vue/language-service').Service>) =>
7677
),
7778
),
7879
)
79-
const config: Configuration = mergeAndPatchConfig(regularConfig, vueSpecificConfig)
80+
const config: Configuration = { ...mergeAndPatchConfig(regularConfig, vueSpecificConfig), editorSuggestInsertModeReplace }
8081
return config
8182
}
8283

0 commit comments

Comments
 (0)