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