diff options
-rw-r--r-- | crates/libsyntax2/src/grammar/expressions/atom.rs | 2 | ||||
-rw-r--r-- | crates/libsyntax2/src/grammar/expressions/mod.rs | 3 | ||||
-rw-r--r-- | crates/libsyntax2/src/grammar/items/mod.rs | 15 | ||||
-rw-r--r-- | crates/libsyntax2/src/grammar/items/nominal.rs | 2 | ||||
-rw-r--r-- | crates/libsyntax2/src/grammar/items/traits.rs | 4 | ||||
-rw-r--r-- | crates/libsyntax2/src/grammar/items/use_item.rs | 2 | ||||
-rw-r--r-- | crates/libsyntax2/src/grammar/mod.rs | 17 | ||||
-rw-r--r-- | crates/libsyntax2/src/lib.rs | 15 | ||||
-rw-r--r-- | crates/libsyntax2/tests/test/main.rs | 66 |
9 files changed, 98 insertions, 28 deletions
diff --git a/crates/libsyntax2/src/grammar/expressions/atom.rs b/crates/libsyntax2/src/grammar/expressions/atom.rs index 8335c700f..f01df56bc 100644 --- a/crates/libsyntax2/src/grammar/expressions/atom.rs +++ b/crates/libsyntax2/src/grammar/expressions/atom.rs | |||
@@ -287,7 +287,7 @@ fn match_expr(p: &mut Parser) -> CompletedMarker { | |||
287 | m.complete(p, MATCH_EXPR) | 287 | m.complete(p, MATCH_EXPR) |
288 | } | 288 | } |
289 | 289 | ||
290 | fn match_arm_list(p: &mut Parser) { | 290 | pub(crate) fn match_arm_list(p: &mut Parser) { |
291 | assert!(p.at(L_CURLY)); | 291 | assert!(p.at(L_CURLY)); |
292 | let m = p.start(); | 292 | let m = p.start(); |
293 | p.eat(L_CURLY); | 293 | p.eat(L_CURLY); |
diff --git a/crates/libsyntax2/src/grammar/expressions/mod.rs b/crates/libsyntax2/src/grammar/expressions/mod.rs index d5ee91ad8..20e0fa328 100644 --- a/crates/libsyntax2/src/grammar/expressions/mod.rs +++ b/crates/libsyntax2/src/grammar/expressions/mod.rs | |||
@@ -2,6 +2,7 @@ mod atom; | |||
2 | 2 | ||
3 | use super::*; | 3 | use super::*; |
4 | pub(super) use self::atom::{literal, LITERAL_FIRST}; | 4 | pub(super) use self::atom::{literal, LITERAL_FIRST}; |
5 | pub(crate) use self::atom::match_arm_list; | ||
5 | 6 | ||
6 | const EXPR_FIRST: TokenSet = LHS_FIRST; | 7 | const EXPR_FIRST: TokenSet = LHS_FIRST; |
7 | 8 | ||
@@ -419,7 +420,7 @@ fn path_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker { | |||
419 | // S { x, y: 32, }; | 420 | // S { x, y: 32, }; |
420 | // S { x, y: 32, ..Default::default() }; | 421 | // S { x, y: 32, ..Default::default() }; |
421 | // } | 422 | // } |
422 | fn named_field_list(p: &mut Parser) { | 423 | pub(crate) fn named_field_list(p: &mut Parser) { |
423 | assert!(p.at(L_CURLY)); | 424 | assert!(p.at(L_CURLY)); |
424 | let m = p.start(); | 425 | let m = p.start(); |
425 | p.bump(); | 426 | p.bump(); |
diff --git a/crates/libsyntax2/src/grammar/items/mod.rs b/crates/libsyntax2/src/grammar/items/mod.rs index 85d7fe770..8c19aa179 100644 --- a/crates/libsyntax2/src/grammar/items/mod.rs +++ b/crates/libsyntax2/src/grammar/items/mod.rs | |||
@@ -5,7 +5,12 @@ mod traits; | |||
5 | mod use_item; | 5 | mod use_item; |
6 | 6 | ||
7 | use super::*; | 7 | use super::*; |
8 | pub(crate) use self::nominal::named_field_def_list; | 8 | pub(crate) use self::{ |
9 | expressions::{named_field_list, match_arm_list}, | ||
10 | nominal::{enum_variant_list, named_field_def_list}, | ||
11 | traits::{trait_item_list, impl_item_list}, | ||
12 | use_item::use_tree_list, | ||
13 | }; | ||
9 | 14 | ||
10 | // test mod_contents | 15 | // test mod_contents |
11 | // fn foo() {} | 16 | // fn foo() {} |
@@ -223,7 +228,7 @@ fn extern_crate_item(p: &mut Parser) { | |||
223 | p.expect(SEMI); | 228 | p.expect(SEMI); |
224 | } | 229 | } |
225 | 230 | ||
226 | fn extern_item_list(p: &mut Parser) { | 231 | pub(crate) fn extern_item_list(p: &mut Parser) { |
227 | assert!(p.at(L_CURLY)); | 232 | assert!(p.at(L_CURLY)); |
228 | let m = p.start(); | 233 | let m = p.start(); |
229 | p.bump(); | 234 | p.bump(); |
@@ -295,7 +300,7 @@ fn type_def(p: &mut Parser) { | |||
295 | p.expect(SEMI); | 300 | p.expect(SEMI); |
296 | } | 301 | } |
297 | 302 | ||
298 | fn mod_item(p: &mut Parser) { | 303 | pub(crate) fn mod_item(p: &mut Parser) { |
299 | assert!(p.at(MOD_KW)); | 304 | assert!(p.at(MOD_KW)); |
300 | p.bump(); | 305 | p.bump(); |
301 | 306 | ||
@@ -307,7 +312,7 @@ fn mod_item(p: &mut Parser) { | |||
307 | } | 312 | } |
308 | } | 313 | } |
309 | 314 | ||
310 | fn mod_item_list(p: &mut Parser) { | 315 | pub(crate) fn mod_item_list(p: &mut Parser) { |
311 | assert!(p.at(L_CURLY)); | 316 | assert!(p.at(L_CURLY)); |
312 | let m = p.start(); | 317 | let m = p.start(); |
313 | p.bump(); | 318 | p.bump(); |
@@ -343,7 +348,7 @@ pub(super) fn macro_call_after_excl(p: &mut Parser) -> BlockLike { | |||
343 | flavor | 348 | flavor |
344 | } | 349 | } |
345 | 350 | ||
346 | pub(super) fn token_tree(p: &mut Parser) { | 351 | pub(crate) fn token_tree(p: &mut Parser) { |
347 | let closing_paren_kind = match p.current() { | 352 | let closing_paren_kind = match p.current() { |
348 | L_CURLY => R_CURLY, | 353 | L_CURLY => R_CURLY, |
349 | L_PAREN => R_PAREN, | 354 | L_PAREN => R_PAREN, |
diff --git a/crates/libsyntax2/src/grammar/items/nominal.rs b/crates/libsyntax2/src/grammar/items/nominal.rs index 3db5b24af..11c43e371 100644 --- a/crates/libsyntax2/src/grammar/items/nominal.rs +++ b/crates/libsyntax2/src/grammar/items/nominal.rs | |||
@@ -51,7 +51,7 @@ pub(super) fn enum_def(p: &mut Parser) { | |||
51 | } | 51 | } |
52 | } | 52 | } |
53 | 53 | ||
54 | fn enum_variant_list(p: &mut Parser) { | 54 | pub(crate) fn enum_variant_list(p: &mut Parser) { |
55 | assert!(p.at(L_CURLY)); | 55 | assert!(p.at(L_CURLY)); |
56 | let m = p.start(); | 56 | let m = p.start(); |
57 | p.bump(); | 57 | p.bump(); |
diff --git a/crates/libsyntax2/src/grammar/items/traits.rs b/crates/libsyntax2/src/grammar/items/traits.rs index 9d21d4d36..c21cfb1a9 100644 --- a/crates/libsyntax2/src/grammar/items/traits.rs +++ b/crates/libsyntax2/src/grammar/items/traits.rs | |||
@@ -25,7 +25,7 @@ pub(super) fn trait_def(p: &mut Parser) { | |||
25 | // fn foo() {} | 25 | // fn foo() {} |
26 | // fn bar(&self); | 26 | // fn bar(&self); |
27 | // } | 27 | // } |
28 | fn trait_item_list(p: &mut Parser) { | 28 | pub(crate) fn trait_item_list(p: &mut Parser) { |
29 | assert!(p.at(L_CURLY)); | 29 | assert!(p.at(L_CURLY)); |
30 | let m = p.start(); | 30 | let m = p.start(); |
31 | p.bump(); | 31 | p.bump(); |
@@ -74,7 +74,7 @@ pub(super) fn impl_item(p: &mut Parser) { | |||
74 | // fn foo() {} | 74 | // fn foo() {} |
75 | // fn bar(&self) {} | 75 | // fn bar(&self) {} |
76 | // } | 76 | // } |
77 | fn impl_item_list(p: &mut Parser) { | 77 | pub(crate) fn impl_item_list(p: &mut Parser) { |
78 | assert!(p.at(L_CURLY)); | 78 | assert!(p.at(L_CURLY)); |
79 | let m = p.start(); | 79 | let m = p.start(); |
80 | p.bump(); | 80 | p.bump(); |
diff --git a/crates/libsyntax2/src/grammar/items/use_item.rs b/crates/libsyntax2/src/grammar/items/use_item.rs index 2fbf2234a..1ee4349fd 100644 --- a/crates/libsyntax2/src/grammar/items/use_item.rs +++ b/crates/libsyntax2/src/grammar/items/use_item.rs | |||
@@ -53,7 +53,7 @@ fn use_tree(p: &mut Parser) { | |||
53 | m.complete(p, USE_TREE); | 53 | m.complete(p, USE_TREE); |
54 | } | 54 | } |
55 | 55 | ||
56 | fn use_tree_list(p: &mut Parser) { | 56 | pub(crate) fn use_tree_list(p: &mut Parser) { |
57 | assert!(p.at(L_CURLY)); | 57 | assert!(p.at(L_CURLY)); |
58 | let m = p.start(); | 58 | let m = p.start(); |
59 | p.bump(); | 59 | p.bump(); |
diff --git a/crates/libsyntax2/src/grammar/mod.rs b/crates/libsyntax2/src/grammar/mod.rs index e19805b9d..2cb11dc1e 100644 --- a/crates/libsyntax2/src/grammar/mod.rs +++ b/crates/libsyntax2/src/grammar/mod.rs | |||
@@ -37,8 +37,21 @@ use { | |||
37 | SyntaxKind::{self, *}, | 37 | SyntaxKind::{self, *}, |
38 | }; | 38 | }; |
39 | pub(crate) use self::{ | 39 | pub(crate) use self::{ |
40 | expressions::block, | 40 | expressions::{ |
41 | items::named_field_def_list, | 41 | block, |
42 | }, | ||
43 | items::{ | ||
44 | enum_variant_list, | ||
45 | extern_item_list, | ||
46 | impl_item_list, | ||
47 | match_arm_list, | ||
48 | mod_item_list, | ||
49 | named_field_def_list, | ||
50 | named_field_list, | ||
51 | token_tree, | ||
52 | trait_item_list, | ||
53 | use_tree_list, | ||
54 | }, | ||
42 | }; | 55 | }; |
43 | 56 | ||
44 | pub(crate) fn root(p: &mut Parser) { | 57 | pub(crate) fn root(p: &mut Parser) { |
diff --git a/crates/libsyntax2/src/lib.rs b/crates/libsyntax2/src/lib.rs index d955c01e7..fd58cb4fa 100644 --- a/crates/libsyntax2/src/lib.rs +++ b/crates/libsyntax2/src/lib.rs | |||
@@ -144,6 +144,21 @@ fn find_reparsable_node(node: SyntaxNodeRef, range: TextRange) -> Option<(Syntax | |||
144 | let res = match node.kind() { | 144 | let res = match node.kind() { |
145 | BLOCK => grammar::block, | 145 | BLOCK => grammar::block, |
146 | NAMED_FIELD_DEF_LIST => grammar::named_field_def_list, | 146 | NAMED_FIELD_DEF_LIST => grammar::named_field_def_list, |
147 | NAMED_FIELD_LIST => grammar::named_field_list, | ||
148 | ENUM_VARIANT_LIST => grammar::enum_variant_list, | ||
149 | MATCH_ARM_LIST => grammar::match_arm_list, | ||
150 | USE_TREE_LIST => grammar::use_tree_list, | ||
151 | EXTERN_ITEM_LIST => grammar::extern_item_list, | ||
152 | TOKEN_TREE if node.first_child().unwrap().kind() == L_CURLY => grammar::token_tree, | ||
153 | ITEM_LIST => { | ||
154 | let parent = node.parent().unwrap(); | ||
155 | match parent.kind() { | ||
156 | IMPL_ITEM => grammar::impl_item_list, | ||
157 | TRAIT_DEF => grammar::trait_item_list, | ||
158 | MODULE => grammar::mod_item_list, | ||
159 | _ => return None, | ||
160 | } | ||
161 | }, | ||
147 | _ => return None, | 162 | _ => return None, |
148 | }; | 163 | }; |
149 | Some(res) | 164 | Some(res) |
diff --git a/crates/libsyntax2/tests/test/main.rs b/crates/libsyntax2/tests/test/main.rs index 014faa2c6..644df9f3c 100644 --- a/crates/libsyntax2/tests/test/main.rs +++ b/crates/libsyntax2/tests/test/main.rs | |||
@@ -24,21 +24,6 @@ fn lexer_tests() { | |||
24 | } | 24 | } |
25 | 25 | ||
26 | #[test] | 26 | #[test] |
27 | fn parser_tests() { | ||
28 | dir_tests(&["parser/inline", "parser/ok", "parser/err"], |text| { | ||
29 | let file = File::parse(text); | ||
30 | dump_tree(file.syntax()) | ||
31 | }) | ||
32 | } | ||
33 | |||
34 | #[test] | ||
35 | fn parser_fuzz_tests() { | ||
36 | for (_, text) in collect_tests(&["parser/fuzz-failures"]) { | ||
37 | check_fuzz_invariants(&text) | ||
38 | } | ||
39 | } | ||
40 | |||
41 | #[test] | ||
42 | fn reparse_test() { | 27 | fn reparse_test() { |
43 | fn do_check(before: &str, replace_with: &str) { | 28 | fn do_check(before: &str, replace_with: &str) { |
44 | let (range, before) = extract_range(before); | 29 | let (range, before) = extract_range(before); |
@@ -73,6 +58,57 @@ fn foo { | |||
73 | <|>92<|>; | 58 | <|>92<|>; |
74 | } | 59 | } |
75 | ", "62"); | 60 | ", "62"); |
61 | do_check(r" | ||
62 | mod foo { | ||
63 | fn <|><|> | ||
64 | } | ||
65 | ", "bar"); | ||
66 | do_check(r" | ||
67 | trait Foo { | ||
68 | type <|>Foo<|>; | ||
69 | } | ||
70 | ", "Output"); | ||
71 | do_check(r" | ||
72 | impl IntoIterator<Item=i32> for Foo { | ||
73 | f<|><|> | ||
74 | } | ||
75 | ", "n next("); | ||
76 | do_check(r" | ||
77 | use a::b::{foo,<|>,bar<|>}; | ||
78 | ", "baz"); | ||
79 | do_check(r" | ||
80 | pub enum A { | ||
81 | Foo<|><|> | ||
82 | } | ||
83 | ", "\nBar;\n"); | ||
84 | do_check(r" | ||
85 | foo!{a, b<|><|> d} | ||
86 | ", ", c[3]"); | ||
87 | do_check(r" | ||
88 | fn foo() { | ||
89 | vec![<|><|>] | ||
90 | } | ||
91 | ", "123"); | ||
92 | do_check(r" | ||
93 | extern { | ||
94 | fn<|>;<|> | ||
95 | } | ||
96 | ", " exit(code: c_int)"); | ||
97 | } | ||
98 | |||
99 | #[test] | ||
100 | fn parser_tests() { | ||
101 | dir_tests(&["parser/inline", "parser/ok", "parser/err"], |text| { | ||
102 | let file = File::parse(text); | ||
103 | dump_tree(file.syntax()) | ||
104 | }) | ||
105 | } | ||
106 | |||
107 | #[test] | ||
108 | fn parser_fuzz_tests() { | ||
109 | for (_, text) in collect_tests(&["parser/fuzz-failures"]) { | ||
110 | check_fuzz_invariants(&text) | ||
111 | } | ||
76 | } | 112 | } |
77 | 113 | ||
78 | 114 | ||