(
context: &mut ParserContext,
env: &mut Environment,
tokens: &[Token],
position: &mut usize,
)
| 1360 | } |
| 1361 | |
| 1362 | fn parse_assignment_expression( |
| 1363 | context: &mut ParserContext, |
| 1364 | env: &mut Environment, |
| 1365 | tokens: &[Token], |
| 1366 | position: &mut usize, |
| 1367 | ) -> Result<Box<dyn Expr>, Box<Diagnostic>> { |
| 1368 | let expression = parse_regex_expression(context, env, tokens, position)?; |
| 1369 | if is_current_token(tokens, position, TokenKind::ColonEqual) { |
| 1370 | if expression.kind() != ExprKind::GlobalVariable { |
| 1371 | return Err(Diagnostic::error( |
| 1372 | "Assignment expressions expect global variable name before `:=`", |
| 1373 | ) |
| 1374 | .with_location(tokens[*position].location) |
| 1375 | .as_boxed()); |
| 1376 | } |
| 1377 | |
| 1378 | let expr = expression |
| 1379 | .as_any() |
| 1380 | .downcast_ref::<GlobalVariableExpr>() |
| 1381 | .unwrap(); |
| 1382 | |
| 1383 | let variable_name = expr.name.to_string(); |
| 1384 | |
| 1385 | // Consume `:=` operator |
| 1386 | *position += 1; |
| 1387 | |
| 1388 | let value = parse_regex_expression(context, env, tokens, position)?; |
| 1389 | env.define_global(variable_name.clone(), value.expr_type()); |
| 1390 | |
| 1391 | return Ok(Box::new(AssignmentExpr { |
| 1392 | symbol: variable_name.clone(), |
| 1393 | value, |
| 1394 | })); |
| 1395 | } |
| 1396 | Ok(expression) |
| 1397 | } |
| 1398 | |
| 1399 | pub(crate) fn parse_is_null_expression( |
| 1400 | context: &mut ParserContext, |
no test coverage detected
searching dependent graphs…