swamp_parser/
lib.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/swamp
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5pub mod prelude;
6
7use pest::error::{Error, ErrorVariant, InputLocation};
8use pest::iterators::{Pair, Pairs};
9use pest::{Parser, Position};
10use pest_derive::Parser;
11use std::iter::Peekable;
12use std::str::Chars;
13use swamp_ast::{
14    AssignmentOperatorKind, BinaryOperatorKind, CompoundOperator, CompoundOperatorKind,
15    ConcretePattern, DestructuringPattern, EnumVariantLiteral, ExpressionKind, FieldExpression,
16    FieldName, ForPattern, ForVar, ImportItems, IterableExpression, LocalConstantIdentifier,
17    LocalTypeIdentifierWithOptionalTypeVariables, Mod, NamedStructDef, PatternVariableOrWildcard,
18    QualifiedIdentifier, RangeMode, SpanWithoutFileId, StructTypeField, TypeForParameter,
19    TypeVariable, VariableBinding, prelude::*,
20};
21use swamp_ast::{AttributeLiteralKind, Function};
22use swamp_ast::{GenericParameter, LiteralKind};
23use swamp_ast::{Postfix, PostfixChain};
24use tracing::error;
25
26pub struct ParseResult<'a> {
27    #[allow(dead_code)]
28    script: String, // Pairs are referencing the script
29    pairs: pest::iterators::Pairs<'a, Rule>,
30}
31
32pub struct GeneralError {
33    pub description: String,
34}
35
36#[derive(Debug)]
37pub enum SpecificError {
38    CouldNotMoveDown,
39    CouldNotMoveRight,
40    General(String),
41    ExpectingTypeIdentifier,
42    ExpectingInnerPair,
43    UnexpectedTypeRule(String),
44    ExpectedTypeIdentifier(String),
45    ExpectedLocalTypeIdentifier(String),
46    UnexpectedRuleInParseScript(String),
47    ExpectedControlStatement(String),
48    ExpectedStatement(String),
49    ExpectedIfOrElse(String),
50    MissingFunctionSignature,
51    MissingFunctionBody,
52    ExpectedStatementBlock,
53    ExpectedFunctionDefinition,
54    ExpectedParameter,
55    ExpectedImplItem,
56    ExpectedMemberSignature,
57    ExpectedBlockInWhileLoop,
58    UnexpectedExpressionType(String),
59    UnexpectedAccessType(String),
60    UnknownAssignmentOperator(String),
61    CompoundOperatorCanNotContainMut,
62    InvalidAssignmentTarget,
63    CompoundOperatorCanNotHaveMultipleVariables,
64    ExpectedExpressionAfterPrefixOperator,
65    UnknownOperator(String),
66    UnexpectedPostfixOperator,
67    UnexpectedUnaryOperator(String),
68    InvalidMemberCall,
69    UnknownMatchType,
70    UnexpectedElementInPatternList,
71    InvalidPrecisionValue,
72    InvalidPrecisionType,
73    ExpectedTypeIdentifierAfterPath,
74    UnexpectedPatternListElement(String),
75    MustHaveAtLeastOneArm,
76    UnexpectedMatchArmRule(String),
77    UnknownEnumVariant(String),
78    UnknownLiteral,
79    UnknownPrimary(String),
80    InvalidFormatSpecifier,
81    UnexpectedVariantField,
82    MutOnlyForVariables,
83    UnexpectedTokenInFunctionCall,
84    ExpectedExpressionInInterpolation,
85    UnexpectedRuleInInterpolation,
86    ExpectedForPattern,
87    ExpectedBlock,
88    InvalidForPattern,
89    UnexpectedRuleInElse(String),
90    ExpectedLocationExpression,
91    ExpectedImportPath,
92    ExpectedIdentifier,
93    ExpectedIdentifierAfterPath,
94    ExpectedFieldOrRest,
95    UnknownEscapeCharacter(char),
96    UnfinishedEscapeSequence,
97    InvalidUnicodeEscape,
98    InvalidHexEscape,
99    InvalidUtf8Sequence,
100    MissingTypeName,
101    UnknownTerm(String),
102    UnknownExpr(String),
103    UnexpectedTokenInMutableExpression,
104}
105
106#[derive(Debug)]
107pub struct ParseError {
108    pub span: SpanWithoutFileId,
109    pub specific: SpecificError,
110}
111
112#[derive(Parser)]
113#[grammar = "grammar.pest"]
114pub struct ScriptParser;
115
116pub const UNKNOWN_FILE_ID: u16 = 0xffff;
117
118pub struct AstParser;
119
120impl From<Error<Rule>> for ParseError {
121    fn from(value: Error<Rule>) -> Self {
122        let span = match value.location {
123            InputLocation::Pos(pos) => SpanWithoutFileId {
124                offset: pos as u32,
125                length: 1,
126            },
127            InputLocation::Span((start, end)) => SpanWithoutFileId {
128                offset: start as u32,
129                length: (end - start) as u16,
130            },
131        };
132        Self {
133            span,
134            specific: SpecificError::General(value.variant.to_string()),
135        }
136    }
137}
138
139impl AstParser {
140    fn next_pair<'a>(
141        pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
142    ) -> Result<Pair<'a, Rule>, ParseError> {
143        Ok(pairs.next().ok_or_else(|| {
144            Error::new_from_pos(
145                ErrorVariant::CustomError {
146                    message: "Expected more tokens".into(),
147                },
148                Position::from_start(""),
149            )
150        })?)
151    }
152
153    fn expect_next<'a>(
154        pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
155        expected_rule: Rule,
156    ) -> Result<Pair<'a, Rule>, ParseError> {
157        let pair = Self::next_pair(pairs)?;
158        if pair.as_rule() != expected_rule {
159            return Err(Error::new_from_span(
160                ErrorVariant::CustomError {
161                    message: format!("Expected {:?}, found {:?}", expected_rule, pair.as_rule()),
162                },
163                pair.as_span(),
164            ))?;
165        }
166        Ok(pair)
167    }
168
169    fn expect_identifier_next<'a>(
170        &self,
171        pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
172    ) -> Result<LocalIdentifier, ParseError> {
173        let pair = Self::expect_next(pairs, Rule::identifier)?;
174        Ok(LocalIdentifier::new(self.to_node(&pair)))
175    }
176
177    fn expect_function_identifier_next<'a>(
178        &self,
179        pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
180    ) -> Result<LocalIdentifier, ParseError> {
181        let pair = Self::expect_next(pairs, Rule::function_identifier)?;
182        Ok(LocalIdentifier::new(self.to_node(&pair)))
183    }
184
185    fn expect_constant_identifier_next<'a>(
186        &self,
187        pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
188    ) -> Result<LocalConstantIdentifier, ParseError> {
189        let pair = Self::expect_next(pairs, Rule::constant_identifier)?;
190        Ok(LocalConstantIdentifier(self.to_node(&pair)))
191    }
192
193    fn _expect_variable_next<'a>(
194        &self,
195        pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
196    ) -> Result<Variable, ParseError> {
197        let identifier = self.expect_identifier_next(pairs)?;
198        Ok(Variable {
199            name: identifier.0,
200            is_mutable: None,
201        })
202    }
203
204    fn expect_field_label_next<'a>(
205        &self,
206        pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
207    ) -> Result<FieldName, ParseError> {
208        let field_label_pair = Self::expect_next(pairs, Rule::field_label)?;
209        let mut inner = field_label_pair.clone().into_inner();
210        let ident_pair = inner.next().ok_or_else(|| {
211            self.create_error_pair(SpecificError::ExpectedIdentifier, &field_label_pair)
212        })?;
213
214        Ok(FieldName(self.to_node(&ident_pair)))
215    }
216
217    fn parse_dot_identifier<'a>(&self, pair: &Pair<Rule>) -> Result<FieldName, ParseError> {
218        debug_assert_eq!(pair.as_rule(), Rule::dot_identifier);
219        let mut inner = pair.clone().into_inner();
220        let ident_pair = inner
221            .next()
222            .ok_or_else(|| self.create_error_pair(SpecificError::ExpectedIdentifier, pair))?;
223
224        Ok(FieldName(self.to_node(&ident_pair)))
225    }
226
227    fn expect_local_type_identifier_next<'a>(
228        &self,
229        pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
230    ) -> Result<LocalTypeIdentifier, ParseError> {
231        let pair = Self::expect_next(pairs, Rule::type_identifier)?;
232        Ok(LocalTypeIdentifier::new(self.to_node(&pair)))
233    }
234
235    /*
236    fn expect_qualified_type_identifier_next<'a>(
237        &self,
238        inner_pairs: &mut impl Iterator<Item = Pair<'a, Rule>>,
239    ) -> Result<QualifiedTypeIdentifier, ParseError> {
240        let first = Self::next_pair(inner_pairs)?;
241        match first.as_rule() {
242            Rule::module_segments => {
243                let module_path = self.parse_module_segments(first.clone());
244                let type_id = inner_pairs.next().ok_or_else(|| {
245                    self.create_error_pair(SpecificError::ExpectedTypeIdentifierAfterPath, &first)
246                })?;
247
248                let type_identifier = self.parse_local_type_identifier(&type_id)?;
249                Ok(QualifiedTypeIdentifier::new(type_identifier, module_path))
250            }
251            Rule::type_identifier => Ok(QualifiedTypeIdentifier::new(
252                LocalTypeIdentifier(self.to_node(&first)),
253                Vec::new(),
254            )),
255            _ => Err(self.create_error_pair(
256                SpecificError::ExpectedTypeIdentifier(Self::pair_to_rule(&first)),
257                &first,
258            )),
259        }
260    }
261
262     */
263
264    fn convert_into_iterator<'a>(pair: &'a Pair<'a, Rule>) -> impl Iterator<Item = Pair<'a, Rule>> {
265        pair.clone().into_inner()
266    }
267
268    fn create_error_pair(&self, kind: SpecificError, pair: &Pair<Rule>) -> ParseError {
269        ParseError {
270            span: self.to_span(pair.as_span()),
271            specific: kind,
272        }
273    }
274
275    fn to_err(kind: SpecificError, pair: &Pair<Rule>) -> ParseError {
276        ParseError {
277            span: Self::span(pair.as_span()),
278            specific: kind,
279        }
280    }
281
282    fn next_inner_pair<'a>(&self, pair: &Pair<'a, Rule>) -> Result<Pair<'a, Rule>, ParseError> {
283        let _span = pair.as_span();
284        pair.clone()
285            .into_inner()
286            .next()
287            .ok_or_else(move || self.create_error_pair(SpecificError::ExpectingInnerPair, pair))
288    }
289
290    pub fn parse(rule: Rule, raw_script: &str) -> Result<ParseResult<'static>, ParseError> {
291        let pairs = unsafe {
292            std::mem::transmute::<pest::iterators::Pairs<'_, Rule>, pest::iterators::Pairs<'_, Rule>>(
293                ScriptParser::parse(rule, raw_script)?,
294            )
295        };
296        Ok(ParseResult {
297            script: raw_script.to_string(),
298            pairs,
299        })
300    }
301
302    pub fn parse_item(&self, pair: &Pair<Rule>) -> Result<Definition, ParseError> {
303        debug_assert_eq!(pair.as_rule(), Rule::item);
304
305        let mut inner = pair.clone().into_inner();
306        let mut attributes = Vec::new();
307
308        while let Some(attr_pair) = inner.peek() {
309            if attr_pair.as_rule() == Rule::attribute {
310                let attr = self.parse_attribute(&inner.next().unwrap())?;
311                attributes.push(attr);
312            } else {
313                break;
314            }
315        }
316        // The next should be the definition
317        if let Some(def_pair) = inner.next() {
318            let definition_kind = self.parse_definition(&def_pair, &attributes)?;
319            let definition = Definition {
320                node: self.to_node(&def_pair),
321                kind: definition_kind,
322                attributes,
323            };
324            Ok(definition)
325        } else {
326            panic!("must be definition after attributes")
327        }
328    }
329
330    pub fn parse_module(&self, raw_script: &str) -> Result<Module, ParseError> {
331        let result = Self::parse(Rule::program, raw_script)?;
332
333        let mut pairs = result.pairs;
334
335        let program_pair = Self::next_pair(&mut pairs)?;
336
337        let mut expressions = Vec::new();
338        let mut definitions = Vec::new();
339        for pair in Self::convert_into_iterator(&program_pair) {
340            match pair.as_rule() {
341                Rule::item => {
342                    let def = self.parse_item(&pair)?;
343                    definitions.push(def);
344                }
345                Rule::expression => {
346                    let expr = self.parse_expression(&pair)?;
347                    expressions.push(expr);
348                }
349                Rule::EOI => {} // End of Input - do nothing
350                _ => {
351                    return Err(self.create_error_pair(
352                        SpecificError::UnexpectedRuleInParseScript(Self::pair_to_rule(&pair)),
353                        &pair,
354                    ));
355                }
356            }
357        }
358
359        let maybe_expression = match expressions.len() {
360            0 => None,
361            1 => Some(expressions.into_iter().next().unwrap()),
362            _ => Some(Expression {
363                kind: ExpressionKind::Block(expressions),
364                node: Node {
365                    span: SpanWithoutFileId::default(),
366                },
367            }),
368        };
369
370        Ok(Module::new(definitions, maybe_expression))
371    }
372
373    fn parse_definition(
374        &self,
375        pair: &Pair<Rule>,
376        attributes: &[Attribute],
377    ) -> Result<DefinitionKind, ParseError> {
378        let inner_pair = self.next_inner_pair(pair)?;
379        match inner_pair.as_rule() {
380            Rule::impl_def => self.parse_impl_def(&inner_pair),
381            Rule::const_def => self.parse_const_definition(&inner_pair),
382            Rule::struct_def => self.parse_struct_def(&inner_pair),
383            Rule::type_def => self.parse_type_def(&inner_pair),
384            Rule::function_def => self.parse_function_def(&inner_pair, attributes),
385            Rule::use_def => self.parse_use(&inner_pair),
386            Rule::mod_def => self.parse_mod(&inner_pair),
387            Rule::enum_def => self.parse_enum_def(&inner_pair),
388            _ => todo!(),
389        }
390    }
391
392    fn parse_const_definition(&self, pair: &Pair<Rule>) -> Result<DefinitionKind, ParseError> {
393        Ok(DefinitionKind::Constant(self.parse_const_info(pair)?))
394    }
395
396    fn parse_const_info(&self, pair: &Pair<Rule>) -> Result<ConstantInfo, ParseError> {
397        let mut inner = pair.clone().into_inner(); // Self::convert_into_iterator(pair);
398
399        let constant_identifier = self.expect_constant_identifier_next(&mut inner)?;
400
401        let maybe_annotation = self.parse_maybe_annotation(&mut inner)?;
402
403        let expr_pair = Self::next_pair(&mut inner)?;
404        let expression = self.parse_expression(&expr_pair)?;
405
406        Ok(ConstantInfo {
407            constant_identifier,
408            annotation: maybe_annotation,
409            expression: Box::new(expression),
410        })
411    }
412
413    fn module_path_and_items(
414        &self,
415        pair: &Pair<Rule>,
416    ) -> Result<(Vec<Node>, ImportItems), ParseError> {
417        let mut inner = Self::convert_into_iterator(pair);
418        let import_path = Self::next_pair(&mut inner)?;
419
420        let mut segments = Vec::new();
421        for pair in import_path.into_inner() {
422            segments.push(self.to_node(&pair));
423        }
424
425        let items = match inner.next() {
426            Some(found_rule) => match found_rule.as_rule() {
427                Rule::all_imports => ImportItems::All,
428                Rule::import_list => {
429                    let mut imported_items = Vec::new();
430                    for list_item in found_rule.into_inner() {
431                        let item = Self::next_pair(&mut list_item.into_inner())?;
432
433                        let import_item = match item.as_rule() {
434                            Rule::identifier => {
435                                ImportItem::Identifier(LocalIdentifier::new(self.to_node(&item)))
436                            }
437                            Rule::type_identifier => {
438                                ImportItem::Type(LocalTypeIdentifier::new(self.to_node(&item)))
439                            }
440                            _ => {
441                                return Err(self
442                                    .create_error_pair(SpecificError::ExpectedIdentifier, &item));
443                            }
444                        };
445
446                        imported_items.push(import_item);
447                    }
448                    if imported_items.is_empty() {
449                        ImportItems::Nothing
450                    } else {
451                        ImportItems::Items(imported_items)
452                    }
453                }
454                _ => panic!("was not all_imports or import_list"),
455            },
456            None => ImportItems::Nothing,
457        };
458
459        Ok((segments, items))
460    }
461
462    fn parse_use(&self, pair: &Pair<Rule>) -> Result<DefinitionKind, ParseError> {
463        let (segments, items) = self.module_path_and_items(pair)?;
464
465        Ok(DefinitionKind::Use(Use {
466            module_path: ModulePath(segments),
467            items,
468        }))
469    }
470
471    fn parse_mod(&self, pair: &Pair<Rule>) -> Result<DefinitionKind, ParseError> {
472        let (segments, items) = self.module_path_and_items(pair)?;
473
474        Ok(DefinitionKind::Mod(Mod {
475            module_path: ModulePath(segments),
476            items,
477        }))
478    }
479
480    fn pair_to_rule(rule: &Pair<Rule>) -> String {
481        format!("{:?}", rule.as_rule())
482    }
483
484    fn parse_block(&self, block_pair: &Pair<Rule>) -> Result<Expression, ParseError> {
485        if block_pair.as_rule() != Rule::block {
486            return Err(self.create_error_pair(SpecificError::ExpectedBlock, block_pair));
487        }
488
489        let mut expressions = Vec::new();
490
491        for pair in Self::convert_into_iterator(block_pair) {
492            if pair.as_rule() != Rule::expression {
493                return Err(self.create_error_pair(
494                    SpecificError::UnexpectedRuleInParseScript(format!(
495                        "Expected expression_in_block, got: {:?}",
496                        pair.as_rule()
497                    )),
498                    block_pair,
499                ));
500            }
501
502            match pair.as_rule() {
503                Rule::expression => {
504                    let expr = self.parse_expression(&pair)?;
505                    expressions.push(expr);
506                }
507                _ => {
508                    return Err(self.create_error_pair(
509                        SpecificError::UnexpectedRuleInParseScript(format!(
510                            "Unexpected rule in parse_block: {:?}",
511                            pair.as_rule()
512                        )),
513                        &pair,
514                    ));
515                }
516            }
517        }
518
519        let block_expr = self.create_expr(ExpressionKind::Block(expressions), block_pair);
520        Ok(block_expr)
521    }
522
523    fn parse_with_expr(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
524        let mut inner = Self::convert_into_iterator(pair);
525        let binding_list_pair = inner.next().expect("variable list missing");
526        let binding_list = self.parse_variable_binding_list(&binding_list_pair)?;
527
528        let expr_pair = inner.next().expect("block missing");
529        let expr = self.parse_expression(&expr_pair)?;
530
531        let with_expr = self.create_expr(ExpressionKind::With(binding_list, Box::from(expr)), pair);
532        Ok(with_expr)
533    }
534
535    fn parse_when_expr(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
536        let mut inner = Self::convert_into_iterator(pair);
537        let binding_list =
538            self.parse_variable_binding_list(&inner.next().expect("variable list missing"))?;
539        let expr = self.parse_expression(&inner.next().expect("block missing"))?;
540
541        let next = inner.next();
542        let else_expr = if let Some(found_else) = next {
543            Some(Box::new(self.parse_expression(&found_else)?))
544        } else {
545            None
546        };
547
548        Ok(self.create_expr(
549            ExpressionKind::When(binding_list, Box::from(expr), else_expr),
550            pair,
551        ))
552    }
553
554    fn parse_when_variable_binding(
555        &self,
556        pair: &Pair<Rule>,
557    ) -> Result<VariableBinding, ParseError> {
558        let mut inner = Self::convert_into_iterator(pair);
559
560        let variable = self.parse_variable_item(&inner.next().expect("variable missing"))?;
561
562        let expression = match inner.next() {
563            Some(expr_pair) => Some(self.parse_arg_expression(&expr_pair)?),
564            _ => None,
565        };
566
567        Ok(VariableBinding {
568            variable,
569            expression,
570        })
571    }
572
573    fn parse_variable_binding_list(
574        &self,
575        pair: &Pair<Rule>,
576    ) -> Result<Vec<VariableBinding>, ParseError> {
577        let inner = Self::convert_into_iterator(pair);
578        let mut bindings = Vec::new();
579
580        // Each item in inner will be a variable_binding
581        for binding_pair in inner {
582            if binding_pair.as_rule() == Rule::variable_binding {
583                bindings.push(self.parse_when_variable_binding(&binding_pair)?);
584            }
585        }
586
587        Ok(bindings)
588    }
589    fn parse_if_expression(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
590        let mut inner = Self::convert_into_iterator(pair);
591        let condition = self.parse_expression(&Self::next_pair(&mut inner)?)?;
592        let then_branch = self.parse_expression(&Self::next_pair(&mut inner)?)?;
593        let else_branch = inner
594            .next()
595            .map(|p| {
596                match p.as_rule() {
597                    Rule::if_expr => self.parse_if_expression(&p), // Recursively handle `else if`
598                    _ => self.parse_expression(&p),                // Inline or block `else`
599                }
600            })
601            .transpose()?;
602
603        Ok(self.create_expr(
604            ExpressionKind::If(
605                Box::new(condition),
606                Box::new(then_branch),
607                else_branch.map(Box::new),
608            ),
609            pair,
610        ))
611    }
612
613    #[allow(clippy::too_many_lines)]
614    fn parse_postfix_expression(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
615        assert_eq!(pair.as_rule(), Rule::postfix);
616        let mut inner = pair.clone().into_inner();
617
618        let primary_pair = inner.next().ok_or_else(|| {
619            self.create_error_pair(SpecificError::UnexpectedPostfixOperator, pair)
620        })?;
621        let start_expr = self.parse_term(&primary_pair)?;
622        //info!(?start_expr, "start");
623        let mut postfixes = Vec::new();
624        if inner.len() == 0 {
625            return Ok(start_expr);
626        }
627
628        for op_pair in inner.clone() {
629            //info!(rule=?op_pair.as_rule(), "..continuing chain");
630            match op_pair.as_rule() {
631                Rule::postfix_op => {
632                    let mut sub_inner = op_pair.clone().into_inner();
633                    let child = sub_inner.next().ok_or_else(|| {
634                        self.create_error_pair(SpecificError::UnexpectedPostfixOperator, &op_pair)
635                    })?;
636
637                    match child.as_rule() {
638                        Rule::unwrap_postfix => {
639                            postfixes
640                                .push(Postfix::OptionalChainingOperator(self.to_node(&op_pair)));
641                        }
642
643                        Rule::none_coalesce_postfix => {
644                            let mut postfix_inner = Self::convert_into_iterator(&child);
645                            let expr_pair = postfix_inner.next().expect("must have following");
646                            let default_expression = self.parse_expression(&expr_pair)?;
647                            postfixes.push(Postfix::NoneCoalescingOperator(default_expression));
648                        }
649
650                        Rule::function_call_postfix => {
651                            let (maybe_generics, args) =
652                                self.parse_function_call_postfix(&child)?;
653                            let node = self.to_node(&op_pair);
654                            postfixes.push(Postfix::FunctionCall(node, maybe_generics, args));
655                        }
656
657                        Rule::member_call_postfix => {
658                            let (member_identifier, maybe_generics, args) =
659                                self.parse_member_call_postfix(&child)?;
660
661                            postfixes.push(Postfix::MemberCall(
662                                member_identifier.0,
663                                maybe_generics,
664                                args,
665                            ));
666                        }
667
668                        Rule::member_access_postfix => {
669                            let mut inner = child.into_inner();
670                            let dot_id = Self::next_pair(&mut inner)?;
671                            let identifier = self.parse_dot_identifier(&dot_id)?;
672                            postfixes.push(Postfix::FieldAccess(identifier.0));
673                        }
674
675                        Rule::subscript_postfix => {
676                            let mut arr_inner = child.clone().into_inner();
677
678                            let first_expr_pair = arr_inner.next().ok_or_else(|| {
679                                self.create_error_pair(
680                                    SpecificError::UnexpectedPostfixOperator,
681                                    &child,
682                                )
683                            })?;
684                            let first_expression = self.parse_expression(&first_expr_pair)?;
685
686                            let second_expr_pair = arr_inner.next();
687                            match second_expr_pair {
688                                Some(pair) => {
689                                    let second_expression = self.parse_expression(&pair)?;
690                                    postfixes.push(Postfix::SubscriptTuple(
691                                        first_expression,
692                                        second_expression,
693                                    ));
694                                }
695                                None => {
696                                    postfixes.push(Postfix::Subscript(first_expression));
697                                }
698                            }
699                        }
700
701                        _ => {
702                            return Err(self.create_error_pair(
703                                SpecificError::UnexpectedPostfixOperator,
704                                &child,
705                            ));
706                        }
707                    }
708                }
709                _ => {
710                    return Err(
711                        self.create_error_pair(SpecificError::UnexpectedPostfixOperator, &op_pair)
712                    );
713                }
714            }
715        }
716
717        Ok(self.create_expr(
718            ExpressionKind::PostfixChain(PostfixChain {
719                base: Box::from(start_expr),
720                postfixes,
721            }),
722            pair,
723        ))
724    }
725
726    fn parse_member_call_postfix(
727        &self,
728        pair: &Pair<Rule>,
729    ) -> Result<(FieldName, Option<Vec<GenericParameter>>, Vec<Expression>), ParseError> {
730        debug_assert_eq!(pair.as_rule(), Rule::member_call_postfix);
731
732        let mut inner = pair.clone().into_inner();
733
734        let member_access = Self::next_pair(&mut inner)?;
735        debug_assert_eq!(member_access.as_rule(), Rule::member_access_postfix);
736        let mut ma_inner = member_access.into_inner();
737        let dot_id = Self::next_pair(&mut ma_inner)?;
738        let member_identifier = self.parse_dot_identifier(&dot_id)?;
739
740        let mut generic_args: Option<Vec<GenericParameter>> = None;
741        // Peek at the next rule without consuming it
742        if let Some(peeked_pair) = inner.peek() {
743            if peeked_pair.as_rule() == Rule::generic_arguments {
744                let generic_args_pair = Self::next_pair(&mut inner)?;
745                generic_args = Some(self.parse_generic_arguments(&generic_args_pair)?);
746            }
747        } else {
748            panic!("shouldn't happen in member_call_postfix")
749        }
750
751        let args_pair = Self::next_pair(&mut inner)?;
752        let args = self.parse_function_call_arguments(&args_pair)?;
753
754        Ok((member_identifier, generic_args, args))
755    }
756
757    fn parse_type_def(&self, pair: &Pair<Rule>) -> Result<DefinitionKind, ParseError> {
758        let mut inner = Self::convert_into_iterator(pair);
759        let alias_name = self.expect_local_type_identifier_next(&mut inner)?;
760        let referenced_type = self.parse_type(inner.next().expect("should work"))?;
761
762        let alias_type = AliasType {
763            identifier: alias_name,
764            referenced_type,
765        };
766
767        Ok(DefinitionKind::AliasDef(alias_type))
768    }
769
770    fn parse_struct_type_field(&self, pair: &Pair<Rule>) -> Result<StructTypeField, ParseError> {
771        debug_assert_eq!(pair.as_rule(), Rule::struct_type_field);
772
773        let mut field_inner = Self::convert_into_iterator(pair);
774        let field_name = self.expect_field_label_next(&mut field_inner)?;
775        let field_type = self.parse_type(Self::next_pair(&mut field_inner)?)?;
776        let struct_type_field = StructTypeField {
777            field_name,
778            field_type,
779        };
780
781        Ok(struct_type_field)
782    }
783
784    fn parse_struct_type_fields(
785        &self,
786        pair: &Pair<Rule>,
787    ) -> Result<Vec<StructTypeField>, ParseError> {
788        debug_assert_eq!(pair.as_rule(), Rule::struct_type_fields);
789        let mut fields = Vec::new();
790        for field_def in Self::convert_into_iterator(pair) {
791            let anonymous_struct_field = self.parse_struct_type_field(&field_def)?;
792
793            fields.push(anonymous_struct_field);
794        }
795        Ok(fields)
796    }
797
798    fn parse_struct_type(&self, pair: &Pair<Rule>) -> Result<AnonymousStructType, ParseError> {
799        debug_assert_eq!(pair.as_rule(), Rule::struct_type);
800        let fields = Self::right_alternative(pair)?;
801        let fields = self.parse_struct_type_fields(&fields)?;
802        let struct_type = AnonymousStructType::new(fields);
803        Ok(struct_type)
804    }
805
806    fn parse_tuple_type_elements(&self, pair: &Pair<Rule>) -> Result<Vec<Type>, ParseError> {
807        debug_assert_eq!(pair.as_rule(), Rule::tuple_type);
808        let mut types = Vec::new();
809        for type_pair in pair.clone().into_inner() {
810            let type_value = self.parse_type(type_pair)?;
811            types.push(type_value);
812        }
813        Ok(types)
814    }
815
816    fn parse_struct_def(&self, pair: &Pair<Rule>) -> Result<DefinitionKind, ParseError> {
817        let mut inner = Self::convert_into_iterator(pair).peekable();
818
819        let name_with_optional_type_params =
820            self.parse_local_type_identifier_with_optional_type_variables(&inner.next().unwrap())?;
821
822        // struct_type is optional
823        // it is valid syntax to just do:
824        // `struct SomeStruct`
825        let struct_type_pair_option = inner.next();
826        let struct_type_result = match struct_type_pair_option {
827            Some(struct_type_pair) => Some(self.parse_struct_type(&struct_type_pair)?),
828            None => None,
829        };
830
831        let struct_type = struct_type_result.map_or_else(
832            || AnonymousStructType::new(vec![]),
833            |found_result| found_result,
834        );
835
836        Ok(DefinitionKind::NamedStructDef(NamedStructDef {
837            identifier: name_with_optional_type_params,
838            struct_type,
839        }))
840    }
841
842    fn parse_function_def(
843        &self,
844        pair: &Pair<Rule>,
845        attributes: &[Attribute],
846    ) -> Result<DefinitionKind, ParseError> {
847        let function_pair = self.next_inner_pair(pair)?;
848
849        match function_pair.as_rule() {
850            Rule::normal_function => {
851                let mut inner = function_pair.clone().into_inner();
852                let signature_pair = inner.next().ok_or_else(|| {
853                    self.create_error_pair(SpecificError::MissingFunctionSignature, &function_pair)
854                })?;
855
856                let signature = self.parse_function_signature(&signature_pair)?;
857
858                let body = self.parse_block(&inner.next().ok_or_else(|| {
859                    self.create_error_pair(SpecificError::MissingFunctionBody, &function_pair)
860                })?)?;
861
862                Ok(DefinitionKind::FunctionDef(Function::Internal(
863                    FunctionWithBody {
864                        declaration: signature,
865                        attributes: attributes.to_vec(),
866                        body,
867                    },
868                )))
869            }
870            Rule::external_function => {
871                let mut inner = function_pair.clone().into_inner();
872                let id = inner.next().unwrap();
873                let signature_pair = inner.next().ok_or_else(|| {
874                    self.create_error_pair(
875                        SpecificError::MissingFunctionSignature,
876                        &function_pair.clone(),
877                    )
878                })?;
879
880                let signature = self.parse_function_signature(&signature_pair)?;
881                Ok(DefinitionKind::FunctionDef(Function::External(
882                    self.to_node(&id),
883                    signature,
884                )))
885            }
886            _ => {
887                Err(self
888                    .create_error_pair(SpecificError::ExpectedFunctionDefinition, &function_pair))
889            }
890        }
891    }
892    fn parse_function_signature(
893        &self,
894        pair: &Pair<Rule>,
895    ) -> Result<FunctionDeclaration, ParseError> {
896        if pair.as_rule() != Rule::function_signature {
897            return Err(self.create_error_pair(SpecificError::MissingFunctionSignature, pair));
898        }
899
900        let mut inner = pair.clone().into_inner();
901
902        let function_name = self.expect_function_identifier_next(&mut inner)?;
903
904        let mut maybe_next_token = inner.next();
905        if let Some(next_rule) = &maybe_next_token {
906            if next_rule.as_rule() == Rule::generic_type_variables {
907                //generic_types = self.parse_generic_type_variables(next_rule)?;
908                maybe_next_token = inner.next();
909            }
910        }
911
912        let (parameters, return_type) = match maybe_next_token {
913            Some(token) if token.as_rule() == Rule::parameter_list => {
914                let params = self.parse_parameters(&token)?;
915
916                let ret_type = if let Some(return_type_pair) = inner.next() {
917                    Some(self.parse_return_type(&return_type_pair)?)
918                } else {
919                    None
920                };
921
922                (params, ret_type)
923            }
924
925            Some(token) if token.as_rule() == Rule::return_type => {
926                (Vec::new(), Some(self.parse_return_type(&token)?))
927            }
928            _ => (Vec::new(), None),
929        };
930
931        Ok(FunctionDeclaration {
932            name: function_name.0,
933            params: parameters,
934            self_parameter: None,
935            return_type,
936        })
937    }
938
939    fn parse_return_type(&self, pair: &Pair<Rule>) -> Result<Type, ParseError> {
940        let inner_pair = self.next_inner_pair(pair)?;
941        self.parse_type(inner_pair)
942    }
943
944    pub fn parse_parameters(&self, pair: &Pair<Rule>) -> Result<Vec<Parameter>, ParseError> {
945        let mut parameters = Vec::new();
946
947        for param_pair in Self::convert_into_iterator(pair) {
948            match param_pair.as_rule() {
949                Rule::parameter => {
950                    let mut iterator = Self::convert_into_iterator(&param_pair);
951                    let may_mut_pair = iterator.next().unwrap();
952                    let var = self.parse_maybe_mut_identifier(&may_mut_pair)?;
953                    let type_pair = iterator.next().unwrap();
954                    let param_type = self.parse_type(type_pair.clone())?;
955
956                    parameters.push(Parameter {
957                        variable: var,
958                        param_type,
959                    });
960                }
961                Rule::self_parameter => {
962                    panic!("should have been handled before parsing parameters")
963                }
964                _ => {
965                    return Err(
966                        self.create_error_pair(SpecificError::ExpectedParameter, &param_pair)
967                    );
968                }
969            }
970        }
971
972        Ok(parameters)
973    }
974
975    fn parse_impl_def(&self, pair: &Pair<Rule>) -> Result<DefinitionKind, ParseError> {
976        let mut inner = Self::convert_into_iterator(pair);
977        let name_with_optional_type_params =
978            self.parse_local_type_identifier_with_optional_type_variables(&inner.next().unwrap())?;
979
980        let mut functions = Vec::new();
981
982        for item_pair in inner {
983            if item_pair.as_rule() == Rule::impl_item {
984                let inner_item = self.next_inner_pair(&item_pair)?;
985                match inner_item.as_rule() {
986                    Rule::external_member_function => {
987                        let mut inner_inner_item = inner_item.into_inner();
988                        let id = inner_inner_item.next().unwrap();
989                        let signature =
990                            self.parse_member_signature(&inner_inner_item.next().unwrap())?;
991                        functions.push(Function::External(self.to_node(&id), signature));
992                    }
993                    Rule::normal_member_function => {
994                        let function_data = self.parse_member_data(&inner_item)?;
995                        functions.push(Function::Internal(function_data));
996                    }
997                    _ => {
998                        return Err(
999                            self.create_error_pair(SpecificError::ExpectedImplItem, &inner_item)
1000                        );
1001                    }
1002                }
1003            }
1004        }
1005
1006        Ok(DefinitionKind::ImplDef(
1007            name_with_optional_type_params,
1008            functions,
1009        ))
1010    }
1011
1012    fn parse_member_signature(&self, pair: &Pair<Rule>) -> Result<FunctionDeclaration, ParseError> {
1013        debug_assert_eq!(pair.as_rule(), Rule::member_signature);
1014
1015        let mut inner = pair.clone().into_inner();
1016
1017        let name = self.expect_function_identifier_next(&mut inner)?;
1018
1019        // TODO: Remove the parsing of generic type variables
1020        let maybe_next_token = inner.peek();
1021        if let Some(next_rule) = &maybe_next_token {
1022            if next_rule.as_rule() == Rule::generic_type_variables {
1023                // self.parse_generic_type_variables(next_rule)?;
1024                let _ = inner.next();
1025            }
1026        }
1027
1028        let mut parameters = Vec::new();
1029        let mut self_parameter = None;
1030        let mut return_type = None;
1031
1032        for next_pair in inner {
1033            match next_pair.as_rule() {
1034                Rule::self_parameter => {
1035                    let mut mut_keyword_node = None;
1036                    let mut self_node = None;
1037
1038                    for pair in next_pair.into_inner() {
1039                        match pair.as_rule() {
1040                            Rule::mut_keyword => {
1041                                mut_keyword_node = Some(self.to_node(&pair));
1042                            }
1043                            Rule::self_identifier => {
1044                                self_node = Some(self.to_node(&pair));
1045                            }
1046                            _ => unreachable!("Unexpected rule in self_parameter"),
1047                        }
1048                    }
1049
1050                    self_parameter = Some(SelfParameter {
1051                        is_mutable: mut_keyword_node,
1052                        self_node: self_node.expect("self node must exist"),
1053                    });
1054                }
1055                Rule::parameter_list => {
1056                    parameters = self.parse_parameters(&next_pair)?;
1057                }
1058                Rule::return_type => {
1059                    return_type = Some(self.parse_return_type(&next_pair)?);
1060                }
1061                _ => {}
1062            }
1063        }
1064
1065        Ok(FunctionDeclaration {
1066            name: name.0,
1067            params: parameters,
1068            self_parameter,
1069            return_type,
1070        })
1071    }
1072
1073    fn parse_member_data(&self, pair: &Pair<Rule>) -> Result<FunctionWithBody, ParseError> {
1074        if pair.as_rule() != Rule::normal_member_function {
1075            return Err(self.create_error_pair(SpecificError::ExpectedMemberSignature, pair));
1076        }
1077
1078        let mut inner = Self::convert_into_iterator(pair).peekable();
1079
1080        let mut attributes = Vec::new();
1081        while let Some(next) = inner.peek() {
1082            if next.as_rule() == Rule::attribute {
1083                let attr_pair = inner.next().unwrap();
1084                let attr = self.parse_attribute(&attr_pair)?;
1085                attributes.push(attr);
1086            } else {
1087                break;
1088            }
1089        }
1090
1091        let signature_pair = Self::next_pair(&mut inner)?;
1092        let signature = self.parse_member_signature(&signature_pair)?;
1093
1094        let block_pair = Self::next_pair(&mut inner)?;
1095        let body = self.parse_block(&block_pair)?;
1096
1097        Ok(FunctionWithBody {
1098            attributes,
1099            declaration: signature,
1100            body,
1101        })
1102    }
1103
1104    fn parse_for_loop(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1105        let mut inner = Self::convert_into_iterator(pair);
1106
1107        let pattern_pair = Self::next_pair(&mut inner)?;
1108        if pattern_pair.as_rule() != Rule::for_pattern {
1109            return Err(self.create_error_pair(SpecificError::ExpectedForPattern, &pattern_pair));
1110        }
1111
1112        let inner_pattern = self.next_inner_pair(&pattern_pair)?;
1113        let pattern = match inner_pattern.as_rule() {
1114            Rule::maybe_mut_identifier => {
1115                let mut inner_iter = inner_pattern.clone().into_inner();
1116                let is_mutable = inner_iter
1117                    .peek()
1118                    .is_some_and(|p| p.as_rule() == Rule::mut_keyword);
1119
1120                let is_mut = if is_mutable {
1121                    let mut_node = self.to_node(&inner_iter.next().unwrap());
1122                    Some(mut_node)
1123                } else {
1124                    None
1125                };
1126
1127                let identifier = if is_mutable {
1128                    self.expect_identifier_next(&mut inner_iter)?.0
1129                } else {
1130                    self.to_node(&inner_pattern)
1131                };
1132
1133                ForPattern::Single(ForVar { identifier, is_mut })
1134            }
1135            Rule::for_pair => {
1136                let mut vars = Self::convert_into_iterator(&inner_pattern);
1137
1138                // Parse first variable in the pair
1139                let first_var_pair = Self::next_pair(&mut vars)?;
1140                let mut first_inner_iter = first_var_pair.clone().into_inner();
1141                let first_is_mut = if first_inner_iter
1142                    .peek()
1143                    .is_some_and(|p| p.as_rule() == Rule::mut_keyword)
1144                {
1145                    Some(self.to_node(&first_inner_iter.next().unwrap()))
1146                } else {
1147                    None
1148                };
1149
1150                let first_identifier = if first_is_mut.is_some() {
1151                    self.expect_identifier_next(&mut first_inner_iter)?.0
1152                } else {
1153                    self.to_node(&first_var_pair)
1154                };
1155
1156                // Parse second variable in the pair
1157                let second_var_pair = Self::next_pair(&mut vars)?;
1158                let mut second_inner_iter = second_var_pair.clone().into_inner();
1159                let second_is_mut = if second_inner_iter
1160                    .peek()
1161                    .is_some_and(|p| p.as_rule() == Rule::mut_keyword)
1162                {
1163                    Some(self.to_node(&second_inner_iter.next().unwrap()))
1164                } else {
1165                    None
1166                };
1167
1168                let second_identifier = if second_is_mut.is_some() {
1169                    self.expect_identifier_next(&mut second_inner_iter)?.0
1170                } else {
1171                    self.to_node(&second_var_pair)
1172                };
1173
1174                ForPattern::Pair(
1175                    ForVar {
1176                        identifier: first_identifier,
1177                        is_mut: first_is_mut,
1178                    },
1179                    ForVar {
1180                        identifier: second_identifier,
1181                        is_mut: second_is_mut,
1182                    },
1183                )
1184            }
1185            _ => {
1186                return Err(
1187                    self.create_error_pair(SpecificError::InvalidForPattern, &inner_pattern)
1188                );
1189            }
1190        };
1191
1192        let next_pair = Self::next_pair(&mut inner)?;
1193        let iterable_expression = self.parse_arg_expression(&next_pair)?;
1194
1195        let mut_expression = IterableExpression {
1196            expression: Box::new(iterable_expression),
1197        };
1198
1199        let body = self.parse_expression(&Self::next_pair(&mut inner)?)?;
1200
1201        // Return the ForLoop statement with MutExpression
1202        Ok(self.create_expr(
1203            ExpressionKind::ForLoop(pattern, mut_expression, Box::from(body)),
1204            pair,
1205        ))
1206    }
1207
1208    fn parse_while_loop(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1209        let mut inner = Self::convert_into_iterator(pair);
1210
1211        let condition = self.parse_expression(&Self::next_pair(&mut inner)?)?;
1212
1213        let body = self.parse_expression(&Self::next_pair(&mut inner)?)?;
1214
1215        Ok(self.create_expr(
1216            ExpressionKind::WhileLoop(Box::from(condition), Box::from(body)),
1217            pair,
1218        ))
1219    }
1220
1221    fn parse_expression(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1222        let sub = &Self::right_alternative(pair)?;
1223        match sub.as_rule() {
1224            /*
1225            // TODO: verify that this block is not needed
1226            Rule::expression => {
1227                let inner = self.next_inner_pair(sub)?;
1228
1229                self.parse_expression(&inner)
1230            }
1231             */
1232            Rule::qualified_identifier => Ok(self.create_expr(
1233                ExpressionKind::VariableReference(Variable::new(self.to_node(sub), None)),
1234                sub,
1235            )),
1236            Rule::block => self.parse_block(sub),
1237
1238            Rule::assignment => self.parse_assignment_expression(sub),
1239            Rule::destructuring_assignment => self.parse_destructuring_assignment(sub),
1240            Rule::variable_definition => self.parse_variable_definition(sub),
1241
1242            Rule::addition => self.parse_addition(sub),
1243            Rule::range => self.parse_range(sub),
1244            Rule::logical => self.parse_logical(sub),
1245            Rule::comparison => self.parse_comparison(sub),
1246            Rule::multiplication => self.parse_multiplication(sub),
1247
1248            Rule::prefix => self.parse_prefix(sub),
1249
1250            Rule::match_expr => self.parse_match_expr(sub),
1251            Rule::initializer_list => self.parse_initializer_list_literal(sub),
1252            Rule::initializer_pair_list => self.parse_initializer_pair_list(sub),
1253            Rule::guard_expr => self.parse_guard_expr_list(sub),
1254            Rule::with_expr => self.parse_with_expr(sub),
1255            Rule::when_expr => self.parse_when_expr(sub),
1256            Rule::if_expr => self.parse_if_expression(sub),
1257            Rule::for_loop => self.parse_for_loop(sub),
1258            Rule::while_loop => self.parse_while_loop(sub),
1259
1260            //            Rule::expression | Rule::literal => self.parse_expr(pair),
1261            Rule::prefix_op | Rule::op_neg | Rule::op_not | Rule::op_borrow_mut_ref => {
1262                // TODO: maybe not called?
1263                let op = self.parse_unary_operator(sub)?;
1264                let expr = self.parse_postfix_expression(&self.next_inner_pair(sub)?)?;
1265                Ok(self.create_expr(ExpressionKind::UnaryOp(op, Box::new(expr)), sub))
1266            }
1267
1268            //Rule::mut_expression => self.parse_mutable_or_immutable_expression(pair),
1269            Rule::postfix => self.parse_postfix_expression(sub), // TODO: maybe not called
1270            _ => {
1271                error!(rule=?sub.as_rule(), "rule");
1272                Err(self.create_error_pair(
1273                    SpecificError::UnexpectedExpressionType(Self::pair_to_rule(sub)),
1274                    sub,
1275                ))
1276            }
1277        }
1278    }
1279
1280    fn parse_at_least_two_variable_list(
1281        &self,
1282        pair: &Pair<Rule>,
1283    ) -> Result<Vec<Variable>, ParseError> {
1284        debug_assert_eq!(pair.as_rule(), Rule::at_least_two_variables_list);
1285        let mut variables = Vec::new();
1286        for item_pair in pair.clone().into_inner() {
1287            variables.push(self.parse_variable_item(&item_pair)?);
1288        }
1289        Ok(variables)
1290    }
1291
1292    fn parse_optional_variable_list(&self, pair: &Pair<Rule>) -> Result<Vec<Variable>, ParseError> {
1293        debug_assert_eq!(pair.as_rule(), Rule::optional_variable_list);
1294        let mut variables = Vec::new();
1295        for item_pair in pair.clone().into_inner() {
1296            variables.push(self.parse_variable_item(&item_pair)?);
1297        }
1298        Ok(variables)
1299    }
1300
1301    fn parse_maybe_mut_identifier(&self, pair: &Pair<Rule>) -> Result<Variable, ParseError> {
1302        debug_assert_eq!(pair.as_rule(), Rule::maybe_mut_identifier);
1303        let mut inner = pair.clone().into_inner();
1304        let mut_node = if let Some(peeked) = inner.peek() {
1305            if peeked.as_rule() == Rule::mut_keyword {
1306                // Convert 'mut' to a Node
1307                let node = self.to_node(&peeked);
1308                inner.next(); // consume the 'mut' token
1309                Some(node)
1310            } else {
1311                None
1312            }
1313        } else {
1314            None
1315        };
1316
1317        let name_pair = inner.next().ok_or_else(|| {
1318            self.create_error_pair(
1319                SpecificError::UnexpectedRuleInParseScript(
1320                    "Expected identifier in variable_item".into(),
1321                ),
1322                pair,
1323            )
1324        })?;
1325
1326        if name_pair.as_rule() != Rule::identifier {
1327            return Err(self.create_error_pair(
1328                SpecificError::UnexpectedRuleInParseScript(format!(
1329                    "Expected identifier, found {:?}",
1330                    name_pair.as_rule()
1331                )),
1332                &name_pair,
1333            ));
1334        }
1335
1336        let variable = Variable {
1337            name: self.to_node(&name_pair),
1338            is_mutable: mut_node,
1339        };
1340
1341        Ok(variable)
1342    }
1343
1344    fn parse_variable_item(&self, pair: &Pair<Rule>) -> Result<Variable, ParseError> {
1345        debug_assert_eq!(pair.as_rule(), Rule::variable_item);
1346        let mut inner = pair.clone().into_inner();
1347        self.parse_maybe_mut_identifier(&inner.next().unwrap())
1348    }
1349
1350    fn parse_assignment_expression(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1351        let mut iterator = pair.clone().into_inner();
1352        let lhs_logical =
1353            self.parse_logical(&iterator.next().expect("parse_assignment_expression"))?;
1354        if let Some(assignment_op_pair) = iterator.peek().clone() {
1355            iterator.next();
1356            let assignment_op = self.parse_assignment_op(&assignment_op_pair)?;
1357            let rhs_expr = self.parse_expression(&iterator.next().unwrap())?;
1358            let kind = match assignment_op {
1359                AssignmentOperatorKind::Assign => {
1360                    ExpressionKind::Assignment(Box::new(lhs_logical), Box::from(rhs_expr))
1361                }
1362                AssignmentOperatorKind::Compound(compound) => {
1363                    let op = CompoundOperator {
1364                        node: Self::node_ex(&assignment_op_pair),
1365                        kind: compound,
1366                    };
1367                    ExpressionKind::CompoundAssignment(
1368                        Box::from(lhs_logical),
1369                        op,
1370                        Box::from(rhs_expr),
1371                    )
1372                }
1373            };
1374
1375            Ok(self.create_expr(kind, pair))
1376        } else {
1377            Ok(lhs_logical)
1378        }
1379    }
1380
1381    fn parse_assignment_op(&self, pair: &Pair<Rule>) -> Result<AssignmentOperatorKind, ParseError> {
1382        debug_assert_eq!(pair.as_rule(), Rule::assign_op);
1383        let sub = Self::right_alternative(pair)?;
1384        let op = match sub.as_rule() {
1385            Rule::compound_assign_op => {
1386                AssignmentOperatorKind::Compound(Self::parse_compound_assign_op(&sub)?)
1387            }
1388            Rule::normal_assign_op => AssignmentOperatorKind::Assign,
1389            _ => {
1390                return Err(Self::to_err(
1391                    SpecificError::UnknownAssignmentOperator("strange".to_string()),
1392                    &sub,
1393                ));
1394            }
1395        };
1396
1397        Ok(op)
1398    }
1399
1400    #[allow(clippy::too_many_lines)]
1401    fn parse_destructuring_assignment(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1402        debug_assert_eq!(pair.as_rule(), Rule::destructuring_assignment);
1403        let mut inner = pair.clone().into_inner();
1404
1405        let var_list_pair = inner.next().ok_or_else(|| {
1406            self.create_error_pair(
1407                SpecificError::UnexpectedRuleInParseScript("missing variable_list".to_string()),
1408                pair,
1409            )
1410        })?;
1411
1412        let variables = self.parse_at_least_two_variable_list(&var_list_pair)?;
1413
1414        let rhs_pair = inner.next().ok_or_else(|| {
1415            self.create_error_pair(
1416                SpecificError::UnexpectedRuleInParseScript("missing RHS expression".to_string()),
1417                pair,
1418            )
1419        })?;
1420        let rhs_expr = self.parse_expression(&rhs_pair)?;
1421
1422        Ok(self.create_expr(
1423            ExpressionKind::DestructuringAssignment(variables, Box::new(rhs_expr)),
1424            &rhs_pair,
1425        ))
1426    }
1427
1428    fn right_alternative<'a>(pair: &Pair<'a, Rule>) -> Result<Pair<'a, Rule>, ParseError> {
1429        pair.clone()
1430            .into_inner()
1431            .next()
1432            .ok_or_else(|| Self::to_err(SpecificError::CouldNotMoveRight, pair))
1433    }
1434
1435    pub fn parse_compound_assign_op(
1436        op_pair: &Pair<Rule>,
1437    ) -> Result<CompoundOperatorKind, ParseError> {
1438        debug_assert_eq!(op_pair.as_rule(), Rule::compound_assign_op);
1439
1440        let kind = match Self::right_alternative(op_pair)?.as_rule() {
1441            Rule::add_assign_op => CompoundOperatorKind::Add,
1442            Rule::sub_assign_op => CompoundOperatorKind::Sub,
1443            Rule::mul_assign_op => CompoundOperatorKind::Mul,
1444            Rule::div_assign_op => CompoundOperatorKind::Div,
1445            Rule::modulo_assign_op => CompoundOperatorKind::Modulo,
1446            _ => {
1447                return Err(Self::to_err(
1448                    SpecificError::UnknownOperator(format!(
1449                        "Found unexpected operator rule: {:?}",
1450                        op_pair.as_rule()
1451                    )),
1452                    op_pair,
1453                ));
1454            }
1455        };
1456
1457        Ok(kind)
1458    }
1459
1460    fn parse_maybe_annotation(&self, inner: &mut Pairs<Rule>) -> Result<Option<Type>, ParseError> {
1461        let result = if let Some(peeked) = inner.peek() {
1462            if peeked.as_rule() == Rule::type_coerce {
1463                let type_coerce_pair = inner.next().unwrap();
1464                let mut type_inner = type_coerce_pair.clone().into_inner();
1465                let type_name_pair = type_inner.next().ok_or_else(|| {
1466                    self.create_error_pair(SpecificError::MissingTypeName, &type_coerce_pair)
1467                })?;
1468                Some(self.parse_type(type_name_pair)?)
1469            } else {
1470                None
1471            }
1472        } else {
1473            None
1474        };
1475        Ok(result)
1476    }
1477
1478    #[allow(clippy::too_many_lines)]
1479    fn parse_variable_definition(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1480        debug_assert_eq!(pair.as_rule(), Rule::variable_definition);
1481        let mut inner = pair.clone().into_inner();
1482        let variable_item = Self::next_pair(&mut inner)?;
1483        let found_var = self.parse_variable_item(&variable_item)?;
1484
1485        let maybe_annotation = self.parse_maybe_annotation(&mut inner)?;
1486
1487        let rhs_expr = self.parse_expression(&inner.next().unwrap())?;
1488
1489        if maybe_annotation.is_some() || found_var.is_mutable.is_some() {
1490            Ok(self.create_expr(
1491                ExpressionKind::VariableDefinition(
1492                    found_var,
1493                    maybe_annotation,
1494                    Box::from(rhs_expr),
1495                ),
1496                pair,
1497            ))
1498        } else {
1499            Ok(self.create_expr(
1500                ExpressionKind::VariableAssignment(found_var, Box::from(rhs_expr)),
1501                pair,
1502            ))
1503        }
1504    }
1505    fn parse_prefix(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1506        debug_assert_eq!(pair.as_rule(), Rule::prefix);
1507        let _span = pair.as_span();
1508        let inner = Self::convert_into_iterator(pair);
1509        let mut expr = None;
1510        let mut prefix_ops = Vec::new();
1511
1512        for part in inner {
1513            match part.as_rule() {
1514                Rule::prefix_op | Rule::op_neg | Rule::op_not => {
1515                    let op = self.parse_unary_operator(&part)?;
1516                    prefix_ops.push(op);
1517                }
1518                _ => {
1519                    expr = Some(self.parse_postfix_expression(&part)?);
1520                    break;
1521                }
1522            }
1523        }
1524
1525        let mut final_expr = expr.ok_or_else(|| {
1526            self.create_error_pair(SpecificError::ExpectedExpressionAfterPrefixOperator, pair)
1527        })?;
1528
1529        for op in prefix_ops.into_iter().rev() {
1530            final_expr = self.create_expr(ExpressionKind::UnaryOp(op, Box::new(final_expr)), pair);
1531        }
1532
1533        Ok(final_expr)
1534    }
1535
1536    fn parse_binary_operator(&self, pair: &Pair<Rule>) -> Result<BinaryOperator, ParseError> {
1537        let op = match pair.as_rule() {
1538            Rule::prefix_op => self.next_inner_pair(pair)?,
1539            _ => pair.clone(),
1540        };
1541
1542        let kind = match op.as_rule() {
1543            Rule::op_add => BinaryOperatorKind::Add,
1544            Rule::op_sub => BinaryOperatorKind::Subtract,
1545            Rule::op_mul => BinaryOperatorKind::Multiply,
1546            Rule::op_div => BinaryOperatorKind::Divide,
1547            Rule::op_mod => BinaryOperatorKind::Modulo,
1548            Rule::op_eq => BinaryOperatorKind::Equal,
1549            Rule::op_neq => BinaryOperatorKind::NotEqual,
1550            Rule::op_lt => BinaryOperatorKind::LessThan,
1551            Rule::op_lte => BinaryOperatorKind::LessEqual,
1552            Rule::op_gt => BinaryOperatorKind::GreaterThan,
1553            Rule::op_gte => BinaryOperatorKind::GreaterEqual,
1554            Rule::op_and => BinaryOperatorKind::LogicalAnd,
1555            Rule::op_or => BinaryOperatorKind::LogicalOr,
1556            _ => {
1557                panic!("unknown operator")
1558            }
1559        };
1560
1561        Ok(BinaryOperator {
1562            kind,
1563            node: self.to_node(pair),
1564        })
1565    }
1566
1567    fn parse_unary_operator(&self, pair: &Pair<Rule>) -> Result<UnaryOperator, ParseError> {
1568        let op = match pair.as_rule() {
1569            Rule::prefix_op => &self.next_inner_pair(pair)?,
1570            _ => pair,
1571        };
1572
1573        let node = self.to_node(op);
1574        match op.as_rule() {
1575            Rule::op_neg => Ok(UnaryOperator::Negate(node)),
1576            Rule::op_not => Ok(UnaryOperator::Not(node)),
1577            Rule::op_borrow_mut_ref => Ok(UnaryOperator::BorrowMutRef(node)),
1578            _ => Err(self.create_error_pair(
1579                SpecificError::UnexpectedUnaryOperator(Self::pair_to_rule(op)),
1580                op,
1581            )),
1582        }
1583    }
1584
1585    fn parse_module_segments(&self, pair: Pair<Rule>) -> Vec<Node> {
1586        pair.into_inner()
1587            .filter_map(|segment| {
1588                if segment.as_rule() == Rule::identifier {
1589                    Some(self.to_node(&segment))
1590                } else {
1591                    None
1592                }
1593            })
1594            .collect()
1595    }
1596
1597    fn parse_qualified_type_identifier(
1598        &self,
1599        pair: &Pair<Rule>,
1600    ) -> Result<QualifiedTypeIdentifier, ParseError> {
1601        let mut inner_pairs = pair.clone().into_inner();
1602        let mut generic_types = Vec::new();
1603
1604        let first = inner_pairs.next().ok_or_else(|| {
1605            self.create_error_pair(
1606                SpecificError::ExpectedTypeIdentifier(Self::pair_to_rule(pair)),
1607                pair,
1608            )
1609        })?;
1610
1611        match first.as_rule() {
1612            Rule::module_segments => {
1613                let module_path = self.parse_module_segments(first.clone());
1614                let type_id = inner_pairs.next().ok_or_else(|| {
1615                    self.create_error_pair(SpecificError::ExpectedTypeIdentifierAfterPath, &first)
1616                })?;
1617
1618                let type_identifier = self.parse_local_type_identifier(&type_id)?;
1619
1620                // TODO: Maybe loop and check for generic params
1621                if let Some(generic_params) = inner_pairs.next() {
1622                    if generic_params.as_rule() == Rule::generic_arguments {
1623                        generic_types = self.parse_generic_arguments(&generic_params)?; // TODO: maybe not used?
1624                    }
1625                }
1626
1627                Ok(QualifiedTypeIdentifier::new_with_generics(
1628                    type_identifier,
1629                    module_path,
1630                    generic_types,
1631                ))
1632            }
1633            Rule::type_identifier => {
1634                let type_identifier = LocalTypeIdentifier(self.to_node(&first));
1635
1636                // TODO: Maybe loop and check for generic params
1637                if let Some(generic_params) = inner_pairs.next() {
1638                    if generic_params.as_rule() == Rule::generic_arguments {
1639                        generic_types = self.parse_generic_arguments(&generic_params)?;
1640                    }
1641                }
1642
1643                Ok(QualifiedTypeIdentifier::new_with_generics(
1644                    type_identifier,
1645                    Vec::new(),
1646                    generic_types,
1647                ))
1648            }
1649            _ => Err(self.create_error_pair(
1650                SpecificError::ExpectedTypeIdentifier(Self::pair_to_rule(&first)),
1651                &first,
1652            )),
1653        }
1654    }
1655
1656    fn parse_qualified_identifier(
1657        &self,
1658        pair: &Pair<Rule>,
1659    ) -> Result<QualifiedIdentifier, ParseError> {
1660        let mut inner_pairs = pair.clone().into_inner();
1661        let mut generic_types = Vec::new();
1662
1663        let first = inner_pairs
1664            .next()
1665            .ok_or_else(|| self.create_error_pair(SpecificError::ExpectedIdentifier, pair))?;
1666
1667        match first.as_rule() {
1668            Rule::module_segments => {
1669                let module_path = self.parse_module_segments(first.clone());
1670                let id = inner_pairs.next().ok_or_else(|| {
1671                    self.create_error_pair(SpecificError::ExpectedIdentifierAfterPath, &first)
1672                })?;
1673
1674                let identifier = self.to_node(&id);
1675
1676                // TODO: Maybe loop and check for generic params
1677                if let Some(generic_params) = inner_pairs.next() {
1678                    if generic_params.as_rule() == Rule::generic_arguments {
1679                        // TODO: maybe not used?
1680                        generic_types = self.parse_generic_arguments(&generic_params)?;
1681                    }
1682                }
1683
1684                Ok(QualifiedIdentifier::new_with_generics(
1685                    identifier,
1686                    module_path,
1687                    generic_types,
1688                ))
1689            }
1690            Rule::identifier => {
1691                let type_identifier = self.to_node(&first);
1692
1693                // TODO: Maybe loop and check for generic params
1694                if let Some(generic_params) = inner_pairs.next() {
1695                    if generic_params.as_rule() == Rule::generic_arguments {
1696                        // TODO: maybe not used
1697                        generic_types = self.parse_generic_arguments(&generic_params)?;
1698                    }
1699                }
1700
1701                Ok(QualifiedIdentifier::new_with_generics(
1702                    type_identifier,
1703                    Vec::new(),
1704                    generic_types,
1705                ))
1706            }
1707            _ => Err(self.create_error_pair(SpecificError::ExpectedIdentifier, &first)),
1708        }
1709    }
1710
1711    fn parse_qualified_identifier_expression(
1712        &self,
1713        pair: &Pair<Rule>,
1714    ) -> Result<Expression, ParseError> {
1715        let qualified_identifier = self.parse_qualified_identifier(pair)?;
1716        Ok(self.create_expr(
1717            ExpressionKind::IdentifierReference(qualified_identifier),
1718            pair,
1719        ))
1720    }
1721
1722    fn parse_generic_arguments(
1723        &self,
1724        pair: &Pair<Rule>,
1725    ) -> Result<Vec<GenericParameter>, ParseError> {
1726        debug_assert_eq!(pair.as_rule(), Rule::generic_arguments);
1727
1728        let inner_pairs = pair.clone().into_inner();
1729        let mut generic_types = Vec::new();
1730
1731        for generic_parameter_pair in inner_pairs {
1732            let generic_parameter = match generic_parameter_pair.as_rule() {
1733                Rule::type_name => GenericParameter::Type(self.parse_type(generic_parameter_pair)?),
1734                Rule::generic_argument_int_tuple => {
1735                    let mut pairs = generic_parameter_pair.clone().into_inner();
1736                    let first = pairs.next().unwrap();
1737                    let second = pairs.next().unwrap();
1738                    let first_node = self.to_node(&first);
1739                    let second_node = self.to_node(&second);
1740                    GenericParameter::UnsignedTupleInt(first_node, second_node)
1741                }
1742                Rule::unsigned_int_lit => {
1743                    GenericParameter::UnsignedInt(self.to_node(&generic_parameter_pair))
1744                }
1745                _ => panic!("unknown generic parameter"),
1746            };
1747
1748            generic_types.push(generic_parameter);
1749        }
1750
1751        Ok(generic_types)
1752    }
1753
1754    fn parse_local_type_identifier_node(&self, pair: &Pair<Rule>) -> Result<Node, ParseError> {
1755        if pair.as_rule() != Rule::type_identifier {
1756            return Err(self.create_error_pair(
1757                SpecificError::ExpectedTypeIdentifier(format!("{:?}", pair.as_rule())),
1758                pair,
1759            ));
1760        }
1761        Ok(self.to_node(pair))
1762    }
1763
1764    fn parse_generic_type_variables(
1765        &self,
1766        pair: &Pair<Rule>,
1767    ) -> Result<Vec<TypeVariable>, ParseError> {
1768        debug_assert_eq!(pair.as_rule(), Rule::generic_type_variables);
1769        let mut type_params = Vec::new();
1770
1771        let inner = Self::convert_into_iterator(pair);
1772        for type_variable in inner {
1773            let mut inner_type_var = type_variable.into_inner();
1774            let type_identifier_pair = inner_type_var.next().unwrap();
1775
1776            type_params.push(TypeVariable(
1777                self.parse_local_type_identifier_node(&type_identifier_pair)?,
1778            ));
1779        }
1780        Ok(type_params)
1781    }
1782
1783    fn parse_local_type_identifier_with_optional_type_variables(
1784        &self,
1785        pair: &Pair<Rule>,
1786    ) -> Result<LocalTypeIdentifierWithOptionalTypeVariables, ParseError> {
1787        debug_assert_eq!(
1788            pair.as_rule(),
1789            Rule::type_identifier_optional_type_variables
1790        );
1791
1792        let mut inner = pair.clone().into_inner();
1793        let name = self.expect_local_type_identifier_next(&mut inner)?;
1794
1795        let type_variables = if let Some(generic_params_pair) = inner.peek() {
1796            // Peek to see if generic params exist
1797            if generic_params_pair.as_rule() == Rule::generic_type_variables {
1798                let _ = inner.next().unwrap(); // Consume the generic_type_params pair
1799                self.parse_generic_type_variables(&generic_params_pair)?
1800            } else {
1801                Vec::new()
1802            }
1803        } else {
1804            Vec::new()
1805        };
1806
1807        Ok(LocalTypeIdentifierWithOptionalTypeVariables {
1808            name: name.0,
1809            type_variables,
1810        })
1811    }
1812
1813    fn parse_struct_fields_expressions<'a>(
1814        &self,
1815        field_list_pair: &Pair<Rule>,
1816    ) -> Result<(Vec<FieldExpression>, bool), ParseError> {
1817        let mut fields = Vec::new();
1818        let mut has_rest = false;
1819
1820        for field_pair in field_list_pair.clone().into_inner() {
1821            match field_pair.as_rule() {
1822                Rule::struct_field => {
1823                    let mut field_inner = field_pair.into_inner();
1824                    let ident = self.expect_field_label_next(&mut field_inner)?;
1825                    let field_name = FieldName(ident.0);
1826                    let field_value = self.parse_expression(&field_inner.next().unwrap())?;
1827
1828                    fields.push(FieldExpression {
1829                        field_name,
1830                        expression: field_value,
1831                    });
1832                }
1833                Rule::rest_fields => {
1834                    has_rest = true;
1835                }
1836                _ => {
1837                    return Err(
1838                        self.create_error_pair(SpecificError::ExpectedFieldOrRest, &field_pair)
1839                    );
1840                }
1841            }
1842        }
1843
1844        Ok((fields, has_rest))
1845    }
1846
1847    fn parse_anonymous_struct_literal(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1848        let (fields, has_rest) = self.parse_anonymous_struct_literal_fields(pair)?;
1849        Ok(self.create_expr(
1850            ExpressionKind::AnonymousStructLiteral(fields, has_rest),
1851            pair,
1852        ))
1853    }
1854
1855    fn parse_anonymous_struct_literal_fields(
1856        &self,
1857        pair: &Pair<Rule>,
1858    ) -> Result<(Vec<FieldExpression>, bool), ParseError> {
1859        debug_assert_eq!(pair.as_rule(), Rule::anonymous_struct_literal);
1860        let mut inner = Self::convert_into_iterator(pair);
1861        let (field_expressions, detected_rest) =
1862            self.parse_struct_fields_expressions(&inner.next().unwrap())?;
1863
1864        Ok((field_expressions, detected_rest))
1865    }
1866
1867    fn parse_struct_literal_optional_fields(
1868        &self,
1869        pair: &Pair<Rule>,
1870    ) -> Result<(Vec<FieldExpression>, bool), ParseError> {
1871        debug_assert_eq!(pair.as_rule(), Rule::struct_literal_optional_field_list);
1872        let mut inner = Self::convert_into_iterator(pair);
1873        let (field_expressions, detected_rest) = if let Some(field_list) = inner.next() {
1874            self.parse_struct_fields_expressions(&field_list)?
1875        } else {
1876            (vec![], false)
1877        };
1878
1879        Ok((field_expressions, detected_rest))
1880    }
1881
1882    fn parse_struct_literal(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1883        let mut inner = Self::convert_into_iterator(pair);
1884
1885        let type_pair = inner.next().unwrap();
1886
1887        let struct_name = self.parse_qualified_type_identifier(&type_pair)?;
1888
1889        let anon_fields = inner.next().unwrap();
1890
1891        let (fields, has_rest) = self.parse_struct_literal_optional_fields(&anon_fields)?;
1892
1893        Ok(self.create_expr(
1894            ExpressionKind::NamedStructLiteral(struct_name, fields, has_rest),
1895            pair,
1896        ))
1897    }
1898
1899    fn parse_context_access(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1900        Ok(self.create_expr(ExpressionKind::ContextAccess, pair))
1901    }
1902
1903    fn parse_static_member_reference(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1904        let mut inner = pair.clone().into_inner();
1905
1906        let type_identifier = self.parse_qualified_type_identifier(&inner.next().unwrap())?;
1907        let member_name = self.expect_identifier_next(&mut inner)?;
1908
1909        Ok(self.create_expr(
1910            ExpressionKind::StaticMemberFunctionReference(type_identifier, member_name.0),
1911            pair,
1912        ))
1913    }
1914
1915    fn parse_constant_reference(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1916        debug_assert_eq!(pair.as_rule(), Rule::constant_reference);
1917        let mut inner_pairs = pair.clone().into_inner();
1918
1919        let mut first = inner_pairs.next().unwrap();
1920
1921        let module_path = if first.as_rule() == Rule::module_segments {
1922            let path = self.parse_module_segments(first.clone());
1923            first = inner_pairs.next().unwrap();
1924            Some(ModulePath(path))
1925        } else {
1926            None
1927        };
1928
1929        let identifier = QualifiedConstantIdentifier::new(self.to_node(&first), module_path);
1930
1931        Ok(self.create_expr(ExpressionKind::ConstantReference(identifier), pair))
1932    }
1933
1934    fn parse_term(&self, pair2: &Pair<Rule>) -> Result<Expression, ParseError> {
1935        debug_assert_eq!(pair2.as_rule(), Rule::term);
1936        let sub = &Self::right_alternative(pair2)?;
1937        match sub.as_rule() {
1938            Rule::qualified_identifier => self.parse_qualified_identifier_expression(sub),
1939            Rule::static_member_reference => self.parse_static_member_reference(sub),
1940
1941            Rule::enum_literal => {
1942                Ok(self.create_expr(ExpressionKind::Literal(self.parse_enum_literal(sub)?), sub))
1943            }
1944            Rule::constant_reference => self.parse_constant_reference(sub),
1945            Rule::parenthesized => {
1946                let inner = self.next_inner_pair(sub)?;
1947                self.parse_expression(&inner)
1948            }
1949            Rule::basic_literal => {
1950                let (literal, node) = self.parse_basic_literal(sub)?;
1951                Ok(self.create_expr_span(ExpressionKind::Literal(literal), node))
1952            }
1953            Rule::struct_literal => self.parse_struct_literal(sub),
1954            Rule::anonymous_struct_literal => self.parse_anonymous_struct_literal(sub),
1955            Rule::initializer_list => self.parse_initializer_list_literal(sub),
1956            Rule::initializer_pair_list => self.parse_initializer_pair_list(sub),
1957
1958            Rule::interpolated_string => self.parse_interpolated_string(sub),
1959
1960            Rule::lambda => self.parse_lambda(sub),
1961            Rule::context_access => self.parse_context_access(sub),
1962
1963            _ => {
1964                Err(self
1965                    .create_error_pair(SpecificError::UnknownTerm(Self::pair_to_rule(sub)), sub))
1966            }
1967        }
1968    }
1969
1970    fn parse_interpolated_string(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
1971        let mut parts = Vec::new();
1972
1973        for part_pair in Self::convert_into_iterator(pair) {
1974            match part_pair.as_rule() {
1975                Rule::text => {
1976                    parts.push(StringPart::Literal(
1977                        self.to_node(&part_pair),
1978                        self.unescape_string(&part_pair, false)?,
1979                    ));
1980                }
1981                Rule::interpolation => {
1982                    let inner = self.next_inner_pair(&part_pair.clone())?;
1983                    let expr = match inner.as_rule() {
1984                        Rule::expression => self.parse_expression(&inner)?,
1985                        _ => {
1986                            return Err(self.create_error_pair(
1987                                SpecificError::ExpectedExpressionInInterpolation,
1988                                &inner,
1989                            ));
1990                        }
1991                    };
1992
1993                    let format = match Self::convert_into_iterator(&part_pair).nth(1) {
1994                        Some(fmt) => {
1995                            if fmt.as_rule() == Rule::format_specifier {
1996                                Some(self.parse_format_specifier(&fmt)?)
1997                            } else {
1998                                None
1999                            }
2000                        }
2001                        _ => None,
2002                    };
2003
2004                    parts.push(StringPart::Interpolation(Box::new(expr), format));
2005                }
2006                _ => {
2007                    return Err(self.create_error_pair(
2008                        SpecificError::UnexpectedRuleInInterpolation,
2009                        &part_pair,
2010                    ));
2011                }
2012            }
2013        }
2014
2015        Ok(self.create_expr(ExpressionKind::InterpolatedString(parts), pair))
2016    }
2017
2018    fn parse_format_specifier(&self, pair: &Pair<Rule>) -> Result<FormatSpecifier, ParseError> {
2019        let node = self.to_node(pair);
2020        match pair.as_str() {
2021            "x" => Ok(FormatSpecifier::LowerHex(node)),
2022            "X" => Ok(FormatSpecifier::UpperHex(node)),
2023            "b" => Ok(FormatSpecifier::Binary(node)),
2024            "f" => Ok(FormatSpecifier::Float(node)),
2025            s if s.starts_with("..") => {
2026                let precision: u32 = s[2..s.len() - 1].parse().map_err(|_| {
2027                    self.create_error_pair(SpecificError::InvalidPrecisionValue, pair)
2028                })?;
2029                let typ = match s.chars().last().unwrap() {
2030                    'f' => PrecisionType::Float(node),
2031                    's' => PrecisionType::String(node),
2032                    _ => {
2033                        return Err(
2034                            self.create_error_pair(SpecificError::InvalidPrecisionType, pair)
2035                        )?;
2036                    }
2037                };
2038                Ok(FormatSpecifier::Precision(
2039                    precision,
2040                    self.to_node(pair),
2041                    typ,
2042                ))
2043            }
2044            _ => Err(self.create_error_pair(SpecificError::InvalidFormatSpecifier, pair)),
2045        }
2046    }
2047
2048    fn parse_enum_literal(&self, pair: &Pair<Rule>) -> Result<LiteralKind, ParseError> {
2049        let mut inner = Self::convert_into_iterator(pair);
2050
2051        // Parse enum type name
2052        let enum_type = self.parse_qualified_type_identifier(&inner.next().unwrap())?;
2053
2054        // Parse variant name
2055        let variant_pair = Self::expect_next(&mut inner, Rule::type_identifier)?;
2056        let variant_type_identifier = LocalTypeIdentifier::new(self.to_node(&variant_pair));
2057
2058        // Parse fields if they exist
2059        let enum_variant_literal = match inner.next() {
2060            Some(fields_pair) => match fields_pair.as_rule() {
2061                Rule::struct_literal_optional_field_list => {
2062                    let (field_expressions, detected_rest) =
2063                        self.parse_struct_literal_optional_fields(&fields_pair)?;
2064                    EnumVariantLiteral::Struct(
2065                        enum_type,
2066                        variant_type_identifier,
2067                        field_expressions,
2068                        detected_rest,
2069                    )
2070                }
2071                Rule::tuple_fields => {
2072                    let mut expressions = vec![];
2073                    for field in Self::convert_into_iterator(&fields_pair) {
2074                        let field_value = self.parse_expression(&field)?;
2075                        expressions.push(field_value);
2076                    }
2077                    EnumVariantLiteral::Tuple(enum_type, variant_type_identifier, expressions)
2078                }
2079                _ => {
2080                    error!("{:?}, {}", fields_pair.as_rule(), "strange");
2081                    return Err(
2082                        self.create_error_pair(SpecificError::UnexpectedVariantField, &fields_pair)
2083                    );
2084                }
2085            },
2086            _ => EnumVariantLiteral::Simple(enum_type, variant_type_identifier),
2087        };
2088
2089        Ok(LiteralKind::EnumVariant(enum_variant_literal))
2090    }
2091
2092    fn unescape_unicode(
2093        &self,
2094        chars: &mut Peekable<Chars>,
2095        octets: &mut Vec<u8>,
2096        pair: &Pair<Rule>,
2097    ) -> Result<(), ParseError> {
2098        match chars.next() {
2099            Some('(') => {
2100                let mut hex_digits = String::new();
2101
2102                while let Some(&c) = chars.peek() {
2103                    if c == ')' {
2104                        break;
2105                    }
2106                    if c.is_ascii_hexdigit() && hex_digits.len() < 6 {
2107                        hex_digits.push(c);
2108                        chars.next();
2109                    } else {
2110                        return Err(
2111                            self.create_error_pair(SpecificError::InvalidUnicodeEscape, pair)
2112                        );
2113                    }
2114                }
2115
2116                match chars.next() {
2117                    Some(')') => {
2118                        if hex_digits.is_empty() {
2119                            return Err(
2120                                self.create_error_pair(SpecificError::InvalidUnicodeEscape, pair)
2121                            );
2122                        }
2123
2124                        let code = u32::from_str_radix(&hex_digits, 16).map_err(|_| {
2125                            self.create_error_pair(SpecificError::InvalidUnicodeEscape, pair)
2126                        })?;
2127
2128                        if code > 0x0010_FFFF {
2129                            return Err(
2130                                self.create_error_pair(SpecificError::InvalidUnicodeEscape, pair)
2131                            );
2132                        }
2133
2134                        if let Some(c) = std::char::from_u32(code) {
2135                            let mut buf = [0; 4];
2136                            let encoded = c.encode_utf8(&mut buf);
2137                            octets.extend_from_slice(encoded.as_bytes());
2138                        } else {
2139                            return Err(
2140                                self.create_error_pair(SpecificError::InvalidUnicodeEscape, pair)
2141                            );
2142                        }
2143                    }
2144                    _ => {
2145                        return Err(
2146                            self.create_error_pair(SpecificError::InvalidUnicodeEscape, pair)
2147                        );
2148                    }
2149                }
2150            }
2151            _ => {
2152                return Err(self.create_error_pair(SpecificError::InvalidUnicodeEscape, pair));
2153            }
2154        }
2155        Ok(())
2156    }
2157
2158    fn unescape_hex(
2159        &self,
2160        chars: &mut Peekable<Chars>,
2161        pair: &Pair<Rule>,
2162    ) -> Result<u8, ParseError> {
2163        let mut hex_digits = String::new();
2164        for _ in 0..2 {
2165            match chars.next() {
2166                Some(h) if h.is_ascii_hexdigit() => {
2167                    hex_digits.push(h);
2168                }
2169                _ => {
2170                    return Err(self.create_error_pair(SpecificError::InvalidHexEscape, pair));
2171                }
2172            }
2173        }
2174        u8::from_str_radix(&hex_digits, 16)
2175            .map_err(|_| self.create_error_pair(SpecificError::InvalidHexEscape, pair))
2176    }
2177
2178    fn unescape_string(&self, pair: &Pair<Rule>, is_literal: bool) -> Result<String, ParseError> {
2179        let mut octets = Vec::new();
2180
2181        let raw = if is_literal {
2182            &pair.as_str()[1..pair.as_str().len() - 1]
2183        } else {
2184            pair.as_str()
2185        };
2186
2187        let mut chars = raw.chars().peekable();
2188
2189        while let Some(ch) = chars.next() {
2190            if ch == '\\' {
2191                let Some(next_ch) = chars.next() else {
2192                    return Err(
2193                        self.create_error_pair(SpecificError::UnfinishedEscapeSequence, pair)
2194                    );
2195                };
2196                match next_ch {
2197                    'n' => {
2198                        octets.push(b'\n');
2199                    }
2200                    't' => {
2201                        octets.push(b'\t');
2202                    }
2203                    '\\' => {
2204                        octets.push(b'\\');
2205                    }
2206                    '"' => {
2207                        octets.push(b'"');
2208                    }
2209                    '\'' => {
2210                        octets.push(b'\'');
2211                    }
2212                    // Two hexadecimal digits that result in an `u8`
2213                    'x' => {
2214                        let code = self.unescape_hex(&mut chars, pair)?;
2215                        octets.push(code);
2216                    }
2217                    // Unicode character
2218                    'u' => {
2219                        self.unescape_unicode(&mut chars, &mut octets, pair)?;
2220                    }
2221
2222                    other => {
2223                        return Err(self.create_error_pair(
2224                            SpecificError::UnknownEscapeCharacter(other),
2225                            pair,
2226                        ));
2227                    }
2228                }
2229            } else {
2230                let mut buf = [0; 4];
2231                let utf8_bytes = ch.encode_utf8(&mut buf);
2232                octets.extend_from_slice(utf8_bytes.as_bytes());
2233            }
2234        }
2235
2236        let output = String::from_utf8(octets)
2237            .map_err(|_| self.create_error_pair(SpecificError::InvalidUtf8Sequence, pair))?;
2238
2239        Ok(output)
2240    }
2241
2242    fn parse_basic_literal(&self, pair: &Pair<Rule>) -> Result<(LiteralKind, Node), ParseError> {
2243        debug_assert_eq!(pair.as_rule(), Rule::basic_literal);
2244        let inner = self.next_inner_pair(pair)?;
2245        let literal_kind = match inner.as_rule() {
2246            Rule::int_lit => LiteralKind::Int,
2247            Rule::float_lit => LiteralKind::Float,
2248            Rule::string_lit => {
2249                let processed_string = self.unescape_string(&inner, true)?;
2250                LiteralKind::String(processed_string)
2251            }
2252            Rule::bool_lit => LiteralKind::Bool,
2253            Rule::none_lit => LiteralKind::None,
2254            Rule::tuple_lit => {
2255                let mut expressions = Vec::new();
2256                for expr_pair in Self::convert_into_iterator(&inner) {
2257                    expressions.push(self.parse_expression(&expr_pair)?);
2258                }
2259                LiteralKind::Tuple(expressions)
2260            }
2261            _ => return Err(self.create_error_pair(SpecificError::UnknownLiteral, &inner)),
2262        };
2263        Ok((literal_kind, self.to_node(&inner)))
2264    }
2265
2266    fn parse_initializer_list_literal(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2267        let mut elements = Vec::new();
2268        for element in Self::convert_into_iterator(pair) {
2269            elements.push(self.parse_expression(&element)?);
2270        }
2271        Ok(self.create_expr(
2272            ExpressionKind::Literal(LiteralKind::InternalInitializerList(elements)),
2273            pair,
2274        ))
2275    }
2276
2277    fn parse_initializer_pair_list(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2278        let mut entries = Vec::new();
2279
2280        for entry_pair in Self::convert_into_iterator(pair) {
2281            if entry_pair.as_rule() == Rule::map_entry {
2282                let mut entry_inner = Self::convert_into_iterator(&entry_pair);
2283                let key = self.parse_expression(&Self::next_pair(&mut entry_inner)?)?;
2284                let value = self.parse_expression(&Self::next_pair(&mut entry_inner)?)?;
2285                entries.push((key, value));
2286            }
2287        }
2288
2289        Ok(self.create_expr(
2290            ExpressionKind::Literal(LiteralKind::InternalInitializerPairList(entries)),
2291            pair,
2292        ))
2293    }
2294
2295    fn assert_end(pairs: &mut Pairs<Rule>) {
2296        assert!(pairs.next().is_none());
2297    }
2298
2299    fn parse_function_call_postfix(
2300        &self,
2301        pair: &Pair<Rule>,
2302    ) -> Result<(Option<Vec<GenericParameter>>, Vec<Expression>), ParseError> {
2303        debug_assert_eq!(pair.as_rule(), Rule::function_call_postfix);
2304        let mut inner = pair.clone().into_inner();
2305
2306        let mut generic_args: Option<Vec<GenericParameter>> = None;
2307        let args_pair: Pair<Rule>; // To hold the function_call_args pair
2308
2309        if let Some(first_inner) = inner.peek() {
2310            if first_inner.as_rule() == Rule::generic_arguments {
2311                let generic_args_pair = Self::next_pair(&mut inner)?;
2312                generic_args = Some(self.parse_generic_arguments(&generic_args_pair)?);
2313
2314                args_pair = Self::next_pair(&mut inner)?;
2315            } else {
2316                args_pair = Self::next_pair(&mut inner)?;
2317            }
2318        } else {
2319            panic!("problem in function_call_postfix");
2320        }
2321
2322        debug_assert_eq!(args_pair.as_rule(), Rule::function_call_args);
2323
2324        let regular_args = self.parse_function_call_arguments(&args_pair)?;
2325
2326        Self::assert_end(&mut inner);
2327
2328        Ok((generic_args, regular_args))
2329    }
2330
2331    fn parse_arg_expression(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2332        debug_assert_eq!(pair.as_rule(), Rule::arg_expression);
2333        let mut inner = pair.clone().into_inner();
2334        self.parse_logical(&inner.next().unwrap())
2335    }
2336
2337    fn parse_function_call_arguments(
2338        &self,
2339        pair: &Pair<Rule>,
2340    ) -> Result<Vec<Expression>, ParseError> {
2341        debug_assert_eq!(pair.as_rule(), Rule::function_call_args);
2342        let inner = pair.clone().into_inner();
2343        let mut args = Vec::new();
2344
2345        // Parse arguments
2346        for arg_pair in inner {
2347            let expr = self.parse_arg_expression(&arg_pair)?;
2348            args.push(expr);
2349        }
2350
2351        Ok(args)
2352    }
2353
2354    #[allow(clippy::too_many_lines)]
2355    fn parse_type(&self, pair: Pair<Rule>) -> Result<Type, ParseError> {
2356        match pair.as_rule() {
2357            Rule::type_name => {
2358                let mut inner = pair.clone().into_inner();
2359                let base_type = if let Some(inner_pair) = inner.next() {
2360                    self.parse_type(inner_pair)?
2361                } else {
2362                    panic!("shouldn't get to here")
2363                };
2364
2365                let optional_marker = inner
2366                    .find(|p| p.as_rule() == Rule::optional_marker)
2367                    .map(|marker_pair| self.to_node(&marker_pair));
2368                if let Some(found_optional_marker) = optional_marker {
2369                    Ok(Type::Optional(Box::new(base_type), found_optional_marker))
2370                } else {
2371                    Ok(base_type)
2372                }
2373            }
2374
2375            Rule::base_type => {
2376                let mut inner = pair.into_inner();
2377                let first = inner.next().unwrap();
2378                let base_type = self.parse_type(first)?;
2379
2380                Ok(base_type)
2381            }
2382            Rule::function_type => {
2383                let mut function_inner = pair.into_inner();
2384
2385                // Parse parameter types
2386                let param_types = if let Some(params) = function_inner
2387                    .next()
2388                    .filter(|p| p.as_rule() == Rule::function_params)
2389                {
2390                    params
2391                        .into_inner()
2392                        .map(|param| {
2393                            Ok(TypeForParameter {
2394                                ast_type: self.parse_type(param).unwrap(),
2395                                is_mutable: false,
2396                            })
2397                        })
2398                        .collect::<Result<Vec<_>, ParseError>>()?
2399                } else {
2400                    Vec::new()
2401                };
2402
2403                // Parse return type
2404                let return_type = self.parse_type(function_inner.next().unwrap())?;
2405
2406                Ok(Type::Function(param_types, Box::new(return_type)))
2407            }
2408
2409            Rule::qualified_type_identifier => {
2410                let qualified_id = self.parse_qualified_type_identifier(&pair)?;
2411                Ok(Type::Named(qualified_id))
2412            }
2413            Rule::tuple_type => {
2414                let elements = self.parse_tuple_type_elements(&pair)?;
2415                Ok(Type::Tuple(elements))
2416            }
2417            Rule::fixed_capacity_array_type => self.parse_fixed_capacity_array_type(&pair),
2418            Rule::slice_view_type => self.parse_slice_view_type(&pair),
2419
2420            Rule::fixed_capacity_map_type => self.parse_fixed_capacity_map_type(&pair),
2421            Rule::dynamic_map_type => self.parse_dynamic_map_type(&pair),
2422
2423            Rule::struct_type => {
2424                let element_type = self.parse_struct_type(&pair)?;
2425                Ok(Type::AnonymousStruct(element_type))
2426            }
2427
2428            Rule::unit_type => Ok(Type::Unit),
2429
2430            _ => Err(self.create_error_pair(
2431                SpecificError::UnexpectedTypeRule(format!("{:?}", pair.as_rule())),
2432                &pair,
2433            )),
2434        }
2435    }
2436
2437    fn parse_fixed_capacity_map_type(&self, pair: &Pair<Rule>) -> Result<Type, ParseError> {
2438        let mut inner = pair.clone().into_inner();
2439        let key_type = self.parse_type(Self::next_pair(&mut inner)?)?;
2440        let value_type = self.parse_type(Self::next_pair(&mut inner)?)?;
2441        let size_pair = inner.next().unwrap();
2442        let size_node = self.to_node(&size_pair);
2443
2444        Ok(Type::FixedCapacityMap(
2445            Box::new(key_type),
2446            Box::new(value_type),
2447            size_node,
2448        ))
2449    }
2450
2451    fn parse_dynamic_map_type(&self, pair: &Pair<Rule>) -> Result<Type, ParseError> {
2452        let mut inner = pair.clone().into_inner();
2453        let key_type = self.parse_type(Self::next_pair(&mut inner)?)?;
2454        let value_type = self.parse_type(Self::next_pair(&mut inner)?)?;
2455
2456        Ok(Type::DynamicLengthMap(
2457            Box::new(key_type),
2458            Box::new(value_type),
2459        ))
2460    }
2461
2462    fn parse_fixed_capacity_array_type(&self, pair: &Pair<Rule>) -> Result<Type, ParseError> {
2463        let mut inner = pair.clone().into_inner();
2464        let element_type = self.parse_type(inner.next().unwrap())?;
2465        let size_pair = inner.next().unwrap();
2466        let size_node = self.to_node(&size_pair);
2467        Ok(Type::FixedCapacityArray(Box::new(element_type), size_node))
2468    }
2469
2470    fn parse_slice_view_type(&self, pair: &Pair<Rule>) -> Result<Type, ParseError> {
2471        let mut inner = pair.clone().into_inner();
2472        let element_type = self.parse_type(inner.next().unwrap())?;
2473        Ok(Type::Slice(Box::new(element_type)))
2474    }
2475
2476    #[allow(unused)] // TODO: Use this again
2477    fn parse_local_type_identifier(
2478        &self,
2479        pair: &Pair<Rule>,
2480    ) -> Result<LocalTypeIdentifier, ParseError> {
2481        if pair.as_rule() != Rule::type_identifier {
2482            return Err(self.create_error_pair(
2483                SpecificError::ExpectedTypeIdentifier(format!("{:?}", pair.as_rule())),
2484                pair,
2485            ));
2486        }
2487        Ok(LocalTypeIdentifier::new(self.to_node(pair)))
2488    }
2489
2490    fn parse_enum_def(&self, pair: &Pair<Rule>) -> Result<DefinitionKind, ParseError> {
2491        let mut inner = Self::convert_into_iterator(pair);
2492
2493        let name_with_optional_type_params =
2494            self.parse_local_type_identifier_with_optional_type_variables(&inner.next().unwrap())?;
2495
2496        let mut variants = Vec::new();
2497
2498        if let Some(variants_pair) = inner.next() {
2499            if variants_pair.as_rule() == Rule::enum_variants {
2500                for variant_pair in Self::convert_into_iterator(&variants_pair) {
2501                    if variant_pair.as_rule() == Rule::enum_variant {
2502                        let variant =
2503                            self.parse_enum_variant(&self.next_inner_pair(&variant_pair)?)?;
2504
2505                        variants.push(variant);
2506                    }
2507                }
2508            }
2509        }
2510
2511        Ok(DefinitionKind::EnumDef(
2512            name_with_optional_type_params,
2513            variants,
2514        ))
2515    }
2516
2517    fn parse_enum_variant(&self, pair: &Pair<Rule>) -> Result<EnumVariantType, ParseError> {
2518        let enum_variant = match pair.as_rule() {
2519            Rule::simple_variant => EnumVariantType::Simple(self.to_node(pair)),
2520            Rule::direct_variant => {
2521                let mut inner = Self::convert_into_iterator(pair);
2522                let name = self.expect_local_type_identifier_next(&mut inner)?;
2523                let type_name = self.parse_type(inner.next().unwrap())?;
2524                EnumVariantType::Direct(name.0, type_name)
2525            }
2526            Rule::tuple_variant => {
2527                let mut inner = Self::convert_into_iterator(pair);
2528                let name = self.expect_local_type_identifier_next(&mut inner)?;
2529
2530                let tuple_elements = self.parse_tuple_type_elements(&inner.next().unwrap())?;
2531
2532                // Convert single-element tuples to direct variants for consistency
2533                if tuple_elements.len() == 1 {
2534                    EnumVariantType::Direct(name.0, tuple_elements.into_iter().next().unwrap())
2535                } else {
2536                    EnumVariantType::Tuple(name.0, tuple_elements)
2537                }
2538            }
2539            Rule::struct_variant => {
2540                let mut inner = Self::convert_into_iterator(pair);
2541                let name = self.expect_local_type_identifier_next(&mut inner)?;
2542
2543                let struct_type = self.parse_struct_type(&inner.next().unwrap())?;
2544                EnumVariantType::Struct(name.0, struct_type)
2545            }
2546            _ => {
2547                return Err(self.create_error_pair(
2548                    SpecificError::UnknownEnumVariant(Self::pair_to_rule(pair)),
2549                    pair,
2550                ));
2551            }
2552        };
2553
2554        Ok(enum_variant)
2555    }
2556
2557    fn parse_match_expr(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2558        let mut inner = Self::convert_into_iterator(pair);
2559        let value = self.parse_arg_expression(&Self::next_pair(&mut inner)?)?;
2560        let arms_pair = Self::next_pair(&mut inner)?;
2561        let mut arms = Vec::new();
2562
2563        for arm_pair in Self::convert_into_iterator(&arms_pair) {
2564            if arm_pair.as_rule() == Rule::match_arm {
2565                let mut arm_inner = Self::convert_into_iterator(&arm_pair);
2566                let pattern = self.parse_match_pattern(&Self::next_pair(&mut arm_inner)?)?;
2567
2568                // Handle both block and direct expression cases
2569                let expr = match Self::next_pair(&mut arm_inner)? {
2570                    block if block.as_rule() == Rule::block => self.parse_block(&block)?,
2571                    expr => self.parse_expression(&expr)?,
2572                };
2573
2574                arms.push(MatchArm {
2575                    pattern,
2576                    expression: expr,
2577                });
2578            }
2579        }
2580
2581        if arms.is_empty() {
2582            return Err(self.create_error_pair(SpecificError::MustHaveAtLeastOneArm, pair));
2583        }
2584
2585        Ok(self.create_expr(ExpressionKind::Match(Box::new(value), arms), pair))
2586    }
2587
2588    fn parse_match_pattern(&self, pair: &Pair<Rule>) -> Result<Pattern, ParseError> {
2589        let mut inner = Self::convert_into_iterator(pair);
2590        let pattern_inside = inner.next().expect("should have inner");
2591        match pattern_inside.as_rule() {
2592            Rule::normal_pattern => {
2593                let (concrete_pattern, pattern_node) =
2594                    self.parse_normal_match_pattern(&pattern_inside)?;
2595                let inner_pairs: Vec<_> = pattern_inside.clone().into_inner().collect();
2596                let has_guard = inner_pairs
2597                    .get(1)
2598                    .is_some_and(|p| p.as_rule() == Rule::guard_clause);
2599
2600                let guard_clause = if has_guard {
2601                    Some(self.parse_guard_clause(&inner_pairs[1])?)
2602                } else {
2603                    None
2604                };
2605                Ok(Pattern::ConcretePattern(
2606                    pattern_node,
2607                    concrete_pattern,
2608                    guard_clause,
2609                ))
2610            }
2611            Rule::wildcard_pattern => Ok(Pattern::Wildcard(self.to_node(pair))),
2612            _ => Err(self.create_error_pair(SpecificError::MustHaveAtLeastOneArm, pair)),
2613        }
2614    }
2615
2616    fn parse_guard_clause(&self, pair: &Pair<Rule>) -> Result<GuardClause, ParseError> {
2617        let inner = Self::right_alternative(pair)?;
2618        let clause = match inner.as_rule() {
2619            Rule::wildcard_pattern => GuardClause::Wildcard(Self::node_ex(pair)),
2620            Rule::expression => {
2621                let mut iterator = inner.into_inner();
2622                let result = self.parse_expression(&Self::next_pair(&mut iterator)?)?;
2623                GuardClause::Expression(result)
2624            }
2625            _ => {
2626                return Err(Self::to_err(
2627                    SpecificError::UnknownExpr("guard_clause".to_string()),
2628                    pair,
2629                ))?;
2630            }
2631        };
2632
2633        Ok(clause)
2634    }
2635
2636    fn parse_guard_expr_list(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2637        let mut guard_exprs = Vec::new();
2638
2639        for expr_pair in Self::convert_into_iterator(pair) {
2640            match expr_pair.as_rule() {
2641                Rule::guard_item => {
2642                    let mut guard_inner = Self::convert_into_iterator(&expr_pair);
2643                    let guard_clause = Self::next_pair(&mut guard_inner)?;
2644                    let condition = self.parse_guard_clause(&guard_clause)?;
2645                    let result = self.parse_expression(&Self::next_pair(&mut guard_inner)?)?;
2646                    guard_exprs.push(GuardExpr {
2647                        clause: condition,
2648                        result,
2649                    });
2650                }
2651
2652                _ => {
2653                    panic!("Unexpected rule: {:?}", expr_pair.as_rule());
2654                }
2655            }
2656        }
2657
2658        Ok(self.create_expr(ExpressionKind::Guard(guard_exprs), pair))
2659    }
2660
2661    fn parse_enum_pattern(
2662        &self,
2663        pattern_type: &Pair<Rule>,
2664    ) -> Result<(ConcretePattern, Node), ParseError> {
2665        let mut inner = pattern_type.clone().into_inner(); // Clone first, then use into_inner()
2666        let variant = self.expect_local_type_identifier_next(&mut inner)?;
2667
2668        // Check for the optional destructuring_pattern
2669        let destructuring = if let Some(destructuring_node) = inner.next() {
2670            self.parse_destructuring_pattern(&destructuring_node)?
2671        } else {
2672            // No payload, it's a unit-like enum like `Red`, `Green`, `Blue`
2673            DestructuringPattern::Unit
2674        };
2675
2676        Ok((
2677            ConcretePattern::EnumPattern(variant.0, destructuring),
2678            self.to_node(pattern_type),
2679        ))
2680    }
2681
2682    fn parse_destructuring_pattern(
2683        &self,
2684        pair: &Pair<Rule>,
2685    ) -> Result<DestructuringPattern, ParseError> {
2686        let mut inner = Self::convert_into_iterator(pair);
2687        let destructuring_type = inner.next().expect("should have inner");
2688
2689        match destructuring_type.as_rule() {
2690            Rule::struct_destruct => {
2691                let fields = self.parse_struct_destructuring_fields(&destructuring_type)?;
2692                Ok(DestructuringPattern::Struct { fields })
2693            }
2694            Rule::tuple_destruct => {
2695                let elements = self.parse_tuple_destructuring_elements(&destructuring_type)?;
2696                if elements.is_empty() {
2697                    Ok(DestructuringPattern::Unit)
2698                }
2699                // Never create tuples with one element - convert to direct destructuring
2700                else if elements.len() == 1 {
2701                    match &elements[0] {
2702                        PatternVariableOrWildcard::Variable(var) => {
2703                            Ok(DestructuringPattern::None {
2704                                variable: var.clone(),
2705                            })
2706                        }
2707                        PatternVariableOrWildcard::Wildcard(_) => {
2708                            // For wildcards, we still need tuple destructuring
2709                            Ok(DestructuringPattern::Tuple { elements })
2710                        }
2711                    }
2712                } else {
2713                    assert!(!elements.is_empty(), "tuples can not be zero");
2714                    assert!(elements.len() > 1, "tuples must be at least two");
2715                    Ok(DestructuringPattern::Tuple { elements })
2716                }
2717            }
2718            Rule::maybe_mut_identifier => {
2719                let variable = self.parse_maybe_mut_identifier(&destructuring_type)?;
2720                Ok(DestructuringPattern::None { variable })
2721            }
2722            _ => Err(self.create_error_pair(SpecificError::UnknownMatchType, &destructuring_type)),
2723        }
2724    }
2725
2726    fn parse_struct_destructuring_fields(
2727        &self,
2728        pair: &Pair<Rule>,
2729    ) -> Result<Vec<Variable>, ParseError> {
2730        let mut fields = Vec::new();
2731        for field_pair in Self::convert_into_iterator(pair) {
2732            match field_pair.as_rule() {
2733                Rule::pattern_variable => {
2734                    let mut inner = Self::convert_into_iterator(&field_pair);
2735                    let variable_pair = inner.next().expect("should have inner");
2736                    let variable = self.parse_maybe_mut_identifier(&variable_pair)?;
2737                    fields.push(variable);
2738                }
2739                _ => {} // Skip other rules like commas
2740            }
2741        }
2742        Ok(fields)
2743    }
2744
2745    fn parse_tuple_destructuring_elements(
2746        &self,
2747        pair: &Pair<Rule>,
2748    ) -> Result<Vec<PatternVariableOrWildcard>, ParseError> {
2749        let mut elements = Vec::new();
2750        for element_pair in Self::convert_into_iterator(pair) {
2751            match element_pair.as_rule() {
2752                Rule::pattern_variable_or_wildcard => {
2753                    let mut inner = Self::convert_into_iterator(&element_pair);
2754                    let element_inner = inner.next().expect("should have inner");
2755
2756                    match element_inner.as_rule() {
2757                        Rule::maybe_mut_identifier => {
2758                            let variable = self.parse_maybe_mut_identifier(&element_inner)?;
2759                            elements.push(PatternVariableOrWildcard::Variable(variable));
2760                        }
2761                        _ => {
2762                            // Handle wildcard "_"
2763                            if element_inner.as_str() == "_" {
2764                                elements.push(PatternVariableOrWildcard::Wildcard(
2765                                    self.to_node(&element_inner),
2766                                ));
2767                            } else {
2768                                return Err(self.create_error_pair(
2769                                    SpecificError::UnknownMatchType,
2770                                    &element_inner,
2771                                ));
2772                            }
2773                        }
2774                    }
2775                }
2776                _ => {} // Skip other rules like commas
2777            }
2778        }
2779        Ok(elements)
2780    }
2781
2782    fn parse_normal_match_pattern(
2783        &self,
2784        pair: &Pair<Rule>,
2785    ) -> Result<(ConcretePattern, Node), ParseError> {
2786        let mut inner = Self::convert_into_iterator(pair);
2787        let pattern = inner.next().expect("should have inner");
2788
2789        match pattern.as_rule() {
2790            Rule::pattern => {
2791                let mut pattern_inner = Self::convert_into_iterator(&pattern);
2792                let pattern_type = pattern_inner.next().expect("should have inner");
2793
2794                match pattern_type.as_rule() {
2795                    Rule::enum_pattern => self.parse_enum_pattern(&pattern_type),
2796                    Rule::basic_literal => {
2797                        let (literal, node) = self.parse_basic_literal(&pattern_type)?;
2798                        Ok((ConcretePattern::Literal(literal), node))
2799                    }
2800                    _ => {
2801                        Err(self.create_error_pair(SpecificError::UnknownMatchType, &pattern_type))
2802                    }
2803                }
2804            }
2805            _ => Err(self.create_error_pair(SpecificError::UnknownMatchType, &pattern)),
2806        }
2807    }
2808
2809    fn to_node(&self, pair: &Pair<Rule>) -> Node {
2810        let pair_span = pair.as_span();
2811        let span = SpanWithoutFileId {
2812            offset: pair_span.start() as u32,
2813            length: (pair_span.end() - pair_span.start()) as u16,
2814        };
2815
2816        Node { span }
2817    }
2818
2819    fn node_ex(pair: &Pair<Rule>) -> Node {
2820        let pair_span = pair.as_span();
2821        let span = SpanWithoutFileId {
2822            offset: pair_span.start() as u32,
2823            length: (pair_span.end() - pair_span.start()) as u16,
2824        };
2825
2826        Node { span }
2827    }
2828
2829    fn to_span(&self, pest_span: pest::Span) -> SpanWithoutFileId {
2830        SpanWithoutFileId {
2831            offset: pest_span.start() as u32,
2832            length: (pest_span.end() - pest_span.start()) as u16,
2833        }
2834    }
2835
2836    fn span(pest_span: pest::Span) -> SpanWithoutFileId {
2837        SpanWithoutFileId {
2838            offset: pest_span.start() as u32,
2839            length: (pest_span.end() - pest_span.start()) as u16,
2840        }
2841    }
2842
2843    fn create_expr(&self, kind: ExpressionKind, pair: &Pair<Rule>) -> Expression {
2844        self.create_expr_span(kind, self.to_node(pair))
2845    }
2846
2847    const fn create_expr_span(&self, kind: ExpressionKind, node: Node) -> Expression {
2848        //info!(?kind, ?node, "create_expr()");
2849        Expression { kind, node }
2850    }
2851
2852    fn parse_multiplication(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2853        let mut inner = pair.clone().into_inner();
2854        let mut expr = self.parse_prefix(&inner.next().unwrap())?;
2855        while let Some(op) = inner.next() {
2856            // Expect the next token to be a multiplication operator, then the next operand.
2857            let operator = self.parse_binary_operator(&op)?; // op_mul, op_div, or op_mod
2858            let right = self.parse_prefix(&inner.next().unwrap())?;
2859            expr = self.create_expr(
2860                ExpressionKind::BinaryOp(Box::new(expr), operator, Box::new(right)),
2861                pair,
2862            );
2863        }
2864        Ok(expr)
2865    }
2866
2867    fn parse_addition(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2868        let mut inner = pair.clone().into_inner();
2869        let mut expr = self.parse_multiplication(&inner.next().unwrap())?;
2870        while let Some(op) = inner.next() {
2871            let operator = self.parse_binary_operator(&op)?; // op_add or op_sub
2872            let right = self.parse_multiplication(&inner.next().unwrap())?;
2873            expr = self.create_expr(
2874                ExpressionKind::BinaryOp(Box::new(expr), operator, Box::new(right)),
2875                pair,
2876            );
2877        }
2878        Ok(expr)
2879    }
2880
2881    fn parse_comparison(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2882        let mut inner = pair.clone().into_inner();
2883        let mut expr = self.parse_addition(&inner.next().unwrap())?;
2884        while let Some(op) = inner.next() {
2885            let operator = self.parse_binary_operator(&op)?; // e.g. op_lt, op_eq, etc.
2886            let right = self.parse_addition(&inner.next().unwrap())?;
2887            expr = self.create_expr(
2888                ExpressionKind::BinaryOp(Box::new(expr), operator, Box::new(right)),
2889                pair,
2890            );
2891        }
2892        Ok(expr)
2893    }
2894
2895    fn parse_range(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2896        let mut inner = pair.clone().into_inner();
2897        let left = self.parse_comparison(&inner.next().unwrap())?;
2898        if let Some(op) = inner.next() {
2899            let right = self.parse_comparison(&inner.next().unwrap())?;
2900            match op.as_rule() {
2901                Rule::exclusive_range_op => {
2902                    return Ok(self.create_expr(
2903                        ExpressionKind::Range(
2904                            Box::new(left),
2905                            Box::new(right),
2906                            RangeMode::Exclusive,
2907                        ),
2908                        pair,
2909                    ));
2910                }
2911                Rule::inclusive_range_op => {
2912                    return Ok(self.create_expr(
2913                        ExpressionKind::Range(
2914                            Box::new(left),
2915                            Box::new(right),
2916                            RangeMode::Inclusive,
2917                        ),
2918                        pair,
2919                    ));
2920                }
2921                _ => {}
2922            }
2923            let operator = self.parse_binary_operator(&op)?; // inclusive_range_op or exclusive_range_op
2924            Ok(self.create_expr(
2925                ExpressionKind::BinaryOp(Box::new(left), operator, Box::new(right)),
2926                pair,
2927            ))
2928        } else {
2929            Ok(left)
2930        }
2931    }
2932
2933    fn parse_logical(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2934        debug_assert_eq!(pair.as_rule(), Rule::logical);
2935        let mut inner = pair.clone().into_inner();
2936        let mut expr = self.parse_range(&inner.next().unwrap())?;
2937        while let Some(op) = inner.next() {
2938            let operator = self.parse_binary_operator(&op)?; // op_and or op_or
2939            let right = self.parse_range(&inner.next().unwrap())?;
2940            expr = self.create_expr(
2941                ExpressionKind::BinaryOp(Box::new(expr), operator, Box::new(right)),
2942                pair,
2943            );
2944        }
2945        Ok(expr)
2946    }
2947
2948    fn parse_lambda(&self, pair: &Pair<Rule>) -> Result<Expression, ParseError> {
2949        debug_assert_eq!(pair.as_rule(), Rule::lambda);
2950        let mut inner = pair.clone().into_inner();
2951        let variable_list_pair = inner.next().unwrap();
2952        let variable_list = self.parse_optional_variable_list(&variable_list_pair)?;
2953        let expression_pair = inner.next().unwrap();
2954        let expression = self.parse_expression(&expression_pair)?;
2955
2956        Ok(self.create_expr(
2957            ExpressionKind::Lambda(variable_list, Box::new(expression)),
2958            pair,
2959        ))
2960    }
2961
2962    pub fn parse_attribute(&self, pair: &Pair<Rule>) -> Result<Attribute, ParseError> {
2963        let inner = pair.clone().into_inner().next().unwrap();
2964        let is_inner = match inner.as_rule() {
2965            Rule::outer_attribute => false,
2966            Rule::inner_attribute => true,
2967            _ => panic!("must be attribute"),
2968        };
2969        let meta_item = inner.into_inner().next().unwrap();
2970        let (path, args) = self.parse_meta_item(&meta_item)?;
2971
2972        Ok(Attribute {
2973            is_inner,
2974            path,
2975            args,
2976            node: self.to_node(pair),
2977        })
2978    }
2979
2980    fn parse_any_meta_item_to_arg(&self, pair: &Pair<Rule>) -> Result<AttributeArg, ParseError> {
2981        debug_assert_eq!(pair.as_rule(), Rule::meta_item);
2982        let matched_alternative = pair.clone().into_inner().next().unwrap();
2983
2984        match matched_alternative.as_rule() {
2985            Rule::meta_path => {
2986                let path_pair = matched_alternative.clone().into_inner().next().unwrap();
2987                let path = self.parse_qualified_identifier(&path_pair)?;
2988                Ok(AttributeArg::Path(path))
2989            }
2990            Rule::meta_key_value => {
2991                let mut inner_items = matched_alternative.clone().into_inner();
2992                let key_pair = inner_items.next().unwrap();
2993                let value_pair = inner_items.next().unwrap();
2994                let key = self.parse_qualified_identifier(&key_pair)?;
2995                let value_arg = self.parse_meta_value(&value_pair)?;
2996                Ok(AttributeArg::Function(key, vec![value_arg]))
2997            }
2998            Rule::meta_list => {
2999                let mut inner_items = matched_alternative.clone().into_inner();
3000                let path_pair = inner_items.next().unwrap();
3001                let path = self.parse_qualified_identifier(&path_pair)?;
3002                let args = if let Some(list_pair) = inner_items.next() {
3003                    self.parse_meta_item_list(&list_pair)?
3004                } else {
3005                    vec![]
3006                };
3007                Ok(AttributeArg::Function(path, args))
3008            }
3009            _ => panic!("unexpected rule inside meta_item"),
3010        }
3011    }
3012
3013    fn parse_meta_item(
3014        &self,
3015        pair: &Pair<Rule>,
3016    ) -> Result<(QualifiedIdentifier, Vec<AttributeArg>), ParseError> {
3017        debug_assert_eq!(pair.as_rule(), Rule::meta_item);
3018        let arg = self.parse_any_meta_item_to_arg(pair)?;
3019
3020        match arg {
3021            AttributeArg::Path(path) => Ok((path, vec![])),
3022            AttributeArg::Function(path, args) => Ok((path, args)),
3023            AttributeArg::Literal(_) => panic!(),
3024        }
3025    }
3026
3027    fn parse_meta_item_list(&self, pair: &Pair<Rule>) -> Result<Vec<AttributeArg>, ParseError> {
3028        let mut args = Vec::new();
3029        for item in pair.clone().into_inner() {
3030            args.push(self.parse_meta_item_arg(&item)?);
3031        }
3032        Ok(args)
3033    }
3034
3035    fn parse_meta_item_arg(&self, pair: &Pair<Rule>) -> Result<AttributeArg, ParseError> {
3036        self.parse_any_meta_item_to_arg(pair)
3037    }
3038
3039    fn parse_meta_value(&self, pair: &Pair<Rule>) -> Result<AttributeArg, ParseError> {
3040        let matched_alternative = self.next_inner_pair(pair)?;
3041        match matched_alternative.as_rule() {
3042            Rule::basic_literal => {
3043                let (kind, node) = self.parse_basic_literal(&matched_alternative)?;
3044                Ok(AttributeArg::Literal(match kind {
3045                    LiteralKind::Int => AttributeValue::Literal(node, AttributeLiteralKind::Int),
3046                    LiteralKind::String(s) => {
3047                        AttributeValue::Literal(node, AttributeLiteralKind::String(s))
3048                    }
3049                    LiteralKind::Bool => AttributeValue::Literal(node, AttributeLiteralKind::Bool),
3050                    _ => panic!("not supported"),
3051                }))
3052            }
3053            Rule::meta_path => {
3054                let path = self.parse_qualified_identifier(
3055                    &matched_alternative.clone().into_inner().next().unwrap(),
3056                )?;
3057                Ok(AttributeArg::Path(path))
3058            }
3059            Rule::meta_list => {
3060                let mut inner = matched_alternative.clone().into_inner();
3061                let path = self.parse_qualified_identifier(&inner.next().unwrap())?;
3062                let args = if let Some(list) = inner.next() {
3063                    self.parse_meta_item_list(&list)?
3064                } else {
3065                    vec![]
3066                };
3067                Ok(AttributeArg::Function(path, args))
3068            }
3069            _ => panic!("unexpected meta_value {:?}", pair.as_rule()),
3070        }
3071    }
3072}