Skip to content

Commit 61a17a1

Browse files
committed
implement async completion
1 parent 28571a4 commit 61a17a1

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

autoload/ddc_vim_lsp.vim

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
function! ddc_vim_lsp#_callback(server, position, plugin_name, method_name, data) abort
1+
function! ddc_vim_lsp#_callback(server, position, data) abort
22
if lsp#client#is_error(a:data) || !has_key(a:data, 'response') || !has_key(a:data['response'], 'result')
3-
call denops#request(a:plugin_name, a:method_name, [])
43
return
54
endif
65

@@ -10,10 +9,16 @@ function! ddc_vim_lsp#_callback(server, position, plugin_name, method_name, data
109
\ 'response': a:data['response'],
1110
\ }
1211
let lspitems = lsp#omni#get_vim_completion_items(l:options)['items']
13-
call denops#request(a:plugin_name, a:method_name, [lspitems])
12+
13+
if len(lspitems) > 0
14+
let g:ddc#source#ddc_vim_lsp#_results = lspitems
15+
let g:ddc#source#ddc_vim_lsp#_requested = v:true
16+
17+
call ddc#refresh_candidates()
18+
endif
1419
endfunction
1520

16-
function! ddc_vim_lsp#request(server_name, plugin_name, method_name) abort
21+
function! ddc_vim_lsp#request(server_name) abort
1722
let l:server = lsp#get_server_info(a:server_name)
1823
let l:position = lsp#get_position()
1924

@@ -23,6 +28,6 @@ function! ddc_vim_lsp#request(server_name, plugin_name, method_name) abort
2328
\ 'textDocument': lsp#get_text_document_identifier(),
2429
\ 'position': l:position,
2530
\ },
26-
\ 'on_notification': function('ddc_vim_lsp#_callback', [l:server, l:position, a:plugin_name, a:method_name]),
31+
\ 'on_notification': function('ddc_vim_lsp#_callback', [l:server, l:position]),
2732
\ })
2833
endfunction

denops/ddc-sources/ddc-vim-lsp.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,51 @@ import {
44
} from "https://deno.land/x/ddc_vim@v0.4.2/types.ts#^";
55

66
import {
7+
batch,
78
Denops,
9+
vars,
810
} from "https://deno.land/x/ddc_vim@v0.4.2/deps.ts#^";
911

1012
import {
1113
once
1214
} from "https://deno.land/x/denops_std@v1.8.1/anonymous/mod.ts";
1315

1416
export class Source extends BaseSource {
17+
async onInit(args: {
18+
denops: Denops,
19+
}): Promise<void> {
20+
await batch(args.denops, async (denops) => {
21+
vars.g.set(denops, "ddc#source#ddc_vim_lsp#_results", []);
22+
vars.g.set(denops, "ddc#source#ddc_vim_lsp#_requested", false);
23+
vars.g.set(denops, "ddc#source#ddc_vim_lsp#_prev_input", "");
24+
});
25+
}
26+
1527
async gatherCandidates(args: {
1628
denops: Denops,
1729
context: Context,
1830
completeStr: string,
1931
}): Promise<Candidate[]> {
32+
const prevInput = await vars.g.get(args.denops, "ddc#source#ddc_vim_lsp#_prev_input");
33+
const requested = await vars.g.get(args.denops, "ddc#source#ddc_vim_lsp#_requested");
34+
if (args.context.input == prevInput && requested) {
35+
return await vars.g.get(args.denops, "ddc#source#ddc_vim_lsp#_results");
36+
}
2037

2138
const lspservers = await args.denops.call("lsp#get_allowed_servers");
2239
if (lspservers.length === 0) {
2340
return [];
2441
}
2542

26-
return new Promise((resolve) => {
43+
await batch(args.denops, async (denops) => {
44+
vars.g.set(denops, "ddc#source#ddc_vim_lsp#_results", []);
45+
vars.g.set(denops, "ddc#source#ddc_vim_lsp#_requested", false);
46+
vars.g.set(denops, "ddc#source#ddc_vim_lsp#_prev_input", args.context.input);
47+
2748
// NOTE: choose first lsp server
28-
args.denops.call("ddc_vim_lsp#request", lspservers[0], args.denops.name, once(args.denops, (response) => {
29-
resolve(response);
30-
})[0])
31-
})
32-
.then((cs: Candidate[]) => {
33-
return cs;
49+
denops.call("ddc_vim_lsp#request", lspservers[0]);
3450
});
51+
52+
return [];
3553
}
3654
}

0 commit comments

Comments
 (0)