Skip to content

Commit 9be27fc

Browse files
committed
✨ feat(parser): optimize assignment handling by using LazyLock for GET identifier
1 parent 886184c commit 9be27fc

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed

crates/mq-lang/src/ast/parser.rs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ use crate::{Ident, Shared, lexer};
99
use smallvec::{SmallVec, smallvec};
1010
use smol_str::SmolStr;
1111
use std::iter::Peekable;
12+
use std::sync::LazyLock;
1213

1314
use super::constants;
1415
use super::node::{AccessTarget, Args, Branches, Expr, Literal, Node, Param, Params};
1516
use super::{Program, TokenId};
1617

1718
type IfExpr = (Option<Shared<Node>>, Shared<Node>);
1819

20+
static GET_IDENT: LazyLock<Ident> = LazyLock::new(|| Ident::from(constants::GET));
21+
1922
#[derive(Debug)]
2023
struct 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

Comments
 (0)