|
3 | 3 | //! purposes.
|
4 | 4 |
|
5 | 5 | use std::{
|
| 6 | + cmp::Ordering, |
6 | 7 | fmt::{self, Debug},
|
7 | 8 | mem::size_of,
|
8 | 9 | };
|
@@ -953,11 +954,17 @@ impl HirDisplay for Ty {
|
953 | 954 | // `parameters` are in the order of fn's params (including impl traits),
|
954 | 955 | // parent's params (those from enclosing impl or trait, if any).
|
955 | 956 | let parameters = parameters.as_slice(Interner);
|
956 |
| - let fn_params_len = |
957 |
| - self_param + type_params + const_params + lifetime_params; |
| 957 | + let fn_params_len = self_param + type_params + const_params; |
| 958 | + // This will give slice till last type or const |
958 | 959 | let fn_params = parameters.get(..fn_params_len);
|
| 960 | + let fn_lt_params = |
| 961 | + parameters.get(fn_params_len..(fn_params_len + lifetime_params)); |
959 | 962 | let parent_params = parameters.get(parameters.len() - parent_params..);
|
960 |
| - let params = parent_params.into_iter().chain(fn_params).flatten(); |
| 963 | + let params = parent_params |
| 964 | + .into_iter() |
| 965 | + .chain(fn_lt_params) |
| 966 | + .chain(fn_params) |
| 967 | + .flatten(); |
961 | 968 | write!(f, "<")?;
|
962 | 969 | f.write_joined(params, ", ")?;
|
963 | 970 | write!(f, ">")?;
|
@@ -1317,6 +1324,15 @@ fn hir_fmt_generics(
|
1317 | 1324 | ) -> Result<(), HirDisplayError> {
|
1318 | 1325 | let db = f.db;
|
1319 | 1326 | if parameters.len(Interner) > 0 {
|
| 1327 | + let param_compare = |
| 1328 | + |a: &GenericArg, b: &GenericArg| match (a.data(Interner), b.data(Interner)) { |
| 1329 | + (crate::GenericArgData::Lifetime(_), crate::GenericArgData::Lifetime(_)) => { |
| 1330 | + Ordering::Equal |
| 1331 | + } |
| 1332 | + (crate::GenericArgData::Lifetime(_), _) => Ordering::Less, |
| 1333 | + (_, crate::GenericArgData::Lifetime(_)) => Ordering::Less, |
| 1334 | + (_, _) => Ordering::Equal, |
| 1335 | + }; |
1320 | 1336 | let parameters_to_write = if f.display_target.is_source_code() || f.omit_verbose_types() {
|
1321 | 1337 | match generic_def
|
1322 | 1338 | .map(|generic_def_id| db.generic_defaults(generic_def_id))
|
@@ -1367,6 +1383,9 @@ fn hir_fmt_generics(
|
1367 | 1383 | } else {
|
1368 | 1384 | parameters.as_slice(Interner)
|
1369 | 1385 | };
|
| 1386 | + //FIXME: Should handle when creating substitutions |
| 1387 | + let mut parameters_to_write = parameters_to_write.to_vec(); |
| 1388 | + parameters_to_write.sort_by(param_compare); |
1370 | 1389 | if !parameters_to_write.is_empty() {
|
1371 | 1390 | write!(f, "<")?;
|
1372 | 1391 | let mut first = true;
|
|
0 commit comments