/
completeResolve.ts
67 lines (52 loc) · 1.69 KB
/
completeResolve.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { transformCompletionItem } from '@volar/transforms';
import * as vscode from 'vscode-languageserver-protocol';
import type { LanguageServiceRuntimeContext } from '../types';
import { PluginCompletionData } from './complete';
export function register(context: LanguageServiceRuntimeContext) {
return async (item: vscode.CompletionItem) => {
const data: PluginCompletionData | undefined = item.data;
if (data) {
const plugin = context.plugins[data.pluginId];
if (!plugin)
return item;
if (!plugin.complete?.resolve)
return item;
const originalItem = data.originalItem;
if (data.map) {
for (const [_, map] of context.documents.getMapsByVirtualFileUri(data.map.embeddedDocumentUri)) {
const resolvedItem = await plugin.complete.resolve(originalItem);
// fix https://github.com/johnsoncodehk/volar/issues/916
if (resolvedItem.additionalTextEdits) {
for (const edit of resolvedItem.additionalTextEdits) {
if (
edit.range.start.line === 0
&& edit.range.start.character === 0
&& edit.range.end.line === 0
&& edit.range.end.character === 0
) {
edit.newText = '\n' + edit.newText;
}
}
}
item = transformCompletionItem(
resolvedItem,
embeddedRange => {
let range = plugin.resolveEmbeddedRange?.(embeddedRange);
if (range) return range;
return map.toSourceRange(embeddedRange);
},
map.virtualFileDocument,
);
}
}
else {
item = await plugin.complete.resolve(originalItem);
}
}
// TODO: monkey fix import ts file icon
if (item.detail !== item.detail + '.ts') {
item.detail = item.detail;
}
return item;
};
}