diff options
Diffstat (limited to 'src/grammar/mod.rs')
-rw-r--r-- | src/grammar/mod.rs | 161 |
1 files changed, 0 insertions, 161 deletions
diff --git a/src/grammar/mod.rs b/src/grammar/mod.rs deleted file mode 100644 index e1329044d..000000000 --- a/src/grammar/mod.rs +++ /dev/null | |||
@@ -1,161 +0,0 @@ | |||
1 | //! This is the actual "grammar" of the Rust language. | ||
2 | //! | ||
3 | //! Each function in this module and its children corresponds | ||
4 | //! to a production of the format grammar. Submodules roughly | ||
5 | //! correspond to different *areas* of the grammar. By convention, | ||
6 | //! each submodule starts with `use super::*` import and exports | ||
7 | //! "public" productions via `pub(super)`. | ||
8 | //! | ||
9 | //! See docs for `Parser` to learn about API, available to the grammar, | ||
10 | //! and see docs for `Event` to learn how this actually manages to | ||
11 | //! produce parse trees. | ||
12 | //! | ||
13 | //! Code in this module also contains inline tests, which start with | ||
14 | //! `// test name-of-the-test` comment and look like this: | ||
15 | //! | ||
16 | //! ``` | ||
17 | //! // test function_with_zero_parameters | ||
18 | //! // fn foo() {} | ||
19 | //! ``` | ||
20 | //! | ||
21 | //! After adding a new inline-test, run `cargo collect-tests` to extract | ||
22 | //! it as a standalone text-fixture into `tests/data/parser/inline`, and | ||
23 | //! run `cargo test` once to create the "gold" value. | ||
24 | mod attributes; | ||
25 | mod expressions; | ||
26 | mod items; | ||
27 | mod params; | ||
28 | mod paths; | ||
29 | mod patterns; | ||
30 | mod type_args; | ||
31 | mod type_params; | ||
32 | mod types; | ||
33 | |||
34 | use { | ||
35 | parser_api::{CompletedMarker, Parser, TokenSet}, | ||
36 | SyntaxKind::{self, *}, | ||
37 | }; | ||
38 | |||
39 | pub(crate) fn file(p: &mut Parser) { | ||
40 | let file = p.start(); | ||
41 | p.eat(SHEBANG); | ||
42 | items::mod_contents(p, false); | ||
43 | file.complete(p, FILE); | ||
44 | } | ||
45 | |||
46 | |||
47 | #[derive(Clone, Copy, PartialEq, Eq)] | ||
48 | enum BlockLike { | ||
49 | Block, | ||
50 | NotBlock, | ||
51 | } | ||
52 | |||
53 | impl BlockLike { | ||
54 | fn is_block(self) -> bool { self == BlockLike::Block } | ||
55 | } | ||
56 | |||
57 | fn visibility(p: &mut Parser) { | ||
58 | match p.current() { | ||
59 | PUB_KW => { | ||
60 | let m = p.start(); | ||
61 | p.bump(); | ||
62 | if p.at(L_PAREN) { | ||
63 | match p.nth(1) { | ||
64 | // test crate_visibility | ||
65 | // pub(crate) struct S; | ||
66 | // pub(self) struct S; | ||
67 | // pub(self) struct S; | ||
68 | // pub(self) struct S; | ||
69 | CRATE_KW | SELF_KW | SUPER_KW => { | ||
70 | p.bump(); | ||
71 | p.bump(); | ||
72 | p.expect(R_PAREN); | ||
73 | } | ||
74 | IN_KW => { | ||
75 | p.bump(); | ||
76 | p.bump(); | ||
77 | paths::use_path(p); | ||
78 | p.expect(R_PAREN); | ||
79 | } | ||
80 | _ => (), | ||
81 | } | ||
82 | } | ||
83 | m.complete(p, VISIBILITY); | ||
84 | } | ||
85 | // test crate_keyword_vis | ||
86 | // crate fn main() { } | ||
87 | CRATE_KW => { | ||
88 | let m = p.start(); | ||
89 | p.bump(); | ||
90 | m.complete(p, VISIBILITY); | ||
91 | } | ||
92 | _ => (), | ||
93 | } | ||
94 | } | ||
95 | fn alias(p: &mut Parser) -> bool { | ||
96 | if p.at(AS_KW) { | ||
97 | let alias = p.start(); | ||
98 | p.bump(); | ||
99 | name(p); | ||
100 | alias.complete(p, ALIAS); | ||
101 | } | ||
102 | true //FIXME: return false if three are errors | ||
103 | } | ||
104 | |||
105 | fn abi(p: &mut Parser) { | ||
106 | assert!(p.at(EXTERN_KW)); | ||
107 | let abi = p.start(); | ||
108 | p.bump(); | ||
109 | match p.current() { | ||
110 | STRING | RAW_STRING => p.bump(), | ||
111 | _ => (), | ||
112 | } | ||
113 | abi.complete(p, ABI); | ||
114 | } | ||
115 | |||
116 | fn fn_ret_type(p: &mut Parser) -> bool { | ||
117 | if p.at(THIN_ARROW) { | ||
118 | p.bump(); | ||
119 | types::type_(p); | ||
120 | true | ||
121 | } else { | ||
122 | false | ||
123 | } | ||
124 | } | ||
125 | |||
126 | fn name(p: &mut Parser) { | ||
127 | if p.at(IDENT) { | ||
128 | let m = p.start(); | ||
129 | p.bump(); | ||
130 | m.complete(p, NAME); | ||
131 | } else { | ||
132 | p.error("expected a name"); | ||
133 | } | ||
134 | } | ||
135 | |||
136 | fn name_ref(p: &mut Parser) { | ||
137 | if p.at(IDENT) { | ||
138 | let m = p.start(); | ||
139 | p.bump(); | ||
140 | m.complete(p, NAME_REF); | ||
141 | } else { | ||
142 | p.error("expected identifier"); | ||
143 | } | ||
144 | } | ||
145 | |||
146 | fn error_block(p: &mut Parser, message: &str) { | ||
147 | assert!(p.at(L_CURLY)); | ||
148 | let err = p.start(); | ||
149 | p.error(message); | ||
150 | p.bump(); | ||
151 | let mut level: u32 = 1; | ||
152 | while level > 0 && !p.at(EOF) { | ||
153 | match p.current() { | ||
154 | L_CURLY => level += 1, | ||
155 | R_CURLY => level -= 1, | ||
156 | _ => (), | ||
157 | } | ||
158 | p.bump(); | ||
159 | } | ||
160 | err.complete(p, ERROR); | ||
161 | } | ||