aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/assists/fill_match_arms.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-09-26 10:18:26 +0100
committerAleksey Kladov <[email protected]>2019-09-26 13:29:28 +0100
commit183a38fb50f284de1ca02c05ed945e240f3c0274 (patch)
tree6f318218b3a97c9a2dba3e8311de4fddbce23b27 /crates/ra_assists/src/assists/fill_match_arms.rs
parentd6bbdfefa7ed4b2b567558e76d5adadda9d9b83f (diff)
keep ast creation API simple
Diffstat (limited to 'crates/ra_assists/src/assists/fill_match_arms.rs')
-rw-r--r--crates/ra_assists/src/assists/fill_match_arms.rs27
1 files changed, 14 insertions, 13 deletions
diff --git a/crates/ra_assists/src/assists/fill_match_arms.rs b/crates/ra_assists/src/assists/fill_match_arms.rs
index 817433526..db82db89a 100644
--- a/crates/ra_assists/src/assists/fill_match_arms.rs
+++ b/crates/ra_assists/src/assists/fill_match_arms.rs
@@ -1,9 +1,9 @@
1use std::iter; 1use std::iter;
2 2
3use hir::{db::HirDatabase, Adt, HasSource}; 3use hir::{db::HirDatabase, Adt, HasSource};
4use ra_syntax::ast::{self, AstNode, NameOwner}; 4use ra_syntax::ast::{self, make, AstNode, NameOwner};
5 5
6use crate::{ast_builder::Make, Assist, AssistCtx, AssistId}; 6use crate::{Assist, AssistCtx, AssistId};
7 7
8pub(crate) fn fill_match_arms(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { 8pub(crate) fn fill_match_arms(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
9 let match_expr = ctx.node_at_offset::<ast::MatchExpr>()?; 9 let match_expr = ctx.node_at_offset::<ast::MatchExpr>()?;
@@ -31,8 +31,8 @@ pub(crate) fn fill_match_arms(mut ctx: AssistCtx<impl HirDatabase>) -> Option<As
31 let variants = variant_list.variants(); 31 let variants = variant_list.variants();
32 let arms = variants 32 let arms = variants
33 .filter_map(build_pat) 33 .filter_map(build_pat)
34 .map(|pat| Make::<ast::MatchArm>::from(iter::once(pat), Make::<ast::Expr>::unit())); 34 .map(|pat| make::match_arm(iter::once(pat), make::expr_unit()));
35 let new_arm_list = Make::<ast::MatchArmList>::from_arms(arms); 35 let new_arm_list = make::match_arm_list(arms);
36 36
37 edit.target(match_expr.syntax().text_range()); 37 edit.target(match_expr.syntax().text_range());
38 edit.set_cursor(expr.syntax().text_range().start()); 38 edit.set_cursor(expr.syntax().text_range().start());
@@ -63,21 +63,22 @@ fn resolve_enum_def(
63} 63}
64 64
65fn build_pat(var: ast::EnumVariant) -> Option<ast::Pat> { 65fn build_pat(var: ast::EnumVariant) -> Option<ast::Pat> {
66 let path = Make::<ast::Path>::from(var.parent_enum().name()?, var.name()?); 66 let path = make::path_qualified(
67 make::path_from_name_ref(make::name_ref(&var.parent_enum().name()?.syntax().to_string())),
68 make::name_ref(&var.name()?.syntax().to_string()),
69 );
67 70
68 let pat: ast::Pat = match var.kind() { 71 let pat: ast::Pat = match var.kind() {
69 ast::StructKind::Tuple(field_list) => { 72 ast::StructKind::Tuple(field_list) => {
70 let pats = iter::repeat(Make::<ast::PlaceholderPat>::placeholder().into()) 73 let pats =
71 .take(field_list.fields().count()); 74 iter::repeat(make::placeholder_pat().into()).take(field_list.fields().count());
72 Make::<ast::TupleStructPat>::from(path, pats).into() 75 make::tuple_struct_pat(path, pats).into()
73 } 76 }
74 ast::StructKind::Named(field_list) => { 77 ast::StructKind::Named(field_list) => {
75 let pats = field_list 78 let pats = field_list.fields().map(|f| make::bind_pat(f.name().unwrap()).into());
76 .fields() 79 make::record_pat(path, pats).into()
77 .map(|f| Make::<ast::BindPat>::from_name(f.name().unwrap()).into());
78 Make::<ast::RecordPat>::from(path, pats).into()
79 } 80 }
80 ast::StructKind::Unit => Make::<ast::PathPat>::from_path(path).into(), 81 ast::StructKind::Unit => make::path_pat(path).into(),
81 }; 82 };
82 83
83 Some(pat) 84 Some(pat)