Skip to content

Commit f1afc93

Browse files
committed
Fix handling of literal patterns
Wrap them in a LiteralPat node so they can be distinguished from literal expressions.
1 parent 7ebde24 commit f1afc93

File tree

10 files changed

+133
-41
lines changed

10 files changed

+133
-41
lines changed

crates/ra_hir/src/expr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,7 @@ impl ExprCollector {
850850
}
851851

852852
// TODO: implement
853+
ast::PatKind::LiteralPat(_) => Pat::Missing,
853854
ast::PatKind::SlicePat(_) | ast::PatKind::RangePat(_) => Pat::Missing,
854855
};
855856
let syntax_ptr = SyntaxNodePtr::new(pat.syntax());
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
created: "2019-02-09T18:02:37.377591660Z"
3+
creator: insta@0.6.1
4+
source: crates/ra_hir/src/ty/tests.rs
5+
expression: "&result"
6+
---
7+
[18; 102) '{ ... } }': ()
8+
[24; 100) 'match ... }': ()
9+
[42; 88) 'SizeSk...tail }': [unknown]
10+
[76; 80) 'true': [unknown]
11+
[82; 86) 'tail': [unknown]
12+
[92; 94) '{}': ()
13+

crates/ra_hir/src/ty/tests.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,21 @@ fn test_line_buffer() {
663663
);
664664
}
665665

