diff options
author | Aleksey Kladov <[email protected]> | 2018-08-10 20:33:29 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-08-10 20:33:29 +0100 |
commit | 7c67612b8a894187fa3b64725531a5459f9211bf (patch) | |
tree | 9e2a536efa0c880d921fd8d4d74423afc9451fd4 /src/grammar/types.rs | |
parent | 26262aaf05983c5b7f41cc438e287523268fe1eb (diff) |
organizize
Diffstat (limited to 'src/grammar/types.rs')
-rw-r--r-- | src/grammar/types.rs | 212 |
1 files changed, 0 insertions, 212 deletions
diff --git a/src/grammar/types.rs b/src/grammar/types.rs deleted file mode 100644 index 0d8c6bfba..000000000 --- a/src/grammar/types.rs +++ /dev/null | |||
@@ -1,212 +0,0 @@ | |||
1 | use super::*; | ||
2 | |||
3 | pub(super) fn type_(p: &mut Parser) { | ||
4 | match p.current() { | ||
5 | L_PAREN => paren_or_tuple_type(p), | ||
6 | EXCL => never_type(p), | ||
7 | STAR => pointer_type(p), | ||
8 | L_BRACK => array_or_slice_type(p), | ||
9 | AMP => reference_type(p), | ||
10 | UNDERSCORE => placeholder_type(p), | ||
11 | FN_KW | UNSAFE_KW | EXTERN_KW => fn_pointer_type(p), | ||
12 | FOR_KW => for_type(p), | ||
13 | IMPL_KW => impl_trait_type(p), | ||
14 | _ if paths::is_path_start(p) => path_type(p), | ||
15 | _ => { | ||
16 | p.error("expected type"); | ||
17 | } | ||
18 | } | ||
19 | } | ||
20 | |||
21 | pub(super) fn ascription(p: &mut Parser) { | ||
22 | p.expect(COLON); | ||
23 | type_(p) | ||
24 | } | ||
25 | |||
26 | fn type_no_plus(p: &mut Parser) { | ||
27 | type_(p); | ||
28 | } | ||
29 | |||
30 | fn paren_or_tuple_type(p: &mut Parser) { | ||
31 | assert!(p.at(L_PAREN)); | ||
32 | let m = p.start(); | ||
33 | p.bump(); | ||
34 | let mut n_types: u32 = 0; | ||
35 | let mut trailing_comma: bool = false; | ||
36 | while !p.at(EOF) && !p.at(R_PAREN) { | ||
37 | n_types += 1; | ||
38 | type_(p); | ||
39 | if p.eat(COMMA) { | ||
40 | trailing_comma = true; | ||
41 | } else { | ||
42 | trailing_comma = false; | ||
43 | break; | ||
44 | } | ||
45 | } | ||
46 | p.expect(R_PAREN); | ||
47 | |||
48 | let kind = if n_types == 1 && !trailing_comma { | ||
49 | // test paren_type | ||
50 | // type T = (i32); | ||
51 | PAREN_TYPE | ||
52 | } else { | ||
53 | // test unit_type | ||
54 | // type T = (); | ||
55 | |||
56 | // test singleton_tuple_type | ||
57 | // type T = (i32,); | ||
58 | TUPLE_TYPE | ||
59 | }; | ||
60 | m.complete(p, kind); | ||
61 | } | ||
62 | |||
63 | // test never_type | ||
64 | // type Never = !; | ||
65 | fn never_type(p: &mut Parser) { | ||
66 | assert!(p.at(EXCL)); | ||
67 | let m = p.start(); | ||
68 | p.bump(); | ||
69 | m.complete(p, NEVER_TYPE); | ||
70 | } | ||
71 | |||
72 | fn pointer_type(p: &mut Parser) { | ||
73 | assert!(p.at(STAR)); | ||
74 | let m = p.start(); | ||
75 | p.bump(); | ||
76 | |||
77 | match p.current() { | ||
78 | // test pointer_type_mut | ||
79 | // type M = *mut (); | ||
80 | // type C = *mut (); | ||
81 | MUT_KW | CONST_KW => p.bump(), | ||
82 | _ => { | ||
83 | // test pointer_type_no_mutability | ||
84 | // type T = *(); | ||
85 | p.error( | ||
86 | "expected mut or const in raw pointer type \ | ||
87 | (use `*mut T` or `*const T` as appropriate)", | ||
88 | ); | ||
89 | } | ||
90 | }; | ||
91 | |||
92 | type_no_plus(p); | ||
93 | m.complete(p, POINTER_TYPE); | ||
94 | } | ||
95 | |||
96 | fn array_or_slice_type(p: &mut Parser) { | ||
97 | assert!(p.at(L_BRACK)); | ||
98 | let m = p.start(); | ||
99 | p.bump(); | ||
100 | |||
101 | type_(p); | ||
102 | let kind = match p.current() { | ||
103 | // test slice_type | ||
104 | // type T = [()]; | ||
105 | R_BRACK => { | ||
106 | p.bump(); | ||
107 | SLICE_TYPE | ||
108 | } | ||
109 | |||
110 | // test array_type | ||
111 | // type T = [(); 92]; | ||
112 | SEMI => { | ||
113 | p.bump(); | ||
114 | expressions::expr(p); | ||
115 | p.expect(R_BRACK); | ||
116 | ARRAY_TYPE | ||
117 | } | ||
118 | // test array_type_missing_semi | ||
119 | // type T = [() 92]; | ||
120 | _ => { | ||
121 | p.error("expected `;` or `]`"); | ||
122 | SLICE_TYPE | ||
123 | } | ||
124 | }; | ||
125 | m.complete(p, kind); | ||
126 | } | ||
127 | |||
128 | // test reference_type; | ||
129 | // type A = &(); | ||
130 | // type B = &'static (); | ||
131 | // type C = &mut (); | ||
132 | fn reference_type(p: &mut Parser) { | ||
133 | assert!(p.at(AMP)); | ||
134 | let m = p.start(); | ||
135 | p.bump(); | ||
136 | p.eat(LIFETIME); | ||
137 | p.eat(MUT_KW); | ||
138 | type_no_plus(p); | ||
139 | m.complete(p, REFERENCE_TYPE); | ||
140 | } | ||
141 | |||
142 | // test placeholder_type | ||
143 | // type Placeholder = _; | ||
144 | fn placeholder_type(p: &mut Parser) { | ||
145 | assert!(p.at(UNDERSCORE)); | ||
146 | let m = p.start(); | ||
147 | p.bump(); | ||
148 | m.complete(p, PLACEHOLDER_TYPE); | ||
149 | } | ||
150 | |||
151 | // test fn_pointer_type | ||
152 | // type A = fn(); | ||
153 | // type B = unsafe fn(); | ||
154 | // type C = unsafe extern "C" fn(); | ||
155 | fn fn_pointer_type(p: &mut Parser) { | ||
156 | let m = p.start(); | ||
157 | p.eat(UNSAFE_KW); | ||
158 | if p.at(EXTERN_KW) { | ||
159 | abi(p); | ||
160 | } | ||
161 | // test fn_pointer_type_missing_fn | ||
162 | // type F = unsafe (); | ||
163 | if !p.eat(FN_KW) { | ||
164 | m.abandon(p); | ||
165 | p.error("expected `fn`"); | ||
166 | return; | ||
167 | } | ||
168 | |||
169 | params::param_list_opt_patterns(p); | ||
170 | // test fn_pointer_type_with_ret | ||
171 | // type F = fn() -> (); | ||
172 | fn_ret_type(p); | ||
173 | m.complete(p, FN_POINTER_TYPE); | ||
174 | } | ||
175 | |||
176 | // test for_type | ||
177 | // type A = for<'a> fn() -> (); | ||
178 | fn for_type(p: &mut Parser) { | ||
179 | assert!(p.at(FOR_KW)); | ||
180 | let m = p.start(); | ||
181 | p.bump(); | ||
182 | type_params::type_param_list(p); | ||
183 | type_(p); | ||
184 | m.complete(p, FOR_TYPE); | ||
185 | } | ||
186 | |||
187 | // test impl_trait_type | ||
188 | // type A = impl Iterator<Item=Foo<'a>> + 'a; | ||
189 | fn impl_trait_type(p: &mut Parser) { | ||
190 | assert!(p.at(IMPL_KW)); | ||
191 | let m = p.start(); | ||
192 | p.bump(); | ||
193 | type_params::bounds_without_colon(p); | ||
194 | m.complete(p, IMPL_TRAIT_TYPE); | ||
195 | } | ||
196 | |||
197 | // test path_type | ||
198 | // type A = Foo; | ||
199 | // type B = ::Foo; | ||
200 | // type C = self::Foo; | ||
201 | // type D = super::Foo; | ||
202 | pub(super) fn path_type(p: &mut Parser) { | ||
203 | assert!(paths::is_path_start(p)); | ||
204 | let m = p.start(); | ||
205 | paths::type_path(p); | ||
206 | // test path_type_with_bounds | ||
207 | // fn foo() -> Box<T + 'f> {} | ||
208 | if p.eat(PLUS) { | ||
209 | type_params::bounds_without_colon(p); | ||
210 | } | ||
211 | m.complete(p, PATH_TYPE); | ||
212 | } | ||