aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def
diff options
context:
space:
mode:
authorJonas Platte <[email protected]>2020-02-11 21:33:11 +0000
committerJonas Platte <[email protected]>2020-02-11 21:33:11 +0000
commita3b104aa6df205e74c116d8c9e41900807924e70 (patch)
treeac3cb2695fba41813b70cadee3e624f71dfa2fd3 /crates/ra_hir_def
parent3e1d97790be166f8735607c552a94a28ab9b09b8 (diff)
Implement slice pattern AST > HIR lowering
Diffstat (limited to 'crates/ra_hir_def')
-rw-r--r--crates/ra_hir_def/Cargo.toml1
-rw-r--r--crates/ra_hir_def/src/body/lower.rs16
-rw-r--r--crates/ra_hir_def/src/expr.rs6
3 files changed, 16 insertions, 7 deletions
diff --git a/crates/ra_hir_def/Cargo.toml b/crates/ra_hir_def/Cargo.toml
index 1efa00fe0..6b9be9948 100644
--- a/crates/ra_hir_def/Cargo.toml
+++ b/crates/ra_hir_def/Cargo.toml
@@ -14,6 +14,7 @@ rustc-hash = "1.0"
14either = "1.5" 14either = "1.5"
15anymap = "0.12" 15anymap = "0.12"
16drop_bomb = "0.1.4" 16drop_bomb = "0.1.4"
17itertools = "0.8.2"
17 18
18ra_arena = { path = "../ra_arena" } 19ra_arena = { path = "../ra_arena" }
19ra_db = { path = "../ra_db" } 20ra_db = { path = "../ra_db" }
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs
index e656f9a41..5c779521b 100644
--- a/crates/ra_hir_def/src/body/lower.rs
+++ b/crates/ra_hir_def/src/body/lower.rs
@@ -8,7 +8,7 @@ use ra_arena::Arena;
8use ra_syntax::{ 8use ra_syntax::{
9 ast::{ 9 ast::{
10 self, ArgListOwner, ArrayExprKind, LiteralKind, LoopBodyOwner, ModuleItemOwner, NameOwner, 10 self, ArgListOwner, ArrayExprKind, LiteralKind, LoopBodyOwner, ModuleItemOwner, NameOwner,
11 TypeAscriptionOwner, 11 SlicePatComponents, TypeAscriptionOwner,
12 }, 12 },
13 AstNode, AstPtr, 13 AstNode, AstPtr,
14}; 14};
@@ -591,7 +591,7 @@ where
591 let args = p.args().map(|p| self.collect_pat(p)).collect(); 591 let args = p.args().map(|p| self.collect_pat(p)).collect();
592 Pat::Tuple(args) 592 Pat::Tuple(args)
593 } 593 }
594 ast::Pat::PlaceholderPat(_) => Pat::Wild, 594 ast::Pat::PlaceholderPat(_) | ast::Pat::DotDotPat(_) => Pat::Wild,
595 ast::Pat::RecordPat(p) => { 595 ast::Pat::RecordPat(p) => {
596 let path = p.path().and_then(|path| self.expander.parse_path(path)); 596 let path = p.path().and_then(|path| self.expander.parse_path(path));
597 let record_field_pat_list = 597 let record_field_pat_list =
@@ -616,12 +616,20 @@ where
616 616
617 Pat::Record { path, args: fields } 617 Pat::Record { path, args: fields }
618 } 618 }
619 ast::Pat::SlicePat(p) => {
620 let SlicePatComponents { prefix, slice, suffix } = p.components();
621
622 Pat::Slice {
623 prefix: prefix.into_iter().map(|p| self.collect_pat(p)).collect(),
624 slice: slice.map(|p| self.collect_pat(p)),
625 suffix: suffix.into_iter().map(|p| self.collect_pat(p)).collect(),
626 }
627 }
619 628
620 // FIXME: implement 629 // FIXME: implement
621 ast::Pat::DotDotPat(_) => Pat::Missing,
622 ast::Pat::BoxPat(_) => Pat::Missing, 630 ast::Pat::BoxPat(_) => Pat::Missing,
623 ast::Pat::LiteralPat(_) => Pat::Missing, 631 ast::Pat::LiteralPat(_) => Pat::Missing,
624 ast::Pat::SlicePat(_) | ast::Pat::RangePat(_) => Pat::Missing, 632 ast::Pat::RangePat(_) => Pat::Missing,
625 }; 633 };
626 let ptr = AstPtr::new(&pat); 634 let ptr = AstPtr::new(&pat);
627 self.alloc_pat(pattern, Either::Left(ptr)) 635 self.alloc_pat(pattern, Either::Left(ptr))
diff --git a/crates/ra_hir_def/src/expr.rs b/crates/ra_hir_def/src/expr.rs
index a75ef9970..035824403 100644
--- a/crates/ra_hir_def/src/expr.rs
+++ b/crates/ra_hir_def/src/expr.rs
@@ -393,7 +393,7 @@ pub enum Pat {
393 }, 393 },
394 Slice { 394 Slice {
395 prefix: Vec<PatId>, 395 prefix: Vec<PatId>,
396 rest: Option<PatId>, 396 slice: Option<PatId>,
397 suffix: Vec<PatId>, 397 suffix: Vec<PatId>,
398 }, 398 },
399 Path(Path), 399 Path(Path),
@@ -424,8 +424,8 @@ impl Pat {
424 args.iter().copied().for_each(f); 424 args.iter().copied().for_each(f);
425 } 425 }
426 Pat::Ref { pat, .. } => f(*pat), 426 Pat::Ref { pat, .. } => f(*pat),
427 Pat::Slice { prefix, rest, suffix } => { 427 Pat::Slice { prefix, slice, suffix } => {
428 let total_iter = prefix.iter().chain(rest.iter()).chain(suffix.iter()); 428 let total_iter = prefix.iter().chain(slice.iter()).chain(suffix.iter());
429 total_iter.copied().for_each(f); 429 total_iter.copied().for_each(f);
430 } 430 }
431 Pat::Record { args, .. } => { 431 Pat::Record { args, .. } => {