666+
#[test]
667+
fn infer_std_crash_3() {
668+
// taken from rustc
669+
check_inference(
670+
"infer_std_crash_3",
671+
r#"
672+
pub fn compute() {
673+
match _ {
674+
SizeSkeleton::Pointer { non_zero: true, tail } => {}
675+
}
676+
}
677+
"#,
678+
);
679+
}
680+
666681
fn infer(content: &str) -> String {
667682
let (db, _, file_id) = MockDatabase::with_single_file(content);
668683
let source_file = db.parse(file_id);

crates/ra_syntax/src/ast/generated.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1821,6 +1821,38 @@ impl LiteralExpr {
18211821

18221822
impl LiteralExpr {}
18231823

1824+
// LiteralPat
1825+
#[derive(Debug, PartialEq, Eq, Hash)]
1826+
#[repr(transparent)]
1827+
pub struct LiteralPat {
1828+
pub(crate) syntax: SyntaxNode,
1829+
}
1830+
unsafe impl TransparentNewType for LiteralPat {
1831+
type Repr = rowan::SyntaxNode<RaTypes>;
1832+
}
1833+
1834+
impl AstNode for LiteralPat {
1835+
fn cast(syntax: &SyntaxNode) -> Option<&Self> {
1836+
match syntax.kind() {
1837+
LITERAL_PAT => Some(LiteralPat::from_repr(syntax.into_repr())),
1838+
_ => None,
1839+
}
1840+
}
1841+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1842+
}
1843+
1844+
impl ToOwned for LiteralPat {
1845+
type Owned = TreeArc<LiteralPat>;
1846+
fn to_owned(&self) -> TreeArc<LiteralPat> { TreeArc::cast(self.syntax.to_owned()) }
1847+
}
1848+
1849+
1850+
impl LiteralPat {
1851+
pub fn literal(&self) -> Option<&Literal> {
1852+
super::child_opt(self)
1853+
}
1854+
}
1855+
18241856
// LoopExpr
18251857
#[derive(Debug, PartialEq, Eq, Hash)]
18261858
#[repr(transparent)]
@@ -2594,6 +2626,7 @@ pub enum PatKind<'a> {
25942626
TuplePat(&'a TuplePat),
25952627
SlicePat(&'a SlicePat),
25962628
RangePat(&'a RangePat),
2629+
LiteralPat(&'a LiteralPat),
25972630
}
25982631

25992632
impl AstNode for Pat {
@@ -2607,7 +2640,8 @@ impl AstNode for Pat {
26072640
| TUPLE_STRUCT_PAT
26082641
| TUPLE_PAT
26092642
| SLICE_PAT
2610-
| RANGE_PAT => Some(Pat::from_repr(syntax.into_repr())),
2643+
| RANGE_PAT
2644+
| LITERAL_PAT => Some(Pat::from_repr(syntax.into_repr())),
26112645
_ => None,
26122646
}
26132647
}
@@ -2631,6 +2665,7 @@ impl Pat {
26312665
TUPLE_PAT => PatKind::TuplePat(TuplePat::cast(&self.syntax).unwrap()),
26322666
SLICE_PAT => PatKind::SlicePat(SlicePat::cast(&self.syntax).unwrap()),
26332667
RANGE_PAT => PatKind::RangePat(RangePat::cast(&self.syntax).unwrap()),
2668+
LITERAL_PAT => PatKind::LiteralPat(LiteralPat::cast(&self.syntax).unwrap()),
26342669
_ => unreachable!(),
26352670
}
26362671
}

crates/ra_syntax/src/grammar.ron

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ Grammar(
161161
"TUPLE_PAT",
162162
"SLICE_PAT",
163163
"RANGE_PAT",
164+
"LITERAL_PAT",
164165

165166
// atoms
166167
"TUPLE_EXPR",
@@ -524,6 +525,7 @@ Grammar(
524525
"TuplePat": ( collections: [["args", "Pat"]] ),
525526
"SlicePat": (),
526527
"RangePat": (),
528+
"LiteralPat": (options: ["Literal"]),
527529

528530
"Pat": (
529531
enum: [
@@ -536,6 +538,7 @@ Grammar(
536538
"TuplePat",
537539
"SlicePat",
538540
"RangePat",
541+
"LiteralPat",
539542
],
540543
),
541544

crates/ra_syntax/src/grammar/patterns.rs

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,8 @@ fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
4343
return Some(path_pat(p));
4444
}
4545

46-
// test literal_pattern
47-
// fn main() {
48-
// match () {
49-
// -1 => (),
50-
// 92 => (),
51-
// 'c' => (),
52-
// "hello" => (),
53-
// }
54-
// }
55-
if p.at(MINUS) && (p.nth(1) == INT_NUMBER || p.nth(1) == FLOAT_NUMBER) {
56-
p.bump();
57-
}
58-
59-
if let Some(m) = expressions::literal(p) {
60-
return Some(m);
46+
if is_literal_pat_start(p) {
47+
return Some(literal_pat(p));
6148
}
6249

6350
let m = match la0 {
@@ -73,6 +60,30 @@ fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
7360
Some(m)
7461
}
7562

63+
fn is_literal_pat_start(p: &mut Parser) -> bool {
64+
p.at(MINUS) && (p.nth(1) == INT_NUMBER || p.nth(1) == FLOAT_NUMBER)
65+
|| p.at_ts(expressions::LITERAL_FIRST)
66+
}
67+
68+
// test literal_pattern
69+
// fn main() {
70+
// match () {
71+
// -1 => (),
72+
// 92 => (),
73+
// 'c' => (),
74+
// "hello" => (),
75+
// }
76+
// }
77+
fn literal_pat(p: &mut Parser) -> CompletedMarker {
78+
assert!(is_literal_pat_start(p));
79+
let m = p.start();
80+
if p.at(MINUS) {
81+
p.bump();
82+
}
83+
expressions::literal(p);
84+
m.complete(p, LITERAL_PAT)
85+
}
86+
7687
// test path_part
7788
// fn foo() {
7889
// let foo::Bar = ();

crates/ra_syntax/src/syntax_kinds/generated.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ pub enum SyntaxKind {
157157
TUPLE_PAT,
158158
SLICE_PAT,
159159
RANGE_PAT,
160+
LITERAL_PAT,
160161
TUPLE_EXPR,
161162
ARRAY_EXPR,
162163
PAREN_EXPR,
@@ -493,6 +494,7 @@ impl SyntaxKind {
493494
TUPLE_PAT => &SyntaxInfo { name: "TUPLE_PAT" },
494495
SLICE_PAT => &SyntaxInfo { name: "SLICE_PAT" },
495496
RANGE_PAT => &SyntaxInfo { name: "RANGE_PAT" },
497+
LITERAL_PAT => &SyntaxInfo { name: "LITERAL_PAT" },
496498
TUPLE_EXPR => &SyntaxInfo { name: "TUPLE_EXPR" },
497499
ARRAY_EXPR => &SyntaxInfo { name: "ARRAY_EXPR" },
498500
PAREN_EXPR => &SyntaxInfo { name: "PAREN_EXPR" },

crates/ra_syntax/tests/data/parser/inline/ok/0055_literal_pattern.txt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ SOURCE_FILE@[0; 113)
2222
L_CURLY@[25; 26)
2323
WHITESPACE@[26; 35)
2424
MATCH_ARM@[35; 43)
25-
MINUS@[35; 36)
26-
LITERAL@[36; 37)
27-
INT_NUMBER@[36; 37) "1"
25+
LITERAL_PAT@[35; 37)
26+
MINUS@[35; 36)
27+
LITERAL@[36; 37)
28+
INT_NUMBER@[36; 37) "1"
2829
WHITESPACE@[37; 38)
2930
FAT_ARROW@[38; 40)
3031
WHITESPACE@[40; 41)
@@ -34,8 +35,9 @@ SOURCE_FILE@[0; 113)
3435
COMMA@[43; 44)
3536
WHITESPACE@[44; 53)
3637
MATCH_ARM@[53; 61)
37-
LITERAL@[53; 55)
38-
INT_NUMBER@[53; 55) "92"
38+
LITERAL_PAT@[53; 55)
39+
LITERAL@[53; 55)
40+
INT_NUMBER@[53; 55) "92"
3941
WHITESPACE@[55; 56)
4042
FAT_ARROW@[56; 58)
4143
WHITESPACE@[58; 59)
@@ -45,8 +47,9 @@ SOURCE_FILE@[0; 113)
4547
COMMA@[61; 62)
4648
WHITESPACE@[62; 71)
4749
MATCH_ARM@[71; 80)
48-
LITERAL@[71; 74)
49-
CHAR@[71; 74)
50+
LITERAL_PAT@[71; 74)
51+
LITERAL@[71; 74)
52+
CHAR@[71; 74)
5053
WHITESPACE@[74; 75)
5154
FAT_ARROW@[75; 77)
5255
WHITESPACE@[77; 78)
@@ -56,8 +59,9 @@ SOURCE_FILE@[0; 113)
5659
COMMA@[80; 81)
5760
WHITESPACE@[81; 90)
5861
MATCH_ARM@[90; 103)
59-
LITERAL@[90; 97)
60-
STRING@[90; 97)
62+
LITERAL_PAT@[90; 97)
63+
LITERAL@[90; 97)
64+
STRING@[90; 97)
6165
WHITESPACE@[97; 98)
6266
FAT_ARROW@[98; 100)
6367
WHITESPACE@[100; 101)

crates/ra_syntax/tests/data/parser/inline/ok/0058_range_pat.txt

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ SOURCE_FILE@[0; 112)
2222
WHITESPACE@[26; 35)
2323
MATCH_ARM@[35; 50)
2424
RANGE_PAT@[35; 44)
25-
LITERAL@[35; 36)
26-
INT_NUMBER@[35; 36) "0"
25+
LITERAL_PAT@[35; 36)
26+
LITERAL@[35; 36)
27+
INT_NUMBER@[35; 36) "0"
2728
WHITESPACE@[36; 37)
2829
DOTDOTDOT@[37; 40)
2930
WHITESPACE@[40; 41)
30-
LITERAL@[41; 44)
31-
INT_NUMBER@[41; 44) "100"
31+
LITERAL_PAT@[41; 44)
32+
LITERAL@[41; 44)
33+
INT_NUMBER@[41; 44) "100"
3234
WHITESPACE@[44; 45)
3335
FAT_ARROW@[45; 47)
3436
WHITESPACE@[47; 48)
@@ -39,13 +41,15 @@ SOURCE_FILE@[0; 112)
3941
WHITESPACE@[51; 60)
4042
MATCH_ARM@[60; 77)
4143
RANGE_PAT@[60; 71)
42-
LITERAL@[60; 63)
43-
INT_NUMBER@[60; 63) "101"
44+
LITERAL_PAT@[60; 63)
45+
LITERAL@[60; 63)
46+
INT_NUMBER@[60; 63) "101"
4447
WHITESPACE@[63; 64)
4548
DOTDOTEQ@[64; 67)
4649
WHITESPACE@[67; 68)
47-
LITERAL@[68; 71)
48-
INT_NUMBER@[68; 71) "200"
50+
LITERAL_PAT@[68; 71)
51+
LITERAL@[68; 71)
52+
INT_NUMBER@[68; 71) "200"
4953
WHITESPACE@[71; 72)
5054
FAT_ARROW@[72; 74)
5155
WHITESPACE@[74; 75)
@@ -56,13 +60,15 @@ SOURCE_FILE@[0; 112)
5660
WHITESPACE@[78; 87)
5761
MATCH_ARM@[87; 102)
5862
RANGE_PAT@[87; 97)
59-
LITERAL@[87; 90)
60-
INT_NUMBER@[87; 90) "200"
63+
LITERAL_PAT@[87; 90)
64+
LITERAL@[87; 90)
65+
INT_NUMBER@[87; 90) "200"
6166
WHITESPACE@[90; 91)
6267
DOTDOT@[91; 93)
6368
WHITESPACE@[93; 94)
64-
LITERAL@[94; 97)
65-
INT_NUMBER@[94; 97) "301"
69+
LITERAL_PAT@[94; 97)
70+
LITERAL@[94; 97)
71+
INT_NUMBER@[94; 97) "301"
6672
FAT_ARROW@[97; 99)
6773
WHITESPACE@[99; 100)
6874
TUPLE_EXPR@[100; 102)

crates/ra_syntax/tests/data/parser/ok/0035_weird_exprs.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,9 @@ SOURCE_FILE@[0; 3813)
456456
L_CURLY@[930; 931)
457457
WHITESPACE@[931; 952)
458458
MATCH_ARM@[952; 1147)
459-
LITERAL@[952; 953)
460-
INT_NUMBER@[952; 953) "1"
459+
LITERAL_PAT@[952; 953)
460+
LITERAL@[952; 953)
461+
INT_NUMBER@[952; 953) "1"
461462
WHITESPACE@[953; 954)
462463
FAT_ARROW@[954; 956)
463464
WHITESPACE@[956; 957)
@@ -1080,8 +1081,9 @@ SOURCE_FILE@[0; 3813)
10801081
L_CURLY@[1853; 1854)
10811082
WHITESPACE@[1854; 1855)
10821083
MATCH_ARM@[1855; 1863)
1083-
LITERAL@[1855; 1856)
1084-
INT_NUMBER@[1855; 1856) "1"
1084+
LITERAL_PAT@[1855; 1856)
1085+
LITERAL@[1855; 1856)
1086+
INT_NUMBER@[1855; 1856) "1"
10851087
WHITESPACE@[1856; 1857)
10861088
FAT_ARROW@[1857; 1859)
10871089
WHITESPACE@[1859; 1860)

0 commit comments

Comments
 (0)