Skip to content

Commit b4ed129

Browse files
committed
feat: add getSpanOfEnclosingComment command
refactor exposed ext API commands
1 parent dbab6d7 commit b4ed129

File tree

5 files changed

+38
-23
lines changed

5 files changed

+38
-23
lines changed

src/apiCommands.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import * as vscode from 'vscode'
2+
import { getExtensionCommandId } from 'vscode-framework'
3+
import { passthroughExposedApiCommands, TriggerCharacterCommand } from '../typescript/src/ipcTypes'
4+
import { sendCommand } from './sendCommand'
5+
6+
export default () => {
7+
const sharedRequest = (type: TriggerCharacterCommand, { offset, relativeOffset = 0 }: RequestOptions) => {
8+
const { activeTextEditor } = vscode.window
9+
if (!activeTextEditor) return
10+
const { document, selection } = activeTextEditor
11+
offset ??= document.offsetAt(selection.active) + relativeOffset
12+
return sendCommand(type, { document, position: document.positionAt(offset) })
13+
}
14+
15+
type RequestOptions = Partial<{
16+
offset: number
17+
relativeOffset: number
18+
}>
19+
for (const cmd of passthroughExposedApiCommands)
20+
vscode.commands.registerCommand(getExtensionCommandId(cmd as never), async (options: RequestOptions = {}) => sharedRequest(cmd, options))
21+
}

src/extension.ts

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
import * as vscode from 'vscode'
33
import { defaultJsSupersetLangs } from '@zardoy/vscode-utils/build/langs'
44
import { getActiveRegularEditor } from '@zardoy/vscode-utils'
5-
import { extensionCtx, getExtensionSettingId, getExtensionCommandId } from 'vscode-framework'
5+
import { extensionCtx, getExtensionSettingId } from 'vscode-framework'
66
import { pickObj } from '@zardoy/utils'
7-
import { TriggerCharacterCommand } from '../typescript/src/ipcTypes'
87
import { Configuration } from './configurationType'
98
import webImports from './webImports'
109
import { sendCommand } from './sendCommand'
1110
import { registerEmmet } from './emmet'
1211
import experimentalPostfixes from './experimentalPostfixes'
1312
import migrateSettings from './migrateSettings'
1413
import figIntegration from './figIntegration'
14+
import apiCommands from './apiCommands'
1515

1616
export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted }) => {
1717
let webWaitingForConfigSync = false
@@ -79,23 +79,6 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
7979
}
8080
})
8181

82-
const sharedRequest = (type: TriggerCharacterCommand, { offset, relativeOffset = 0 }: RequestOptions) => {
83-
const { activeTextEditor } = vscode.window
84-
if (!activeTextEditor) return
85-
const { document, selection } = activeTextEditor
86-
offset ??= document.offsetAt(selection.active) + relativeOffset
87-
return sendCommand(type, { document, position: document.positionAt(offset) })
88-
}
89-
90-
type RequestOptions = Partial<{
91-
offset: number
92-
relativeOffset: number
93-
}>
94-
vscode.commands.registerCommand(getExtensionCommandId('getNodeAtPosition' as never), async (options: RequestOptions = {}) =>
95-
sharedRequest('nodeAtPosition', options),
96-
)
97-
vscode.commands.registerCommand(getExtensionCommandId('getNodePath' as never), async (options: RequestOptions = {}) => sharedRequest('nodePath', options))
98-
9982
if (process.env.PLATFORM === 'web') {
10083
const possiblySyncConfig = async () => {
10184
const { activeTextEditor } = vscode.window
@@ -113,6 +96,7 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
11396
experimentalPostfixes()
11497
void registerEmmet()
11598
webImports()
99+
apiCommands()
116100

117101
figIntegration()
118102
}

typescript/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const decorateLanguageService = (info: ts.server.PluginCreateInfo, existingProxy
4646
return { entries: [] }
4747
}
4848
const specialCommandResult = options?.triggerCharacter
49-
? handleSpecialCommand(info, fileName, position, options.triggerCharacter as TriggerCharacterCommand, _configuration)
49+
? handleSpecialCommand(info, fileName, position, options.triggerCharacter as TriggerCharacterCommand, languageService, _configuration)
5050
: undefined
5151
// handled specialCommand request
5252
if (specialCommandResult !== undefined) return specialCommandResult as any

typescript/src/ipcTypes.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
export const triggerCharacterCommands = ['find-in-import', 'getPostfixes', 'nodeAtPosition', 'nodePath', 'emmet-completions'] as const
1+
export const passthroughExposedApiCommands = ['getNodePath', 'getSpanOfEnclosingComment', 'getNodeAtPosition'] as const
2+
3+
export const triggerCharacterCommands = [...passthroughExposedApiCommands, 'emmet-completions', 'getPostfixes'] as const
4+
25
export type TriggerCharacterCommand = typeof triggerCharacterCommands[number]
36

47
export type NodeAtPositionResponse = {

typescript/src/specialCommands/handle.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export default (
88
fileName: string,
99
position: number,
1010
specialCommand: TriggerCharacterCommand,
11+
languageService: ts.LanguageService,
1112
configuration: any,
1213
): void | {
1314
entries: []
@@ -25,14 +26,20 @@ export default (
2526
typescriptEssentialsResponse: getEmmetCompletions(fileName, leftNode, sourceFile, position, info.languageService),
2627
}
2728
}
28-
if (specialCommand === 'nodeAtPosition') {
29+
if (specialCommand === 'getNodeAtPosition') {
2930
const node = findChildContainingPosition(ts, sourceFile, position)
3031
return {
3132
entries: [],
3233
typescriptEssentialsResponse: !node ? undefined : nodeToApiResponse(node),
3334
}
3435
}
35-
if (specialCommand === 'nodePath') {
36+
if (specialCommand === 'getSpanOfEnclosingComment') {
37+
return {
38+
entries: [],
39+
typescriptEssentialsResponse: languageService.getSpanOfEnclosingComment(fileName, position, false),
40+
}
41+
}
42+
if (specialCommand === 'getNodePath') {
3643
const nodes = getNodePath(sourceFile, position)
3744
return {
3845
entries: [],

0 commit comments

Comments
 (0)