Skip to content

Commit e2a60c7

Browse files
authored
Merge pull request #95 from zardoy/develop
2 parents 0d34cb0 + 1148454 commit e2a60c7

File tree

11 files changed

+118
-220
lines changed

11 files changed

+118
-220
lines changed

src/configurationType.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -249,15 +249,6 @@ export type Configuration = {
249249
* @default false
250250
*/
251251
'jsxImproveElementsSuggestions.filterNamespaces': boolean
252-
/**
253-
* @default false
254-
*/
255-
'experimentalPostfixes.enable': boolean
256-
/**
257-
* Disable specific postfixes from this plugin
258-
* @default []
259-
*/
260-
'experimentalPostfixes.disablePostfixes': string[]
261252
/**
262253
* Requires TS server restart
263254
* @default false

src/experimentalPostfixes.ts

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/extension.ts

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
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 { extensionCtx, getExtensionSettingId } from 'vscode-framework'
4+
import { extensionCtx, getExtensionSetting, getExtensionSettingId } from 'vscode-framework'
55
import { pickObj } from '@zardoy/utils'
6+
import { watchExtensionSettings } from '@zardoy/vscode-utils/build/settings'
67
import { Configuration } from './configurationType'
78
import webImports from './webImports'
89
import { sendCommand } from './sendCommand'
910
import { registerEmmet } from './emmet'
10-
import experimentalPostfixes from './experimentalPostfixes'
1111
import migrateSettings from './migrateSettings'
1212
import figIntegration from './figIntegration'
1313
import apiCommands from './apiCommands'
@@ -16,13 +16,21 @@ import specialCommands from './specialCommands'
1616
import vueVolarSupport from './vueVolarSupport'
1717
import moreCompletions from './moreCompletions'
1818

19-
export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted }) => {
19+
let isActivated = false
20+
// let erroredStatusBarItem: vscode.StatusBarItem | undefined
21+
22+
export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted } | undefined) => {
23+
if (isActivated) return
24+
isActivated = true
2025
let webWaitingForConfigSync = false
2126

2227
const syncConfig = () => {
28+
if (!tsApi) return
2329
console.log('sending configure request for typescript-essential-plugins')
2430
const config = vscode.workspace.getConfiguration().get(process.env.IDS_PREFIX!)
2531

32+
tsApi.configurePlugin('typescript-essential-plugins', config)
33+
2634
if (process.env.PLATFORM === 'node') {
2735
// see comment in plugin
2836
require('fs').writeFileSync(
@@ -31,8 +39,6 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
3139
)
3240
}
3341

34-
tsApi.configurePlugin('typescript-essential-plugins', config)
35-
3642
if (process.env.PLATFORM === 'web') {
3743
webWaitingForConfigSync = true
3844
}
@@ -49,7 +55,7 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
4955
})
5056
syncConfig()
5157

52-
onCompletionAccepted(tsApi)
58+
if (tsApi) onCompletionAccepted(tsApi)
5359

5460
if (process.env.PLATFORM === 'web') {
5561
const possiblySyncConfig = async () => {
@@ -65,7 +71,6 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
6571
void possiblySyncConfig()
6672
}
6773

68-
experimentalPostfixes()
6974
moreCompletions()
7075
void registerEmmet()
7176
webImports()
@@ -81,24 +86,47 @@ export const activate = async () => {
8186

8287
const possiblyActivateTsPlugin = async () => {
8388
const tsExtension = vscode.extensions.getExtension('vscode.typescript-language-features')
84-
if (!tsExtension) return
89+
if (tsExtension) {
90+
await tsExtension.activate()
91+
92+
if (!tsExtension.exports || !tsExtension.exports.getAPI) {
93+
throw new Error("TS extension doesn't export API")
94+
}
95+
96+
// Get the API from the TS extension
97+
const api = tsExtension.exports.getAPI(0)
98+
if (!api) {
99+
throw new Error("TS extension doesn't have API")
100+
}
85101

86-
await tsExtension.activate()
102+
activateTsPlugin(api)
103+
return true
104+
}
87105

88-
if (!tsExtension.exports || !tsExtension.exports.getAPI) return
106+
if (vscode.extensions.getExtension('Vue.volar') && getExtensionSetting('enableVueSupport')) {
107+
activateTsPlugin(undefined)
108+
return true
109+
}
89110

90-
// Get the API from the TS extension
91-
const api = tsExtension.exports.getAPI(0)
92-
if (!api) return
93-
activateTsPlugin(api)
94-
return true
111+
return false
95112
}
96113

97114
const isActivated = (await possiblyActivateTsPlugin()) ?? false
98115
if (!isActivated) {
99-
// can be also used in future, for now only when activating TS extension manually
100-
const { dispose } = vscode.extensions.onDidChange(async () => {
101-
if (await possiblyActivateTsPlugin()) dispose()
116+
// can be also used in future, for now only when activating TS or Volar extension manually
117+
const disposables = []
118+
const { dispose } = vscode.extensions.onDidChange(
119+
async () => {
120+
if (await possiblyActivateTsPlugin()) dispose()
121+
},
122+
undefined,
123+
disposables,
124+
)
125+
watchExtensionSettings(['enableVueSupport'], async () => {
126+
if (await possiblyActivateTsPlugin()) {
127+
// todo
128+
// disposables.forEach(d => d.dispose())
129+
}
102130
})
103131
}
104132
}

src/moreCompletions.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,20 @@ export default () => {
66
defaultJsSupersetLangsWithVue,
77
{
88
provideCompletionItems(document, position, token, context) {
9-
const regex = /\/\/@?[\w-]*/
9+
const regex = /\/\/ ?@?[\w-]*/
1010
let range = document.getWordRangeAtPosition(position, regex)
1111
if (!range) return
1212
const rangeText = document.getText(range)
1313
if (rangeText !== document.lineAt(position).text.trim()) {
1414
return
1515
}
1616

17-
range = range.with(range.start.translate(0, 2), range.end)
17+
range = range.with(range.start.translate(0, rangeText.indexOf('@')), range.end)
1818
const tsDirectives = ['@ts-format-ignore-line', '@ts-format-ignore-region', '@ts-format-ignore-endregion']
1919
return tsDirectives.map((directive, i) => {
2020
const completionItem = new vscode.CompletionItem(directive, vscode.CompletionItemKind.Snippet)
2121
completionItem.range = range
22-
completionItem.sortText = `z${i}`
22+
completionItem.sortText = `@z${i}`
2323
return completionItem
2424
})
2525
},

