Skip to content

Commit fb0db2a

Browse files
committed
Auto merge of #13831 - bvanjoi:fix_bound_type_in_trait_insert, r=Veykril
fix(completion): remove bound insert of type in trait Fixed rust-lang/rust-analyzer#13819
2 parents 19e5adc + 67cbd8f commit fb0db2a

File tree

2 files changed

+105
-6
lines changed

2 files changed

+105
-6
lines changed

crates/ide-completion/src/completions/item_list/trait_impl.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use ide_db::{
3737
traits::get_missing_assoc_items, SymbolKind,
3838
};
3939
use syntax::{
40-
ast::{self, edit_in_place::AttrsOwnerEdit},
40+
ast::{self, edit_in_place::AttrsOwnerEdit, HasTypeBounds},
4141
AstNode, SyntaxElement, SyntaxKind, TextRange, T,
4242
};
4343
use text_edit::TextEdit;
@@ -265,10 +265,21 @@ fn add_type_alias_impl(
265265
};
266266

267267
let start = transformed_ty.syntax().text_range().start();
268-
let Some(end) = transformed_ty
269-
.eq_token()
270-
.map(|tok| tok.text_range().start())
271-
.or(transformed_ty.semicolon_token().map(|tok| tok.text_range().start())) else { return };
268+
269+
let end = if let Some(end) =
270+
transformed_ty.colon_token().map(|tok| tok.text_range().start())
271+
{
272+
end
273+
} else if let Some(end) = transformed_ty.eq_token().map(|tok| tok.text_range().start())
274+
{
275+
end
276+
} else if let Some(end) =
277+
transformed_ty.semicolon_token().map(|tok| tok.text_range().start())
278+
{
279+
end
280+
} else {
281+
return;
282+
};
272283

273284
let len = end - start;
274285
let mut decl = transformed_ty.syntax().text().slice(..len).to_string();

crates/ide-completion/src/tests/item_list.rs

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Completion tests for item list position.
22
use expect_test::{expect, Expect};
33

4-
use crate::tests::{completion_list, BASE_ITEMS_FIXTURE};
4+
use crate::tests::{check_edit, completion_list, BASE_ITEMS_FIXTURE};
55

66
fn check(ra_fixture: &str, expect: Expect) {
77
let actual = completion_list(&format!("{}{}", BASE_ITEMS_FIXTURE, ra_fixture));
@@ -277,3 +277,91 @@ fn after_unit_struct() {
277277
"#]],
278278
);
279279
}
280+
281+
#[test]
282+
fn type_in_impl_trait() {
283+
check_edit(
284+
"type O",
285+
r"
286+
struct A;
287+
trait B {
288+
type O: ?Sized;
289+
}
290+
impl B for A {
291+
$0
292+
}
293+
",
294+
r#"
295+
struct A;
296+
trait B {
297+
type O: ?Sized;
298+
}
299+
impl B for A {
300+
type O = $0;
301+
}
302+
"#,
303+
);
304+
check_edit(
305+
"type O",
306+
r"
307+
struct A;
308+
trait B {
309+
type O;
310+
}
311+
impl B for A {
312+
$0
313+
}
314+
",
315+
r#"
316+
struct A;
317+
trait B {
318+
type O;
319+
}
320+
impl B for A {
321+
type O = $0;
322+
}
323+
"#,
324+
);
325+
check_edit(
326+
"type O",
327+
r"
328+
struct A;
329+
trait B {
330+
type O: ?Sized = u32;
331+
}
332+
impl B for A {
333+
$0
334+
}
335+
",
336+
r#"
337+
struct A;
338+
trait B {
339+
type O: ?Sized = u32;
340+
}
341+
impl B for A {
342+
type O = $0;
343+
}
344+
"#,
345+
);
346+
check_edit(
347+
"type O",
348+
r"
349+
struct A;
350+
trait B {
351+
type O = u32;
352+
}
353+
impl B for A {
354+
$0
355+
}
356+
",
357+
r"
358+
struct A;
359+
trait B {
360+
type O = u32;
361+
}
362+
impl B for A {
363+
type O = $0;
364+
}
365+
",
366+
)
367+
}

0 commit comments

Comments
 (0)