Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit bf27d88

Browse files
committed
Show variance of parameters on hover
1 parent e54cf80 commit bf27d88

File tree

5 files changed

+69
-12
lines changed

5 files changed

+69
-12
lines changed

src/tools/rust-analyzer/crates/hir-ty/src/generics.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ use triomphe::Arc;
2626

2727
use crate::{db::HirDatabase, lt_to_placeholder_idx, to_placeholder_idx, Interner, Substitution};
2828

29-
pub(crate) fn generics(db: &dyn DefDatabase, def: GenericDefId) -> Generics {
29+
pub fn generics(db: &dyn DefDatabase, def: GenericDefId) -> Generics {
3030
let parent_generics = parent_generic_def(db, def).map(|def| Box::new(generics(db, def)));
3131
let params = db.generic_params(def);
3232
let has_trait_self_param = params.trait_self_param().is_some();
3333
Generics { def, params, parent_generics, has_trait_self_param }
3434
}
3535
#[derive(Clone, Debug)]
36-
pub(crate) struct Generics {
36+
pub struct Generics {
3737
def: GenericDefId,
3838
params: Arc<GenericParams>,
3939
parent_generics: Option<Box<Generics>>,
@@ -153,7 +153,7 @@ impl Generics {
153153
(parent_len, self_param, type_params, const_params, impl_trait_params, lifetime_params)
154154
}
155155

156-
pub(crate) fn type_or_const_param_idx(&self, param: TypeOrConstParamId) -> Option<usize> {
156+
pub fn type_or_const_param_idx(&self, param: TypeOrConstParamId) -> Option<usize> {
157157
self.find_type_or_const_param(param)
158158
}
159159

@@ -174,7 +174,7 @@ impl Generics {
174174
}
175175
}
176176

177-
pub(crate) fn lifetime_idx(&self, lifetime: LifetimeParamId) -> Option<usize> {
177+
pub fn lifetime_idx(&self, lifetime: LifetimeParamId) -> Option<usize> {
178178
self.find_lifetime(lifetime)
179179
}
180180

src/tools/rust-analyzer/crates/hir-ty/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ extern crate ra_ap_rustc_pattern_analysis as rustc_pattern_analysis;
2424
mod builder;
2525
mod chalk_db;
2626
mod chalk_ext;
27-
mod generics;
2827
mod infer;
2928
mod inhabitedness;
3029
mod interner;
@@ -39,6 +38,7 @@ pub mod db;
3938
pub mod diagnostics;
4039
pub mod display;
4140
pub mod dyn_compatibility;
41+
pub mod generics;
4242
pub mod lang_items;
4343
pub mod layout;
4444
pub mod method_resolution;
@@ -89,10 +89,9 @@ pub use infer::{
8989
PointerCast,
9090
};
9191
pub use interner::Interner;
92-
pub use lower::diagnostics::*;
9392
pub use lower::{
94-
associated_type_shorthand_candidates, ImplTraitLoweringMode, ParamLoweringMode, TyDefId,
95-
TyLoweringContext, ValueTyDefId,
93+
associated_type_shorthand_candidates, diagnostics::*, ImplTraitLoweringMode, ParamLoweringMode,
94+
TyDefId, TyLoweringContext, ValueTyDefId,
9695
};
9796
pub use mapping::{
9897
from_assoc_type_id, from_chalk_trait_id, from_foreign_def_id, from_placeholder_idx,
@@ -102,6 +101,7 @@ pub use mapping::{
102101
pub use method_resolution::check_orphan_rules;
103102
pub use traits::TraitEnvironment;
104103
pub use utils::{all_super_traits, direct_super_traits, is_fn_unsafe_to_call};
104+
pub use variance::Variance;
105105

106106
pub use chalk_ir::{
107107
cast::Cast,

src/tools/rust-analyzer/crates/hir/src/lib.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ pub use crate::{
101101
PathResolution, Semantics, SemanticsImpl, SemanticsScope, TypeInfo, VisibleTraits,
102102
},
103103
};
104-
pub use hir_ty::method_resolution::TyFingerprint;
105104

106105
// Be careful with these re-exports.
107106
//
@@ -151,8 +150,9 @@ pub use {
151150
display::{ClosureStyle, HirDisplay, HirDisplayError, HirWrite},
152151
dyn_compatibility::{DynCompatibilityViolation, MethodViolationCode},
153152
layout::LayoutError,
153+
method_resolution::TyFingerprint,
154154
mir::{MirEvalError, MirLowerError},
155-
CastError, FnAbi, PointerCast, Safety,
155+
CastError, FnAbi, PointerCast, Safety, Variance,
156156
},
157157
// FIXME: Properly encapsulate mir
158158
hir_ty::{mir, Interner as ChalkTyInterner},
@@ -3957,6 +3957,22 @@ impl GenericParam {
39573957
GenericParam::LifetimeParam(it) => it.id.parent.into(),
39583958
}
39593959
}
3960+
3961+
pub fn variance(self, db: &dyn HirDatabase) -> Option<Variance> {
3962+
let parent = match self {
3963+
GenericParam::TypeParam(it) => it.id.parent(),
3964+
// const parameters are always invariant
3965+
GenericParam::ConstParam(_) => return None,
3966+
GenericParam::LifetimeParam(it) => it.id.parent,
3967+
};
3968+
let generics = hir_ty::generics::generics(db.upcast(), parent);
3969+
let index = match self {
3970+
GenericParam::TypeParam(it) => generics.type_or_const_param_idx(it.id.into())?,
3971+
GenericParam::ConstParam(_) => return None,
3972+
GenericParam::LifetimeParam(it) => generics.lifetime_idx(it.id)?,
3973+
};
3974+
db.variances_of(parent)?.get(index).copied()
3975+
}
39603976
}
39613977

39623978
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]

src/tools/rust-analyzer/crates/ide/src/hover/render.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,12 +594,21 @@ pub(super) fn definition(
594594
_ => None,
595595
};
596596

597+
let variance_info = || match def {
598+
Definition::GenericParam(it) => it.variance(db).as_ref().map(ToString::to_string),
599+
_ => None,
600+
};
601+
597602
let mut extra = String::new();
598603
if hovered_definition {
599604
if let Some(notable_traits) = render_notable_trait(db, notable_traits, edition) {
600605
extra.push_str("\n___\n");
601606
extra.push_str(&notable_traits);
602607
}
608+
if let Some(variance_info) = variance_info() {
609+
extra.push_str("\n___\n");
610+
extra.push_str(&variance_info);
611+
}
603612
if let Some(layout_info) = layout_info() {
604613
extra.push_str("\n___\n");
605614
extra.push_str(&layout_info);

src/tools/rust-analyzer/crates/ide/src/hover/tests.rs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4721,7 +4721,7 @@ fn hover_type_param_sized_bounds() {
47214721
//- minicore: sized
47224722
trait Trait {}
47234723
struct Foo<T>(T);
4724-
impl<T: Trait> Foo<T$0> {}
4724+
impl<T$0: Trait> Foo<T> {}
47254725
"#,
47264726
expect![[r#"
47274727
*T*
@@ -4736,7 +4736,7 @@ impl<T: Trait> Foo<T$0> {}
47364736
//- minicore: sized
47374737
trait Trait {}
47384738
struct Foo<T>(T);
4739-
impl<T: Trait + ?Sized> Foo<T$0> {}
4739+
impl<T$0: Trait + ?Sized> Foo<T> {}
47404740
"#,
47414741
expect![[r#"
47424742
*T*
@@ -4764,6 +4764,10 @@ fn foo<T$0>() {}
47644764
```rust
47654765
T
47664766
```
4767+
4768+
---
4769+
4770+
invariant
47674771
"#]],
47684772
);
47694773
}
@@ -4781,6 +4785,10 @@ fn foo<T$0: Sized>() {}
47814785
```rust
47824786
T
47834787
```
4788+
4789+
---
4790+
4791+
invariant
47844792
"#]],
47854793
);
47864794
}
@@ -4798,6 +4806,10 @@ fn foo<T$0: ?Sized>() {}
47984806
```rust
47994807
T: ?Sized
48004808
```
4809+
4810+
---
4811+
4812+
invariant
48014813
"#]],
48024814
);
48034815
}
@@ -4816,6 +4828,10 @@ fn foo<T$0: Trait>() {}
48164828
```rust
48174829
T: Trait
48184830
```
4831+
4832+
---
4833+
4834+
invariant
48194835
"#]],
48204836
);
48214837
}
@@ -4834,6 +4850,10 @@ fn foo<T$0: Trait + Sized>() {}
48344850
```rust
48354851
T: Trait
48364852
```
4853+
4854+
---
4855+
4856+
invariant
48374857
"#]],
48384858
);
48394859
}
@@ -4852,6 +4872,10 @@ fn foo<T$0: Trait + ?Sized>() {}
48524872
```rust
48534873
T: Trait + ?Sized
48544874
```
4875+
4876+
---
4877+
4878+
invariant
48554879
"#]],
48564880
);
48574881
}
@@ -4869,6 +4893,10 @@ fn foo<T$0: ?Sized + Sized + Sized>() {}
48694893
```rust
48704894
T
48714895
```
4896+
4897+
---
4898+
4899+
invariant
48724900
"#]],
48734901
);
48744902
}
@@ -4887,6 +4915,10 @@ fn foo<T$0: Sized + ?Sized + Sized + Trait>() {}
48874915
```rust
48884916
T: Trait
48894917
```
4918+
4919+
---
4920+
4921+
invariant
48904922
"#]],
48914923
);
48924924
}

0 commit comments

Comments
 (0)