@@ -9,13 +9,16 @@ use crate::{Ident, Shared, lexer};
99use smallvec:: { SmallVec , smallvec} ;
1010use smol_str:: SmolStr ;
1111use std:: iter:: Peekable ;
12+ use std:: sync:: LazyLock ;
1213
1314use super :: constants;
1415use super :: node:: { AccessTarget , Args , Branches , Expr , Literal , Node , Param , Params } ;
1516use super :: { Program , TokenId } ;
1617
1718type IfExpr = ( Option < Shared < Node > > , Shared < Node > ) ;
1819
20+ static GET_IDENT : LazyLock < Ident > = LazyLock :: new ( || Ident :: from ( constants:: GET ) ) ;
21+
1922#[ derive( Debug ) ]
2023struct ArrayIndex ( Option < usize > ) ;
2124
@@ -177,26 +180,24 @@ impl<'a, 'alloc> Parser<'a, 'alloc> {
177180 token_id : operator_token_id,
178181 expr : Shared :: new ( Expr :: Assign ( ident. clone ( ) , rhs) ) ,
179182 } ) ) ,
180- Expr :: Call ( func_ident, args) if func_ident. name == Ident :: from ( constants:: GET ) && args. len ( ) == 2 => {
181- match & * args[ 0 ] . expr {
182- Expr :: Ident ( var_ident) => Ok ( Shared :: new ( Node {
183- token_id : operator_token_id,
184- expr : Shared :: new ( Expr :: Assign (
185- var_ident. clone ( ) ,
186- Shared :: new ( Node {
187- token_id : operator_token_id,
188- expr : Shared :: new ( Expr :: Call (
189- IdentWithToken :: new_with_token ( constants:: SET , Some ( Shared :: clone ( operator_token) ) ) ,
190- smallvec ! [ Shared :: clone( & args[ 0 ] ) , Shared :: clone( & args[ 1 ] ) , rhs, ] ,
191- ) ) ,
192- } ) ,
193- ) ) ,
194- } ) ) ,
195- _ => Err ( SyntaxError :: InvalidAssignmentTarget (
196- ( * self . token_arena [ args[ 0 ] . token_id ] ) . clone ( ) ,
183+ Expr :: Call ( func_ident, args) if func_ident. name == * GET_IDENT && args. len ( ) == 2 => match & * args[ 0 ] . expr {
184+ Expr :: Ident ( var_ident) => Ok ( Shared :: new ( Node {
185+ token_id : operator_token_id,
186+ expr : Shared :: new ( Expr :: Assign (
187+ var_ident. clone ( ) ,
188+ Shared :: new ( Node {
189+ token_id : operator_token_id,
190+ expr : Shared :: new ( Expr :: Call (
191+ IdentWithToken :: new_with_token ( constants:: SET , Some ( Shared :: clone ( operator_token) ) ) ,
192+ smallvec ! [ Shared :: clone( & args[ 0 ] ) , Shared :: clone( & args[ 1 ] ) , rhs, ] ,
193+ ) ) ,
194+ } ) ,
197195 ) ) ,
198- }
199- }
196+ } ) ) ,
197+ _ => Err ( SyntaxError :: InvalidAssignmentTarget (
198+ ( * self . token_arena [ args[ 0 ] . token_id ] ) . clone ( ) ,
199+ ) ) ,
200+ } ,
200201 _ => Err ( SyntaxError :: InvalidAssignmentTarget (
201202 ( * self . token_arena [ lhs. token_id ] ) . clone ( ) ,
202203 ) ) ,
0 commit comments