Skip to content

Commit f3d6320

Browse files
martskinsautozimu
authored andcommitted
Check if server has CodeLens capability before issuing the call to textDocument/codeLens
1 parent 4ef68cb commit f3d6320

File tree

1 file changed

+57
-26
lines changed

1 file changed

+57
-26
lines changed

src/language_server_protocol.rs

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,41 +1829,72 @@ impl LanguageClient {
18291829
return Ok(Value::Null);
18301830
}
18311831

1832-
info!("Begin {}", lsp::request::CodeLensRequest::METHOD);
18331832
let filename = self.vim()?.get_filename(params)?;
18341833
let language_id = self.vim()?.get_languageId(&filename, params)?;
1835-
let client = self.get_client(&Some(language_id))?;
1836-
let input = lsp::CodeLensParams {
1837-
text_document: TextDocumentIdentifier {
1838-
uri: filename.to_url()?,
1839-
},
1840-
};
1834+
let capabilities = self.get(|state| state.capabilities.clone())?;
1835+
if let Some(initialize_result) = capabilities.get(&language_id) {
1836+
// XXX: the capabilities state field stores the initialize result, not the capabilities
1837+
// themselves, so we need to deserialize to InitializeResult.
1838+
let initialize_result: InitializeResult =
1839+
serde_json::from_value(initialize_result.clone())?;
1840+
let capabilities = initialize_result.capabilities;
1841+
if capabilities.code_lens_provider.is_some() {
1842+
info!("Begin {}", lsp::request::CodeLensRequest::METHOD);
1843+
let client = self.get_client(&Some(language_id))?;
1844+
let input = lsp::CodeLensParams {
1845+
text_document: TextDocumentIdentifier {
1846+
uri: filename.to_url()?,
1847+
},
1848+
};
18411849

1842-
let results: Value = client.call(lsp::request::CodeLensRequest::METHOD, &input)?;
1850+
let results: Value = client.call(lsp::request::CodeLensRequest::METHOD, &input)?;
1851+
let code_lens: Option<Vec<CodeLens>> = serde_json::from_value(results.clone())?;
18431852

1844-
let code_lens: Option<Vec<CodeLens>> = serde_json::from_value(results.clone())?;
1845-
let mut resolved_code_lens = vec![];
1846-
if let Some(code_lens) = code_lens {
1847-
for item in code_lens {
1848-
let mut item = item;
1849-
if let Some(_d) = &item.data {
1850-
if let Some(cl) = client.call(lsp::request::CodeLensResolve::METHOD, &item)? {
1851-
item = cl;
1853+
if capabilities
1854+
.code_lens_provider
1855+
.unwrap()
1856+
.resolve_provider
1857+
.is_some()
1858+
{
1859+
let mut resolved_code_lens = vec![];
1860+
if let Some(code_lens) = code_lens {
1861+
for item in code_lens {
1862+
let mut item = item;
1863+
if let Some(_d) = &item.data {
1864+
if let Some(cl) =
1865+
client.call(lsp::request::CodeLensResolve::METHOD, &item)?
1866+
{
1867+
item = cl;
1868+
}
1869+
}
1870+
resolved_code_lens.push(item);
1871+
}
18521872
}
1873+
1874+
self.update(|state| {
1875+
state
1876+
.code_lens
1877+
.insert(filename.to_owned(), resolved_code_lens);
1878+
Ok(Value::Null)
1879+
})?;
1880+
} else if let Some(code_lens) = code_lens {
1881+
self.update(|state| {
1882+
state.code_lens.insert(filename.to_owned(), code_lens);
1883+
Ok(Value::Null)
1884+
})?;
18531885
}
1854-
resolved_code_lens.push(item);
1886+
1887+
info!("End {}", lsp::request::CodeLensRequest::METHOD);
1888+
return Ok(results);
1889+
} else {
1890+
info!(
1891+
"CodeLens not supported. Skipping {}",
1892+
lsp::request::CodeLensRequest::METHOD
1893+
);
18551894
}
18561895
}
18571896

1858-
self.update(|state| {
1859-
state
1860-
.code_lens
1861-
.insert(filename.to_owned(), resolved_code_lens);
1862-
Ok(Value::Null)
1863-
})?;
1864-
1865-
info!("End {}", lsp::request::CodeLensRequest::METHOD);
1866-
Ok(results)
1897+
Ok(Value::Null)
18671898
}
18681899

18691900
pub fn textDocument_didOpen(&self, params: &Value) -> Fallible<()> {

0 commit comments

Comments
 (0)