Skip to content

Commit e47ea7f

Browse files
authored
Add implementation for clangd's textDocument/switchSourceHeader (#1105)
1 parent 8c779dd commit e47ea7f

File tree

6 files changed

+50
-0
lines changed

6 files changed

+50
-0
lines changed

autoload/LanguageClient.vim

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,15 @@ function! LanguageClient#findLocations(...) abort
808808
return LanguageClient#Call('languageClient/findLocations', l:params, l:Callback)
809809
endfunction
810810

811+
function! LanguageClient#textDocument_switchSourceHeader(...) abort
812+
let l:Callback = get(a:000, 1, v:null)
813+
let l:params = {
814+
\ 'filename': LSP#filename(),
815+
\ }
816+
call extend(l:params, get(a:000, 0, {}))
817+
return LanguageClient#Call('textDocument/switchSourceHeader', l:params, l:Callback)
818+
endfunction
819+
811820
function! LanguageClient#textDocument_definition(...) abort
812821
let l:params = {
813822
\ 'method': 'textDocument/definition',

doc/LanguageClient.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,10 @@ Signature: LanguageClient#diagnosticsPrevious()
974974

975975
Moves the cursor to the previous diagnostic in the buffer, relative to the current cursor position.
976976

977+
*LanguageClient#textDocument_switchSourceHeader*
978+
Signature: LanguageClient#textDocument_switchSourceHeader(...)
979+
980+
Calls clangd's `textDocument/switchSourceHeader` extension request.
977981

978982
==============================================================================
979983
5. Mappings *LanguageClientMappings*

plugin/LanguageClient.vim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ function! LanguageClient_explainErrorAtPoint(...)
146146
return call('LanguageClient#explainErrorAtPoint', a:000)
147147
endfunction
148148

149+
function! LanguageClient_textDocument_switchSourceHeader(...)
150+
return call('LanguageClient#textDocument_switchSourceHeader', a:000)
151+
endfunction
152+
149153
command! -nargs=* LanguageClientStart :call LanguageClient#startServer(<f-args>)
150154
command! LanguageClientStop :call LanguageClient#exit()
151155

src/extensions/clangd.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use crate::{language_client::LanguageClient, utils::ToUrl};
2+
use anyhow::Result;
3+
use jsonrpc_core::Value;
4+
use lsp_types::TextDocumentIdentifier;
5+
6+
pub mod request {
7+
pub const SWITCH_SOURCE_HEADER: &str = "textDocument/switchSourceHeader";
8+
}
9+
10+
impl LanguageClient {
11+
pub fn text_document_switch_source_header(&self, params: &Value) -> Result<Value> {
12+
let filename = self.vim()?.get_filename(params)?;
13+
let language_id = self.vim()?.get_language_id(&filename, &Value::Null)?;
14+
let params = TextDocumentIdentifier {
15+
uri: filename.to_url()?,
16+
};
17+
18+
let response: String = self
19+
.get_client(&Some(language_id))?
20+
.call(request::SWITCH_SOURCE_HEADER, params)?;
21+
22+
let path = std::path::Path::new(&response);
23+
self.vim()?.edit(&None, path)?;
24+
25+
Ok(Value::Null)
26+
}
27+
}

src/extensions/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod clangd;
12
pub mod gopls;
23
pub mod java;
34
pub mod rust_analyzer;

src/rpchandler.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::extensions::clangd;
12
use crate::{language_client::LanguageClient, language_server_protocol::Direction, types::*};
23
use anyhow::{anyhow, Result};
34
use log::*;
@@ -118,6 +119,10 @@ impl LanguageClient {
118119
REQUEST_SEMANTIC_SCOPES => self.semantic_scopes(&params),
119120
REQUEST_SHOW_SEMANTIC_HL_SYMBOLS => self.semantic_highlight_symbols(&params),
120121

122+
clangd::request::SWITCH_SOURCE_HEADER => {
123+
self.text_document_switch_source_header(&params)
124+
}
125+
121126
_ => {
122127
let language_id_target = if language_id.is_some() {
123128
// Message from language server. No handler found.

0 commit comments

Comments
 (0)