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,
pub debug: bool,
pub goto_type_def: bool,
pub links_in_hover: bool,
+ pub markdown: bool,
}
impl Default for HoverConfig {
debug: true,
goto_type_def: true,
links_in_hover: true,
+ markdown: true,
}
}
}
debug: false,
goto_type_def: false,
links_in_hover: true,
+ markdown: true,
};
pub fn any(&self) -> bool {
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();
};
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())
}
};
- 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))
}
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];
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];
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)
}
);
}
+ #[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(
AssistConfig, CompletionConfig, DiagnosticsConfig, HoverConfig, InlayHintsConfig,
MergeBehaviour,
};
-use lsp_types::ClientCapabilities;
+use lsp_types::{ClientCapabilities, MarkupKind};
use project_model::{CargoConfig, ProjectJson, ProjectJsonData, ProjectManifest};
use rustc_hash::FxHashSet;
use serde::Deserialize;
debug: data.hoverActions_enable && data.hoverActions_debug,
goto_type_def: data.hoverActions_enable && data.hoverActions_gotoTypeDef,
links_in_hover: data.hoverActions_linksInHover,
+ markdown: true,
};
log::info!("Config::update() = {:#?}", self);
pub fn update_caps(&mut self, caps: &ClientCapabilities) {
if let Some(doc_caps) = caps.text_document.as_ref() {
+ if let Some(value) = doc_caps.hover.as_ref().and_then(|it| it.content_format.as_ref()) {
+ self.hover.markdown = value.contains(&MarkupKind::Markdown)
+ }
if let Some(value) = doc_caps.definition.as_ref().and_then(|it| it.link_support) {
self.client_caps.location_link = value;
}