Skip to content

Commit fce440d

Browse files
author
Junfeng Li
committed
Implement textDocument/typeDefinition and textDocument/implementation.
Close #386.
1 parent 836e600 commit fce440d

File tree

5 files changed

+63
-58
lines changed

5 files changed

+63
-58
lines changed

Cargo.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

autoload/LanguageClient.vim

+34-53
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
if get(g:,"LanguageClient_loaded", 0)
1+
if get(g:, 'LanguageClient_loaded')
22
finish
33
endif
44

@@ -371,7 +371,8 @@ function! LanguageClient#textDocument_hover(...) abort
371371
return LanguageClient#Call('textDocument/hover', l:params, l:callback)
372372
endfunction
373373

374-
function! LanguageClient#textDocument_definition(...) abort
374+
" Meta methods to go to various places.
375+
function! LanguageClient#find_locations(method_name, ...) abort
375376
let l:params = {
376377
\ 'filename': s:Expand('%:p'),
377378
\ 'text': s:Text(),
@@ -382,7 +383,33 @@ function! LanguageClient#textDocument_definition(...) abort
382383
\ }
383384
call extend(l:params, a:0 >= 1 ? a:1 : {})
384385
let l:callback = a:0 >= 2 ? a:2 : v:null
385-
return LanguageClient#Call('textDocument/definition', l:params, l:callback)
386+
return LanguageClient#Call(a:method_name, l:params, l:callback)
387+
endfunction
388+
389+
function! LanguageClient#textDocument_definition(...) abort
390+
return call('LanguageClient#find_locations', ['textDocument/definition'] + a:000)
391+
endfunction
392+
393+
function! LanguageClient#textDocument_typeDefinition(...) abort
394+
return call('LanguageClient#find_locations', ['textDocument/typeDefinition'] + a:000)
395+
endfunction
396+
397+
function! LanguageClient#textDocument_implementation(...) abort
398+
return call('LanguageClient#find_locations', ['textDocument/implementation'] + a:000)
399+
endfunction
400+
401+
function! LanguageClient#textDocument_references(...) abort
402+
let l:callback = get(a:000, 1, v:null)
403+
let l:params = {
404+
\ 'filename': s:Expand('%:p'),
405+
\ 'text': s:Text(),
406+
\ 'line': line('.') - 1,
407+
\ 'character': col('.') - 1,
408+
\ 'includeDeclaration': v:true,
409+
\ 'handle': s:IsFalse(l:callback),
410+
\ }
411+
call extend(l:params, get(a:000, 0, {}))
412+
return LanguageClient#Call('textDocument/references', l:params, l:callback)
386413
endfunction
387414

388415
function! LanguageClient#textDocument_rename(...) abort
@@ -448,20 +475,6 @@ function! LanguageClient#textDocument_completion(...) abort
448475
return LanguageClient#Call('textDocument/completion', l:params, l:callback)
449476
endfunction
450477

