Merge pull request #20235 from A4-Tacks/assoctype-where-comp

Fix assoc type where clause position
This commit is contained in:
Shoyu Vanilla (Flint) 2025-07-13 13:55:27 +00:00 committed by GitHub
commit 9c52f2eddd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 75 additions and 5 deletions

View File

@ -37,6 +37,7 @@ use ide_db::{
SymbolKind, documentation::HasDocs, path_transform::PathTransform,
syntax_helpers::prettify_macro_expansion, traits::get_missing_assoc_items,
};
use syntax::ast::HasGenericParams;
use syntax::{
AstNode, SmolStr, SyntaxElement, SyntaxKind, T, TextRange, ToSmolStr,
ast::{self, HasGenericArgs, HasTypeBounds, edit_in_place::AttrsOwnerEdit, make},
@ -388,6 +389,12 @@ fn add_type_alias_impl(
{
end
} else if let Some(end) = transformed_ty.eq_token().map(|tok| tok.text_range().start())
{
end
} else if let Some(end) = transformed_ty
.where_clause()
.and_then(|wc| wc.where_token())
.map(|tok| tok.text_range().start())
{
end
} else if let Some(end) =
@ -400,17 +407,29 @@ fn add_type_alias_impl(
let len = end - start;
let mut decl = transformed_ty.syntax().text().slice(..len).to_string();
if !decl.ends_with(' ') {
decl.push(' ');
}
decl.push_str("= ");
decl.truncate(decl.trim_end().len());
decl.push_str(" = ");
let wc = transformed_ty
.where_clause()
.map(|wc| {
let ws = wc
.where_token()
.and_then(|it| it.prev_token())
.filter(|token| token.kind() == SyntaxKind::WHITESPACE)
.map(|token| token.to_string())
.unwrap_or_else(|| " ".into());
format!("{ws}{wc}")
})
.unwrap_or_default();
match ctx.config.snippet_cap {
Some(cap) => {
let snippet = format!("{decl}$0;");
let snippet = format!("{decl}$0{wc};");
item.snippet_edit(cap, TextEdit::replace(replacement_range, snippet));
}
None => {
decl.push_str(&wc);
item.text_edit(TextEdit::replace(replacement_range, decl));
}
};
@ -1437,6 +1456,30 @@ trait Tr<'b> {
impl<'b> Tr<'b> for () {
type Ty<'a: 'b, T: Copy, const C: usize> = $0;
}
"#,
);
}
#[test]
fn includes_where_clause() {
check_edit(
"type Ty",
r#"
trait Tr {
type Ty where Self: Copy;
}
impl Tr for () {
$0
}
"#,
r#"
trait Tr {
type Ty where Self: Copy;
}
impl Tr for () {
type Ty = $0 where Self: Copy;
}
"#,
);
}

View File

@ -458,6 +458,33 @@ type O = $0;
r"
struct A;
trait B {
type O<'a>
where
Self: 'a;
}
impl B for A {
$0
}
",
r#"
struct A;
trait B {
type O<'a>
where
Self: 'a;
}
impl B for A {
type O<'a> = $0
where
Self: 'a;
}
"#,
);
check_edit(
"type O",
r"
struct A;
trait B {
type O: ?Sized = u32;
}
impl B for A {