11use std:: iter:: once;
22
33use hir:: {
4- Adt , AsAssocItem , AssocItemContainer , FieldSource , HasSource , HirDisplay , ModuleDef ,
5- ModuleSource , Semantics ,
4+ Adt , AsAssocItem , AssocItemContainer , Documentation , FieldSource , HasSource , HirDisplay ,
5+ ModuleDef , ModuleSource , Semantics ,
66} ;
77use itertools:: Itertools ;
88use ra_db:: SourceDatabase ;
99use ra_ide_db:: {
1010 defs:: { classify_name, classify_name_ref, Definition } ,
1111 RootDatabase ,
1212} ;
13- use ra_syntax:: {
14- ast:: { self , DocCommentsOwner } ,
15- match_ast, AstNode ,
16- SyntaxKind :: * ,
17- SyntaxToken , TokenAtOffset ,
18- } ;
13+ use ra_syntax:: { ast, match_ast, AstNode , SyntaxKind :: * , SyntaxToken , TokenAtOffset } ;
1914
2015use crate :: {
2116 display:: { macro_label, rust_code_markup, rust_code_markup_with_doc, ShortLabel } ,
@@ -169,21 +164,24 @@ fn hover_text_from_name_kind(db: &RootDatabase, def: Definition) -> Option<Strin
169164 return match def {
170165 Definition :: Macro ( it) => {
171166 let src = it. source ( db) ;
172- hover_text ( src. value . doc_comment_text ( ) , Some ( macro_label ( & src. value ) ) , mod_path)
167+ let docs = Documentation :: from_ast ( & src. value ) . map ( Into :: into) ;
168+ hover_text ( docs, Some ( macro_label ( & src. value ) ) , mod_path)
173169 }
174170 Definition :: Field ( it) => {
175171 let src = it. source ( db) ;
176172 match src. value {
177173 FieldSource :: Named ( it) => {
178- hover_text ( it. doc_comment_text ( ) , it. short_label ( ) , mod_path)
174+ let docs = Documentation :: from_ast ( & it) . map ( Into :: into) ;
175+ hover_text ( docs, it. short_label ( ) , mod_path)
179176 }
180177 _ => None ,
181178 }
182179 }
183180 Definition :: ModuleDef ( it) => match it {
184181 ModuleDef :: Module ( it) => match it. definition_source ( db) . value {
185182 ModuleSource :: Module ( it) => {
186- hover_text ( it. doc_comment_text ( ) , it. short_label ( ) , mod_path)
183+ let docs = Documentation :: from_ast ( & it) . map ( Into :: into) ;
184+ hover_text ( docs, it. short_label ( ) , mod_path)
187185 }
188186 _ => None ,
189187 } ,
@@ -208,10 +206,11 @@ fn hover_text_from_name_kind(db: &RootDatabase, def: Definition) -> Option<Strin
208206 fn from_def_source < A , D > ( db : & RootDatabase , def : D , mod_path : Option < String > ) -> Option < String >
209207 where
210208 D : HasSource < Ast = A > ,
211- A : ast:: DocCommentsOwner + ast:: NameOwner + ShortLabel ,
209+ A : ast:: DocCommentsOwner + ast:: NameOwner + ShortLabel + ast :: AttrsOwner ,
212210 {
213211 let src = def. source ( db) ;
214- hover_text ( src. value . doc_comment_text ( ) , src. value . short_label ( ) , mod_path)
212+ let docs = Documentation :: from_ast ( & src. value ) . map ( Into :: into) ;
213+ hover_text ( docs, src. value . short_label ( ) , mod_path)
215214 }
216215}
217216
@@ -951,4 +950,106 @@ fn func(foo: i32) { if true { <|>foo; }; }
951950 & [ "mod my" ] ,
952951 ) ;
953952 }
953+
954+ #[ test]
955+ fn test_hover_struct_doc_comment ( ) {
956+ check_hover_result (
957+ r#"
958+ //- /lib.rs
959+ /// bar docs
960+ struct Bar;
961+
962+ fn foo() {
963+ let bar = Ba<|>r;
964+ }
965+ "# ,
966+ & [ "struct Bar\n ```\n ___\n \n bar docs" ] ,
967+ ) ;
968+ }
969+
970+ #[ test]
971+ fn test_hover_struct_doc_attr ( ) {
972+ check_hover_result (
973+ r#"
974+ //- /lib.rs
975+ #[doc = "bar docs"]
976+ struct Bar;
977+
978+ fn foo() {
979+ let bar = Ba<|>r;
980+ }
981+ "# ,
982+ & [ "struct Bar\n ```\n ___\n \n bar docs" ] ,
983+ ) ;
984+ }
985+
986+ #[ test]
987+ fn test_hover_struct_doc_attr_multiple_and_mixed ( ) {
988+ check_hover_result (
989+ r#"
990+ //- /lib.rs
991+ /// bar docs 0
992+ #[doc = "bar docs 1"]
993+ #[doc = "bar docs 2"]
994+ struct Bar;
995+
996+ fn foo() {
997+ let bar = Ba<|>r;
998+ }
999+ "# ,
1000+ & [ "struct Bar\n ```\n ___\n \n bar docs 0\n \n bar docs 1\n \n bar docs 2" ] ,
1001+ ) ;
1002+ }
1003+
1004+ #[ test]
1005+ fn test_hover_macro_generated_struct_fn_doc_comment ( ) {
1006+ check_hover_result (
1007+ r#"
1008+ //- /lib.rs
1009+ macro_rules! bar {
1010+ () => {
1011+ struct Bar;
1012+ impl Bar {
1013+ /// Do the foo
1014+ fn foo(&self) {}
1015+ }
1016+ }
1017+ }
1018+
1019+ bar!();
1020+
1021+ fn foo() {
1022+ let bar = Bar;
1023+ bar.fo<|>o();
1024+ }
1025+ "# ,
1026+ & [ "Bar\n ```\n \n ```rust\n fn foo(&self)\n ```\n ___\n \n Do the foo" ] ,
1027+ ) ;
1028+ }
1029+
1030+ #[ test]
1031+ fn test_hover_macro_generated_struct_fn_doc_attr ( ) {
1032+ check_hover_result (
1033+ r#"
1034+ //- /lib.rs
1035+ macro_rules! bar {
1036+ () => {
1037+ struct Bar;
1038+ impl Bar {
1039+ #[doc = "Do the foo"]
1040+ fn foo(&self) {}
1041+ }
1042+ }
1043+ }
1044+
1045+ bar!();
1046+
1047+ fn foo() {
1048+ let bar = Bar;
1049+ bar.fo<|>o();
1050+ }
1051+ "# ,
1052+ & [ "Bar\n ```\n \n ```rust\n fn foo(&self)\n ```\n ___\n \n Do the foo" ] ,
1053+ ) ;
1054+ }
9541055}
0 commit comments