1use super::*;
2use crate::kind::RustSyntaxKind::*;
3use oak_core::{GreenBuilder, SourceLocation};
4
5type State<'a, S> = ParserState<'a, S, RustLanguage>;
6
7impl<'config> Parser<RustLanguage> for RustParser<'config> {
8 fn parse_incremental(
9 &self,
10 text: impl Source,
11 changed: usize,
12 cache: IncrementalCache<RustLanguage>,
13 ) -> OakDiagnostics<Arc<GreenNode<RustSyntaxKind>>> {
14 let mut state = ParserState::new_with_cache(text, changed, cache);
15 let result = self.run(&mut state);
16 state.finish(result)
17 }
18}
19
20impl<'config> RustParser<'config> {
21 fn run<S: Source>(&self, state: &mut State<S>) -> Result<(), OakError> {
22 let root = self.parse_source_file(state)?;
23 state.cache.last_parse = Some(root);
24 Ok(())
25 }
26
27 fn parse_source_file<S: Source>(&self, state: &mut State<S>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
28 self.skip_trivia(state);
30
31 while state.not_at_end() {
32 self.skip_trivia(state);
34
35 match state.peek_kind() {
36 Some(Fn) => {
37 let function = self.parse_function(state)?;
38 let old_builder = std::mem::replace(state.cache.pool, oak_core::GreenBuilder::<RustLanguage>::new(128));
40 let new_builder = old_builder.push(GreenTree::Node(function));
41 *state.cache.pool = new_builder;
42 }
43 Some(Use) => {
44 let use_item = Self::parse_use_item(state)?;
45 let old_builder = std::mem::replace(state.cache.pool, oak_core::GreenBuilder::<RustLanguage>::new(128));
46 let new_builder = old_builder.push(GreenTree::Node(use_item));
47 *state.cache.pool = new_builder;
48 }
49 Some(Const) => {
50 let const_item = Self::parse_const_item(state)?;
51 let old_builder = std::mem::replace(state.cache.pool, oak_core::GreenBuilder::<RustLanguage>::new(128));
52 let new_builder = old_builder.push(GreenTree::Node(const_item));
53 *state.cache.pool = new_builder;
54 }
55 Some(Mod) => {
56 let mod_item = Self::parse_mod_item(state)?;
57 let old_builder = std::mem::replace(state.cache.pool, oak_core::GreenBuilder::<RustLanguage>::new(128));
58 let new_builder = old_builder.push(GreenTree::Node(mod_item));
59 *state.cache.pool = new_builder;
60 }
61 Some(Pub) => {
62 let pub_item = Self::parse_pub_item(state)?;
63 let old_builder = std::mem::replace(state.cache.pool, oak_core::GreenBuilder::<RustLanguage>::new(128));
64 let new_builder = old_builder.push(GreenTree::Node(pub_item));
65 *state.cache.pool = new_builder;
66 }
67 Some(_) => {
68 let (k, len) = match state.advance() {
70 Some(t) => (t.kind, t.length()),
71 None => break,
72 };
73 let old_builder = std::mem::replace(state.cache.pool, oak_core::GreenBuilder::<RustLanguage>::new(128));
74 let new_builder = old_builder.token(k, len);
75 *state.cache.pool = new_builder;
76 }
77 None => break,
78 }
79 }
80
81 let builder = std::mem::replace(state.cache.pool, oak_core::GreenBuilder::<RustLanguage>::new(128));
82 let result = builder.finish(RustSyntaxKind::SourceFile);
83 Ok(result)
84 }
85
86 fn parse_function<S: Source>(&self, state: &mut State<S>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
87 let mut builder = GreenBuilder::<RustLanguage>::new(32);
88
89 if let Some(t) = state.current() {
91 if t.kind == Fn {
92 let (k, len) = (t.kind, t.length());
93 state.advance();
94 builder = builder.token(k, len);
95 }
96 }
97
98 if let Some(t) = state.current() {
100 if t.kind == Identifier {
101 let (k, len) = (t.kind, t.length());
102 state.advance();
103 builder = builder.token(k, len);
104 }
105 }
106
107 if let Some(t) = state.current() {
109 if t.kind == LeftParen {
110 let params = self.parse_param_list(state)?;
111 builder = builder.push(GreenTree::Node(params));
112 }
113 }
114
115 if let Some(t) = state.current() {
117 if t.kind == LeftBrace {
118 let body = Self::parse_block(state)?;
119 builder = builder.push(GreenTree::Node(body));
120 }
121 }
122
123 Ok(builder.finish(RustSyntaxKind::Function))
124 }
125
126 fn parse_function_with_builder<S: Source>(&self, state: &mut State<S>, builder: &mut GreenBuilder<RustLanguage>) -> Result<GreenBuilder<RustLanguage>, OakError> {
127 let mut function_builder = GreenBuilder::<RustLanguage>::new(32);
128
129 if let Some(t) = state.current() {
131 if t.kind == Fn {
132 let (k, len) = (t.kind, t.length());
133 state.advance();
134 function_builder = function_builder.token(k, len);
135 }
136 }
137
138 if let Some(t) = state.current() {
140 if t.kind == Identifier {
141 let (k, len) = (t.kind, t.length());
142 state.advance();
143 function_builder = function_builder.token(k, len);
144 }
145 }
146
147 if let Some(t) = state.current() {
149 if t.kind == LeftParen {
150 let params = self.parse_param_list_with_builder(state)?;
151 function_builder = function_builder.push(GreenTree::Node(params));
152 }
153 }
154
155 if let Some(t) = state.current() {
157 if t.kind == LeftBrace {
158 let body = Self::parse_block(state)?;
159 function_builder = function_builder.push(GreenTree::Node(body));
160 }
161 }
162
163 let function_node = function_builder.finish(RustSyntaxKind::Function);
164 Ok(std::mem::replace(builder, GreenBuilder::<RustLanguage>::new(128)).push(GreenTree::Node(function_node)))
165 }
166
167 fn parse_param_list_with_builder<S: Source>(&self, state: &mut State<S>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
168 let mut builder = GreenBuilder::<RustLanguage>::new(16);
169
170 if let Some(t) = state.current() {
172 if t.kind == RustSyntaxKind::LeftParen {
173 let (k, len) = (t.kind, t.length());
174 state.advance();
175 builder = builder.token(k, len);
176 }
177 }
178
179 while state.current().map(|t| t.kind) != Some(RustSyntaxKind::RightParen) && state.current().is_some() {
181 let param = Self::parse_param(state)?;
182 builder = builder.push(GreenTree::Node(param));
183
184 if let Some(t) = state.current() {
185 if t.kind == RustSyntaxKind::Comma {
186 let (k, len) = (t.kind, t.length());
187 state.advance();
188 builder = builder.token(k, len);
189 }
190 }
191 }
192
193 if let Some(t) = state.current() {
195 if t.kind == RustSyntaxKind::RightParen {
196 let (k, len) = (t.kind, t.length());
197 state.advance();
198 builder = builder.token(k, len);
199 }
200 }
201
202 Ok(builder.finish(RustSyntaxKind::ParameterList))
203 }
204
205 fn parse_param_list<S: Source>(&self, state: &mut State<S>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
206 let mut builder = GreenBuilder::<RustLanguage>::new(16);
207
208 if let Some(t) = state.current() {
210 if t.kind == RustSyntaxKind::LeftParen {
211 let (k, len) = (t.kind, t.length());
212 state.advance();
213 builder = builder.token(k, len);
214 }
215 }
216
217 while state.current().map(|t| t.kind) != Some(RustSyntaxKind::RightParen) && state.current().is_some() {
219 let param = Self::parse_param(state)?;
220 builder = builder.push(GreenTree::Node(param));
221
222 if let Some(t) = state.current() {
223 if t.kind == RustSyntaxKind::Comma {
224 let (k, len) = (t.kind, t.length());
225 state.advance();
226 builder = builder.token(k, len);
227 }
228 }
229 }
230
231 if let Some(t) = state.current() {
233 if t.kind == RustSyntaxKind::RightParen {
234 let (k, len) = (t.kind, t.length());
235 state.advance();
236 builder = builder.token(k, len);
237 }
238 }
239
240 Ok(builder.finish(RustSyntaxKind::ParameterList))
241 }
242
243 pub fn parse_param(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
244 let mut builder = GreenBuilder::<RustLanguage>::new(8);
245
246 if let Some(t) = state.current() {
248 if t.kind == RustSyntaxKind::Identifier {
249 let (k, len) = (t.kind, t.length());
250 state.advance();
251 builder = builder.token(k, len);
252 }
253 }
254
255 if let Some(t) = state.current() {
257 if t.kind == RustSyntaxKind::Colon {
258 let (k, len) = (t.kind, t.length());
259 state.advance();
260 builder = builder.token(k, len);
261 }
262 }
263
264 if let Some(t) = state.current() {
266 if t.kind == RustSyntaxKind::Identifier {
267 let (k, len) = (t.kind, t.length());
268 state.advance();
269 builder = builder.token(k, len);
270 }
271 }
272
273 Ok(builder.finish(RustSyntaxKind::Parameter))
274 }
275
276 pub fn parse_block(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
277 let mut builder = GreenBuilder::<RustLanguage>::new(32);
278
279 if let Some(t) = state.current() {
281 if t.kind == RustSyntaxKind::LeftBrace {
282 let (k, len) = (t.kind, t.length());
283 state.advance();
284 builder = builder.token(k, len);
285 }
286 }
287
288 while state.current().map(|t| t.kind) != Some(RustSyntaxKind::RightBrace) && state.current().is_some() {
290 let stmt = Self::parse_stmt(state)?;
291 builder = builder.push(GreenTree::Node(stmt));
292 }
293
294 if let Some(t) = state.current() {
296 if t.kind == RustSyntaxKind::RightBrace {
297 let (k, len) = (t.kind, t.length());
298 state.advance();
299 builder = builder.token(k, len);
300 }
301 }
302
303 Ok(builder.finish(RustSyntaxKind::BlockExpression))
304 }
305
306 pub fn parse_stmt(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
307 match state.current().map(|t| t.kind) {
308 Some(RustSyntaxKind::Let) => Self::parse_let_stmt(state),
309 _ => Self::parse_expr_stmt(state),
310 }
311 }
312
313 pub fn parse_let_stmt(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
314 let mut builder = GreenBuilder::<RustLanguage>::new(16);
315
316 if let Some(t) = state.current() {
318 if t.kind == RustSyntaxKind::Let {
319 let (k, len) = (t.kind, t.length());
320 state.advance();
321 builder = builder.token(k, len);
322 }
323 }
324
325 if let Some(t) = state.current() {
327 if t.kind == RustSyntaxKind::Identifier {
328 let (k, len) = (t.kind, t.length());
329 state.advance();
330 builder = builder.token(k, len);
331 }
332 }
333
334 if let Some(t) = state.current() {
336 if t.kind == RustSyntaxKind::Eq {
337 let (k, len) = (t.kind, t.length());
338 state.advance();
339 builder = builder.token(k, len);
340 }
341 }
342
343 let expr = Self::parse_expr(state)?;
345 builder = builder.push(GreenTree::Node(expr));
346
347 if let Some(t) = state.current() {
349 if t.kind == RustSyntaxKind::Semicolon {
350 let (k, len) = (t.kind, t.length());
351 state.advance();
352 builder = builder.token(k, len);
353 }
354 }
355
356 Ok(builder.finish(RustSyntaxKind::LetStatement))
357 }
358
359 pub fn parse_expr_stmt(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
360 let mut builder = GreenBuilder::<RustLanguage>::new(8);
361
362 let expr = Self::parse_expr(state)?;
363 builder = builder.push(GreenTree::Node(expr));
364
365 if let Some(t) = state.current() {
367 if t.kind == RustSyntaxKind::Semicolon {
368 let (k, len) = (t.kind, t.length());
369 state.advance();
370 builder = builder.token(k, len);
371 }
372 }
373
374 Ok(builder.finish(RustSyntaxKind::ExpressionStatement))
375 }
376
377 pub fn parse_expr(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
378 let mut builder = GreenBuilder::<RustLanguage>::new(4);
379
380 match state.current().map(|t| t.kind) {
381 Some(RustSyntaxKind::Identifier) => {
382 let (k, len) = match state.advance() { Some(t) => (t.kind, t.length()), None => (RustSyntaxKind::Identifier, 0) };
383 builder = builder.token(k, len);
384 }
385 Some(RustSyntaxKind::IntegerLiteral) => {
386 let (k, len) = match state.advance() { Some(t) => (t.kind, t.length()), None => (RustSyntaxKind::IntegerLiteral, 0) };
387 builder = builder.token(k, len);
388 }
389 _ => {
390 let pos = state.current().map(|t| t.span.start).unwrap_or(state.source.length());
391 return Err(state.source.syntax_error("Expected expression".to_string(), pos));
392 }
393 }
394
395 Ok(builder.finish(RustSyntaxKind::IdentifierExpression))
396 }
397
398 pub fn parse_use_item(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
399 let mut builder = GreenBuilder::<RustLanguage>::new(8);
400
401 if let Some(t) = state.current() {
403 if t.kind == RustSyntaxKind::Use {
404 let (k, len) = (t.kind, t.length());
405 state.advance();
406 builder = builder.token(k, len);
407 }
408 }
409
410 if let Some(t) = state.current() {
412 if t.kind == RustSyntaxKind::Identifier {
413 let (k, len) = (t.kind, t.length());
414 state.advance();
415 builder = builder.token(k, len);
416 }
417 }
418
419 if let Some(t) = state.current() {
421 if t.kind == RustSyntaxKind::Semicolon {
422 let (k, len) = (t.kind, t.length());
423 state.advance();
424 builder = builder.token(k, len);
425 }
426 }
427
428 Ok(builder.finish(RustSyntaxKind::UseDeclaration))
429 }
430
431 pub fn parse_const_item(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
432 let mut builder = GreenBuilder::<RustLanguage>::new(12);
433
434 if let Some(t) = state.current() {
436 if t.kind == RustSyntaxKind::Const {
437 let (k, len) = (t.kind, t.length());
438 state.advance();
439 builder = builder.token(k, len);
440 }
441 }
442
443 if let Some(t) = state.current() {
445 if t.kind == RustSyntaxKind::Identifier {
446 let (k, len) = (t.kind, t.length());
447 state.advance();
448 builder = builder.token(k, len);
449 }
450 }
451
452 if let Some(t) = state.current() {
454 if t.kind == RustSyntaxKind::Colon {
455 let (k, len) = (t.kind, t.length());
456 state.advance();
457 builder = builder.token(k, len);
458 }
459 }
460
461 if let Some(t) = state.current() {
463 if t.kind == RustSyntaxKind::Identifier {
464 let (k, len) = (t.kind, t.length());
465 state.advance();
466 builder = builder.token(k, len);
467 }
468 }
469
470 if let Some(t) = state.current() {
472 if t.kind == RustSyntaxKind::Eq {
473 let (k, len) = (t.kind, t.length());
474 state.advance();
475 builder = builder.token(k, len);
476 }
477 }
478
479 let expr = Self::parse_expr(state)?;
481 builder = builder.push(GreenTree::Node(expr));
482
483 if let Some(t) = state.current() {
485 if t.kind == RustSyntaxKind::Semicolon {
486 let (k, len) = (t.kind, t.length());
487 state.advance();
488 builder = builder.token(k, len);
489 }
490 }
491
492 Ok(builder.finish(RustSyntaxKind::ConstDeclaration))
493 }
494
495 pub fn parse_mod_item(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
496 let mut builder = GreenBuilder::<RustLanguage>::new(8);
497
498 if let Some(t) = state.current() {
500 if t.kind == RustSyntaxKind::Mod {
501 let (k, len) = (t.kind, t.length());
502 state.advance();
503 builder = builder.token(k, len);
504 }
505 }
506
507 if let Some(t) = state.current() {
509 if t.kind == RustSyntaxKind::Identifier {
510 let (k, len) = (t.kind, t.length());
511 state.advance();
512 builder = builder.token(k, len);
513 }
514 }
515
516 if let Some(t) = state.current() {
518 if t.kind == RustSyntaxKind::Semicolon {
519 let (k, len) = (t.kind, t.length());
520 state.advance();
521 builder = builder.token(k, len);
522 }
523 }
524
525 Ok(builder.finish(RustSyntaxKind::ModuleDeclaration))
526 }
527
528 pub fn parse_pub_item(state: &mut ParserState<impl Source, RustLanguage>) -> Result<Arc<GreenNode<RustSyntaxKind>>, OakError> {
529 let mut builder = GreenBuilder::<RustLanguage>::new(4);
530
531 if let Some(t) = state.current() {
533 if t.kind == RustSyntaxKind::Pub {
534 let (k, len) = (t.kind, t.length());
535 state.advance();
536 builder = builder.token(k, len);
537 }
538 }
539
540 Ok(builder.finish(RustSyntaxKind::Visibility))
541 }
542
543 fn skip_trivia<S: Source>(&self, state: &mut State<S>) {
544 while let Some(kind) = state.current() {
545 match kind.kind {
546 RustSyntaxKind::Whitespace | RustSyntaxKind::Comment => {
547 state.advance();
548 }
549 _ => break,
550 }
551 }
552 }
553}