aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-02-10 09:35:40 +0000
committerAleksey Kladov <[email protected]>2018-02-10 09:35:40 +0000
commit2ef16a4121ad497e7fb290445ffe644b6b8ceae6 (patch)
treec9e86b4c2e02c19433f7c6cf8f73578602fb9d26 /src
parent419b9b7e5efd895249934551cb2588b27a956f58 (diff)
G: type item
Diffstat (limited to 'src')
-rw-r--r--src/parser/grammar/items/mod.rs80
-rw-r--r--src/parser/grammar/type_params.rs3
-rw-r--r--src/parser/grammar/types.rs11
-rw-r--r--src/syntax_kinds.rs5
4 files changed, 70 insertions, 29 deletions
diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs
index b73628ec0..ffe86fa97 100644
--- a/src/parser/grammar/items/mod.rs
+++ b/src/parser/grammar/items/mod.rs
@@ -150,7 +150,14 @@ fn item(p: &mut Parser) {
150 } 150 }
151 } 151 }
152 } 152 }
153 153 FN_KW => {
154 fn_item(p);
155 FN_ITEM
156 }
157 TYPE_KW => {
158 type_item(p);
159 TYPE_ITEM
160 }
154 MOD_KW => { 161 MOD_KW => {
155 mod_item(p); 162 mod_item(p);
156 MOD_ITEM 163 MOD_ITEM
@@ -163,10 +170,6 @@ fn item(p: &mut Parser) {
163 structs::enum_item(p); 170 structs::enum_item(p);
164 ENUM_ITEM 171 ENUM_ITEM
165 } 172 }
166 FN_KW => {
167 fn_item(p);
168 FN_ITEM
169 }
170 L_CURLY => { 173 L_CURLY => {
171 item.abandon(p); 174 item.abandon(p);
172 error_block(p, "expected item"); 175 error_block(p, "expected item");
@@ -203,29 +206,6 @@ fn extern_block(p: &mut Parser) {
203 p.expect(R_CURLY); 206 p.expect(R_CURLY);
204} 207}
205 208
206fn mod_item(p: &mut Parser) {
207 assert!(p.at(MOD_KW));
208 p.bump();
209
210 if p.expect(IDENT) && !p.eat(SEMI) {
211 if p.expect(L_CURLY) {
212 mod_contents(p, true);
213 p.expect(R_CURLY);
214 }
215 }
216}
217
218fn abi(p: &mut Parser) {
219 assert!(p.at(EXTERN_KW));
220 let abi = p.start();
221 p.bump();
222 match p.current() {
223 STRING | RAW_STRING => p.bump(),
224 _ => (),
225 }
226 abi.complete(p, ABI);
227}
228
229fn fn_item(p: &mut Parser) { 209fn fn_item(p: &mut Parser) {
230 assert!(p.at(FN_KW)); 210 assert!(p.at(FN_KW));
231 p.bump(); 211 p.bump();
@@ -248,3 +228,47 @@ fn fn_item(p: &mut Parser) {
248 p.expect(R_PAREN); 228 p.expect(R_PAREN);
249 } 229 }
250} 230}
231
232// test type_item
233// type Foo = Bar;
234fn type_item(p: &mut Parser) {
235 assert!(p.at(TYPE_KW));
236 p.bump();
237
238 p.expect(IDENT);
239
240 // test type_item_type_params
241 // type Result<T> = ();
242 type_params::list(p);
243
244 // test type_item_where_clause
245 // type Foo where Foo: Copy = ();
246 type_params::where_clause(p);
247
248 p.expect(EQ);
249 types::type_ref(p);
250 p.expect(SEMI);
251}
252
253fn mod_item(p: &mut Parser) {
254 assert!(p.at(MOD_KW));
255 p.bump();
256
257 if p.expect(IDENT) && !p.eat(SEMI) {
258 if p.expect(L_CURLY) {
259 mod_contents(p, true);
260 p.expect(R_CURLY);
261 }
262 }
263}
264
265fn abi(p: &mut Parser) {
266 assert!(p.at(EXTERN_KW));
267 let abi = p.start();
268 p.bump();
269 match p.current() {
270 STRING | RAW_STRING => p.bump(),
271 _ => (),
272 }
273 abi.complete(p, ABI);
274}
diff --git a/src/parser/grammar/type_params.rs b/src/parser/grammar/type_params.rs
index 12c9a5362..73c3cf8b8 100644
--- a/src/parser/grammar/type_params.rs
+++ b/src/parser/grammar/type_params.rs
@@ -71,5 +71,8 @@ pub(super) fn list(p: &mut Parser) {
71pub(super) fn where_clause(p: &mut Parser) { 71pub(super) fn where_clause(p: &mut Parser) {
72 if p.at(WHERE_KW) { 72 if p.at(WHERE_KW) {
73 p.bump(); 73 p.bump();
74 p.expect(IDENT);
75 p.expect(COLON);
76 p.expect(IDENT);
74 } 77 }
75} 78}
diff --git a/src/parser/grammar/types.rs b/src/parser/grammar/types.rs
index 1a3d44a0a..c798edd08 100644
--- a/src/parser/grammar/types.rs
+++ b/src/parser/grammar/types.rs
@@ -1,5 +1,14 @@
1use super::*; 1use super::*;
2 2
3pub(super) fn type_ref(p: &mut Parser) { 3pub(super) fn type_ref(p: &mut Parser) {
4 p.expect(IDENT); 4 match p.current() {
5 IDENT => p.bump(),
6 L_PAREN => {
7 p.bump();
8 p.expect(R_PAREN);
9 }
10 _ => {
11 p.error("expected type");
12 }
13 }
5} 14}
diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs
index 27bc1cafa..501b940bb 100644
--- a/src/syntax_kinds.rs
+++ b/src/syntax_kinds.rs
@@ -83,6 +83,7 @@ pub enum SyntaxKind {
83 STATIC_KW, 83 STATIC_KW,
84 MUT_KW, 84 MUT_KW,
85 UNSAFE_KW, 85 UNSAFE_KW,
86 TYPE_KW,
86 AUTO_KW, 87 AUTO_KW,
87 DEFAULT_KW, 88 DEFAULT_KW,
88 UNION_KW, 89 UNION_KW,
@@ -97,6 +98,7 @@ pub enum SyntaxKind {
97 CONST_ITEM, 98 CONST_ITEM,
98 TRAIT_ITEM, 99 TRAIT_ITEM,
99 IMPL_ITEM, 100 IMPL_ITEM,
101 TYPE_ITEM,
100 EXTERN_BLOCK, 102 EXTERN_BLOCK,
101 ENUM_VARIANT, 103 ENUM_VARIANT,
102 NAMED_FIELD, 104 NAMED_FIELD,
@@ -203,6 +205,7 @@ impl SyntaxKind {
203 STATIC_KW => &SyntaxInfo { name: "STATIC_KW" }, 205 STATIC_KW => &SyntaxInfo { name: "STATIC_KW" },
204 MUT_KW => &SyntaxInfo { name: "MUT_KW" }, 206 MUT_KW => &SyntaxInfo { name: "MUT_KW" },
205 UNSAFE_KW => &SyntaxInfo { name: "UNSAFE_KW" }, 207 UNSAFE_KW => &SyntaxInfo { name: "UNSAFE_KW" },
208 TYPE_KW => &SyntaxInfo { name: "TYPE_KW" },
206 AUTO_KW => &SyntaxInfo { name: "AUTO_KW" }, 209 AUTO_KW => &SyntaxInfo { name: "AUTO_KW" },
207 DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" }, 210 DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" },
208 UNION_KW => &SyntaxInfo { name: "UNION_KW" }, 211 UNION_KW => &SyntaxInfo { name: "UNION_KW" },
@@ -217,6 +220,7 @@ impl SyntaxKind {
217 CONST_ITEM => &SyntaxInfo { name: "CONST_ITEM" }, 220 CONST_ITEM => &SyntaxInfo { name: "CONST_ITEM" },
218 TRAIT_ITEM => &SyntaxInfo { name: "TRAIT_ITEM" }, 221 TRAIT_ITEM => &SyntaxInfo { name: "TRAIT_ITEM" },
219 IMPL_ITEM => &SyntaxInfo { name: "IMPL_ITEM" }, 222 IMPL_ITEM => &SyntaxInfo { name: "IMPL_ITEM" },
223 TYPE_ITEM => &SyntaxInfo { name: "TYPE_ITEM" },
220 EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, 224 EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },
221 ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, 225 ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
222 NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, 226 NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
@@ -268,6 +272,7 @@ pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {
268 "static" => Some(STATIC_KW), 272 "static" => Some(STATIC_KW),
269 "mut" => Some(MUT_KW), 273 "mut" => Some(MUT_KW),
270 "unsafe" => Some(UNSAFE_KW), 274 "unsafe" => Some(UNSAFE_KW),
275 "type" => Some(TYPE_KW),
271 _ => None, 276 _ => None,
272 } 277 }
273} 278}