Skip to content

Commit 800c878

Browse files
rhysdmattn
andauthored
Support show message notification by handling window/showMessage response (#1120)
* support window/showMessage * describe g:lsp_show_message_log_level in documentation * add tests for window/showMessage support Co-authored-by: mattn <[email protected]>
1 parent 7d7ded9 commit 800c878

File tree

5 files changed

+181
-0
lines changed

5 files changed

+181
-0
lines changed

autoload/lsp.vim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ function! lsp#enable() abort
6363
call lsp#internal#diagnostics#_enable()
6464
call lsp#internal#document_code_action#signs#_enable()
6565
call lsp#internal#show_message_request#_enable()
66+
call lsp#internal#show_message#_enable()
6667
call lsp#internal#work_done_progress#_enable()
6768
call lsp#internal#completion#documentation#_enable()
6869
call s:register_events()
@@ -78,6 +79,7 @@ function! lsp#disable() abort
7879
call lsp#internal#diagnostics#_disable()
7980
call lsp#internal#document_code_action#signs#_disable()
8081
call lsp#internal#show_message_request#_disable()
82+
call lsp#internal#show_message#_disable()
8183
call lsp#internal#work_done_progress#_disable()
8284
call lsp#internal#completion#documentation#_disable()
8385
call s:unregister_events()
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
let s:ErrorType = 1
2+
let s:WarningType = 2
3+
let s:InfoType = 3
4+
let s:LogType = 4
5+
6+
function! lsp#internal#show_message#_enable() abort
7+
if g:lsp_show_message_log_level ==# 'none' | return | endif
8+
let s:Dispose = lsp#callbag#pipe(
9+
\ lsp#stream(),
10+
\ lsp#callbag#filter({x->
11+
\ g:lsp_show_message_log_level !=# 'none' &&
12+
\ has_key(x, 'response') && has_key(x['response'], 'method')
13+
\ && x['response']['method'] ==# 'window/showMessage'
14+
\ }),
15+
\ lsp#callbag#tap({x->s:handle_show_message(x['server'], x['response']['params'])}),
16+
\ lsp#callbag#subscribe({ 'error': function('s:on_error') }),
17+
\ )
18+
endfunction
19+
20+
function! lsp#internal#show_message#_disable() abort
21+
if exists('s:Dispose')
22+
call s:Dispose()
23+
unlet s:Dispose
24+
endif
25+
endfunction
26+
27+
function! s:on_error(e) abort
28+
call lsp#log('lsp#internal#show_message error', a:e)
29+
if exists('s:Dispose')
30+
call s:Dispose()
31+
unlet s:Dispose
32+
endif
33+
endfunction
34+
35+
function! s:handle_show_message(server, params) abort
36+
let l:level = s:name_to_level(g:lsp_show_message_log_level)
37+
let l:type = a:params['type']
38+
if l:level < l:type
39+
return
40+
endif
41+
42+
let l:message = a:params['message']
43+
try
44+
if l:type == s:ErrorType
45+
echohl ErrorMsg
46+
elseif l:type == s:WarningType
47+
echohl WarningMsg
48+
endif
49+
echom printf('%s: %s: %s', a:server, s:type_to_name(l:type), l:message)
50+
finally
51+
echohl None
52+
endtry
53+
endfunction
54+
55+
function! s:name_to_level(name) abort
56+
if a:name ==# 'none'
57+
return 0
58+
elseif a:name ==# 'error'
59+
return s:ErrorType
60+
elseif a:name ==# 'warn' || a:name ==# 'warning'
61+
return s:WarningType
62+
elseif a:name ==# 'info'
63+
return s:InfoType
64+
elseif a:name ==# 'log'
65+
return s:LogType
66+
else
67+
return 0
68+
endif
69+
endfunction
70+
71+
function! s:type_to_name(type) abort
72+
return get(['unknown', 'error', 'warning', 'info', 'log'], a:type, 'unknown')
73+
endfunction
74+

doc/vim-lsp.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ CONTENTS *vim-lsp-contents*
7373
g:lsp_tagfunc_source_methods |g:lsp_tagfunc_source_methods|
7474
g:lsp_show_message_request_enabled |g:lsp_show_message_request_enabled|
7575
g:lsp_work_done_progress_enabled |g:lsp_work_done_progress_enabled|
76+
g:lsp_show_message_log_level |g:lsp_show_message_log_level|
7677
Functions |vim-lsp-functions|
7778
lsp#enable |lsp#enable()|
7879
lsp#disable |lsp#disable()|
@@ -913,6 +914,17 @@ g:lsp_work_done_progress_enabled *g:lsp_work_done_progress_enabled*
913914
notifications. This can be intercepted by listening to |lsp#stream()|.
914915
Set to `1` to enable.
915916

917+
g:lsp_show_message_log_level *g:lsp_show_message_log_level*
918+
Type: |String|
919+
Default: `'warning'`
920+
921+
Determines log level of messages sent from LSP servers. Possible values
922+
are one of `'none'`, `'error'`, `'warning'`, `'info'`, `'log'`. Messages
923+
are filtered by the value set to this variable. For example, when
924+
`'warning'` is set, `'error'` level and `'warning'` level messages are
925+
shown but `'info'` level and `'log'` level messages are not shown. Setting
926+
`'none'` disables to show messages completely.
927+
916928
==============================================================================
917929
FUNCTIONS *vim-lsp-functions*
918930

