From d7339bcf02e9802187d8f5dcc02d732e9dcf7452 Mon Sep 17 00:00:00 2001 From: Ori Ziv Date: Wed, 21 Jun 2023 15:04:27 +0300 Subject: [PATCH] Added support for including minus in literals. commit-id:295e9468 --- corelib/src/lib.cairo | 2 +- corelib/src/test/integer_test.cairo | 31 +- .../src/node_properties.rs | 10 +- .../src/semantic_highlighting/token_kind.rs | 2 +- .../src/inline/test_data/inline | 2 +- .../cairo-lang-parser/src/colored_printer.rs | 2 +- crates/cairo-lang-parser/src/lexer.rs | 6 +- crates/cairo-lang-parser/src/lexer_test.rs | 12 +- crates/cairo-lang-parser/src/parser.rs | 68 +++- .../src/parser_test_data/array | 8 +- .../src/parser_test_data/constant | 8 +- .../src/parser_test_data/function_call | 20 +- .../src/parser_test_data/if_else | 16 +- .../src/parser_test_data/item_free_function | 4 +- .../src/parser_test_data/literal | 109 +++++- .../src/parser_test_data/loop | 4 +- .../src/parser_test_data/op_eq | 28 +- .../src/parser_test_data/unary_only_operators | 16 +- crates/cairo-lang-parser/src/validation.rs | 6 +- .../expected_results/test1_tree_no_trivia | 74 ++-- .../expected_results/test1_tree_with_trivia | 200 ++++++----- .../expected_results/test2_tree_no_trivia | 42 ++- .../expected_results/test2_tree_with_trivia | 104 +++--- .../expected_results/test3_tree_no_trivia | 28 +- .../expected_results/test3_tree_with_trivia | 78 +++-- crates/cairo-lang-semantic/src/corelib.rs | 13 +- .../cairo-lang-semantic/src/expr/compute.rs | 2 +- crates/cairo-lang-semantic/src/expr/test.rs | 14 +- .../src/cairo_spec.rs | 11 +- crates/cairo-lang-syntax/src/node/ast.rs | 322 ++++++++++++++---- crates/cairo-lang-syntax/src/node/ast_ext.rs | 19 +- crates/cairo-lang-syntax/src/node/ast_test.rs | 28 +- .../cairo-lang-syntax/src/node/key_fields.rs | 10 +- crates/cairo-lang-syntax/src/node/kind.rs | 10 +- tests/test_data/fib_unary.casm | 6 +- tests/test_data/fib_unary.sierra | 34 +- 36 files changed, 938 insertions(+), 411 deletions(-) diff --git a/corelib/src/lib.cairo b/corelib/src/lib.cairo index 01c04b9b5a7..f54edf0b998 100644 --- a/corelib/src/lib.cairo +++ b/corelib/src/lib.cairo @@ -162,7 +162,7 @@ extern fn felt252_mul(lhs: felt252, rhs: felt252) -> felt252 nopanic; impl Felt252Neg of Neg { #[inline(always)] fn neg(a: felt252) -> felt252 { - a * felt252_const::<-1>() + a * -1 } } diff --git a/corelib/src/test/integer_test.cairo b/corelib/src/test/integer_test.cairo index b74e697b543..9de0cf454e8 100644 --- a/corelib/src/test/integer_test.cairo +++ b/corelib/src/test/integer_test.cairo @@ -1127,9 +1127,8 @@ fn test_i8_operators() { assert_eq(@0x7f_felt252.try_into().unwrap(), @0x7f_i8, '0x7f is not i8'); let v: Option = 0x80_felt252.try_into(); assert(v.is_none(), '0x80 is i8'); - let v: Option = (-0x80_felt252).try_into(); - assert(v.is_some(), '-0x80 is not i8'); - let v: Option = (-0x81_felt252).try_into(); + assert_eq(@-0x80_felt252.try_into().unwrap(), @-0x80_i8, '-0x80 is not i8'); + let v: Option = -0x81_felt252.try_into(); assert(v.is_none(), '-0x81 is i8'); } @@ -1141,9 +1140,8 @@ fn test_i16_operators() { assert_eq(@0x7fff_felt252.try_into().unwrap(), @0x7fff_i16, '0x7fff is not i16'); let v: Option = 0x8000_felt252.try_into(); assert(v.is_none(), '0x8000 is i16'); - let v: Option = (-0x8000_felt252).try_into(); - assert(v.is_some(), '-0x8000 is not i16'); - let v: Option = (-0x8001_felt252).try_into(); + assert_eq(@-0x8000_felt252.try_into().unwrap(), @-0x8000_i16, '-0x8000 is not i16'); + let v: Option = -0x8001_felt252.try_into(); assert(v.is_none(), '-0x8001 is i16'); } @@ -1155,9 +1153,8 @@ fn test_i32_operators() { assert_eq(@0x7fffffff_felt252.try_into().unwrap(), @0x7fffffff_i32, '0x7fffffff is not i32'); let v: Option = 0x80000000_felt252.try_into(); assert(v.is_none(), '0x80000000 is i32'); - let v: Option = (-0x80000000_felt252).try_into(); - assert(v.is_some(), '-0x80000000 is not i32'); - let v: Option = (-0x80000001_felt252).try_into(); + assert_eq(@-0x80000000_felt252.try_into().unwrap(), @-0x80000000_i32, '-0x8000 is not i32'); + let v: Option = -0x80000001_felt252.try_into(); assert(v.is_none(), '-0x80000001 is i32'); } @@ -1169,12 +1166,15 @@ fn test_i64_operators() { assert_eq( @0x7fffffffffffffff_felt252.try_into().unwrap(), @0x7fffffffffffffff_i64, - '-0x7fffffffffffffff is not i64' + '0x7fffffffffffffff is not i64' ); let v: Option = 0x8000000000000000_felt252.try_into(); assert(v.is_none(), '0x8000000000000000 is i64'); - let v: Option = (-0x8000000000000000_felt252).try_into(); - assert(v.is_some(), '-0x8000000000000000 is not i64'); + assert_eq( + @-0x8000000000000000_felt252.try_into().unwrap(), + @-0x8000000000000000_i64, + '-0x8000000000000000 is not i64' + ); let v: Option = (-0x8000000000000001_felt252).try_into(); assert(v.is_none(), '-0x8000000000000001 is i64'); } @@ -1191,8 +1191,11 @@ fn test_i128_operators() { ); let v: Option = 0x80000000000000000000000000000000_felt252.try_into(); assert(v.is_none(), '0x80..0 is i128'); - let v: Option = (-0x80000000000000000000000000000000_felt252).try_into(); - assert(v.is_some(), '-0x80..0 is not i128'); + assert_eq( + @-0x80000000000000000000000000000000_felt252.try_into().unwrap(), + @-0x80000000000000000000000000000000_i128, + '-0x80..0 is not i128' + ); let v: Option = (-0x80000000000000000000000000000001_felt252).try_into(); assert(v.is_none(), '-0x80..01 is i128'); } diff --git a/crates/cairo-lang-formatter/src/node_properties.rs b/crates/cairo-lang-formatter/src/node_properties.rs index dc6bc388693..aa024227380 100644 --- a/crates/cairo-lang-formatter/src/node_properties.rs +++ b/crates/cairo-lang-formatter/src/node_properties.rs @@ -91,7 +91,10 @@ impl SyntaxNodeFormat for SyntaxNode { true } SyntaxKind::TokenMinus | SyntaxKind::TokenMul => { - matches!(grandparent_kind(db, self), Some(SyntaxKind::ExprUnary)) + matches!( + grandparent_kind(db, self), + Some(SyntaxKind::ExprUnary | SyntaxKind::LiteralNumber) + ) } SyntaxKind::TokenLT if matches!( @@ -546,7 +549,10 @@ impl SyntaxNodeFormat for SyntaxNode { trailing: None, }, SyntaxKind::TerminalMinus - if parent_kind(db, self) != Some(SyntaxKind::ExprUnary) => + if !matches!( + parent_kind(db, self), + Some(SyntaxKind::ExprUnary | SyntaxKind::LiteralNumber) + ) => { WrappingBreakLinePoints { leading: Some(BreakLinePointProperties::new( diff --git a/crates/cairo-lang-language-server/src/semantic_highlighting/token_kind.rs b/crates/cairo-lang-language-server/src/semantic_highlighting/token_kind.rs index fc8aac8caf0..24c04ea1d69 100644 --- a/crates/cairo-lang-language-server/src/semantic_highlighting/token_kind.rs +++ b/crates/cairo-lang-language-server/src/semantic_highlighting/token_kind.rs @@ -25,7 +25,7 @@ impl SemanticTokenKind { Some(match kind { _ if kind.is_keyword_token() => SemanticTokenKind::Keyword, SyntaxKind::TokenIdentifier => SemanticTokenKind::Variable, - SyntaxKind::TokenLiteralNumber => SemanticTokenKind::Number, + SyntaxKind::TokenNumber => SemanticTokenKind::Number, SyntaxKind::TokenAnd | SyntaxKind::TokenAndAnd | SyntaxKind::TokenOr diff --git a/crates/cairo-lang-lowering/src/inline/test_data/inline b/crates/cairo-lang-lowering/src/inline/test_data/inline index 341a2a57557..2455f46f262 100644 --- a/crates/cairo-lang-lowering/src/inline/test_data/inline +++ b/crates/cairo-lang-lowering/src/inline/test_data/inline @@ -37,7 +37,7 @@ End: blk2: Statements: - (v2: core::felt252) <- core::felt252_const::() + (v2: core::felt252) <- -1u End: Goto(blk4, {}) diff --git a/crates/cairo-lang-parser/src/colored_printer.rs b/crates/cairo-lang-parser/src/colored_printer.rs index 65aee405ec0..89f8930e319 100644 --- a/crates/cairo-lang-parser/src/colored_printer.rs +++ b/crates/cairo-lang-parser/src/colored_printer.rs @@ -65,7 +65,7 @@ fn set_color(text: SmolStr, kind: SyntaxKind) -> ColoredString { | SyntaxKind::TokenDiv | SyntaxKind::TokenMod | SyntaxKind::TokenDot => text.bright_magenta(), - SyntaxKind::TokenLiteralNumber + SyntaxKind::TokenNumber | SyntaxKind::TokenFalse | SyntaxKind::TokenTrue | SyntaxKind::TokenShortString => text.bright_cyan(), diff --git a/crates/cairo-lang-parser/src/lexer.rs b/crates/cairo-lang-parser/src/lexer.rs index 92b62799730..9781459de10 100644 --- a/crates/cairo-lang-parser/src/lexer.rs +++ b/crates/cairo-lang-parser/src/lexer.rs @@ -139,7 +139,7 @@ impl<'a> Lexer<'a> { if self.peek() == Some('_') { self.take_while(|c| c.is_ascii_alphanumeric() || c == '_'); } - TokenKind::LiteralNumber + TokenKind::Number } /// Takes a short string. @@ -326,7 +326,7 @@ enum TokenKind { Identifier, // Literals. - LiteralNumber, + Number, ShortString, // Keywords. @@ -414,7 +414,7 @@ fn token_kind_to_terminal_syntax_kind(kind: TokenKind) -> SyntaxKind { TokenKind::As => SyntaxKind::TerminalAs, TokenKind::Const => SyntaxKind::TerminalConst, TokenKind::Identifier => SyntaxKind::TerminalIdentifier, - TokenKind::LiteralNumber => SyntaxKind::TerminalLiteralNumber, + TokenKind::Number => SyntaxKind::TerminalNumber, TokenKind::ShortString => SyntaxKind::TerminalShortString, TokenKind::False => SyntaxKind::TerminalFalse, TokenKind::True => SyntaxKind::TerminalTrue, diff --git a/crates/cairo-lang-parser/src/lexer_test.rs b/crates/cairo-lang-parser/src/lexer_test.rs index a1a3acaff1d..a664335850e 100644 --- a/crates/cairo-lang-parser/src/lexer_test.rs +++ b/crates/cairo-lang-parser/src/lexer_test.rs @@ -14,7 +14,7 @@ use crate::utils::SimpleParserDatabase; fn terminal_kind_to_text(kind: SyntaxKind) -> Vec<&'static str> { match kind { SyntaxKind::TerminalIdentifier => vec!["abc", "_az12f", "A90g5__"], - SyntaxKind::TerminalLiteralNumber => { + SyntaxKind::TerminalNumber => { vec![ "0", "0xA2", @@ -104,7 +104,7 @@ fn terminal_kind_to_text(kind: SyntaxKind) -> Vec<&'static str> { fn terminal_kinds() -> Vec { vec![ SyntaxKind::TerminalIdentifier, - SyntaxKind::TerminalLiteralNumber, + SyntaxKind::TerminalNumber, SyntaxKind::TerminalFalse, SyntaxKind::TerminalTrue, SyntaxKind::TerminalExtern, @@ -183,11 +183,11 @@ fn need_separator( text1: &'static str, ) -> bool { if is_identifier_like(kind0) - && (is_identifier_like(kind1) || matches!(kind1, SyntaxKind::TerminalLiteralNumber)) + && (is_identifier_like(kind1) || matches!(kind1, SyntaxKind::TerminalNumber)) { return true; } - if kind0 == SyntaxKind::TerminalLiteralNumber && (kind0 == kind1 || is_identifier_like(kind1)) { + if kind0 == SyntaxKind::TerminalNumber && (kind0 == kind1 || is_identifier_like(kind1)) { return true; } if kind0 == SyntaxKind::TerminalShortString @@ -206,7 +206,7 @@ fn need_separator( || (text0 == "-" && (text1.starts_with('>') || text1.starts_with('='))) || ((text0 == "+" || text0 == "*" || text0 == "/" || text0 == "%") && text1.starts_with('=')) - || (kind0 == SyntaxKind::TerminalLiteralNumber && kind0 == kind1) + || (kind0 == SyntaxKind::TerminalNumber && kind0 == kind1) { return true; } @@ -401,7 +401,7 @@ fn test_cases() { }, LexerTerminal { text: "6".into(), - kind: SyntaxKind::TerminalLiteralNumber, + kind: SyntaxKind::TerminalNumber, leading_trivia: vec![], trailing_trivia: vec![] }, diff --git a/crates/cairo-lang-parser/src/parser.rs b/crates/cairo-lang-parser/src/parser.rs index f46763b3381..1575b8a29d8 100644 --- a/crates/cairo-lang-parser/src/parser.rs +++ b/crates/cairo-lang-parser/src/parser.rs @@ -774,13 +774,7 @@ impl<'a> Parser<'a> { parent_precedence: usize, lbrace_allowed: LbraceAllowed, ) -> Option { - let mut expr = if let Some(precedence) = get_unary_operator_precedence(self.peek().kind) { - let op = self.expect_unary_operator(); - let expr = self.parse_expr_limited(precedence, lbrace_allowed); - ExprUnary::new_green(self.db, op, expr).into() - } else { - self.try_parse_atom(lbrace_allowed)? - }; + let mut expr = self.try_parse_atom_or_unary(lbrace_allowed)?; while let Some(precedence) = get_post_operator_precedence(self.peek().kind) { if precedence >= parent_precedence { @@ -807,6 +801,32 @@ impl<'a> Parser<'a> { } Some(expr) } + + /// Returns a GreenId of a node with ExprPath, ExprFunctionCall, ExprStructCtorCall, + /// ExprParenthesized, ExprTuple, LiteralNumber or ExprUnary kind, or None if such an expression + /// can't be parsed. + /// + /// `lbrace_allowed` - See [LbraceAllowed]. + fn try_parse_atom_or_unary(&mut self, lbrace_allowed: LbraceAllowed) -> Option { + let Some(precedence) = get_unary_operator_precedence(self.peek().kind) else { + return self.try_parse_atom(lbrace_allowed); + }; + let op = if self.peek().kind == SyntaxKind::TerminalMinus { + let minus = self.take::(); + if self.peek().kind == SyntaxKind::TerminalNumber { + return Some( + LiteralNumber::new_green(self.db, minus.into(), self.take::()) + .into(), + ); + } + minus.into() + } else { + self.expect_unary_operator() + }; + let expr = self.parse_expr_limited(precedence, lbrace_allowed); + Some(ExprUnary::new_green(self.db, op, expr).into()) + } + /// Returns a GreenId of a node with an Expr.* kind (see [syntax::node::ast::Expr]), /// excluding ExprBlock, or ExprMissing if such an expression can't be parsed. /// @@ -844,7 +864,14 @@ impl<'a> Parser<'a> { } SyntaxKind::TerminalFalse => Some(self.take::().into()), SyntaxKind::TerminalTrue => Some(self.take::().into()), - SyntaxKind::TerminalLiteralNumber => Some(self.take::().into()), + SyntaxKind::TerminalNumber => Some( + LiteralNumber::new_green( + self.db, + OptionTerminalMinusEmpty::new_green(self.db).into(), + self.take::(), + ) + .into(), + ), SyntaxKind::TerminalShortString => Some(self.take::().into()), SyntaxKind::TerminalLParen => { // Note that LBrace is allowed inside parenthesis, even if `lbrace_allowed` is @@ -1315,7 +1342,12 @@ impl<'a> Parser<'a> { // TODO(yuval): Support "Or" patterns. Some(match self.peek().kind { - SyntaxKind::TerminalLiteralNumber => self.take::().into(), + SyntaxKind::TerminalNumber => LiteralNumber::new_green( + self.db, + OptionTerminalMinusEmpty::new_green(self.db).into(), + self.take::(), + ) + .into(), SyntaxKind::TerminalShortString => self.take::().into(), SyntaxKind::TerminalUnderscore => self.take::().into(), SyntaxKind::TerminalIdentifier => { @@ -1778,12 +1810,18 @@ impl<'a> Parser<'a> { } let expr = match self.peek().kind { - SyntaxKind::TerminalLiteralNumber => self.take::().into(), - SyntaxKind::TerminalMinus => { - let minus = self.take::().into(); - let literal = self.parse_token::().into(); - ExprUnary::new_green(self.db, minus, literal).into() - } + SyntaxKind::TerminalNumber => LiteralNumber::new_green( + self.db, + OptionTerminalMinusEmpty::new_green(self.db).into(), + self.take::(), + ) + .into(), + SyntaxKind::TerminalMinus => LiteralNumber::new_green( + self.db, + self.take::().into(), + self.take::(), + ) + .into(), SyntaxKind::TerminalShortString => self.take::().into(), SyntaxKind::TerminalLBrace => self.parse_block().into(), _ => self.try_parse_type_expr()?, diff --git a/crates/cairo-lang-parser/src/parser_test_data/array b/crates/cairo-lang-parser/src/parser_test_data/array index adae657afce..96cfeef1b40 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/array +++ b/crates/cairo-lang-parser/src/parser_test_data/array @@ -20,7 +20,9 @@ ExprPath └── Top level kind: ExprIndexed ├── expr (kind: ExprPath) ├── lbrack (kind: TokenLBrack): '[' - ├── index_expr (kind: TokenLiteralNumber): '1' + ├── index_expr (kind: LiteralNumber) + │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ └── number (kind: TokenNumber): '1' └── rbrack (kind: TokenRBrack): ']' //! > ========================================================================== @@ -107,6 +109,8 @@ ExprPath ├── index_expr (kind: ExprIndexed) │ ├── expr (kind: ExprPath) │ ├── lbrack (kind: TokenLBrack): '[' - │ ├── index_expr (kind: TokenLiteralNumber): '1' + │ ├── index_expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '1' │ └── rbrack (kind: TokenRBrack): ']' └── rbrack (kind: TokenRBrack): ']' diff --git a/crates/cairo-lang-parser/src/parser_test_data/constant b/crates/cairo-lang-parser/src/parser_test_data/constant index 38653344409..279fc3d941b 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/constant +++ b/crates/cairo-lang-parser/src/parser_test_data/constant @@ -33,7 +33,9 @@ ItemConstant │ │ └── ident (kind: TokenIdentifier): 'felt252' │ └── rangle (kind: TokenGT): '>' ├── eq (kind: TokenEq): '=' - ├── value (kind: TokenLiteralNumber): '0x1234' + ├── value (kind: LiteralNumber) + │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ └── number (kind: TokenNumber): '0x1234' └── semicolon (kind: TokenSemicolon): ';' //! > ========================================================================== @@ -66,5 +68,7 @@ const X = 0x1234; │ ├── colon: Missing │ └── ty: Missing [] ├── eq (kind: TokenEq): '=' - ├── value (kind: TokenLiteralNumber): '0x1234' + ├── value (kind: LiteralNumber) + │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ └── number (kind: TokenNumber): '0x1234' └── semicolon (kind: TokenSemicolon): ';' diff --git a/crates/cairo-lang-parser/src/parser_test_data/function_call b/crates/cairo-lang-parser/src/parser_test_data/function_call index 388625e735f..cc0cbee9836 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/function_call +++ b/crates/cairo-lang-parser/src/parser_test_data/function_call @@ -30,7 +30,9 @@ ExprFunctionCall │ │ │ └── ident (kind: TokenIdentifier): 'felt252' │ │ ├── separator #0 (kind: TokenComma): ',' │ │ └── item #1 (kind: GenericArgExpr) - │ │ └── value (kind: TokenLiteralNumber): '7' + │ │ └── value (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '7' │ └── rangle (kind: TokenGT): '>' └── arguments (kind: ArgListParenthesized) ├── lparen (kind: TokenLParen): '(' @@ -38,7 +40,9 @@ ExprFunctionCall │ ├── item #0 (kind: Arg) │ │ ├── modifiers (kind: ModifierList) [] │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ └── value (kind: TokenLiteralNumber): '12' + │ │ └── value (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '12' │ ├── separator #0 (kind: TokenComma): ',' │ ├── item #1 (kind: Arg) │ │ ├── modifiers (kind: ModifierList) [] @@ -48,7 +52,9 @@ ExprFunctionCall │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ └── ident (kind: TokenIdentifier): 'a' │ │ ├── op (kind: TokenPlus): '+' - │ │ └── rhs (kind: TokenLiteralNumber): '3' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '3' │ ├── separator #1 (kind: TokenComma): ',' │ └── item #2 (kind: Arg) │ ├── modifiers (kind: ModifierList) @@ -89,7 +95,9 @@ ExprFunctionCall │ ├── item #0 (kind: Arg) │ │ ├── modifiers (kind: ModifierList) [] │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ └── value (kind: TokenLiteralNumber): '12' + │ │ └── value (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '12' │ ├── separator #0 (kind: TokenComma): ',' │ ├── item #1 (kind: Arg) │ │ ├── modifiers (kind: ModifierList) [] @@ -101,7 +109,9 @@ ExprFunctionCall │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ └── ident (kind: TokenIdentifier): 'a' │ │ ├── op (kind: TokenPlus): '+' - │ │ └── rhs (kind: TokenLiteralNumber): '3' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '3' │ ├── separator #1 (kind: TokenComma): ',' │ └── item #2 (kind: Arg) │ ├── modifiers (kind: ModifierList) [] diff --git a/crates/cairo-lang-parser/src/parser_test_data/if_else b/crates/cairo-lang-parser/src/parser_test_data/if_else index fd10b68cb96..593807fdec1 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/if_else +++ b/crates/cairo-lang-parser/src/parser_test_data/if_else @@ -32,7 +32,9 @@ ExprBinary │ ├── lbrace (kind: TokenLBrace): '{' │ ├── statements (kind: StatementList) │ │ └── child #0 (kind: StatementExpr) - │ │ ├── expr (kind: TokenLiteralNumber): '3' + │ │ ├── expr (kind: LiteralNumber) + │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ └── number (kind: TokenNumber): '3' │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ └── rbrace (kind: TokenRBrace): '}' └── else_clause (kind: ElseClause) @@ -44,7 +46,9 @@ ExprBinary │ ├── lbrace (kind: TokenLBrace): '{' │ ├── statements (kind: StatementList) │ │ └── child #0 (kind: StatementExpr) - │ │ ├── expr (kind: TokenLiteralNumber): '6' + │ │ ├── expr (kind: LiteralNumber) + │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ └── number (kind: TokenNumber): '6' │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ └── rbrace (kind: TokenRBrace): '}' └── else_clause (kind: ElseClause) @@ -56,7 +60,9 @@ ExprBinary │ ├── lbrace (kind: TokenLBrace): '{' │ ├── statements (kind: StatementList) │ │ └── child #0 (kind: StatementExpr) - │ │ ├── expr (kind: TokenLiteralNumber): '9' + │ │ ├── expr (kind: LiteralNumber) + │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ └── number (kind: TokenNumber): '9' │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ └── rbrace (kind: TokenRBrace): '}' └── else_clause (kind: ElseClause) @@ -65,6 +71,8 @@ ExprBinary ├── lbrace (kind: TokenLBrace): '{' ├── statements (kind: StatementList) │ └── child #0 (kind: StatementExpr) - │ ├── expr (kind: TokenLiteralNumber): '10' + │ ├── expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '10' │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] └── rbrace (kind: TokenRBrace): '}' diff --git a/crates/cairo-lang-parser/src/parser_test_data/item_free_function b/crates/cairo-lang-parser/src/parser_test_data/item_free_function index a0e20117f86..62c074282fe 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/item_free_function +++ b/crates/cairo-lang-parser/src/parser_test_data/item_free_function @@ -151,6 +151,8 @@ fn foo() -> Aaaaa Bbb + Cc; let x = 0; } │ │ └── ident (kind: TokenIdentifier): 'x' │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0' │ └── semicolon (kind: TokenSemicolon): ';' └── rbrace (kind: TokenRBrace): '}' diff --git a/crates/cairo-lang-parser/src/parser_test_data/literal b/crates/cairo-lang-parser/src/parser_test_data/literal index 3c394bb28ff..c596680351a 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/literal +++ b/crates/cairo-lang-parser/src/parser_test_data/literal @@ -24,9 +24,13 @@ ExprPath ├── eq (kind: TokenEq): '=' ├── rhs (kind: ExprBinary) │ ├── lhs (kind: ExprBinary) - │ │ ├── lhs (kind: TokenLiteralNumber): '0x123' + │ │ ├── lhs (kind: LiteralNumber) + │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ └── number (kind: TokenNumber): '0x123' │ │ ├── op (kind: TokenPlus): '+' - │ │ └── rhs (kind: TokenLiteralNumber): '456' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '456' │ ├── op (kind: TokenPlus): '+' │ └── rhs (kind: TokenShortString): ''abc'' └── semicolon (kind: TokenSemicolon): ';' @@ -59,15 +63,60 @@ ExprPath ├── eq (kind: TokenEq): '=' ├── rhs (kind: ExprBinary) │ ├── lhs (kind: ExprBinary) - │ │ ├── lhs (kind: TokenLiteralNumber): '0x123_u8' + │ │ ├── lhs (kind: LiteralNumber) + │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ └── number (kind: TokenNumber): '0x123_u8' │ │ ├── op (kind: TokenPlus): '+' - │ │ └── rhs (kind: TokenLiteralNumber): '456_u256' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '456_u256' │ ├── op (kind: TokenPlus): '+' │ └── rhs (kind: TokenShortString): ''abc'_u16' └── semicolon (kind: TokenSemicolon): ';' //! > ========================================================================== +//! > Test a syntax tree with literals with unary minuses + +//! > test_runner_name +test_partial_parser_tree + +//! > cairo_code +fn f() { + let a = -0x123_u8 + -456_u256 + -'abc'_u16; +} + +//! > top_level_kind +StatementLet + +//! > ignored_kinds +ExprPath + +//! > expected_diagnostics + +//! > expected_tree +└── Top level kind: StatementLet + ├── let_kw (kind: TokenLet): 'let' + ├── pattern (kind: ExprPath) + ├── type_clause (kind: OptionTypeClauseEmpty) [] + ├── eq (kind: TokenEq): '=' + ├── rhs (kind: ExprBinary) + │ ├── lhs (kind: ExprBinary) + │ │ ├── lhs (kind: LiteralNumber) + │ │ │ ├── sign (kind: TokenMinus): '-' + │ │ │ └── number (kind: TokenNumber): '0x123_u8' + │ │ ├── op (kind: TokenPlus): '+' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: TokenMinus): '-' + │ │ └── number (kind: TokenNumber): '456_u256' + │ ├── op (kind: TokenPlus): '+' + │ └── rhs (kind: ExprUnary) + │ ├── op (kind: TokenMinus): '-' + │ └── expr (kind: TokenShortString): ''abc'_u16' + └── semicolon (kind: TokenSemicolon): ';' + +//! > ========================================================================== + //! > Invalid literals. //! > test_runner_name @@ -145,68 +194,92 @@ error: Literal is not a valid number. │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0b1' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0b1' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #1 (kind: StatementLet) │ ├── let_kw (kind: TokenLet): 'let' │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0b' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0b' │ └── semicolon: Missing ├── child #2 (kind: StatementExpr) - │ ├── expr (kind: TokenLiteralNumber): '2' + │ ├── expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '2' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #3 (kind: StatementLet) │ ├── let_kw (kind: TokenLet): 'let' │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0b1' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0b1' │ └── semicolon: Missing ├── child #4 (kind: StatementExpr) - │ ├── expr (kind: TokenLiteralNumber): '2' + │ ├── expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '2' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #5 (kind: StatementLet) │ ├── let_kw (kind: TokenLet): 'let' │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0o1' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0o1' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #6 (kind: StatementLet) │ ├── let_kw (kind: TokenLet): 'let' │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0o' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0o' │ └── semicolon: Missing ├── child #7 (kind: StatementExpr) - │ ├── expr (kind: TokenLiteralNumber): '8' + │ ├── expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '8' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #8 (kind: StatementLet) │ ├── let_kw (kind: TokenLet): 'let' │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0o7' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0o7' │ └── semicolon: Missing ├── child #9 (kind: StatementExpr) - │ ├── expr (kind: TokenLiteralNumber): '8' + │ ├── expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '8' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #10 (kind: StatementLet) │ ├── let_kw (kind: TokenLet): 'let' │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0xf' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0xf' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #11 (kind: StatementLet) │ ├── let_kw (kind: TokenLet): 'let' │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0x' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0x' │ └── semicolon: Missing ├── child #12 (kind: StatementExpr) │ ├── expr (kind: ExprPath) @@ -216,7 +289,9 @@ error: Literal is not a valid number. │ ├── pattern (kind: ExprPath) │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ ├── eq (kind: TokenEq): '=' - │ ├── rhs (kind: TokenLiteralNumber): '0xf' + │ ├── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '0xf' │ └── semicolon: Missing └── child #14 (kind: StatementExpr) ├── expr (kind: ExprPath) diff --git a/crates/cairo-lang-parser/src/parser_test_data/loop b/crates/cairo-lang-parser/src/parser_test_data/loop index 55aae7a0c54..1ffbd59108d 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/loop +++ b/crates/cairo-lang-parser/src/parser_test_data/loop @@ -33,7 +33,9 @@ StatementLet │ │ └── child #0 (kind: StatementBreak) │ │ ├── break_kw (kind: TokenBreak): 'break' │ │ ├── expr_clause (kind: ExprClause) - │ │ │ └── expr (kind: TokenLiteralNumber): '5' + │ │ │ └── expr (kind: LiteralNumber) + │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ └── number (kind: TokenNumber): '5' │ │ └── semicolon (kind: TokenSemicolon): ';' │ └── rbrace (kind: TokenRBrace): '}' └── semicolon (kind: TokenSemicolon): ';' diff --git a/crates/cairo-lang-parser/src/parser_test_data/op_eq b/crates/cairo-lang-parser/src/parser_test_data/op_eq index c4ec72cbe9d..9a57656e6b8 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/op_eq +++ b/crates/cairo-lang-parser/src/parser_test_data/op_eq @@ -31,7 +31,9 @@ StatementLet │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ └── ident (kind: TokenIdentifier): 'x' │ │ ├── op (kind: TokenPlusEq): '+=' - │ │ └── rhs (kind: TokenLiteralNumber): '5' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '5' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #2 (kind: StatementExpr) │ ├── expr (kind: ExprBinary) @@ -39,7 +41,9 @@ StatementLet │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ └── ident (kind: TokenIdentifier): 'x' │ │ ├── op (kind: TokenMinusEq): '-=' - │ │ └── rhs (kind: TokenLiteralNumber): '5' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '5' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #3 (kind: StatementExpr) │ ├── expr (kind: ExprBinary) @@ -47,7 +51,9 @@ StatementLet │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ └── ident (kind: TokenIdentifier): 'x' │ │ ├── op (kind: TokenMulEq): '*=' - │ │ └── rhs (kind: TokenLiteralNumber): '5' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '5' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #4 (kind: StatementExpr) │ ├── expr (kind: ExprBinary) @@ -55,7 +61,9 @@ StatementLet │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ └── ident (kind: TokenIdentifier): 'x' │ │ ├── op (kind: TokenDivEq): '/=' - │ │ └── rhs (kind: TokenLiteralNumber): '5' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '5' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #5 (kind: StatementExpr) │ ├── expr (kind: ExprBinary) @@ -63,7 +71,9 @@ StatementLet │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ └── ident (kind: TokenIdentifier): 'x' │ │ ├── op (kind: TokenModEq): '%=' - │ │ └── rhs (kind: TokenLiteralNumber): '5' + │ │ └── rhs (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '5' │ └── semicolon (kind: TokenSemicolon): ';' └── child #6 (kind: StatementExpr) ├── expr (kind: ExprBinary) @@ -71,7 +81,9 @@ StatementLet │ │ └── item #0 (kind: PathSegmentSimple) │ │ └── ident (kind: TokenIdentifier): 'x' │ ├── op (kind: TokenEq): '=' - │ └── rhs (kind: TokenLiteralNumber): '5' + │ └── rhs (kind: LiteralNumber) + │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ └── number (kind: TokenNumber): '5' └── semicolon (kind: TokenSemicolon): ';' //! > ========================================================================== @@ -124,5 +136,7 @@ error: Skipped tokens. Expected: statement. │ ├── rhs: Missing [] │ └── semicolon: Missing └── child #1 (kind: StatementExpr) - ├── expr (kind: TokenLiteralNumber): '5' + ├── expr (kind: LiteralNumber) + │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ └── number (kind: TokenNumber): '5' └── semicolon (kind: TokenSemicolon): ';' diff --git a/crates/cairo-lang-parser/src/parser_test_data/unary_only_operators b/crates/cairo-lang-parser/src/parser_test_data/unary_only_operators index 16a45dbab30..995b42003ac 100644 --- a/crates/cairo-lang-parser/src/parser_test_data/unary_only_operators +++ b/crates/cairo-lang-parser/src/parser_test_data/unary_only_operators @@ -24,18 +24,26 @@ StatementList //! > expected_tree └── Top level kind: StatementList ├── child #0 (kind: StatementExpr) - │ ├── expr (kind: TokenLiteralNumber): '1' + │ ├── expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '1' │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] ├── child #1 (kind: StatementExpr) │ ├── expr (kind: ExprUnary) │ │ ├── op (kind: TokenNot): '!' - │ │ └── expr (kind: TokenLiteralNumber): '2' + │ │ └── expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '2' │ └── semicolon (kind: TokenSemicolon): ';' ├── child #2 (kind: StatementExpr) - │ ├── expr (kind: TokenLiteralNumber): '1' + │ ├── expr (kind: LiteralNumber) + │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ └── number (kind: TokenNumber): '1' │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] └── child #3 (kind: StatementExpr) ├── expr (kind: ExprUnary) │ ├── op (kind: TokenAt): '@' - │ └── expr (kind: TokenLiteralNumber): '2' + │ └── expr (kind: LiteralNumber) + │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ └── number (kind: TokenNumber): '2' └── semicolon (kind: TokenSemicolon): ';' diff --git a/crates/cairo-lang-parser/src/validation.rs b/crates/cairo-lang-parser/src/validation.rs index 842f56dd6e9..caa9193bdfa 100644 --- a/crates/cairo-lang-parser/src/validation.rs +++ b/crates/cairo-lang-parser/src/validation.rs @@ -30,8 +30,8 @@ pub fn validate( ) -> Maybe<()> { root.descendants(db).fold(Ok(()), |result, node| { result.and(match node.kind(db) { - SyntaxKind::TerminalLiteralNumber => { - let node = ast::TerminalLiteralNumber::from_syntax_node(db, node); + SyntaxKind::TerminalNumber => { + let node = ast::TerminalNumber::from_syntax_node(db, node); validate_literal_number(node, db, diagnostics, file_id) } @@ -53,7 +53,7 @@ pub fn validate( /// 1. Is parseable according to its radix. /// 2. Has properly formatted suffix. fn validate_literal_number( - node: ast::TerminalLiteralNumber, + node: ast::TerminalNumber, db: &dyn SyntaxGroup, diagnostics: &mut DiagnosticsBuilder, file_id: FileId, diff --git a/crates/cairo-lang-parser/test_data/expected_results/test1_tree_no_trivia b/crates/cairo-lang-parser/test_data/expected_results/test1_tree_no_trivia index f19ff05dbe3..c1cae8eb1b5 100644 --- a/crates/cairo-lang-parser/test_data/expected_results/test1_tree_no_trivia +++ b/crates/cairo-lang-parser/test_data/expected_results/test1_tree_no_trivia @@ -66,9 +66,9 @@ │ │ │ │ ├── eq (kind: TokenEq): '=' │ │ │ │ ├── rhs (kind: ExprUnary) │ │ │ │ │ ├── op (kind: TokenMinus): '-' - │ │ │ │ │ └── expr (kind: ExprUnary) - │ │ │ │ │ ├── op (kind: TokenMinus): '-' - │ │ │ │ │ └── expr (kind: TokenLiteralNumber): '7' + │ │ │ │ │ └── expr (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: TokenMinus): '-' + │ │ │ │ │ └── number (kind: TokenNumber): '7' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' │ │ │ ├── child #1 (kind: StatementLet) │ │ │ │ ├── let_kw (kind: TokenLet): 'let' @@ -85,7 +85,9 @@ │ │ │ │ │ ├── op (kind: TokenMinus): '-' │ │ │ │ │ └── expr (kind: ExprUnary) │ │ │ │ │ ├── op (kind: TokenNot): '!' - │ │ │ │ │ └── expr (kind: TokenLiteralNumber): '8' + │ │ │ │ │ └── expr (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TokenNumber): '8' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' │ │ │ ├── child #2 (kind: StatementLet) │ │ │ │ ├── let_kw (kind: TokenLet): 'let' @@ -94,7 +96,9 @@ │ │ │ │ │ └── ident (kind: TokenIdentifier): 'x' │ │ │ │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ │ │ │ ├── eq (kind: TokenEq): '=' - │ │ │ │ ├── rhs (kind: TokenLiteralNumber): '1' + │ │ │ │ ├── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' │ │ │ ├── child #3 (kind: StatementLet) │ │ │ │ ├── let_kw (kind: TokenLet): 'let' @@ -111,20 +115,26 @@ │ │ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ │ │ ├── arms (kind: MatchArms) │ │ │ │ │ │ ├── item #0 (kind: MatchArm) - │ │ │ │ │ │ │ ├── pattern (kind: TokenLiteralNumber): '0' + │ │ │ │ │ │ │ ├── pattern (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TokenNumber): '0' │ │ │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' │ │ │ │ │ │ │ └── expression (kind: ExprBlock) │ │ │ │ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ │ │ ├── expr (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ │ │ │ ├── separator #0 (kind: TokenComma): ',' │ │ │ │ │ │ ├── item #1 (kind: MatchArm) │ │ │ │ │ │ │ ├── pattern (kind: TokenUnderscore): '_' │ │ │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' - │ │ │ │ │ │ │ └── expression (kind: TokenLiteralNumber): '0' + │ │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TokenNumber): '0' │ │ │ │ │ │ └── separator #1 (kind: TokenComma): ',' │ │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' @@ -139,7 +149,9 @@ │ │ │ │ │ ├── if_kw (kind: TokenIf): 'if' │ │ │ │ │ ├── condition (kind: ExprBinary) │ │ │ │ │ │ ├── lhs (kind: ExprBinary) - │ │ │ │ │ │ │ ├── lhs (kind: TokenLiteralNumber): '0' + │ │ │ │ │ │ │ ├── lhs (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TokenNumber): '0' │ │ │ │ │ │ │ ├── op (kind: TokenPlus): '+' │ │ │ │ │ │ │ └── rhs (kind: ExprPath) │ │ │ │ │ │ │ └── item #0 (kind: PathSegmentSimple) @@ -152,7 +164,9 @@ │ │ │ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ │ ├── expr (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ │ │ └── else_clause (kind: ElseClause) @@ -161,7 +175,9 @@ │ │ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ ├── expr (kind: TokenLiteralNumber): '2' + │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TokenNumber): '2' │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' @@ -178,7 +194,9 @@ │ │ │ │ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ │ │ ├── expr (kind: TokenLiteralNumber): '5' + │ │ │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ │ └── number (kind: TokenNumber): '5' │ │ │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ │ │ │ ├── op (kind: TokenPlus): '+' @@ -202,7 +220,9 @@ │ │ │ │ │ │ │ │ │ ├── pattern (kind: TokenUnderscore): '_' │ │ │ │ │ │ │ │ │ └── rparen (kind: TokenRParen): ')' │ │ │ │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' - │ │ │ │ │ │ │ │ └── expression (kind: TokenLiteralNumber): '4' + │ │ │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TokenNumber): '4' │ │ │ │ │ │ │ ├── separator #0 (kind: TokenComma): ',' │ │ │ │ │ │ │ └── item #1 (kind: MatchArm) │ │ │ │ │ │ │ ├── pattern (kind: PatternEnum) @@ -217,7 +237,9 @@ │ │ │ │ │ │ │ │ ├── pattern (kind: TokenUnderscore): '_' │ │ │ │ │ │ │ │ └── rparen (kind: TokenRParen): ')' │ │ │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' - │ │ │ │ │ │ │ └── expression (kind: TokenLiteralNumber): '2' + │ │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TokenNumber): '2' │ │ │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ │ │ ├── op (kind: TokenMinus): '-' │ │ │ │ │ └── rhs (kind: ExprIf) @@ -229,7 +251,9 @@ │ │ │ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ │ ├── expr (kind: TokenLiteralNumber): '32' + │ │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TokenNumber): '32' │ │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ │ │ └── else_clause (kind: ElseClause) @@ -238,7 +262,9 @@ │ │ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ ├── expr (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' @@ -338,7 +364,9 @@ │ │ │ │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ │ │ │ └── ident (kind: TokenIdentifier): 'z' │ │ │ │ │ ├── op (kind: TokenEq): '=' - │ │ │ │ │ └── rhs (kind: TokenLiteralNumber): '5' + │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TokenNumber): '5' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' │ │ │ ├── child #11 (kind: StatementExpr) │ │ │ │ ├── expr (kind: ExprFunctionCall) @@ -627,7 +655,9 @@ │ │ │ │ │ │ │ ├── pattern (kind: TokenUnderscore): '_' │ │ │ │ │ │ │ └── rparen (kind: TokenRParen): ')' │ │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' - │ │ │ │ │ │ └── expression (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ ├── separator #0 (kind: TokenComma): ',' │ │ │ │ │ ├── item #1 (kind: MatchArm) │ │ │ │ │ │ ├── pattern (kind: PatternEnum) @@ -644,7 +674,9 @@ │ │ │ │ │ │ │ │ └── ident (kind: TokenIdentifier): 'x' │ │ │ │ │ │ │ └── rparen (kind: TokenRParen): ')' │ │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' - │ │ │ │ │ │ └── expression (kind: TokenLiteralNumber): '2' + │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '2' │ │ │ │ │ ├── separator #1 (kind: TokenComma): ',' │ │ │ │ │ ├── item #2 (kind: MatchArm) │ │ │ │ │ │ ├── pattern (kind: PatternEnum) @@ -656,7 +688,9 @@ │ │ │ │ │ │ │ │ └── ident (kind: TokenIdentifier): 'VEmpty' │ │ │ │ │ │ │ └── pattern (kind: OptionPatternEnumInnerPatternEmpty) [] │ │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' - │ │ │ │ │ │ └── expression (kind: TokenLiteralNumber): '0' + │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '0' │ │ │ │ │ └── separator #2 (kind: TokenComma): ',' │ │ │ │ └── rbrace (kind: TokenRBrace): '}' │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] diff --git a/crates/cairo-lang-parser/test_data/expected_results/test1_tree_with_trivia b/crates/cairo-lang-parser/test_data/expected_results/test1_tree_with_trivia index 0c0a63de7c2..aedf9d7a0f6 100644 --- a/crates/cairo-lang-parser/test_data/expected_results/test1_tree_with_trivia +++ b/crates/cairo-lang-parser/test_data/expected_results/test1_tree_with_trivia @@ -180,14 +180,14 @@ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenMinus): '-' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] - │ │ │ │ │ └── expr (kind: ExprUnary) - │ │ │ │ │ ├── op (kind: TerminalMinus) + │ │ │ │ │ └── expr (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: TerminalMinus) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenMinus): '-' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] - │ │ │ │ │ └── expr (kind: TerminalLiteralNumber) + │ │ │ │ │ └── number (kind: TerminalNumber) │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '7' + │ │ │ │ │ ├── token (kind: TokenNumber): '7' │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ └── semicolon (kind: TerminalSemicolon) │ │ │ │ ├── leading_trivia (kind: Trivia) [] @@ -236,10 +236,12 @@ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenNot): '!' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] - │ │ │ │ │ └── expr (kind: TerminalLiteralNumber) - │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '8' - │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ └── expr (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ ├── token (kind: TokenNumber): '8' + │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ └── semicolon (kind: TerminalSemicolon) │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ ├── token (kind: TokenSemicolon): ';' @@ -267,10 +269,12 @@ │ │ │ │ │ ├── token (kind: TokenEq): '=' │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ ├── rhs (kind: TerminalLiteralNumber) - │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ ├── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ └── semicolon (kind: TerminalSemicolon) │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ ├── token (kind: TokenSemicolon): ';' @@ -316,12 +320,14 @@ │ │ │ │ │ │ └── child #0 (kind: TokenNewline). │ │ │ │ │ ├── arms (kind: MatchArms) │ │ │ │ │ │ ├── item #0 (kind: MatchArm) - │ │ │ │ │ │ │ ├── pattern (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '0' - │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ ├── pattern (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '0' + │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ │ ├── arrow (kind: TerminalMatchArrow) │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' @@ -335,11 +341,13 @@ │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ │ │ ├── expr (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ │ │ └── rbrace (kind: TerminalRBrace) │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] @@ -362,10 +370,12 @@ │ │ │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ └── expression (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '0' - │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '0' + │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ │ └── separator #1 (kind: TerminalComma) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenComma): ',' @@ -409,11 +419,13 @@ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ ├── condition (kind: ExprBinary) │ │ │ │ │ │ ├── lhs (kind: ExprBinary) - │ │ │ │ │ │ │ ├── lhs (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '0' - │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ ├── lhs (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '0' + │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ │ ├── op (kind: TerminalPlus) │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ │ │ ├── token (kind: TokenPlus): '+' @@ -446,12 +458,14 @@ │ │ │ │ │ │ │ └── child #0 (kind: TokenNewline). │ │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ │ ├── expr (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ └── child #0 (kind: TokenNewline). + │ │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ └── child #0 (kind: TokenNewline). │ │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ │ └── rbrace (kind: TerminalRBrace) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) @@ -473,12 +487,14 @@ │ │ │ │ │ │ └── child #0 (kind: TokenNewline). │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ ├── expr (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '2' - │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ └── child #0 (kind: TokenNewline). + │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '2' + │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ └── child #0 (kind: TokenNewline). │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ └── rbrace (kind: TerminalRBrace) │ │ │ │ │ ├── leading_trivia (kind: Trivia) @@ -519,10 +535,12 @@ │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ │ │ ├── expr (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '5' - │ │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '5' + │ │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ │ │ └── rbrace (kind: TerminalRBrace) │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] @@ -589,10 +607,12 @@ │ │ │ │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' │ │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ │ └── expression (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '4' - │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '4' + │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ │ │ ├── separator #0 (kind: TerminalComma) │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ │ │ ├── token (kind: TokenComma): ',' @@ -634,11 +654,13 @@ │ │ │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ └── expression (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '2' - │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '2' + │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ └── rbrace (kind: TerminalRBrace) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenRBrace): '}' @@ -671,11 +693,13 @@ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ │ ├── expr (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '32' - │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '32' + │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ │ └── rbrace (kind: TerminalRBrace) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] @@ -696,11 +720,13 @@ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ ├── statements (kind: StatementList) │ │ │ │ │ │ └── child #0 (kind: StatementExpr) - │ │ │ │ │ │ ├── expr (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ ├── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ │ │ └── rbrace (kind: TerminalRBrace) │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] @@ -954,10 +980,12 @@ │ │ │ │ │ │ ├── token (kind: TokenEq): '=' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ └── rhs (kind: TerminalLiteralNumber) - │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '5' - │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ ├── token (kind: TokenNumber): '5' + │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ └── semicolon (kind: TerminalSemicolon) │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ ├── token (kind: TokenSemicolon): ';' @@ -1705,10 +1733,12 @@ │ │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ └── expression (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ ├── separator #0 (kind: TerminalComma) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenComma): ',' @@ -1753,10 +1783,12 @@ │ │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ └── expression (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '2' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '2' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ ├── separator #1 (kind: TerminalComma) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenComma): ',' @@ -1787,10 +1819,12 @@ │ │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ └── expression (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '0' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ └── expression (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '0' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ └── separator #2 (kind: TerminalComma) │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ ├── token (kind: TokenComma): ',' diff --git a/crates/cairo-lang-parser/test_data/expected_results/test2_tree_no_trivia b/crates/cairo-lang-parser/test_data/expected_results/test2_tree_no_trivia index 67c5dcc32c7..de2b9d9760d 100644 --- a/crates/cairo-lang-parser/test_data/expected_results/test2_tree_no_trivia +++ b/crates/cairo-lang-parser/test_data/expected_results/test2_tree_no_trivia @@ -36,11 +36,13 @@ │ │ │ │ ├── type_clause (kind: OptionTypeClauseEmpty) [] │ │ │ │ ├── eq (kind: TokenEq): '=' │ │ │ │ ├── rhs (kind: ExprBinary) - │ │ │ │ │ ├── lhs (kind: ExprUnary) - │ │ │ │ │ │ ├── op (kind: TokenMinus): '-' - │ │ │ │ │ │ └── expr (kind: TokenLiteralNumber): '5' + │ │ │ │ │ ├── lhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: TokenMinus): '-' + │ │ │ │ │ │ └── number (kind: TokenNumber): '5' │ │ │ │ │ ├── op (kind: TokenPlus): '+' - │ │ │ │ │ └── rhs (kind: TokenLiteralNumber): '3' + │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TokenNumber): '3' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' │ │ │ ├── child #1 (kind: StatementLet) │ │ │ │ ├── let_kw (kind: TokenLet): 'let' @@ -59,12 +61,18 @@ │ │ │ │ │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ │ │ │ │ └── ident (kind: TokenIdentifier): 'x' │ │ │ │ │ │ ├── op (kind: TokenMul): '*' - │ │ │ │ │ │ └── rhs (kind: TokenLiteralNumber): '2' + │ │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '2' │ │ │ │ │ ├── op (kind: TokenPlus): '+' │ │ │ │ │ └── rhs (kind: ExprBinary) - │ │ │ │ │ ├── lhs (kind: TokenLiteralNumber): '3' + │ │ │ │ │ ├── lhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '3' │ │ │ │ │ ├── op (kind: TokenMul): '*' - │ │ │ │ │ └── rhs (kind: TokenLiteralNumber): '5' + │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TokenNumber): '5' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' │ │ │ ├── child #2 (kind: StatementLet) │ │ │ │ ├── let_kw (kind: TokenLet): 'let' @@ -94,7 +102,9 @@ │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' │ │ │ ├── child #4 (kind: StatementExpr) │ │ │ │ ├── expr (kind: ExprBinary) - │ │ │ │ │ ├── lhs (kind: TokenLiteralNumber): '5' + │ │ │ │ │ ├── lhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '5' │ │ │ │ │ ├── op (kind: TokenPlus): '+' │ │ │ │ │ └── rhs (kind: ExprStructCtorCall) │ │ │ │ │ ├── path (kind: ExprPath) @@ -107,7 +117,9 @@ │ │ │ │ │ │ │ ├── identifier (kind: TokenIdentifier): 'a' │ │ │ │ │ │ │ └── arg_expr (kind: StructArgExpr) │ │ │ │ │ │ │ ├── colon (kind: TokenColon): ':' - │ │ │ │ │ │ │ └── expr (kind: TokenLiteralNumber): '5' + │ │ │ │ │ │ │ └── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TokenNumber): '5' │ │ │ │ │ │ ├── separator #0 (kind: TokenComma): ',' │ │ │ │ │ │ └── item #1 (kind: StructArgSingle) │ │ │ │ │ │ ├── identifier (kind: TokenIdentifier): 'b' @@ -139,7 +151,9 @@ │ │ │ │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ │ │ │ └── ident (kind: TokenIdentifier): 'df' │ │ │ │ │ ├── op (kind: TokenEqEq): '==' - │ │ │ │ │ └── rhs (kind: TokenLiteralNumber): '6' + │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TokenNumber): '6' │ │ │ │ └── semicolon (kind: TokenSemicolon): ';' │ │ │ └── child #6 (kind: StatementExpr) │ │ │ ├── expr (kind: ExprBinary) @@ -235,12 +249,16 @@ │ │ │ │ │ │ ├── item #0 (kind: Arg) │ │ │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ │ │ └── value (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ │ ├── separator #0 (kind: TokenComma): ',' │ │ │ │ │ │ └── item #1 (kind: Arg) │ │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ │ └── value (kind: TokenLiteralNumber): '3' + │ │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '3' │ │ │ │ │ └── rparen (kind: TokenRParen): ')' │ │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ │ └── rbrace (kind: TokenRBrace): '}' diff --git a/crates/cairo-lang-parser/test_data/expected_results/test2_tree_with_trivia b/crates/cairo-lang-parser/test_data/expected_results/test2_tree_with_trivia index 4c43c39eb0a..7f1a1e656eb 100644 --- a/crates/cairo-lang-parser/test_data/expected_results/test2_tree_with_trivia +++ b/crates/cairo-lang-parser/test_data/expected_results/test2_tree_with_trivia @@ -85,14 +85,14 @@ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ ├── rhs (kind: ExprBinary) - │ │ │ │ │ ├── lhs (kind: ExprUnary) - │ │ │ │ │ │ ├── op (kind: TerminalMinus) + │ │ │ │ │ ├── lhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: TerminalMinus) │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ │ ├── token (kind: TokenMinus): '-' │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] - │ │ │ │ │ │ └── expr (kind: TerminalLiteralNumber) + │ │ │ │ │ │ └── number (kind: TerminalNumber) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '5' + │ │ │ │ │ │ ├── token (kind: TokenNumber): '5' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ ├── op (kind: TerminalPlus) @@ -100,10 +100,12 @@ │ │ │ │ │ │ ├── token (kind: TokenPlus): '+' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ └── rhs (kind: TerminalLiteralNumber) - │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '3' - │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ ├── token (kind: TokenNumber): '3' + │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ └── semicolon (kind: TerminalSemicolon) │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ ├── token (kind: TokenSemicolon): ';' @@ -153,29 +155,35 @@ │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ │ ├── token (kind: TokenMul): '*' │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] - │ │ │ │ │ │ └── rhs (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '2' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '2' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ ├── op (kind: TerminalPlus) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenPlus): '+' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ └── rhs (kind: ExprBinary) - │ │ │ │ │ ├── lhs (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '3' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ ├── lhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '3' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ ├── op (kind: TerminalMul) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenMul): '*' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] - │ │ │ │ │ └── rhs (kind: TerminalLiteralNumber) - │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '5' - │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ ├── token (kind: TokenNumber): '5' + │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ └── semicolon (kind: TerminalSemicolon) │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ ├── token (kind: TokenSemicolon): ';' @@ -262,12 +270,14 @@ │ │ │ │ └── child #0 (kind: TokenNewline). │ │ │ ├── child #4 (kind: StatementExpr) │ │ │ │ ├── expr (kind: ExprBinary) - │ │ │ │ │ ├── lhs (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) - │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '5' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ ├── lhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) + │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ ├── token (kind: TokenNumber): '5' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ ├── op (kind: TerminalPlus) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenPlus): '+' @@ -297,10 +307,12 @@ │ │ │ │ │ │ │ │ ├── token (kind: TokenColon): ':' │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ └── expr (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '5' - │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ └── expr (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '5' + │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── separator #0 (kind: TerminalComma) │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ │ ├── token (kind: TokenComma): ',' @@ -385,10 +397,12 @@ │ │ │ │ │ │ ├── token (kind: TokenEqEq): '==' │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ └── rhs (kind: TerminalLiteralNumber) - │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '6' - │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ ├── token (kind: TokenNumber): '6' + │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ └── semicolon (kind: TerminalSemicolon) │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ ├── token (kind: TokenSemicolon): ';' @@ -612,10 +626,12 @@ │ │ │ │ │ │ ├── item #0 (kind: Arg) │ │ │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ │ │ └── value (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── separator #0 (kind: TerminalComma) │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ │ ├── token (kind: TokenComma): ',' @@ -623,10 +639,12 @@ │ │ │ │ │ │ └── item #1 (kind: Arg) │ │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ │ └── value (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '3' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '3' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ └── rparen (kind: TerminalRParen) │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ ├── token (kind: TokenRParen): ')' diff --git a/crates/cairo-lang-parser/test_data/expected_results/test3_tree_no_trivia b/crates/cairo-lang-parser/test_data/expected_results/test3_tree_no_trivia index 05dc52e6c01..f19d3d4a5e5 100644 --- a/crates/cairo-lang-parser/test_data/expected_results/test3_tree_no_trivia +++ b/crates/cairo-lang-parser/test_data/expected_results/test3_tree_no_trivia @@ -40,17 +40,23 @@ │ │ │ │ │ ├── item #0 (kind: Arg) │ │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ │ └── value (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ ├── separator #0 (kind: TokenComma): ',' │ │ │ │ │ ├── item #1 (kind: Arg) │ │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ │ └── value (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ ├── separator #1 (kind: TokenComma): ',' │ │ │ │ │ └── item #2 (kind: Arg) │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ └── value (kind: TokenLiteralNumber): '13' + │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TokenNumber): '13' │ │ │ │ └── rparen (kind: TokenRParen): ')' │ │ │ └── semicolon (kind: OptionTerminalSemicolonEmpty) [] │ │ └── rbrace (kind: TokenRBrace): '}' @@ -144,7 +150,9 @@ │ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ │ ├── arms (kind: MatchArms) │ │ │ │ │ ├── item #0 (kind: MatchArm) - │ │ │ │ │ │ ├── pattern (kind: TokenLiteralNumber): '0' + │ │ │ │ │ │ ├── pattern (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TokenNumber): '0' │ │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' │ │ │ │ │ │ └── expression (kind: ExprFunctionCall) │ │ │ │ │ │ ├── path (kind: ExprPath) @@ -201,7 +209,9 @@ │ │ │ │ │ │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ │ │ │ │ │ └── ident (kind: TokenIdentifier): 'n' │ │ │ │ │ │ │ ├── op (kind: TokenMinus): '-' - │ │ │ │ │ │ │ └── rhs (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ │ └── rparen (kind: TokenRParen): ')' │ │ │ │ │ └── separator #1 (kind: TokenComma): ',' │ │ │ │ └── rbrace (kind: TokenRBrace): '}' @@ -303,7 +313,9 @@ │ │ │ ├── lbrace (kind: TokenLBrace): '{' │ │ │ ├── arms (kind: MatchArms) │ │ │ │ ├── item #0 (kind: MatchArm) - │ │ │ │ │ ├── pattern (kind: TokenLiteralNumber): '0' + │ │ │ │ │ ├── pattern (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '0' │ │ │ │ │ ├── arrow (kind: TokenMatchArrow): '=>' │ │ │ │ │ └── expression (kind: ExprListParenthesized) │ │ │ │ │ ├── lparen (kind: TokenLParen): '(' @@ -382,7 +394,9 @@ │ │ │ │ │ │ │ └── item #0 (kind: PathSegmentSimple) │ │ │ │ │ │ │ └── ident (kind: TokenIdentifier): 'n' │ │ │ │ │ │ ├── op (kind: TokenMinus): '-' - │ │ │ │ │ │ └── rhs (kind: TokenLiteralNumber): '1' + │ │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TokenNumber): '1' │ │ │ │ │ └── rparen (kind: TokenRParen): ')' │ │ │ │ └── separator #1 (kind: TokenComma): ',' │ │ │ └── rbrace (kind: TokenRBrace): '}' diff --git a/crates/cairo-lang-parser/test_data/expected_results/test3_tree_with_trivia b/crates/cairo-lang-parser/test_data/expected_results/test3_tree_with_trivia index ddb0b388c97..c1a18d83a06 100644 --- a/crates/cairo-lang-parser/test_data/expected_results/test3_tree_with_trivia +++ b/crates/cairo-lang-parser/test_data/expected_results/test3_tree_with_trivia @@ -82,10 +82,12 @@ │ │ │ │ │ ├── item #0 (kind: Arg) │ │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ │ └── value (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ ├── separator #0 (kind: TerminalComma) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenComma): ',' @@ -94,10 +96,12 @@ │ │ │ │ │ ├── item #1 (kind: Arg) │ │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ │ └── value (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ ├── separator #1 (kind: TerminalComma) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenComma): ',' @@ -106,10 +110,12 @@ │ │ │ │ │ └── item #2 (kind: Arg) │ │ │ │ │ ├── modifiers (kind: ModifierList) [] │ │ │ │ │ └── arg_clause (kind: ArgClauseUnnamed) - │ │ │ │ │ └── value (kind: TerminalLiteralNumber) - │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '13' - │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ └── value (kind: LiteralNumber) + │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ ├── token (kind: TokenNumber): '13' + │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ └── rparen (kind: TerminalRParen) │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ ├── token (kind: TokenRParen): ')' @@ -340,12 +346,14 @@ │ │ │ │ │ └── child #0 (kind: TokenNewline). │ │ │ │ ├── arms (kind: MatchArms) │ │ │ │ │ ├── item #0 (kind: MatchArm) - │ │ │ │ │ │ ├── pattern (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) - │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '0' - │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ ├── pattern (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) + │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '0' + │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ │ ├── arrow (kind: TerminalMatchArrow) │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' @@ -473,10 +481,12 @@ │ │ │ │ │ │ │ │ ├── token (kind: TokenMinus): '-' │ │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ │ └── rhs (kind: TerminalLiteralNumber) - │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ │ └── rparen (kind: TerminalRParen) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenRParen): ')' @@ -726,12 +736,14 @@ │ │ │ │ └── child #0 (kind: TokenNewline). │ │ │ ├── arms (kind: MatchArms) │ │ │ │ ├── item #0 (kind: MatchArm) - │ │ │ │ │ ├── pattern (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) - │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '0' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) - │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ ├── pattern (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) + │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). + │ │ │ │ │ │ ├── token (kind: TokenNumber): '0' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) + │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). │ │ │ │ │ ├── arrow (kind: TerminalMatchArrow) │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ │ ├── token (kind: TokenMatchArrow): '=>' @@ -909,10 +921,12 @@ │ │ │ │ │ │ │ ├── token (kind: TokenMinus): '-' │ │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) │ │ │ │ │ │ │ └── child #0 (kind: TokenWhitespace). - │ │ │ │ │ │ └── rhs (kind: TerminalLiteralNumber) - │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] - │ │ │ │ │ │ ├── token (kind: TokenLiteralNumber): '1' - │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] + │ │ │ │ │ │ └── rhs (kind: LiteralNumber) + │ │ │ │ │ │ ├── sign (kind: OptionTerminalMinusEmpty) [] + │ │ │ │ │ │ └── number (kind: TerminalNumber) + │ │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] + │ │ │ │ │ │ ├── token (kind: TokenNumber): '1' + │ │ │ │ │ │ └── trailing_trivia (kind: Trivia) [] │ │ │ │ │ └── rparen (kind: TerminalRParen) │ │ │ │ │ ├── leading_trivia (kind: Trivia) [] │ │ │ │ │ ├── token (kind: TokenRParen): ')' diff --git a/crates/cairo-lang-semantic/src/corelib.rs b/crates/cairo-lang-semantic/src/corelib.rs index 94ddbc63674..5ec3134f541 100644 --- a/crates/cairo-lang-semantic/src/corelib.rs +++ b/crates/cairo-lang-semantic/src/corelib.rs @@ -622,13 +622,12 @@ pub fn validate_literal( value: BigInt, ) -> Result<(), SemanticDiagnosticKind> { let is_out_of_range = if ty == core_felt252_ty(db) { - value.is_negative() - || value - > BigInt::from_str_radix( - "800000000000011000000000000000000000000000000000000000000000000", - 16, - ) - .unwrap() + value.abs() + > BigInt::from_str_radix( + "800000000000011000000000000000000000000000000000000000000000000", + 16, + ) + .unwrap() } else if ty == get_core_ty_by_name(db, "u8".into(), vec![]) { value.to_u8().is_none() } else if ty == get_core_ty_by_name(db, "u16".into(), vec![]) { diff --git a/crates/cairo-lang-semantic/src/expr/compute.rs b/crates/cairo-lang-semantic/src/expr/compute.rs index 699d32f6620..6929a1f6236 100644 --- a/crates/cairo-lang-semantic/src/expr/compute.rs +++ b/crates/cairo-lang-semantic/src/expr/compute.rs @@ -1377,7 +1377,7 @@ fn get_tail_expression( /// Creates the semantic model of a literal expression from its AST. fn literal_to_semantic( ctx: &mut ComputationContext<'_>, - literal_syntax: &ast::TerminalLiteralNumber, + literal_syntax: &ast::LiteralNumber, ) -> Maybe { let db = ctx.db; let syntax_db = db.upcast(); diff --git a/crates/cairo-lang-semantic/src/expr/test.rs b/crates/cairo-lang-semantic/src/expr/test.rs index c8f1dc07b95..c460568d9ca 100644 --- a/crates/cairo-lang-semantic/src/expr/test.rs +++ b/crates/cairo-lang-semantic/src/expr/test.rs @@ -120,14 +120,12 @@ fn test_expr_operator() { "FunctionCall(ExprFunctionCall { function: core::BoolNot::not, args: \ [Value(FunctionCall(ExprFunctionCall { function: core::Felt252PartialEq::eq, args: \ [Value(Snapshot(ExprSnapshot { inner: FunctionCall(ExprFunctionCall { function: \ - core::Felt252Add::add, args: [Value(FunctionCall(ExprFunctionCall { function: \ - core::Felt252Neg::neg, args: [Value(Literal(ExprLiteral { value: 5, ty: core::felt252 \ - }))], ty: core::felt252 })), Value(FunctionCall(ExprFunctionCall { function: \ - core::Felt252Mul::mul, args: [Value(Literal(ExprLiteral { value: 9, ty: core::felt252 \ - })), Value(Literal(ExprLiteral { value: 3, ty: core::felt252 }))], ty: core::felt252 \ - }))], ty: core::felt252 }), ty: @core::felt252 })), Value(Snapshot(ExprSnapshot { inner: \ - Literal(ExprLiteral { value: 0, ty: core::felt252 }), ty: @core::felt252 }))], ty: \ - core::bool }))], ty: core::bool })" + core::Felt252Add::add, args: [Value(Literal(ExprLiteral { value: -5, ty: core::felt252 \ + })), Value(FunctionCall(ExprFunctionCall { function: core::Felt252Mul::mul, args: \ + [Value(Literal(ExprLiteral { value: 9, ty: core::felt252 })), Value(Literal(ExprLiteral \ + { value: 3, ty: core::felt252 }))], ty: core::felt252 }))], ty: core::felt252 }), ty: \ + @core::felt252 })), Value(Snapshot(ExprSnapshot { inner: Literal(ExprLiteral { value: 0, \ + ty: core::felt252 }), ty: @core::felt252 }))], ty: core::bool }))], ty: core::bool })" ); } diff --git a/crates/cairo-lang-syntax-codegen/src/cairo_spec.rs b/crates/cairo-lang-syntax-codegen/src/cairo_spec.rs index 60ad6d14ee7..ee1fc3b4ceb 100644 --- a/crates/cairo-lang-syntax-codegen/src/cairo_spec.rs +++ b/crates/cairo-lang-syntax-codegen/src/cairo_spec.rs @@ -15,7 +15,7 @@ pub fn get_spec() -> Vec { .add_enum(EnumBuilder::new("Expr") .missing("Missing") .node("Path") - .node_with_explicit_kind("Literal", "TerminalLiteralNumber") + .node_with_explicit_kind("Literal", "LiteralNumber") .node_with_explicit_kind("ShortString", "TerminalShortString") .node_with_explicit_kind("False", "TerminalFalse") .node_with_explicit_kind("True", "TerminalTrue") @@ -34,6 +34,11 @@ pub fn get_spec() -> Vec { .node("Indexed") .node("InlineMacro") ) + .add_struct(StructBuilder::new("LiteralNumber") + .node("sign", "OptionTerminalMinus") + .node("number", "TerminalNumber") + ) + .add_option("TerminalMinus") .add_separated_list("ExprList", "Expr", "TerminalComma") .add_struct(StructBuilder::new("Arg") .node("modifiers", "ModifierList") @@ -227,7 +232,7 @@ pub fn get_spec() -> Vec { // TODO(spapini): Support tuple patterns (e.g. (x, _)). .add_enum(EnumBuilder::new("Pattern") .node_with_explicit_kind("Underscore", "TerminalUnderscore") - .node_with_explicit_kind("Literal", "TerminalLiteralNumber") + .node_with_explicit_kind("Literal", "LiteralNumber") .node_with_explicit_kind("ShortString", "TerminalShortString") .node("Identifier") .node("Struct") @@ -630,7 +635,7 @@ pub fn get_spec() -> Vec { ) // --- Tokens + Terminals --- .add_token_and_terminal("Identifier") - .add_token_and_terminal("LiteralNumber") + .add_token_and_terminal("Number") .add_token_and_terminal("ShortString") .add_keyword_token_and_terminal("As") .add_keyword_token_and_terminal("Const") diff --git a/crates/cairo-lang-syntax/src/node/ast.rs b/crates/cairo-lang-syntax/src/node/ast.rs index f46a89f98a0..b7a6643a042 100644 --- a/crates/cairo-lang-syntax/src/node/ast.rs +++ b/crates/cairo-lang-syntax/src/node/ast.rs @@ -178,7 +178,7 @@ impl Trivium { #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub enum Expr { Path(ExprPath), - Literal(TerminalLiteralNumber), + Literal(LiteralNumber), ShortString(TerminalShortString), False(TerminalFalse), True(TerminalTrue), @@ -210,8 +210,8 @@ impl From for ExprPtr { Self(value.0) } } -impl From for ExprPtr { - fn from(value: TerminalLiteralNumberPtr) -> Self { +impl From for ExprPtr { + fn from(value: LiteralNumberPtr) -> Self { Self(value.0) } } @@ -310,8 +310,8 @@ impl From for ExprGreen { Self(value.0) } } -impl From for ExprGreen { - fn from(value: TerminalLiteralNumberGreen) -> Self { +impl From for ExprGreen { + fn from(value: LiteralNumberGreen) -> Self { Self(value.0) } } @@ -418,9 +418,7 @@ impl TypedSyntaxNode for Expr { let kind = node.kind(db); match kind { SyntaxKind::ExprPath => Expr::Path(ExprPath::from_syntax_node(db, node)), - SyntaxKind::TerminalLiteralNumber => { - Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node)) - } + SyntaxKind::LiteralNumber => Expr::Literal(LiteralNumber::from_syntax_node(db, node)), SyntaxKind::TerminalShortString => { Expr::ShortString(TerminalShortString::from_syntax_node(db, node)) } @@ -494,7 +492,7 @@ impl Expr { pub fn is_variant(kind: SyntaxKind) -> bool { match kind { SyntaxKind::ExprPath => true, - SyntaxKind::TerminalLiteralNumber => true, + SyntaxKind::LiteralNumber => true, SyntaxKind::TerminalShortString => true, SyntaxKind::TerminalFalse => true, SyntaxKind::TerminalTrue => true, @@ -518,6 +516,215 @@ impl Expr { } } #[derive(Clone, Debug, Eq, Hash, PartialEq)] +pub struct LiteralNumber { + node: SyntaxNode, + children: Vec, +} +impl LiteralNumber { + pub const INDEX_SIGN: usize = 0; + pub const INDEX_NUMBER: usize = 1; + pub fn new_green( + db: &dyn SyntaxGroup, + sign: OptionTerminalMinusGreen, + number: TerminalNumberGreen, + ) -> LiteralNumberGreen { + let children: Vec = vec![sign.0, number.0]; + let width = children.iter().copied().map(|id| db.lookup_intern_green(id).width()).sum(); + LiteralNumberGreen(db.intern_green(GreenNode { + kind: SyntaxKind::LiteralNumber, + details: GreenNodeDetails::Node { children, width }, + })) + } +} +impl LiteralNumber { + pub fn sign(&self, db: &dyn SyntaxGroup) -> OptionTerminalMinus { + OptionTerminalMinus::from_syntax_node(db, self.children[0].clone()) + } + pub fn number(&self, db: &dyn SyntaxGroup) -> TerminalNumber { + TerminalNumber::from_syntax_node(db, self.children[1].clone()) + } +} +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct LiteralNumberPtr(pub SyntaxStablePtrId); +impl LiteralNumberPtr { + pub fn untyped(&self) -> SyntaxStablePtrId { + self.0 + } +} +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct LiteralNumberGreen(pub GreenId); +impl TypedSyntaxNode for LiteralNumber { + const OPTIONAL_KIND: Option = Some(SyntaxKind::LiteralNumber); + type StablePtr = LiteralNumberPtr; + type Green = LiteralNumberGreen; + fn missing(db: &dyn SyntaxGroup) -> Self::Green { + LiteralNumberGreen(db.intern_green(GreenNode { + kind: SyntaxKind::LiteralNumber, + details: GreenNodeDetails::Node { + children: vec![OptionTerminalMinus::missing(db).0, TerminalNumber::missing(db).0], + width: TextWidth::default(), + }, + })) + } + fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self { + let kind = node.kind(db); + assert_eq!( + kind, + SyntaxKind::LiteralNumber, + "Unexpected SyntaxKind {:?}. Expected {:?}.", + kind, + SyntaxKind::LiteralNumber + ); + let children = node.children(db).collect(); + Self { node, children } + } + fn from_ptr(db: &dyn SyntaxGroup, root: &SyntaxFile, ptr: Self::StablePtr) -> Self { + Self::from_syntax_node(db, root.as_syntax_node().lookup_ptr(db, ptr.0)) + } + fn as_syntax_node(&self) -> SyntaxNode { + self.node.clone() + } + fn stable_ptr(&self) -> Self::StablePtr { + LiteralNumberPtr(self.node.0.stable_ptr) + } +} +#[derive(Clone, Debug, Eq, Hash, PartialEq)] +pub enum OptionTerminalMinus { + Empty(OptionTerminalMinusEmpty), + TerminalMinus(TerminalMinus), +} +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct OptionTerminalMinusPtr(pub SyntaxStablePtrId); +impl OptionTerminalMinusPtr { + pub fn untyped(&self) -> SyntaxStablePtrId { + self.0 + } +} +impl From for OptionTerminalMinusPtr { + fn from(value: OptionTerminalMinusEmptyPtr) -> Self { + Self(value.0) + } +} +impl From for OptionTerminalMinusPtr { + fn from(value: TerminalMinusPtr) -> Self { + Self(value.0) + } +} +impl From for OptionTerminalMinusGreen { + fn from(value: OptionTerminalMinusEmptyGreen) -> Self { + Self(value.0) + } +} +impl From for OptionTerminalMinusGreen { + fn from(value: TerminalMinusGreen) -> Self { + Self(value.0) + } +} +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct OptionTerminalMinusGreen(pub GreenId); +impl TypedSyntaxNode for OptionTerminalMinus { + const OPTIONAL_KIND: Option = None; + type StablePtr = OptionTerminalMinusPtr; + type Green = OptionTerminalMinusGreen; + fn missing(db: &dyn SyntaxGroup) -> Self::Green { + panic!("No missing variant."); + } + fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self { + let kind = node.kind(db); + match kind { + SyntaxKind::OptionTerminalMinusEmpty => { + OptionTerminalMinus::Empty(OptionTerminalMinusEmpty::from_syntax_node(db, node)) + } + SyntaxKind::TerminalMinus => { + OptionTerminalMinus::TerminalMinus(TerminalMinus::from_syntax_node(db, node)) + } + _ => panic!( + "Unexpected syntax kind {:?} when constructing {}.", + kind, "OptionTerminalMinus" + ), + } + } + fn as_syntax_node(&self) -> SyntaxNode { + match self { + OptionTerminalMinus::Empty(x) => x.as_syntax_node(), + OptionTerminalMinus::TerminalMinus(x) => x.as_syntax_node(), + } + } + fn from_ptr(db: &dyn SyntaxGroup, root: &SyntaxFile, ptr: Self::StablePtr) -> Self { + Self::from_syntax_node(db, root.as_syntax_node().lookup_ptr(db, ptr.0)) + } + fn stable_ptr(&self) -> Self::StablePtr { + OptionTerminalMinusPtr(self.as_syntax_node().0.stable_ptr) + } +} +impl OptionTerminalMinus { + #[allow(clippy::match_like_matches_macro)] + pub fn is_variant(kind: SyntaxKind) -> bool { + match kind { + SyntaxKind::OptionTerminalMinusEmpty => true, + SyntaxKind::TerminalMinus => true, + _ => false, + } + } +} +#[derive(Clone, Debug, Eq, Hash, PartialEq)] +pub struct OptionTerminalMinusEmpty { + node: SyntaxNode, + children: Vec, +} +impl OptionTerminalMinusEmpty { + pub fn new_green(db: &dyn SyntaxGroup) -> OptionTerminalMinusEmptyGreen { + let children: Vec = vec![]; + let width = children.iter().copied().map(|id| db.lookup_intern_green(id).width()).sum(); + OptionTerminalMinusEmptyGreen(db.intern_green(GreenNode { + kind: SyntaxKind::OptionTerminalMinusEmpty, + details: GreenNodeDetails::Node { children, width }, + })) + } +} +impl OptionTerminalMinusEmpty {} +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct OptionTerminalMinusEmptyPtr(pub SyntaxStablePtrId); +impl OptionTerminalMinusEmptyPtr { + pub fn untyped(&self) -> SyntaxStablePtrId { + self.0 + } +} +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct OptionTerminalMinusEmptyGreen(pub GreenId); +impl TypedSyntaxNode for OptionTerminalMinusEmpty { + const OPTIONAL_KIND: Option = Some(SyntaxKind::OptionTerminalMinusEmpty); + type StablePtr = OptionTerminalMinusEmptyPtr; + type Green = OptionTerminalMinusEmptyGreen; + fn missing(db: &dyn SyntaxGroup) -> Self::Green { + OptionTerminalMinusEmptyGreen(db.intern_green(GreenNode { + kind: SyntaxKind::OptionTerminalMinusEmpty, + details: GreenNodeDetails::Node { children: vec![], width: TextWidth::default() }, + })) + } + fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self { + let kind = node.kind(db); + assert_eq!( + kind, + SyntaxKind::OptionTerminalMinusEmpty, + "Unexpected SyntaxKind {:?}. Expected {:?}.", + kind, + SyntaxKind::OptionTerminalMinusEmpty + ); + let children = node.children(db).collect(); + Self { node, children } + } + fn from_ptr(db: &dyn SyntaxGroup, root: &SyntaxFile, ptr: Self::StablePtr) -> Self { + Self::from_syntax_node(db, root.as_syntax_node().lookup_ptr(db, ptr.0)) + } + fn as_syntax_node(&self) -> SyntaxNode { + self.node.clone() + } + fn stable_ptr(&self) -> Self::StablePtr { + OptionTerminalMinusEmptyPtr(self.node.0.stable_ptr) + } +} +#[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct ExprList(ElementList); impl Deref for ExprList { type Target = ElementList; @@ -4712,7 +4919,7 @@ impl WrappedExprList { #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub enum Pattern { Underscore(TerminalUnderscore), - Literal(TerminalLiteralNumber), + Literal(LiteralNumber), ShortString(TerminalShortString), Identifier(PatternIdentifier), Struct(PatternStruct), @@ -4732,8 +4939,8 @@ impl From for PatternPtr { Self(value.0) } } -impl From for PatternPtr { - fn from(value: TerminalLiteralNumberPtr) -> Self { +impl From for PatternPtr { + fn from(value: LiteralNumberPtr) -> Self { Self(value.0) } } @@ -4772,8 +4979,8 @@ impl From for PatternGreen { Self(value.0) } } -impl From for PatternGreen { - fn from(value: TerminalLiteralNumberGreen) -> Self { +impl From for PatternGreen { + fn from(value: LiteralNumberGreen) -> Self { Self(value.0) } } @@ -4822,8 +5029,8 @@ impl TypedSyntaxNode for Pattern { SyntaxKind::TerminalUnderscore => { Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)) } - SyntaxKind::TerminalLiteralNumber => { - Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)) + SyntaxKind::LiteralNumber => { + Pattern::Literal(LiteralNumber::from_syntax_node(db, node)) } SyntaxKind::TerminalShortString => { Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)) @@ -4862,7 +5069,7 @@ impl Pattern { pub fn is_variant(kind: SyntaxKind) -> bool { match kind { SyntaxKind::TerminalUnderscore => true, - SyntaxKind::TerminalLiteralNumber => true, + SyntaxKind::LiteralNumber => true, SyntaxKind::TerminalShortString => true, SyntaxKind::PatternIdentifier => true, SyntaxKind::PatternStruct => true, @@ -13128,13 +13335,13 @@ impl TypedSyntaxNode for TerminalIdentifier { } } #[derive(Clone, Debug, Eq, Hash, PartialEq)] -pub struct TokenLiteralNumber { +pub struct TokenNumber { node: SyntaxNode, } -impl Token for TokenLiteralNumber { +impl Token for TokenNumber { fn new_green(db: &dyn SyntaxGroup, text: SmolStr) -> Self::Green { - TokenLiteralNumberGreen(db.intern_green(GreenNode { - kind: SyntaxKind::TokenLiteralNumber, + TokenNumberGreen(db.intern_green(GreenNode { + kind: SyntaxKind::TokenNumber, details: GreenNodeDetails::Token(text), })) } @@ -13143,25 +13350,25 @@ impl Token for TokenLiteralNumber { } } #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] -pub struct TokenLiteralNumberPtr(pub SyntaxStablePtrId); -impl TokenLiteralNumberPtr { +pub struct TokenNumberPtr(pub SyntaxStablePtrId); +impl TokenNumberPtr { pub fn untyped(&self) -> SyntaxStablePtrId { self.0 } } #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] -pub struct TokenLiteralNumberGreen(pub GreenId); -impl TokenLiteralNumberGreen { +pub struct TokenNumberGreen(pub GreenId); +impl TokenNumberGreen { pub fn text(&self, db: &dyn SyntaxGroup) -> SmolStr { extract_matches!(db.lookup_intern_green(self.0).details, GreenNodeDetails::Token) } } -impl TypedSyntaxNode for TokenLiteralNumber { - const OPTIONAL_KIND: Option = Some(SyntaxKind::TokenLiteralNumber); - type StablePtr = TokenLiteralNumberPtr; - type Green = TokenLiteralNumberGreen; +impl TypedSyntaxNode for TokenNumber { + const OPTIONAL_KIND: Option = Some(SyntaxKind::TokenNumber); + type StablePtr = TokenNumberPtr; + type Green = TokenNumberGreen; fn missing(db: &dyn SyntaxGroup) -> Self::Green { - TokenLiteralNumberGreen(db.intern_green(GreenNode { + TokenNumberGreen(db.intern_green(GreenNode { kind: SyntaxKind::TokenMissing, details: GreenNodeDetails::Token("".into()), })) @@ -13169,10 +13376,9 @@ impl TypedSyntaxNode for TokenLiteralNumber { fn from_syntax_node(db: &dyn SyntaxGroup, node: SyntaxNode) -> Self { match db.lookup_intern_green(node.0.green).details { GreenNodeDetails::Token(_) => Self { node }, - GreenNodeDetails::Node { .. } => panic!( - "Expected a token {:?}, not an internal node", - SyntaxKind::TokenLiteralNumber - ), + GreenNodeDetails::Node { .. } => { + panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNumber) + } } } fn from_ptr(db: &dyn SyntaxGroup, root: &SyntaxFile, ptr: Self::StablePtr) -> Self { @@ -13182,27 +13388,27 @@ impl TypedSyntaxNode for TokenLiteralNumber { self.node.clone() } fn stable_ptr(&self) -> Self::StablePtr { - TokenLiteralNumberPtr(self.node.0.stable_ptr) + TokenNumberPtr(self.node.0.stable_ptr) } } #[derive(Clone, Debug, Eq, Hash, PartialEq)] -pub struct TerminalLiteralNumber { +pub struct TerminalNumber { node: SyntaxNode, children: Vec, } -impl Terminal for TerminalLiteralNumber { - const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber; - type TokenType = TokenLiteralNumber; +impl Terminal for TerminalNumber { + const KIND: SyntaxKind = SyntaxKind::TerminalNumber; + type TokenType = TokenNumber; fn new_green( db: &dyn SyntaxGroup, leading_trivia: TriviaGreen, - token: <::TokenType as TypedSyntaxNode>::Green, + token: <::TokenType as TypedSyntaxNode>::Green, trailing_trivia: TriviaGreen, ) -> Self::Green { let children: Vec = vec![leading_trivia.0, token.0, trailing_trivia.0]; let width = children.iter().copied().map(|id| db.lookup_intern_green(id).width()).sum(); - TerminalLiteralNumberGreen(db.intern_green(GreenNode { - kind: SyntaxKind::TerminalLiteralNumber, + TerminalNumberGreen(db.intern_green(GreenNode { + kind: SyntaxKind::TerminalNumber, details: GreenNodeDetails::Node { children, width }, })) } @@ -13210,37 +13416,37 @@ impl Terminal for TerminalLiteralNumber { self.token(db).text(db) } } -impl TerminalLiteralNumber { +impl TerminalNumber { pub fn leading_trivia(&self, db: &dyn SyntaxGroup) -> Trivia { Trivia::from_syntax_node(db, self.children[0].clone()) } - pub fn token(&self, db: &dyn SyntaxGroup) -> TokenLiteralNumber { - TokenLiteralNumber::from_syntax_node(db, self.children[1].clone()) + pub fn token(&self, db: &dyn SyntaxGroup) -> TokenNumber { + TokenNumber::from_syntax_node(db, self.children[1].clone()) } pub fn trailing_trivia(&self, db: &dyn SyntaxGroup) -> Trivia { Trivia::from_syntax_node(db, self.children[2].clone()) } } #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] -pub struct TerminalLiteralNumberPtr(pub SyntaxStablePtrId); -impl TerminalLiteralNumberPtr { +pub struct TerminalNumberPtr(pub SyntaxStablePtrId); +impl TerminalNumberPtr { pub fn untyped(&self) -> SyntaxStablePtrId { self.0 } } #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] -pub struct TerminalLiteralNumberGreen(pub GreenId); -impl TypedSyntaxNode for TerminalLiteralNumber { - const OPTIONAL_KIND: Option = Some(SyntaxKind::TerminalLiteralNumber); - type StablePtr = TerminalLiteralNumberPtr; - type Green = TerminalLiteralNumberGreen; +pub struct TerminalNumberGreen(pub GreenId); +impl TypedSyntaxNode for TerminalNumber { + const OPTIONAL_KIND: Option = Some(SyntaxKind::TerminalNumber); + type StablePtr = TerminalNumberPtr; + type Green = TerminalNumberGreen; fn missing(db: &dyn SyntaxGroup) -> Self::Green { - TerminalLiteralNumberGreen(db.intern_green(GreenNode { - kind: SyntaxKind::TerminalLiteralNumber, + TerminalNumberGreen(db.intern_green(GreenNode { + kind: SyntaxKind::TerminalNumber, details: GreenNodeDetails::Node { children: vec![ Trivia::missing(db).0, - TokenLiteralNumber::missing(db).0, + TokenNumber::missing(db).0, Trivia::missing(db).0, ], width: TextWidth::default(), @@ -13251,10 +13457,10 @@ impl TypedSyntaxNode for TerminalLiteralNumber { let kind = node.kind(db); assert_eq!( kind, - SyntaxKind::TerminalLiteralNumber, + SyntaxKind::TerminalNumber, "Unexpected SyntaxKind {:?}. Expected {:?}.", kind, - SyntaxKind::TerminalLiteralNumber + SyntaxKind::TerminalNumber ); let children = node.children(db).collect(); Self { node, children } @@ -13266,7 +13472,7 @@ impl TypedSyntaxNode for TerminalLiteralNumber { self.node.clone() } fn stable_ptr(&self) -> Self::StablePtr { - TerminalLiteralNumberPtr(self.node.0.stable_ptr) + TerminalNumberPtr(self.node.0.stable_ptr) } } #[derive(Clone, Debug, Eq, Hash, PartialEq)] diff --git a/crates/cairo-lang-syntax/src/node/ast_ext.rs b/crates/cairo-lang-syntax/src/node/ast_ext.rs index 79a7af388b2..0a4058c760a 100644 --- a/crates/cairo-lang-syntax/src/node/ast_ext.rs +++ b/crates/cairo-lang-syntax/src/node/ast_ext.rs @@ -7,7 +7,7 @@ use num_traits::Num; use smol_str::SmolStr; use unescaper::unescape; -use super::{TerminalFalse, TerminalLiteralNumber, TerminalShortString, TerminalTrue}; +use super::{LiteralNumber, OptionTerminalMinus, TerminalFalse, TerminalShortString, TerminalTrue}; use crate::node::db::SyntaxGroup; use crate::node::Terminal; @@ -25,7 +25,7 @@ impl TerminalFalse { } } -impl TerminalLiteralNumber { +impl LiteralNumber { /// Interpret this terminal as a [`BigInt`] number. pub fn numeric_value(&self, db: &dyn SyntaxGroup) -> Option { self.numeric_value_and_suffix(db).map(|(value, _suffix)| value) @@ -36,7 +36,8 @@ impl TerminalLiteralNumber { &self, db: &dyn SyntaxGroup, ) -> Option<(BigInt, Option)> { - let text = self.text(db); + let text = self.number(db).text(db); + let negative = matches!(self.sign(db), OptionTerminalMinus::TerminalMinus(_)); let (text, radix) = if let Some(num_no_prefix) = text.strip_prefix("0x") { (num_no_prefix, 16) @@ -51,8 +52,8 @@ impl TerminalLiteralNumber { // Catch an edge case, where literal seems to have a suffix that is valid numeric part // according to the radix. Interpret this as an untyped numer. // Example: 0x1_f32 is interpreted as 0x1F32 without suffix. - if let Ok(value) = BigInt::from_str_radix(text, radix) { - Some((value, None)) + let (value, suffix) = if let Ok(value) = BigInt::from_str_radix(text, radix) { + (value, None) } else { let (text, suffix) = match text.rsplit_once('_') { Some((text, suffix)) => { @@ -61,11 +62,9 @@ impl TerminalLiteralNumber { } None => (text, None), }; - - let value = BigInt::from_str_radix(text, radix).ok()?; - let suffix = suffix.map(SmolStr::new); - Some((value, suffix)) - } + (BigInt::from_str_radix(text, radix).ok()?, suffix.map(SmolStr::new)) + }; + Some((if negative { -value } else { value }, suffix)) } } diff --git a/crates/cairo-lang-syntax/src/node/ast_test.rs b/crates/cairo-lang-syntax/src/node/ast_test.rs index 48fa4057242..b419f98324f 100644 --- a/crates/cairo-lang-syntax/src/node/ast_test.rs +++ b/crates/cairo-lang-syntax/src/node/ast_test.rs @@ -4,11 +4,11 @@ use test_log::test; use super::ast::{ ExprBinary, ExprPath, PathSegmentGreen, PathSegmentSimple, SyntaxFileGreen, TerminalIdentifier, - TerminalLiteralNumber, TerminalPlus, TokenIdentifier, TokenLiteralNumber, TokenPlus, - TokenWhitespace, Trivia, + TerminalPlus, TokenIdentifier, TokenPlus, TokenWhitespace, Trivia, }; use super::kind::SyntaxKind; use super::{SyntaxNode, Terminal, Token}; +use crate::node::ast::{LiteralNumber, OptionTerminalMinusEmpty, TerminalNumber, TokenNumber}; use crate::node::test_utils::DatabaseForTesting; #[test] @@ -101,7 +101,19 @@ fn test_ast() { TextWidth::new_for_testing(1) ), ( - SyntaxKind::TerminalLiteralNumber, + SyntaxKind::LiteralNumber, + None, + TextOffset::default().add_width(TextWidth::new_for_testing(6)), + TextWidth::new_for_testing(1) + ), + ( + SyntaxKind::OptionTerminalMinusEmpty, + None, + TextOffset::default().add_width(TextWidth::new_for_testing(6)), + TextWidth::new_for_testing(0) + ), + ( + SyntaxKind::TerminalNumber, None, TextOffset::default().add_width(TextWidth::new_for_testing(6)), TextWidth::new_for_testing(1) @@ -113,7 +125,7 @@ fn test_ast() { TextWidth::new_for_testing(0) ), ( - SyntaxKind::TokenLiteralNumber, + SyntaxKind::TokenNumber, Some("5".into()), TextOffset::default().add_width(TextWidth::new_for_testing(6)), TextWidth::new_for_testing(1) @@ -147,7 +159,7 @@ fn setup(db: &DatabaseForTesting) -> SyntaxNode { let token_whitespace1 = TokenWhitespace::new_green(db, " ".into()); let token_plus = TokenPlus::new_green(db, "+".into()); let token_whitespace2 = TokenWhitespace::new_green(db, " ".into()); - let token5 = TokenLiteralNumber::new_green(db, "5".into()); + let token5 = TokenNumber::new_green(db, "5".into()); assert_eq!(token_whitespace1, token_whitespace2); let no_trivia = Trivia::new_green(db, vec![]); let triviums = vec![token_whitespace1, token_whitespace2]; @@ -164,7 +176,9 @@ fn setup(db: &DatabaseForTesting) -> SyntaxNode { token_plus, Trivia::new_green(db, vec![triviums[1].into()]), ); - let terminal5 = TerminalLiteralNumber::new_green(db, no_trivia, token5, no_trivia); + let terminal5 = TerminalNumber::new_green(db, no_trivia, token5, no_trivia); + let number5 = + LiteralNumber::new_green(db, OptionTerminalMinusEmpty::new_green(db).into(), terminal5); let expr = ExprBinary::new_green( db, ExprPath::new_green( @@ -173,7 +187,7 @@ fn setup(db: &DatabaseForTesting) -> SyntaxNode { ) .into(), terminal_plus.into(), - terminal5.into(), + number5.into(), ); // SyntaxNode::new_root only accepts ast::SyntaxFileGreen, but we only have an expression. // This is a hack to crate a green id of "SyntaxFile" from "Expr". diff --git a/crates/cairo-lang-syntax/src/node/key_fields.rs b/crates/cairo-lang-syntax/src/node/key_fields.rs index c105033308d..dfdeba42198 100644 --- a/crates/cairo-lang-syntax/src/node/key_fields.rs +++ b/crates/cairo-lang-syntax/src/node/key_fields.rs @@ -7,6 +7,12 @@ use super::kind::SyntaxKind; pub fn get_key_fields(kind: SyntaxKind, children: Vec) -> Vec { match kind { SyntaxKind::Trivia => vec![], + SyntaxKind::LiteralNumber => { + vec![] + } + SyntaxKind::OptionTerminalMinusEmpty => { + vec![] + } SyntaxKind::ExprList => vec![], SyntaxKind::Arg => { vec![] @@ -313,8 +319,8 @@ pub fn get_key_fields(kind: SyntaxKind, children: Vec) -> Vec SyntaxKind::TerminalIdentifier => { vec![] } - SyntaxKind::TokenLiteralNumber => vec![], - SyntaxKind::TerminalLiteralNumber => { + SyntaxKind::TokenNumber => vec![], + SyntaxKind::TerminalNumber => { vec![] } SyntaxKind::TokenShortString => vec![], diff --git a/crates/cairo-lang-syntax/src/node/kind.rs b/crates/cairo-lang-syntax/src/node/kind.rs index 989495c999e..64b8e43f274 100644 --- a/crates/cairo-lang-syntax/src/node/kind.rs +++ b/crates/cairo-lang-syntax/src/node/kind.rs @@ -3,6 +3,8 @@ use core::fmt; #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] pub enum SyntaxKind { Trivia, + LiteralNumber, + OptionTerminalMinusEmpty, ExprList, Arg, ArgClauseNamed, @@ -119,8 +121,8 @@ pub enum SyntaxKind { GenericParamImpl, TokenIdentifier, TerminalIdentifier, - TokenLiteralNumber, - TerminalLiteralNumber, + TokenNumber, + TerminalNumber, TokenShortString, TerminalShortString, TokenAs, @@ -275,7 +277,7 @@ impl SyntaxKind { matches!( *self, SyntaxKind::TokenIdentifier - | SyntaxKind::TokenLiteralNumber + | SyntaxKind::TokenNumber | SyntaxKind::TokenShortString | SyntaxKind::TokenAs | SyntaxKind::TokenConst @@ -358,7 +360,7 @@ impl SyntaxKind { matches!( *self, SyntaxKind::TerminalIdentifier - | SyntaxKind::TerminalLiteralNumber + | SyntaxKind::TerminalNumber | SyntaxKind::TerminalShortString | SyntaxKind::TerminalAs | SyntaxKind::TerminalConst diff --git a/tests/test_data/fib_unary.casm b/tests/test_data/fib_unary.casm index afdb1dd3fa1..6f9553c3f2b 100644 --- a/tests/test_data/fib_unary.casm +++ b/tests/test_data/fib_unary.casm @@ -1,7 +1,5 @@ -[ap + 0] = 1, ap++; -[ap + 0] = 1, ap++; -[ap + 0] = [ap + -2] * -1, ap++; -[ap + 0] = [ap + -2] * -1, ap++; +[ap + 0] = -1, ap++; +[ap + 0] = -1, ap++; [ap + 0] = [fp + -3], ap++; call rel 5; [ap + 0] = [ap + -1] * -1, ap++; diff --git a/tests/test_data/fib_unary.sierra b/tests/test_data/fib_unary.sierra index 0a0d8d6d2d4..447a7fdc2cc 100644 --- a/tests/test_data/fib_unary.sierra +++ b/tests/test_data/fib_unary.sierra @@ -3,10 +3,9 @@ type NonZero = NonZero; libfunc disable_ap_tracking = disable_ap_tracking; libfunc felt252_const<-1> = felt252_const<-1>; -libfunc felt252_const<1> = felt252_const<1>; libfunc store_temp = store_temp; -libfunc felt252_mul = felt252_mul; libfunc function_call = function_call; +libfunc felt252_mul = felt252_mul; libfunc snapshot_take = snapshot_take; libfunc felt252_const<0> = felt252_const<0>; libfunc drop = drop; @@ -18,24 +17,19 @@ libfunc jump = jump; libfunc drop> = drop>; libfunc dup = dup; libfunc felt252_add = felt252_add; +libfunc felt252_const<1> = felt252_const<1>; disable_ap_tracking() -> (); felt252_const<-1>() -> ([1]); -felt252_const<1>() -> ([2]); -store_temp([2]) -> ([2]); -felt252_mul([2], [1]) -> ([3]); -felt252_const<-1>() -> ([4]); -felt252_const<1>() -> ([5]); -store_temp([5]) -> ([5]); -felt252_mul([5], [4]) -> ([6]); -store_temp([3]) -> ([8]); -store_temp([6]) -> ([9]); -store_temp([0]) -> ([10]); -function_call([8], [9], [10]) -> ([7]); -felt252_const<-1>() -> ([11]); -felt252_mul([7], [11]) -> ([12]); -store_temp([12]) -> ([13]); -return([13]); +felt252_const<-1>() -> ([2]); +store_temp([1]) -> ([4]); +store_temp([2]) -> ([5]); +store_temp([0]) -> ([6]); +function_call([4], [5], [6]) -> ([3]); +felt252_const<-1>() -> ([7]); +felt252_mul([3], [7]) -> ([8]); +store_temp([8]) -> ([9]); +return([9]); disable_ap_tracking() -> (); snapshot_take([2]) -> ([3], [4]); felt252_const<0>() -> ([5]); @@ -51,12 +45,12 @@ rename([10]) -> ([14]); rename([13]) -> ([15]); felt252_sub([14], [15]) -> ([16]); store_temp([16]) -> ([16]); -felt252_is_zero([16]) { fallthrough() 38([17]) }; +felt252_is_zero([16]) { fallthrough() 32([17]) }; branch_align() -> (); drop([1]) -> (); drop([3]) -> (); store_temp([0]) -> ([18]); -jump() { 49() }; +jump() { 43() }; branch_align() -> (); drop>([17]) -> (); dup([1]) -> ([1], [20]); @@ -72,4 +66,4 @@ rename([18]) -> ([27]); return([27]); examples::fib_unary::fib@0([0]: felt252) -> (felt252); -examples::fib_unary::inner::inner::fib_inner@17([0]: felt252, [1]: felt252, [2]: felt252) -> (felt252); +examples::fib_unary::inner::inner::fib_inner@11([0]: felt252, [1]: felt252, [2]: felt252) -> (felt252);