From 0f654b06ab093e7bb057cfd68b27925803b003d8 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 14 Jul 2020 13:12:16 +0200 Subject: missing impl members: remove assoc. type bounds --- .../src/handlers/add_missing_impl_members.rs | 33 ++++++++++++++++++++++ crates/ra_syntax/src/ast/make.rs | 13 +++++++++ 2 files changed, 46 insertions(+) (limited to 'crates') diff --git a/crates/ra_assists/src/handlers/add_missing_impl_members.rs b/crates/ra_assists/src/handlers/add_missing_impl_members.rs index d6aaf53f1..124cead6c 100644 --- a/crates/ra_assists/src/handlers/add_missing_impl_members.rs +++ b/crates/ra_assists/src/handlers/add_missing_impl_members.rs @@ -158,6 +158,9 @@ fn add_missing_impl_members_inner( .map(|it| ast_transform::apply(&*ast_transform, it)) .map(|it| match it { ast::AssocItem::FnDef(def) => ast::AssocItem::FnDef(add_body(def)), + ast::AssocItem::TypeAliasDef(def) => { + ast::AssocItem::TypeAliasDef(remove_bounds(def)) + } _ => it, }) .map(|it| edit::remove_attrs_and_docs(&it)); @@ -188,6 +191,14 @@ fn add_missing_impl_members_inner( }) } +fn remove_bounds(ty_def: ast::TypeAliasDef) -> ast::TypeAliasDef { + if let Some(name) = ty_def.name() { + make::type_alias_def(name, None, ty_def.type_ref()) + } else { + ty_def + } +} + fn add_body(fn_def: ast::FnDef) -> ast::FnDef { if fn_def.body().is_some() { return fn_def; @@ -681,6 +692,28 @@ impl Foo for S { fn bar(&self, this: &T, that: &Self) { ${0:todo!()} } +}"#, + ) + } + + #[test] + fn test_assoc_type_bounds_are_removed() { + check_assist( + add_missing_impl_members, + r#" +trait Tr { + type Ty: Copy + 'static; +} + +impl Tr for ()<|> { +}"#, + r#" +trait Tr { + type Ty: Copy + 'static; +} + +impl Tr for () { + $0type Ty; }"#, ) } diff --git a/crates/ra_syntax/src/ast/make.rs b/crates/ra_syntax/src/ast/make.rs index 192c610f1..42116afbb 100644 --- a/crates/ra_syntax/src/ast/make.rs +++ b/crates/ra_syntax/src/ast/make.rs @@ -64,6 +64,19 @@ pub fn use_item(use_tree: ast::UseTree) -> ast::UseItem { ast_from_text(&format!("use {};", use_tree)) } +pub fn type_alias_def( + name: ast::Name, + bounds: Option, + ty: Option, +) -> ast::TypeAliasDef { + match (bounds, ty) { + (None, None) => ast_from_text(&format!("type {};", name)), + (None, Some(ty)) => ast_from_text(&format!("type {} = {};", name, ty)), + (Some(bounds), None) => ast_from_text(&format!("type {}: {};", name, bounds)), + (Some(bounds), Some(ty)) => ast_from_text(&format!("type {}: {} = {};", name, bounds, ty)), + } +} + pub fn record_field(name: ast::NameRef, expr: Option) -> ast::RecordField { return match expr { Some(expr) => from_text(&format!("{}: {}", name, expr)), -- cgit v1.2.3