@@ -14,7 +14,7 @@ use test_utils::mark;
1414
1515use crate :: {
1616 display:: { macro_label, ShortLabel , ToNav , TryToNav } ,
17- link_rewrite:: rewrite_links,
17+ link_rewrite:: { remove_links , rewrite_links} ,
1818 markup:: Markup ,
1919 runnables:: runnable,
2020 FileId , FilePosition , NavigationTarget , RangeInfo , Runnable ,
@@ -26,17 +26,29 @@ pub struct HoverConfig {
2626 pub run : bool ,
2727 pub debug : bool ,
2828 pub goto_type_def : bool ,
29+ pub links_in_hover : bool ,
2930}
3031
3132impl Default for HoverConfig {
3233 fn default ( ) -> Self {
33- Self { implementations : true , run : true , debug : true , goto_type_def : true }
34+ Self {
35+ implementations : true ,
36+ run : true ,
37+ debug : true ,
38+ goto_type_def : true ,
39+ links_in_hover : true ,
40+ }
3441 }
3542}
3643
3744impl HoverConfig {
38- pub const NO_ACTIONS : Self =
39- Self { implementations : false , run : false , debug : false , goto_type_def : false } ;
45+ pub const NO_ACTIONS : Self = Self {
46+ implementations : false ,
47+ run : false ,
48+ debug : false ,
49+ goto_type_def : false ,
50+ links_in_hover : true ,
51+ } ;
4052
4153 pub fn any ( & self ) -> bool {
4254 self . implementations || self . runnable ( ) || self . goto_type_def
@@ -75,7 +87,11 @@ pub struct HoverResult {
7587//
7688// Shows additional information, like type of an expression or documentation for definition when "focusing" code.
7789// Focusing is usually hovering with a mouse, but can also be triggered with a shortcut.
78- pub ( crate ) fn hover ( db : & RootDatabase , position : FilePosition ) -> Option < RangeInfo < HoverResult > > {
90+ pub ( crate ) fn hover (
91+ db : & RootDatabase ,
92+ position : FilePosition ,
93+ links_in_hover : bool ,
94+ ) -> Option < RangeInfo < HoverResult > > {
7995 let sema = Semantics :: new ( db) ;
8096 let file = sema. parse ( position. file_id ) . syntax ( ) . clone ( ) ;
8197 let token = pick_best ( file. token_at_offset ( position. offset ) ) ?;
@@ -93,7 +109,11 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option<RangeIn
93109 } ;
94110 if let Some ( definition) = definition {
95111 if let Some ( markup) = hover_for_definition ( db, definition) {
96- let markup = rewrite_links ( db, & markup. as_str ( ) , & definition) ;
112+ let markup = if links_in_hover {
113+ rewrite_links ( db, & markup. as_str ( ) , & definition)
114+ } else {
115+ remove_links ( & markup. as_str ( ) )
116+ } ;
97117 res. markup = Markup :: from ( markup) ;
98118 if let Some ( action) = show_implementations_action ( db, definition) {
99119 res. actions . push ( action) ;
@@ -363,12 +383,23 @@ mod tests {
363383
364384 fn check_hover_no_result ( ra_fixture : & str ) {
365385 let ( analysis, position) = analysis_and_position ( ra_fixture) ;
366- assert ! ( analysis. hover( position) . unwrap( ) . is_none( ) ) ;
386+ assert ! ( analysis. hover( position, true ) . unwrap( ) . is_none( ) ) ;
367387 }
368388
369389 fn check ( ra_fixture : & str , expect : Expect ) {
370390 let ( analysis, position) = analysis_and_position ( ra_fixture) ;
371- let hover = analysis. hover ( position) . unwrap ( ) . unwrap ( ) ;
391+ let hover = analysis. hover ( position, true ) . unwrap ( ) . unwrap ( ) ;
392+
393+ let content = analysis. db . file_text ( position. file_id ) ;
394+ let hovered_element = & content[ hover. range ] ;
395+
396+ let actual = format ! ( "*{}*\n {}\n " , hovered_element, hover. info. markup) ;
397+ expect. assert_eq ( & actual)
398+ }
399+
400+ fn check_hover_no_links ( ra_fixture : & str , expect : Expect ) {
401+ let ( analysis, position) = analysis_and_position ( ra_fixture) ;
402+ let hover = analysis. hover ( position, false ) . unwrap ( ) . unwrap ( ) ;
372403
373404 let content = analysis. db . file_text ( position. file_id ) ;
374405 let hovered_element = & content[ hover. range ] ;
@@ -379,7 +410,7 @@ mod tests {
379410
380411 fn check_actions ( ra_fixture : & str , expect : Expect ) {
381412 let ( analysis, position) = analysis_and_position ( ra_fixture) ;
382- let hover = analysis. hover ( position) . unwrap ( ) . unwrap ( ) ;
413+ let hover = analysis. hover ( position, true ) . unwrap ( ) . unwrap ( ) ;
383414 expect. assert_debug_eq ( & hover. info . actions )
384415 }
385416
@@ -1809,6 +1840,70 @@ struct S {
18091840 ) ;
18101841 }
18111842
1843+ #[ test]
1844+ fn test_hover_no_links ( ) {
1845+ check_hover_no_links (
1846+ r#"
1847+ /// Test cases:
1848+ /// case 1. bare URL: https://www.example.com/
1849+ /// case 2. inline URL with title: [example](https://www.example.com/)
1850+ /// case 3. code refrence: [`Result`]
1851+ /// case 4. code refrence but miss footnote: [`String`]
1852+ /// case 5. autolink: <http://www.example.com/>
1853+ /// case 6. email address: <test@example.com>
1854+ /// case 7. refrence: [example][example]
1855+ /// case 8. collapsed link: [example][]
1856+ /// case 9. shortcut link: [example]
1857+ /// case 10. inline without URL: [example]()
1858+ /// case 11. refrence: [foo][foo]
1859+ /// case 12. refrence: [foo][bar]
1860+ /// case 13. collapsed link: [foo][]
1861+ /// case 14. shortcut link: [foo]
1862+ /// case 15. inline without URL: [foo]()
1863+ /// case 16. just escaped text: \[foo]
1864+ /// case 17. inline link: [Foo](foo::Foo)
1865+ ///
1866+ /// [`Result`]: ../../std/result/enum.Result.html
1867+ /// [^example]: https://www.example.com/
1868+ pub fn fo<|>o() {}
1869+ "# ,
1870+ expect ! [ [ r#"
1871+ *foo*
1872+
1873+ ```rust
1874+ test
1875+ ```
1876+
1877+ ```rust
1878+ pub fn foo()
1879+ ```
1880+
1881+ ---
1882+
1883+ Test cases:
1884+ case 1. bare URL: https://www.example.com/
1885+ case 2. inline URL with title: [example](https://www.example.com/)
1886+ case 3. code refrence: `Result`
1887+ case 4. code refrence but miss footnote: `String`
1888+ case 5. autolink: http://www.example.com/
1889+ case 6. email address: test@example.com
1890+ case 7. refrence: example
1891+ case 8. collapsed link: example
1892+ case 9. shortcut link: example
1893+ case 10. inline without URL: example
1894+ case 11. refrence: foo
1895+ case 12. refrence: foo
1896+ case 13. collapsed link: foo
1897+ case 14. shortcut link: foo
1898+ case 15. inline without URL: foo
1899+ case 16. just escaped text: \[foo]
1900+ case 17. inline link: Foo
1901+
1902+ [^example]: https://www.example.com/
1903+ "# ] ] ,
1904+ ) ;
1905+ }
1906+
18121907 #[ test]
18131908 fn test_hover_macro_generated_struct_fn_doc_comment ( ) {
18141909 mark:: check!( hover_macro_generated_struct_fn_doc_comment) ;
0 commit comments