Skip to content

Commit 5531d46

Browse files
committed
Emit '_ for lifetime generics in HirDisplay
1 parent b4907a5 commit 5531d46

File tree

4 files changed

+49
-22
lines changed

4 files changed

+49
-22
lines changed

Diff for: crates/hir-ty/src/display.rs

+22-19
Original file line numberDiff line numberDiff line change
@@ -1223,7 +1223,8 @@ fn hir_fmt_generics(
12231223
generic_def: Option<hir_def::GenericDefId>,
12241224
) -> Result<(), HirDisplayError> {
12251225
let db = f.db;
1226-
if parameters.len(Interner) > 0 {
1226+
let lifetime_args_count = generic_def.map_or(0, |g| db.generic_params(g).lifetimes.len());
1227+
if parameters.len(Interner) + lifetime_args_count > 0 {
12271228
let parameters_to_write = if f.display_target.is_source_code() || f.omit_verbose_types() {
12281229
match generic_def
12291230
.map(|generic_def_id| db.generic_defaults(generic_def_id))
@@ -1268,26 +1269,28 @@ fn hir_fmt_generics(
12681269
} else {
12691270
parameters.as_slice(Interner)
12701271
};
1271-
if !parameters_to_write.is_empty() {
1272+
if !parameters_to_write.is_empty() || lifetime_args_count != 0 {
12721273
write!(f, "<")?;
1273-
1274-
if f.display_target.is_source_code() {
1275-
let mut first = true;
1276-
for generic_arg in parameters_to_write {
1277-
if !first {
1278-
write!(f, ", ")?;
1279-
}
1280-
first = false;
1281-
1282-
if generic_arg.ty(Interner).map(|ty| ty.kind(Interner)) == Some(&TyKind::Error)
1283-
{
1284-
write!(f, "_")?;
1285-
} else {
1286-
generic_arg.hir_fmt(f)?;
1287-
}
1274+
let mut first = true;
1275+
for _ in 0..lifetime_args_count {
1276+
if !first {
1277+
write!(f, ", ")?;
1278+
}
1279+
first = false;
1280+
write!(f, "'_")?;
1281+
}
1282+
for generic_arg in parameters_to_write {
1283+
if !first {
1284+
write!(f, ", ")?;
1285+
}
1286+
first = false;
1287+
if f.display_target.is_source_code()
1288+
&& generic_arg.ty(Interner).map(|ty| ty.kind(Interner)) == Some(&TyKind::Error)
1289+
{
1290+
write!(f, "_")?;
1291+
} else {
1292+
generic_arg.hir_fmt(f)?;
12881293
}
1289-
} else {
1290-
f.write_joined(parameters_to_write, ", ")?;
12911294
}
12921295

12931296
write!(f, ">")?;

Diff for: crates/hir-ty/src/tests/patterns.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,7 @@ fn var_args() {
11091109
#[lang = "va_list"]
11101110
pub struct VaListImpl<'f>;
11111111
fn my_fn(foo: ...) {}
1112-
//^^^ VaListImpl
1112+
//^^^ VaListImpl<'_>
11131113
"#,
11141114
);
11151115
}

Diff for: crates/hir-ty/src/tests/regression.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -896,13 +896,13 @@ fn flush(&self) {
896896
"#,
897897
expect![[r#"
898898
123..127 'self': &Mutex<T>
899-
150..152 '{}': MutexGuard<T>
899+
150..152 '{}': MutexGuard<'_, T>
900900
234..238 'self': &{unknown}
901901
240..290 '{ ...()); }': ()
902902
250..251 'w': &Mutex<BufWriter>
903903
276..287 '*(w.lock())': BufWriter
904904
278..279 'w': &Mutex<BufWriter>
905-
278..286 'w.lock()': MutexGuard<BufWriter>
905+
278..286 'w.lock()': MutexGuard<'_, BufWriter>
906906
"#]],
907907
);
908908
}

Diff for: crates/ide-assists/src/handlers/extract_function.rs

+24
Original file line numberDiff line numberDiff line change
@@ -5478,6 +5478,30 @@ fn $0fun_name<T: Debug>(i: T) {
54785478
);
54795479
}
54805480

5481+
#[test]
5482+
fn dont_emit_type_with_hidden_lifetime_parameter() {
5483+
// FIXME: We should emit a `<T: Debug>` generic argument for the generated function
5484+
check_assist(
5485+
extract_function,
5486+
r#"
5487+
struct Struct<'a, T>(&'a T);
5488+
fn func<T: Debug>(i: Struct<'_, T>) {
5489+
$0foo(i);$0
5490+
}
5491+
"#,
5492+
r#"
5493+
struct Struct<'a, T>(&'a T);
5494+
fn func<T: Debug>(i: Struct<'_, T>) {
5495+
fun_name(i);
5496+
}
5497+
5498+
fn $0fun_name(i: Struct<'_, T>) {
5499+
foo(i);
5500+
}
5501+
"#,
5502+
);
5503+
}
5504+
54815505
#[test]
54825506
fn preserve_generics_from_body() {
54835507
check_assist(

0 commit comments

Comments
 (0)