451-
function! LanguageClient#textDocument_references(...) abort
452-
let l:callback = get(a:000, 1, v:null)
453-
let l:params = {
454-
\ 'filename': s:Expand('%:p'),
455-
\ 'text': s:Text(),
456-
\ 'line': line('.') - 1,
457-
\ 'character': col('.') - 1,
458-
\ 'includeDeclaration': v:true,
459-
\ 'handle': s:IsFalse(l:callback),
460-
\ }
461-
call extend(l:params, get(a:000, 0, {}))
462-
return LanguageClient#Call('textDocument/references', l:params, l:callback)
463-
endfunction
464-
465478
function! LanguageClient#textDocument_formatting(...) abort
466479
let l:params = {
467480
\ 'filename': s:Expand('%:p'),
@@ -779,51 +792,19 @@ function! LanguageClient#statusLine() abort
779792
endfunction
780793

781794
function! LanguageClient#cquery_base(...) abort
782-
let l:params = {
783-
\ 'filename': s:Expand('%:p'),
784-
\ 'line': line('.') - 1,
785-
\ 'character': col('.') - 1,
786-
\ 'handle': v:true,
787-
\ }
788-
call extend(l:params, a:0 >= 1 ? a:1 : {})
789-
let l:callback = a:0 >= 2 ? a:2 : v:null
790-
return LanguageClient#Call('$cquery/base', l:params, l:callback)
795+
return call('LanguageClient#find_locations', ['$cquery/base'] + a:000)
791796
endfunction
792797

793798
function! LanguageClient#cquery_derived(...) abort
794-
let l:params = {
795-
\ 'filename': s:Expand('%:p'),
796-
\ 'line': line('.') - 1,
797-
\ 'character': col('.') - 1,
798-
\ 'handle': v:true,
799-
\ }
800-
call extend(l:params, a:0 >= 1 ? a:1 : {})
801-
let l:callback = a:0 >= 2 ? a:2 : v:null
802-
return LanguageClient#Call('$cquery/derived', l:params, l:callback)
799+
return call('LanguageClient#find_locations', ['$cquery/derived'] + a:000)
803800
endfunction
804801

805802
function! LanguageClient#cquery_callers(...) abort
806-
let l:params = {
807-
\ 'filename': s:Expand('%:p'),
808-
\ 'line': line('.') - 1,
809-
\ 'character': col('.') - 1,
810-
\ 'handle': v:true,
811-
\ }
812-
call extend(l:params, a:0 >= 1 ? a:1 : {})
813-
let l:callback = a:0 >= 2 ? a:2 : v:null
814-
return LanguageClient#Call('$cquery/callers', l:params, l:callback)
803+
return call('LanguageClient#find_locations', ['$cquery/callers'] + a:000)
815804
endfunction
816805

817806
function! LanguageClient#cquery_vars(...) abort
818-
let l:params = {
819-
\ 'filename': s:Expand('%:p'),
820-
\ 'line': line('.') - 1,
821-
\ 'character': col('.') - 1,
822-
\ 'handle': v:true,
823-
\ }
824-
call extend(l:params, a:0 >= 1 ? a:1 : {})
825-
let l:callback = a:0 >= 2 ? a:2 : v:null
826-
return LanguageClient#Call('$cquery/vars', l:params, l:callback)
807+
return call('LanguageClient#find_locations', ['$cquery/vars'] + a:000)
827808
endfunction
828809

829810
let g:LanguageClient_loaded = s:Launch()

doc/LanguageClient.txt

+13-1
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,19 @@ Show type info (and short doc) of identifier under cursor.
243243
*LanguageClient_textDocument_definition()*
244244
Signature: LanguageClient#textDocument_definition(...)
245245

246-
Goto definition of identifier under cursor.
246+
Goto definition under cursor.
247+
248+
*LanguageClient#textDocument_typeDefinition()*
249+
*LanguageClient_textDocument_typeDefinition()*
250+
Signature: LanguageClient#textDocument_typeDefinition(...)
251+
252+
Goto type definition under cursor.
253+
254+
*LanguageClient#textDocument_implementation()*
255+
*LanguageClient_textDocument_implementation()*
256+
Signature: LanguageClient#textDocument_implementation(...)
257+
258+
Goto implementation under cursor.
247259

248260
*LanguageClient#textDocument_rename()*
249261
*LanguageClient_textDocument_rename()*

plugin/LanguageClient.vim

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ function! LanguageClient_textDocument_definition(...)
66
return call('LanguageClient#textDocument_definition', a:000)
77
endfunction
88

9+
function! LanguageClient_textDocument_typeDefinition(...)
10+
return call('LanguageClient#textDocument_typeDefinition', a:000)
11+
endfunction
12+
13+
function! LanguageClient_textDocument_implementation(...)
14+
return call('LanguageClient#textDocument_implementation', a:000)
15+
endfunction
16+
917
function! LanguageClient_textDocument_rename(...)
1018
return call('LanguageClient#textDocument_rename', a:000)
1119
endfunction

src/rpchandler.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ impl IRpcHandler for Arc<RwLock<State>> {
3838
| m @ REQUEST__CqueryBase
3939
| m @ REQUEST__CqueryCallers
4040
| m @ REQUEST__CqueryDerived
41-
| m @ REQUEST__CqueryVars => self.find_locations(m, &method_call.params),
41+
| m @ REQUEST__CqueryVars
42+
| m @ lsp::request::GotoTypeDefinition::METHOD
43+
| m @ lsp::request::GotoImplementation::METHOD => {
44+
self.find_locations(m, &method_call.params)
45+
}
4246
lsp::request::Rename::METHOD => self.textDocument_rename(&method_call.params),
4347
lsp::request::DocumentSymbol::METHOD => {
4448
self.textDocument_documentSymbol(&method_call.params)

0 commit comments

Comments
 (0)