aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/hir/src/lib.rs8
-rw-r--r--crates/ide/src/hover.rs62
-rw-r--r--crates/ide/src/syntax_highlighting/highlight.rs5
3 files changed, 47 insertions, 28 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index d5a3d9034..caf4c3395 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -1296,13 +1296,7 @@ impl Local {
1296 1296
1297 pub fn is_mut(self, db: &dyn HirDatabase) -> bool { 1297 pub fn is_mut(self, db: &dyn HirDatabase) -> bool {
1298 let body = db.body(self.parent.into()); 1298 let body = db.body(self.parent.into());
1299 match &body[self.pat_id] { 1299 matches!(&body[self.pat_id], Pat::Bind { mode: BindingAnnotation::Mutable, .. })
1300 Pat::Bind { mode, .. } => match mode {
1301 BindingAnnotation::Mutable | BindingAnnotation::RefMut => true,
1302 _ => false,
1303 },
1304 _ => false,
1305 }
1306 } 1300 }
1307 1301
1308 pub fn parent(self, _db: &dyn HirDatabase) -> DefWithBody { 1302 pub fn parent(self, _db: &dyn HirDatabase) -> DefWithBody {
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index 5d1cc2052..ea45086ce 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -1,3 +1,4 @@
1use either::Either;
1use hir::{ 2use hir::{
2 Adt, AsAssocItem, AssocItemContainer, FieldSource, GenericParam, HasAttrs, HasSource, 3 Adt, AsAssocItem, AssocItemContainer, FieldSource, GenericParam, HasAttrs, HasSource,
3 HirDisplay, Module, ModuleDef, ModuleSource, Semantics, 4 HirDisplay, Module, ModuleDef, ModuleSource, Semantics,
@@ -366,7 +367,7 @@ fn hover_for_definition(
366 .and_then(|fd| hover_for_builtin(fd, it)) 367 .and_then(|fd| hover_for_builtin(fd, it))
367 .or_else(|| Some(Markup::fenced_block(&it.name()))), 368 .or_else(|| Some(Markup::fenced_block(&it.name()))),
368 }, 369 },
369 Definition::Local(it) => Some(Markup::fenced_block(&it.ty(db).display(db))), 370 Definition::Local(it) => hover_for_local(it, db),
370 Definition::SelfType(impl_def) => { 371 Definition::SelfType(impl_def) => {
371 impl_def.target_ty(db).as_adt().and_then(|adt| match adt { 372 impl_def.target_ty(db).as_adt().and_then(|adt| match adt {
372 Adt::Struct(it) => from_def_source(db, it, mod_path), 373 Adt::Struct(it) => from_def_source(db, it, mod_path),
@@ -405,6 +406,29 @@ fn hover_for_definition(
405 } 406 }
406} 407}
407 408
409fn hover_for_local(it: hir::Local, db: &RootDatabase) -> Option<Markup> {
410 let ty = it.ty(db);
411 let ty = ty.display(db);
412 let is_mut = if it.is_mut(db) { "mut " } else { "" };
413 let desc = match it.source(db).value {
414 Either::Left(ident) => {
415 let name = it.name(db).unwrap();
416 let let_kw = if ident
417 .syntax()
418 .parent()
419 .map_or(false, |p| p.kind() == LET_STMT || p.kind() == CONDITION)
420 {
421 "let "
422 } else {
423 ""
424 };
425 format!("{}{}{}: {}", let_kw, is_mut, name, ty)
426 }
427 Either::Right(_) => format!("{}self: {}", is_mut, ty),
428 };
429 hover_markup(None, Some(desc), None)
430}
431
408fn hover_for_keyword( 432fn hover_for_keyword(
409 sema: &Semantics<RootDatabase>, 433 sema: &Semantics<RootDatabase>,
410 links_in_hover: bool, 434 links_in_hover: bool,
@@ -574,7 +598,7 @@ fn main() {
574 *iter* 598 *iter*
575 599
576 ```rust 600 ```rust
577 Iter<Scan<OtherStruct<OtherStruct<i32>>, |&mut u32, &u32, &mut u32| -> Option<u32>, u32>> 601 let mut iter: Iter<Scan<OtherStruct<OtherStruct<i32>>, |&mut u32, &u32, &mut u32| -> Option<u32>, u32>>
578 ``` 602 ```
579 "#]], 603 "#]],
580 ); 604 );
@@ -798,7 +822,7 @@ fn main() {
798 ``` 822 ```
799 823
800 ```rust 824 ```rust
801 const foo: u32 = 123 825 const foo: u32
802 ``` 826 ```
803 "#]], 827 "#]],
804 ); 828 );
@@ -831,7 +855,7 @@ fn main() {
831 *zz* 855 *zz*
832 856
833 ```rust 857 ```rust
834 Test<i32, u8> 858 let zz: Test<i32, u8>
835 ``` 859 ```
836 "#]], 860 "#]],
837 ); 861 );
@@ -870,7 +894,7 @@ fn main() { let b$0ar = Some(12); }
870 *bar* 894 *bar*
871 895
872 ```rust 896 ```rust
873 Option<i32> 897 let bar: Option<i32>
874 ``` 898 ```
875 "#]], 899 "#]],
876 ); 900 );
@@ -938,7 +962,7 @@ fn main() {
938 *foo* 962 *foo*
939 963
940 ```rust 964 ```rust
941 i32 965 foo: i32
942 ``` 966 ```
943 "#]], 967 "#]],
944 ) 968 )
@@ -952,7 +976,7 @@ fn main() {
952 *foo* 976 *foo*
953 977
954 ```rust 978 ```rust
955 i32 979 foo: i32
956 ``` 980 ```
957 "#]], 981 "#]],
958 ) 982 )
@@ -966,7 +990,7 @@ fn main() {
966 *foo* 990 *foo*
967 991
968 ```rust 992 ```rust
969 i32 993 foo: i32
970 ``` 994 ```
971 "#]], 995 "#]],
972 ) 996 )
@@ -980,7 +1004,7 @@ fn main() {
980 *foo* 1004 *foo*
981 1005
982 ```rust 1006 ```rust
983 i32 1007 foo: i32
984 ``` 1008 ```
985 "#]], 1009 "#]],
986 ) 1010 )
@@ -1000,7 +1024,7 @@ fn main() {
1000 *_x* 1024 *_x*
1001 1025
1002 ```rust 1026 ```rust
1003 impl Deref<Target = u8> + DerefMut<Target = u8> 1027 _x: impl Deref<Target = u8> + DerefMut<Target = u8>
1004 ``` 1028 ```
1005 "#]], 1029 "#]],
1006 ) 1030 )
@@ -1022,7 +1046,7 @@ fn main() { let foo_$0test = Thing::new(); }
1022 *foo_test* 1046 *foo_test*
1023 1047
1024 ```rust 1048 ```rust
1025 Thing 1049 let foo_test: Thing
1026 ``` 1050 ```
1027 "#]], 1051 "#]],
1028 ) 1052 )
@@ -1081,7 +1105,7 @@ fn main() {
1081 ``` 1105 ```
1082 1106
1083 ```rust 1107 ```rust
1084 const C: u32 = 1 1108 const C: u32
1085 ``` 1109 ```
1086 "#]], 1110 "#]],
1087 ) 1111 )
@@ -1182,7 +1206,7 @@ fn y() {
1182 *x* 1206 *x*
1183 1207
1184 ```rust 1208 ```rust
1185 i32 1209 let x: i32
1186 ``` 1210 ```
1187 "#]], 1211 "#]],
1188 ) 1212 )
@@ -1259,7 +1283,7 @@ fn foo(bar:u32) { let a = id!(ba$0r); }
1259 *bar* 1283 *bar*
1260 1284
1261 ```rust 1285 ```rust
1262 u32 1286 bar: u32
1263 ``` 1287 ```
1264 "#]], 1288 "#]],
1265 ); 1289 );
@@ -1277,7 +1301,7 @@ fn foo(bar:u32) { let a = id!(ba$0r); }
1277 *bar* 1301 *bar*
1278 1302
1279 ```rust 1303 ```rust
1280 u32 1304 bar: u32
1281 ``` 1305 ```
1282 "#]], 1306 "#]],
1283 ); 1307 );
@@ -3302,7 +3326,7 @@ fn main() {
3302 *f* 3326 *f*
3303 3327
3304 ```rust 3328 ```rust
3305 &i32 3329 f: &i32
3306 ``` 3330 ```
3307 "#]], 3331 "#]],
3308 ); 3332 );
@@ -3321,7 +3345,7 @@ impl Foo {
3321 *self* 3345 *self*
3322 3346
3323 ```rust 3347 ```rust
3324 &Foo 3348 self: &Foo
3325 ``` 3349 ```
3326 "#]], 3350 "#]],
3327 ); 3351 );
@@ -3341,7 +3365,7 @@ impl Foo {
3341 *self* 3365 *self*
3342 3366
3343 ```rust 3367 ```rust
3344 Arc<Foo> 3368 self: Arc<Foo>
3345 ``` 3369 ```
3346 "#]], 3370 "#]],
3347 ); 3371 );
@@ -3537,7 +3561,7 @@ fn foo() {
3537 ``` 3561 ```
3538 3562
3539 ```rust 3563 ```rust
3540 const FOO: usize = 3 3564 const FOO: usize
3541 ``` 3565 ```
3542 3566
3543 --- 3567 ---
diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs
index 24fcbb584..b0cfdd8b7 100644
--- a/crates/ide/src/syntax_highlighting/highlight.rs
+++ b/crates/ide/src/syntax_highlighting/highlight.rs
@@ -330,10 +330,11 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
330 HlTag::Symbol(SymbolKind::Local) 330 HlTag::Symbol(SymbolKind::Local)
331 }; 331 };
332 let mut h = Highlight::new(tag); 332 let mut h = Highlight::new(tag);
333 if local.is_mut(db) || local.ty(db).is_mutable_reference() { 333 let ty = local.ty(db);
334 if local.is_mut(db) || ty.is_mutable_reference() {
334 h |= HlMod::Mutable; 335 h |= HlMod::Mutable;
335 } 336 }
336 if local.ty(db).as_callable(db).is_some() || local.ty(db).impls_fnonce(db) { 337 if ty.as_callable(db).is_some() || ty.impls_fnonce(db) {
337 h |= HlMod::Callable; 338 h |= HlMod::Callable;
338 } 339 }
339 return h; 340 return h;