plugin/lsp.vim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ let g:lsp_text_document_did_save_delay = get(g:, 'lsp_text_document_did_save_del
6464
let g:lsp_completion_resolve_timeout = get(g:, 'lsp_completion_resolve_timeout', 200)
6565
let g:lsp_tagfunc_source_methods = get(g:, 'lsp_tagfunc_source_methods', ['definition', 'declaration', 'implementation', 'typeDefinition'])
6666
let g:lsp_show_message_request_enabled = get(g:, 'lsp_show_message_request_enabled', 1)
67+
let g:lsp_show_message_log_level = get(g:, 'lsp_show_message_log_level', 'warning')
6768
let g:lsp_work_done_progress_enabled = get(g:, 'lsp_work_done_progress_enabled', 0)
6869

6970
let g:lsp_get_supported_capabilities = get(g:, 'lsp_get_supported_capabilities', [function('lsp#default_get_supported_capabilities')])
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
let s:Error = 1
2+
let s:Warn = 2
3+
let s:Info = 3
4+
let s:Log = 4
5+
6+
function! s:response(type, message) abort
7+
return {
8+
\ 'server': 'server1',
9+
\ 'response': {
10+
\ 'method': 'window/showMessage',
11+
\ 'params': {
12+
\ 'type': a:type,
13+
\ 'message': a:message
14+
\ }
15+
\ }
16+
\ }
17+
endfunction
18+
19+
Describe lsp#internal#show_message
20+
Before
21+
%bwipeout!
22+
let g:lsp_show_message_log_level = 'warning'
23+
call lsp#internal#show_message#_disable()
24+
call lsp#internal#show_message#_enable()
25+
End
26+
27+
After all
28+
%bwipeout!
29+
let g:lsp_show_message_log_level = 'none'
30+
call lsp#internal#show_message#_disable()
31+
End
32+
33+
It should show all messages when 'log' is set to g:lsp_show_message_log_level
34+
let g:lsp_show_message_log_level = 'log'
35+
36+
redir => message_area
37+
call lsp#stream(1, s:response(s:Error, 'error message'))
38+
call lsp#stream(1, s:response(s:Warn, 'warn message'))
39+
call lsp#stream(1, s:response(s:Info, 'info message'))
40+
call lsp#stream(1, s:response(s:Log, 'log message'))
41+
call lsp#stream(1, s:response(s:Info, 'info message2'))
42+
call lsp#stream(1, s:response(s:Info, 'info message3'))
43+
redir END
44+
45+
Assert Match(message_area, 'server1: error: error message')
46+
Assert Match(message_area, 'server1: warning: warn message')
47+
Assert Match(message_area, 'server1: info: info message')
48+
Assert Match(message_area, 'server1: log: log message')
49+
Assert Match(message_area, 'server1: info: info message2')
50+
Assert Match(message_area, 'server1: info: info message3')
51+
End
52+
53+
It should filter shown messages by log level set to g:lsp_show_message_log_level
54+
let g:lsp_show_message_log_level = 'warning'
55+
56+
redir => message_area
57+
call lsp#stream(1, s:response(s:Error, 'error message'))
58+
call lsp#stream(1, s:response(s:Warn, 'warn message'))
59+
call lsp#stream(1, s:response(s:Info, 'info message'))
60+
call lsp#stream(1, s:response(s:Log, 'log message'))
61+
call lsp#stream(1, s:response(s:Info, 'info message2'))
62+
call lsp#stream(1, s:response(s:Info, 'info message3'))
63+
redir END
64+
65+
Assert Match(message_area, 'server1: error: error message')
66+
Assert Match(message_area, 'server1: warning: warn message')
67+
Assert NotMatch(message_area, 'server1: info: info message')
68+
Assert NotMatch(message_area, 'server1: log: log message')
69+
Assert NotMatch(message_area, 'server1: info: info message2')
70+
Assert NotMatch(message_area, 'server1: info: info message3')
71+
End
72+
73+
It should show no message when 'none' is set to g:lsp_show_message_log_level
74+
let g:lsp_show_message_log_level = 'none'
75+
76+
redir => message_area
77+
call lsp#stream(1, s:response(s:Error, 'error message'))
78+
call lsp#stream(1, s:response(s:Warn, 'warn message'))
79+
call lsp#stream(1, s:response(s:Info, 'info message'))
80+
call lsp#stream(1, s:response(s:Log, 'log message'))
81+
call lsp#stream(1, s:response(s:Info, 'info message2'))
82+
call lsp#stream(1, s:response(s:Info, 'info message3'))
83+
redir END
84+
85+
Assert NotMatch(message_area, 'server1: error: error message')
86+
Assert NotMatch(message_area, 'server1: warning: warn message')
87+
Assert NotMatch(message_area, 'server1: info: info message')
88+
Assert NotMatch(message_area, 'server1: log: log message')
89+
Assert NotMatch(message_area, 'server1: info: info message2')
90+
Assert NotMatch(message_area, 'server1: info: info message3')
91+
End
92+
End

0 commit comments

Comments
 (0)