src/sendCommand.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as vscode from 'vscode'
22
import { getActiveRegularEditor } from '@zardoy/vscode-utils'
33
import { getExtensionSetting } from 'vscode-framework'
4-
import { TriggerCharacterCommand } from '../typescript/src/ipcTypes'
4+
import { passthroughExposedApiCommands, TriggerCharacterCommand } from '../typescript/src/ipcTypes'
55

66
type SendCommandData<K> = {
77
position: vscode.Position
@@ -10,7 +10,22 @@ type SendCommandData<K> = {
1010
}
1111
export const sendCommand = async <T, K = any>(command: TriggerCharacterCommand, sendCommandDataArg?: SendCommandData<K>): Promise<T | undefined> => {
1212
// plugin id disabled, languageService would not understand the special trigger character
13-
if (!getExtensionSetting('enablePlugin')) return
13+
if (!getExtensionSetting('enablePlugin')) {
14+
console.warn('Ignoring request because plugin is disabled')
15+
return
16+
}
17+
18+
if (!vscode.extensions.getExtension('vscode.typescript-language-features')) {
19+
const message = 'Special commands are not supported in Volar takeover mode'
20+
if (passthroughExposedApiCommands.includes(command as any)) {
21+
// don't spam in case of api command
22+
console.error(message)
23+
} else {
24+
throw new Error(message)
25+
}
26+
27+
return
28+
}
1429

1530
if (sendCommandDataArg?.inputOptions) {
1631
command = `${command}?${JSON.stringify(sendCommandDataArg.inputOptions)}` as any

typescript/src/codeFixes.ts

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import _ from 'lodash'
22
import addMissingProperties from './codeFixes/addMissingProperties'
33
import { changeSortingOfAutoImport, getIgnoreAutoImportSetting, isAutoImportEntryShouldBeIgnored } from './adjustAutoImports'
44
import { GetConfig } from './types'
5-
import { findChildContainingPosition, getIndentFromPos } from './utils'
5+
import { findChildContainingPosition, getIndentFromPos, patchMethod } from './utils'
66

77
// codeFixes that I managed to put in files
88
const externalCodeFixes = [addMissingProperties]
@@ -166,31 +166,41 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService,
166166
const ignoreAutoImportsSetting = getIgnoreAutoImportSetting(c)
167167
for (const diagnostic of semanticDiagnostics) {
168168
if (!errorCodes.includes(diagnostic.code)) continue
169-
const oldFirst = tsFull.first
170-
const oldForEachExternalModuleToImportFrom = tsFull.forEachExternalModuleToImportFrom
169+
const toUnpatch: (() => any)[] = []
171170
try {
172-
tsFull.first = ((fixes: FixInfo[]) => {
173-
const sortFn = changeSortingOfAutoImport(c, fixes[0]!.symbolName)
174-
fixes = _.sortBy(
175-
fixes.filter(({ fix, symbolName }) => {
176-
if (fix.kind === (ImportFixKind.PromoteTypeOnly as number)) return false
177-
const shouldBeIgnored =
178-
c('autoImport.alwaysIgnoreInImportAll').includes(fix.moduleSpecifier) ||
179-
isAutoImportEntryShouldBeIgnored(ignoreAutoImportsSetting, fix.moduleSpecifier, symbolName)
180-
return !shouldBeIgnored
181-
}),
182-
({ fix }) => sortFn(fix.moduleSpecifier),
183-
)
184-
return fixes[0]
185-
}) as any
186-
// patching is fun
187-
tsFull.forEachExternalModuleToImportFrom = (program, host, preferences, _useAutoImportProvider, cb) => {
188-
return oldForEachExternalModuleToImportFrom(program, host, preferences, true, cb)
189-
}
171+
toUnpatch.push(
172+
patchMethod(
173+
tsFull,
174+
'first',
175+
() =>
176+
((fixes: FixInfo[]) => {
177+
const sortFn = changeSortingOfAutoImport(c, fixes[0]!.symbolName)
178+
fixes = _.sortBy(
179+
fixes.filter(({ fix, symbolName }) => {
180+
if (fix.kind === (ImportFixKind.PromoteTypeOnly as number)) return false
181+
const shouldBeIgnored =
182+
c('autoImport.alwaysIgnoreInImportAll').includes(fix.moduleSpecifier) ||
183+
isAutoImportEntryShouldBeIgnored(ignoreAutoImportsSetting, fix.moduleSpecifier, symbolName)
184+
return !shouldBeIgnored
185+
}),
186+
({ fix }) => sortFn(fix.moduleSpecifier),
187+
)
188+
return fixes[0]
189+
}) as any,
190+
),
191+
patchMethod(
192+
tsFull,
193+
'forEachExternalModuleToImportFrom',
194+
oldForEachExternalModuleToImportFrom => (program, host, preferences, _useAutoImportProvider, cb) => {
195+
return oldForEachExternalModuleToImportFrom(program, host, preferences, true, cb)
196+
},
197+
),
198+
)
190199
importAdder.addImportFromDiagnostic({ ...diagnostic, file: sourceFile as any } as any, context)
191200
} finally {
192-
tsFull.first = oldFirst
193-
tsFull.forEachExternalModuleToImportFrom = oldForEachExternalModuleToImportFrom
201+
for (const unpatch of toUnpatch) {
202+
unpatch()
203+
}
194204
}
195205
}
196206
return tsFull.codefix.createCombinedCodeActions(tsFull.textChanges.ChangeTracker.with(context, importAdder.writeFixes))

typescript/src/completions/postfixesAtPosition.ts

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)