summaryrefslogtreecommitdiff
path: root/start/cmp/autoload/cmp.vim
blob: 43b8cc282ff59de5e05dad913d7fb63e3c1d4819 (plain)
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
let s:bridge_id = 0
let s:sources = {}

"
" cmp#register_source
"
function! cmp#register_source(name, source) abort
  let l:methods = []
  for l:method in ['is_available', 'get_debug_name', 'get_trigger_characters', 'get_keyword_pattern', 'complete', 'execute', 'resolve']
    if has_key(a:source, l:method) && type(a:source[l:method]) == v:t_func
      call add(l:methods, l:method)
    endif
  endfor

  let s:bridge_id += 1
  let a:source.bridge_id = s:bridge_id
  let a:source.id = luaeval('require("cmp").register_source(_A[1], require("cmp.vim_source").new(_A[2], _A[3]))', [a:name, s:bridge_id, l:methods])
  let s:sources[s:bridge_id] = a:source
  return a:source.id
endfunction

"
" cmp#unregister_source
"
function! cmp#unregister_source(id) abort
  if has_key(s:sources, a:id)
    unlet s:sources[a:id]
  endif
  call luaeval('require("cmp").unregister_source(_A)', a:id)
endfunction

"
" cmp#_method
"
function! cmp#_method(bridge_id, method, args) abort
  try
    let l:source = s:sources[a:bridge_id]
    if a:method ==# 'is_available'
      return l:source[a:method]()
    elseif a:method ==# 'get_debug_name'
      return l:source[a:method]()
    elseif a:method ==# 'get_keyword_pattern'
      return l:source[a:method](a:args[0])
    elseif a:method ==# 'get_trigger_characters'
      return l:source[a:method](a:args[0])
    elseif a:method ==# 'complete'
      return l:source[a:method](a:args[0], s:callback(a:args[1]))
    elseif a:method ==# 'resolve'
      return l:source[a:method](a:args[0], s:callback(a:args[1]))
    elseif a:method ==# 'execute'
      return l:source[a:method](a:args[0], s:callback(a:args[1]))
    endif
  catch /.*/
    echomsg string({ 'exception': v:exception, 'throwpoint': v:throwpoint })
  endtry
  return v:null
endfunction

"
" s:callback
"
function! s:callback(id) abort
  return { ... -> luaeval('require("cmp.vim_source").on_callback(_A[1], _A[2])', [a:id, a:000]) }
endfunction