From 2c11a9b42deca002bcd4a669dcbb3ab972b939d8 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 10 Jan 2020 21:42:04 +0100 Subject: Qualify paths in 'fill match arms' assist --- crates/ra_assists/src/assists/fill_match_arms.rs | 67 ++++++++++++++++++------ 1 file changed, 51 insertions(+), 16 deletions(-) (limited to 'crates/ra_assists/src/assists') diff --git a/crates/ra_assists/src/assists/fill_match_arms.rs b/crates/ra_assists/src/assists/fill_match_arms.rs index b75bd44eb..99d80998c 100644 --- a/crates/ra_assists/src/assists/fill_match_arms.rs +++ b/crates/ra_assists/src/assists/fill_match_arms.rs @@ -46,19 +46,24 @@ pub(crate) fn fill_match_arms(ctx: AssistCtx) -> Option Option { +) -> Option { let expr_ty = analyzer.type_of(db, &expr)?; - let res = expr_ty.autoderef(db).find_map(|ty| match ty.as_adt() { - Some(Adt::Enum(e)) => Some(e.source(db).value), + let result = expr_ty.autoderef(db).find_map(|ty| match ty.as_adt() { + Some(Adt::Enum(e)) => Some(e), _ => None, }); - res + result } -fn build_pat(var: ast::EnumVariant) -> Option { - let path = make::path_qualified( - make::path_from_name_ref(make::name_ref(&var.parent_enum().name()?.syntax().to_string())), - make::name_ref(&var.name()?.syntax().to_string()), - ); +fn build_pat( + db: &impl HirDatabase, + module: hir::Module, + var: hir::EnumVariant, +) -> Option { + let path = crate::ast_transform::path_to_ast(module.find_use_path(db, var.into())?); - let pat: ast::Pat = match var.kind() { + // FIXME: use HIR for this; it doesn't currently expose struct vs. tuple vs. unit variants though + let pat: ast::Pat = match var.source(db).value.kind() { ast::StructKind::Tuple(field_list) => { let pats = iter::repeat(make::placeholder_pat().into()).take(field_list.fields().count()); @@ -106,7 +113,7 @@ fn build_pat(var: ast::EnumVariant) -> Option { let pats = field_list.fields().map(|f| make::bind_pat(f.name().unwrap()).into()); make::record_pat(path, pats).into() } - ast::StructKind::Unit => make::path_pat(path).into(), + ast::StructKind::Unit => make::path_pat(path), }; Some(pat) @@ -252,4 +259,32 @@ mod tests { "#, ); } + + #[test] + fn fill_match_arms_qualifies_path() { + check_assist( + fill_match_arms, + r#" + mod foo { pub enum E { X, Y } } + use foo::E::X; + + fn main() { + match X { + <|> + } + } + "#, + r#" + mod foo { pub enum E { X, Y } } + use foo::E::X; + + fn main() { + match <|>X { + X => (), + foo::E::Y => (), + } + } + "#, + ); + } } -- cgit v1.2.3