mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
Merge #6140
6140: honour hover.content_format client capability r=lnicola a=robinvd This removes all markdown when the client does not support the markdown MarkupKind. Otherwise the output on the editor will have some markdown boilerplate, making it less readable. For example kak_lsp does not currently support markdown.  after:  Co-authored-by: Robin van Dijk <robin@robinjint.nl>
This commit is contained in:
commit
57735f2a32
5 changed files with 81 additions and 9 deletions
|
@ -15,6 +15,7 @@ use test_utils::mark;
|
|||
use crate::{
|
||||
display::{macro_label, ShortLabel, ToNav, TryToNav},
|
||||
link_rewrite::{remove_links, rewrite_links},
|
||||
markdown_remove::remove_markdown,
|
||||
markup::Markup,
|
||||
runnables::runnable,
|
||||
FileId, FilePosition, NavigationTarget, RangeInfo, Runnable,
|
||||
|
@ -27,6 +28,7 @@ pub struct HoverConfig {
|
|||
pub debug: bool,
|
||||
pub goto_type_def: bool,
|
||||
pub links_in_hover: bool,
|
||||
pub markdown: bool,
|
||||
}
|
||||
|
||||
impl Default for HoverConfig {
|
||||
|
@ -37,6 +39,7 @@ impl Default for HoverConfig {
|
|||
debug: true,
|
||||
goto_type_def: true,
|
||||
links_in_hover: true,
|
||||
markdown: true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -48,6 +51,7 @@ impl HoverConfig {
|
|||
debug: false,
|
||||
goto_type_def: false,
|
||||
links_in_hover: true,
|
||||
markdown: true,
|
||||
};
|
||||
|
||||
pub fn any(&self) -> bool {
|
||||
|
@ -91,6 +95,7 @@ pub(crate) fn hover(
|
|||
db: &RootDatabase,
|
||||
position: FilePosition,
|
||||
links_in_hover: bool,
|
||||
markdown: bool,
|
||||
) -> Option<RangeInfo<HoverResult>> {
|
||||
let sema = Semantics::new(db);
|
||||
let file = sema.parse(position.file_id).syntax().clone();
|
||||
|
@ -109,7 +114,9 @@ pub(crate) fn hover(
|
|||
};
|
||||
if let Some(definition) = definition {
|
||||
if let Some(markup) = hover_for_definition(db, definition) {
|
||||
let markup = if links_in_hover {
|
||||
let markup = if !markdown {
|
||||
remove_markdown(&markup.as_str())
|
||||
} else if links_in_hover {
|
||||
rewrite_links(db, &markup.as_str(), &definition)
|
||||
} else {
|
||||
remove_links(&markup.as_str())
|
||||
|
@ -147,7 +154,11 @@ pub(crate) fn hover(
|
|||
}
|
||||
};
|
||||
|
||||
res.markup = Markup::fenced_block(&ty.display(db));
|
||||
res.markup = if markdown {
|
||||
Markup::fenced_block(&ty.display(db))
|
||||
} else {
|
||||
ty.display(db).to_string().into()
|
||||
};
|
||||
let range = sema.original_range(&node).range;
|
||||
Some(RangeInfo::new(range, res))
|
||||
}
|
||||
|
@ -383,12 +394,12 @@ mod tests {
|
|||
|
||||
fn check_hover_no_result(ra_fixture: &str) {
|
||||
let (analysis, position) = fixture::position(ra_fixture);
|
||||
assert!(analysis.hover(position, true).unwrap().is_none());
|
||||
assert!(analysis.hover(position, true, true).unwrap().is_none());
|
||||
}
|
||||
|
||||
fn check(ra_fixture: &str, expect: Expect) {
|
||||
let (analysis, position) = fixture::position(ra_fixture);
|
||||
let hover = analysis.hover(position, true).unwrap().unwrap();
|
||||
let hover = analysis.hover(position, true, true).unwrap().unwrap();
|
||||
|
||||
let content = analysis.db.file_text(position.file_id);
|
||||
let hovered_element = &content[hover.range];
|
||||
|
@ -399,7 +410,18 @@ mod tests {
|
|||
|
||||
fn check_hover_no_links(ra_fixture: &str, expect: Expect) {
|
||||
let (analysis, position) = fixture::position(ra_fixture);
|
||||
let hover = analysis.hover(position, false).unwrap().unwrap();
|
||||
let hover = analysis.hover(position, false, true).unwrap().unwrap();
|
||||
|
||||
let content = analysis.db.file_text(position.file_id);
|
||||
let hovered_element = &content[hover.range];
|
||||
|
||||
let actual = format!("*{}*\n{}\n", hovered_element, hover.info.markup);
|
||||
expect.assert_eq(&actual)
|
||||
}
|
||||
|
||||
fn check_hover_no_markdown(ra_fixture: &str, expect: Expect) {
|
||||
let (analysis, position) = fixture::position(ra_fixture);
|
||||
let hover = analysis.hover(position, true, false).unwrap().unwrap();
|
||||
|
||||
let content = analysis.db.file_text(position.file_id);
|
||||
let hovered_element = &content[hover.range];
|
||||
|
@ -410,7 +432,7 @@ mod tests {
|
|||
|
||||
fn check_actions(ra_fixture: &str, expect: Expect) {
|
||||
let (analysis, position) = fixture::position(ra_fixture);
|
||||
let hover = analysis.hover(position, true).unwrap().unwrap();
|
||||
let hover = analysis.hover(position, true, true).unwrap().unwrap();
|
||||
expect.assert_debug_eq(&hover.info.actions)
|
||||
}
|
||||
|
||||
|
@ -433,6 +455,23 @@ fn main() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hover_remove_markdown_if_configured() {
|
||||
check_hover_no_markdown(
|
||||
r#"
|
||||
pub fn foo() -> u32 { 1 }
|
||||
|
||||
fn main() {
|
||||
let foo_test = foo()<|>;
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
*foo()*
|
||||
u32
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hover_shows_long_type_of_an_expression() {
|
||||
check(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue