mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
fix: Panic when displaying generic params with defaults
This commit is contained in:
parent
e7c8b2fd81
commit
405520150d
2 changed files with 55 additions and 1 deletions
|
@ -1047,10 +1047,14 @@ impl HirDisplay for Ty {
|
||||||
);
|
);
|
||||||
// We print all params except implicit impl Trait params. Still a bit weird; should we leave out parent and self?
|
// We print all params except implicit impl Trait params. Still a bit weird; should we leave out parent and self?
|
||||||
if parameters.len() - impl_ > 0 {
|
if parameters.len() - impl_ > 0 {
|
||||||
|
let params_len = parameters.len();
|
||||||
// `parameters` are in the order of fn's params (including impl traits), fn's lifetimes
|
// `parameters` are in the order of fn's params (including impl traits), fn's lifetimes
|
||||||
let parameters =
|
let parameters =
|
||||||
generic_args_sans_defaults(f, Some(generic_def_id), parameters);
|
generic_args_sans_defaults(f, Some(generic_def_id), parameters);
|
||||||
let without_impl = self_param as usize + type_ + const_ + lifetime;
|
assert!(params_len >= parameters.len());
|
||||||
|
let defaults = params_len - parameters.len();
|
||||||
|
let without_impl =
|
||||||
|
self_param as usize + type_ + const_ + lifetime - defaults;
|
||||||
// parent's params (those from enclosing impl or trait, if any).
|
// parent's params (those from enclosing impl or trait, if any).
|
||||||
let (fn_params, parent_params) = parameters.split_at(without_impl + impl_);
|
let (fn_params, parent_params) = parameters.split_at(without_impl + impl_);
|
||||||
|
|
||||||
|
|
|
@ -9416,3 +9416,53 @@ fn f<T: UnCompat$0>
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn issue_18613() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
fn main() {
|
||||||
|
struct S<T, D = bool>();
|
||||||
|
let x$0 = S::<()>;
|
||||||
|
}"#,
|
||||||
|
expect![[r#"
|
||||||
|
*x*
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let x: fn S<()>() -> S<()>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
size = 0, align = 1
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
pub struct Global;
|
||||||
|
pub struct Box<T, A = Global>(T, A);
|
||||||
|
|
||||||
|
impl<T> Box<T> {
|
||||||
|
pub fn new(x: T) -> Self { loop {} }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct String;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let box_value$0 = Box::<String>new();
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r#"
|
||||||
|
*box_value*
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let box_value: fn Box<String>(String, Global) -> Box<String>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
size = 0, align = 1
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue