From 7413c1d9b46acf31d593317b2002cfec319ed6ab Mon Sep 17 00:00:00 2001 From: TJ DeVries Date: Wed, 21 Dec 2016 14:12:02 -0500 Subject: [PATCH] Working on improving callback setup --- autoload/langserver/api/textDocument.vim | 4 +++ autoload/langserver/client.vim | 8 ++++-- autoload/langserver/hover.vim | 5 +++- autoload/langserver/lock.vim | 34 ++++++++++++++++++------ tests/test_lock.vader | 11 ++++++-- 5 files changed, 49 insertions(+), 13 deletions(-) diff --git a/autoload/langserver/api/textDocument.vim b/autoload/langserver/api/textDocument.vim index 25f5e02..6cf3f09 100644 --- a/autoload/langserver/api/textDocument.vim +++ b/autoload/langserver/api/textDocument.vim @@ -7,3 +7,7 @@ function! langserver#api#textDocument#definition(request) abort \ {}, \ ) endfunction + +function! langserver#api#textDocument#completion(request) abort + +endfunction diff --git a/autoload/langserver/client.vim b/autoload/langserver/client.vim index 2e64e54..b2315af 100644 --- a/autoload/langserver/client.vim +++ b/autoload/langserver/client.vim @@ -1,4 +1,4 @@ -let s:lsp_clients = {} " { id, opts, req_seq, on_notifications: { request, on_notification }, stdout: { max_buffer_size, buffer, next_token, current_content_length, current_content_type } } +let s:lsp_clients = {} let s:lsp_token_type_contentlength = 'content-length' let s:lsp_token_type_contenttype = 'content-type' let s:lsp_token_type_message = 'message' @@ -14,11 +14,14 @@ function! s:_on_lsp_stdout(id, data, event) abort " \ 'id': l:lsp_client_id, " \ 'opts': a:opts, " \ 'req_seq': 0, - " \ 'on_notifications': {}, + " \ 'lock': langserver#lock#semaphore(), + " \ 'request_notifications': {}, " \ 'stdout': { " \ 'max_buffer_size': l:max_buffer_size, " \ 'buffer': '', " \ 'next_token': s:lsp_token_type_contentlength, + " \ 'current_content_length': , + " \ 'current_content_type': , " \ }, " \ } let l:client = s:lsp_clients[a:id] @@ -126,6 +129,7 @@ function! s:lsp_start(opts) abort \ 'id': l:lsp_client_id, \ 'opts': a:opts, \ 'req_seq': 0, + \ 'lock': langserver#lock#semaphore(), \ 'on_notifications': {}, \ 'stdout': { \ 'max_buffer_size': l:max_buffer_size, diff --git a/autoload/langserver/hover.vim b/autoload/langserver/hover.vim index 0d357bb..1d1f8d6 100644 --- a/autoload/langserver/hover.vim +++ b/autoload/langserver/hover.vim @@ -20,6 +20,9 @@ function! langserver#hover#request() abort return langserver#client#send(langserver#util#get_lsp_id(), { \ 'method': 'textDocument/hover', \ 'params': langserver#util#get_text_document_position_params(), + \ 'on_notification': { + \ 'callback': function('langserver#hover#callback'), + \ }, \ }) endfunction @@ -38,7 +41,7 @@ function! langserver#hover#display(range, data) abort echo l:hover_string - return timer_start(5000, function('s:delete_highlight')) + return timer_start(3000, function('s:delete_highlight')) endfunction function! s:delete_highlight() abort diff --git a/autoload/langserver/lock.vim b/autoload/langserver/lock.vim index 81a9826..3b99682 100644 --- a/autoload/langserver/lock.vim +++ b/autoload/langserver/lock.vim @@ -1,28 +1,46 @@ +let s:unlocked_id = -1 -function! s:dict_lock() dict - let self.locked = v:true +function! s:dict_lock(job_id) dict + if self.locked == v:false + let self.locked = v:true + let self.id = a:job_id + return v:true + else + return v:false + endif endfunction function! s:dict_unlock() dict + let self.id = s:unlocked_id let self.locked = v:false endfunction -function! s:set_id(job_id) dict - let self.id = a:job_id -endfunction - function! s:get_id() dict return self.id endfunction +function! s:take_lock(job_id) dict + " If we're locked, kill the other job + " And set ourselves to be the current job. + if self.locked + " TODO: Don't actually want to stop the whole server... + " I just want to stop the current request. Maybe a send cancel request + " would be good enough. We will see. + " call langserver#job#stop(self.id) + call self.unlock() + endif + + call self.lock(a:job_id) +endfunction + function! langserver#lock#semaphore() abort let l:ret = { - \ 'id': -1, + \ 'id': s:unlocked_id, \ 'locked': v:false, \ } let l:ret.lock = function('s:dict_lock') let l:ret.unlock = function('s:dict_unlock') - let l:ret.set_id = function('s:set_id') let l:ret.get_id = function('s:get_id') + let l:ret.take_lock = function('s:take_lock') return l:ret endfunction diff --git a/tests/test_lock.vader b/tests/test_lock.vader index f00580c..403c256 100644 --- a/tests/test_lock.vader +++ b/tests/test_lock.vader @@ -3,7 +3,7 @@ Execute (Test Lock): AssertEqual v:false, my_lock.locked - call my_lock.lock() + call my_lock.lock(1) AssertEqual v:true, my_lock.locked call my_lock.unlock() @@ -11,5 +11,12 @@ Execute (Test Lock): AssertEqual -1, my_lock.get_id() - call my_lock.set_id(1) + call my_lock.lock(1) AssertEqual 1, my_lock.get_id() + + let set_result = my_lock.lock(2) + AssertEqual v:false, set_result + AssertEqual 1, my_lock.get_id() + + call my_lock.take_lock(2) + AssertEqual 2, my_lock.get_id()