Browse Source

implement feature

pull/4/head
KUDO Shunsuke 3 years ago
parent
commit
196b7cee0e
  1. 28
      autoload/ddc_vim_lsp.vim
  2. 42
      denops/ddc/sources/ddc-vim-lsp.ts
  3. 10
      plugin/ddc/ddc-vim-lsp.vim

28
autoload/ddc_vim_lsp.vim

@ -0,0 +1,28 @@
function! ddc_vim_lsp#_callback(server, position, plugin_name, method_name, data) abort
if lsp#client#is_error(a:data) || !has_key(a:data, 'response') || !has_key(a:data['response'], 'result') || !has_key(a:data['response']['result'], 'items')
return
endif
call denops#request(a:plugin_name, a:method_name, [a:data['response']['result']['items']])
endfunction
function! ddc_vim_lsp#request(plugin_name, method_name) abort
let l:servers = lsp#get_allowed_servers()
if len(l:servers) == 0
return
endif
" NOTE: choose first lsp server
let l:server_name = l:servers[0]
let l:server = lsp#get_server_info(l:server_name)
let l:position = lsp#get_position()
call lsp#send_request(l:server_name, {
\ 'method': 'textDocument/completion',
\ 'params': {
\ 'textDocument': lsp#get_text_document_identifier(),
\ 'position': l:position,
\ },
\ 'on_notification': function('ddc_vim_lsp#_callback', [l:server, l:position, a:plugin_name, a:method_name]),
\ })
endfunction

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

@ -0,0 +1,42 @@
import {
BaseSource,
Candidate,
Context,
DdcOptions,
SourceOptions,
} from "https://deno.land/x/ddc_vim@v0.0.11/types.ts#^";
import {
Denops,
} from "https://deno.land/x/ddc_vim@v0.0.11/deps.ts#^";
import {
once
} from "https://deno.land/x/denops_std@v1.0.1/anonymous/mod.ts";
export class Source extends BaseSource {
async gatherCandidates(
denops: Denops,
context: Context,
_ddcOptions: DdcOptions,
_sourceOptions: SourceOptions,
_sourceParams: Record<string, unknown>,
completeStr: string,
): Promise<Candidate[]> {
return new Promise((resolve) => {
denops.call("ddc_vim_lsp#request", denops.name, once(denops, (response) => {
resolve(this.toCandidates(response));
})[0])
})
.then((cs: Candidate[]) => {
return cs;
});
}
toCandidates(response: unknown[]): Candidate[] {
const cs: Candidate[] = response.map((e) => {
return {word: e.label};
});
return cs;
}
}

10
plugin/ddc/ddc-vim-lsp.vim

@ -0,0 +1,10 @@
if exists('g:loaded_ddc_vim_lsp')
finish
endif
let g:loaded_ddc_vim_lsp = 1
silent! call ddc#register_source({
\ 'name': 'ddc-vim-lsp',
\ 'path': printf('%s/denops/ddc/sources/ddc-vim-lsp.ts', fnamemodify(expand('<sfile>'), ':h:h:h')),
\ })
Loading…
Cancel
Save