diff options
author | Jonas Platte <[email protected]> | 2020-02-11 21:33:11 +0000 |
---|---|---|
committer | Jonas Platte <[email protected]> | 2020-02-11 21:33:11 +0000 |
commit | a3b104aa6df205e74c116d8c9e41900807924e70 (patch) | |
tree | ac3cb2695fba41813b70cadee3e624f71dfa2fd3 /crates/ra_hir_def | |
parent | 3e1d97790be166f8735607c552a94a28ab9b09b8 (diff) |
Implement slice pattern AST > HIR lowering
Diffstat (limited to 'crates/ra_hir_def')
-rw-r--r-- | crates/ra_hir_def/Cargo.toml | 1 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body/lower.rs | 16 | ||||
-rw-r--r-- | crates/ra_hir_def/src/expr.rs | 6 |
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" | |||
14 | either = "1.5" | 14 | either = "1.5" |
15 | anymap = "0.12" | 15 | anymap = "0.12" |
16 | drop_bomb = "0.1.4" | 16 | drop_bomb = "0.1.4" |
17 | itertools = "0.8.2" | ||
17 | 18 | ||
18 | ra_arena = { path = "../ra_arena" } | 19 | ra_arena = { path = "../ra_arena" } |
19 | ra_db = { path = "../ra_db" } | 20 | ra_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; | |||
8 | use ra_syntax::{ | 8 | use 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, .. } => { |