1
1
use std:: iter:: once;
2
2
3
3
use hir:: {
4
- Adt , AsAssocItem , AssocItemContainer , FieldSource , HasSource , HirDisplay , ModuleDef ,
5
- ModuleSource , Semantics ,
4
+ Adt , AsAssocItem , AssocItemContainer , Documentation , FieldSource , HasSource , HirDisplay ,
5
+ ModuleDef , ModuleSource , Semantics ,
6
6
} ;
7
7
use itertools:: Itertools ;
8
8
use ra_db:: SourceDatabase ;
9
9
use ra_ide_db:: {
10
10
defs:: { classify_name, classify_name_ref, Definition } ,
11
11
RootDatabase ,
12
12
} ;
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 } ;
19
14
20
15
use crate :: {
21
16
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
169
164
return match def {
170
165
Definition :: Macro ( it) => {
171
166
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)
173
169
}
174
170
Definition :: Field ( it) => {
175
171
let src = it. source ( db) ;
176
172
match src. value {
177
173
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)
179
176
}
180
177
_ => None ,
181
178
}
182
179
}
183
180
Definition :: ModuleDef ( it) => match it {
184
181
ModuleDef :: Module ( it) => match it. definition_source ( db) . value {
185
182
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)
187
185
}
188
186
_ => None ,
189
187
} ,
@@ -208,10 +206,11 @@ fn hover_text_from_name_kind(db: &RootDatabase, def: Definition) -> Option<Strin
208
206
fn from_def_source < A , D > ( db : & RootDatabase , def : D , mod_path : Option < String > ) -> Option < String >
209
207
where
210
208
D : HasSource < Ast = A > ,
211
- A : ast:: DocCommentsOwner + ast:: NameOwner + ShortLabel ,
209
+ A : ast:: DocCommentsOwner + ast:: NameOwner + ShortLabel + ast :: AttrsOwner ,
212
210
{
213
211
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)
215
214
}
216
215
}
217
216
@@ -951,4 +950,106 @@ fn func(foo: i32) { if true { <|>foo; }; }
951
950
& [ "mod my" ] ,
952
951
) ;
953
952
}
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
+ }
954
1055
}
0 commit comments