|
2 | 2 |
|
3 | 3 | use std::ops;
|
4 | 4 |
|
| 5 | +use ast::TypeBoundsOwner; |
5 | 6 | use hir::{Adt, HasSource};
|
6 | 7 | use ide_db::{helpers::SnippetCap, RootDatabase};
|
7 | 8 | use itertools::Itertools;
|
@@ -377,29 +378,46 @@ pub(crate) fn generate_trait_impl_text(adt: &ast::Adt, trait_text: &str, code: &
|
377 | 378 | }
|
378 | 379 |
|
379 | 380 | fn generate_impl_text_inner(adt: &ast::Adt, trait_text: Option<&str>, code: &str) -> String {
|
380 |
| - let type_params = adt.generic_param_list(); |
| 381 | + let generic_params = adt.generic_param_list(); |
381 | 382 | let mut buf = String::with_capacity(code.len());
|
382 | 383 | buf.push_str("\n\n");
|
383 | 384 | adt.attrs()
|
384 | 385 | .filter(|attr| attr.as_simple_call().map(|(name, _arg)| name == "cfg").unwrap_or(false))
|
385 | 386 | .for_each(|attr| buf.push_str(format!("{}\n", attr.to_string()).as_str()));
|
386 | 387 | buf.push_str("impl");
|
387 |
| - if let Some(type_params) = &type_params { |
388 |
| - format_to!(buf, "{}", type_params.syntax()); |
| 388 | + if let Some(generic_params) = &generic_params { |
| 389 | + let lifetimes = generic_params.lifetime_params().map(|lt| format!("{}", lt.syntax())); |
| 390 | + let type_params = generic_params.type_params().map(|type_param| { |
| 391 | + let mut buf = String::new(); |
| 392 | + if let Some(it) = type_param.name() { |
| 393 | + format_to!(buf, "{}", it.syntax()); |
| 394 | + } |
| 395 | + if let Some(it) = type_param.colon_token() { |
| 396 | + format_to!(buf, "{} ", it); |
| 397 | + } |
| 398 | + if let Some(it) = type_param.type_bound_list() { |
| 399 | + format_to!(buf, "{}", it.syntax()); |
| 400 | + } |
| 401 | + buf |
| 402 | + }); |
| 403 | + let generics = lifetimes.chain(type_params).format(", "); |
| 404 | + format_to!(buf, "<{}>", generics); |
389 | 405 | }
|
390 | 406 | buf.push(' ');
|
391 | 407 | if let Some(trait_text) = trait_text {
|
392 | 408 | buf.push_str(trait_text);
|
393 | 409 | buf.push_str(" for ");
|
394 | 410 | }
|
395 | 411 | buf.push_str(adt.name().unwrap().text());
|
396 |
| - if let Some(type_params) = type_params { |
397 |
| - let lifetime_params = type_params |
| 412 | + if let Some(generic_params) = generic_params { |
| 413 | + let lifetime_params = generic_params |
398 | 414 | .lifetime_params()
|
399 | 415 | .filter_map(|it| it.lifetime())
|
400 | 416 | .map(|it| SmolStr::from(it.text()));
|
401 |
| - let type_params = |
402 |
| - type_params.type_params().filter_map(|it| it.name()).map(|it| SmolStr::from(it.text())); |
| 417 | + let type_params = generic_params |
| 418 | + .type_params() |
| 419 | + .filter_map(|it| it.name()) |
| 420 | + .map(|it| SmolStr::from(it.text())); |
403 | 421 | format_to!(buf, "<{}>", lifetime_params.chain(type_params).format(", "))
|
404 | 422 | }
|
405 | 423 |
|
|
0 commit comments