feat: add List.get support to JS backend
List.get(list, index) now correctly compiles to JavaScript, returning Lux.Some(value) for valid indices and Lux.None() for out-of-bounds. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1917,6 +1917,14 @@ impl JsBackend {
|
||||
let func = self.emit_expr(&args[1])?;
|
||||
Ok(format!("({}.forEach({}), undefined)", list, func))
|
||||
}
|
||||
"get" => {
|
||||
let list = self.emit_expr(&args[0])?;
|
||||
let idx = self.emit_expr(&args[1])?;
|
||||
Ok(format!(
|
||||
"((__i, __l) => (__i >= 0 && __i < __l.length) ? Lux.Some(__l[__i]) : Lux.None())({}, {})",
|
||||
idx, list
|
||||
))
|
||||
}
|
||||
_ => Err(JsGenError {
|
||||
message: format!("Unknown List operation: {}", operation),
|
||||
span: None,
|
||||
|
||||
23
src/main.rs
23
src/main.rs
@@ -4263,6 +4263,29 @@ c")"#;
|
||||
assert!(js.contains("main_lux"), "main should be mangled: {}", js);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_list_get_js_codegen() {
|
||||
use crate::codegen::js_backend::JsBackend;
|
||||
use crate::parser::Parser;
|
||||
use crate::lexer::Lexer;
|
||||
|
||||
let source = r#"
|
||||
fn main(): Unit = {
|
||||
let xs = [10, 20, 30]
|
||||
let result = List.get(xs, 1)
|
||||
()
|
||||
}
|
||||
"#;
|
||||
|
||||
let tokens = Lexer::new(source).tokenize().unwrap();
|
||||
let program = Parser::new(tokens).parse_program().unwrap();
|
||||
let mut backend = JsBackend::new();
|
||||
let js = backend.generate(&program).unwrap();
|
||||
|
||||
assert!(js.contains("Lux.Some"), "JS should contain Lux.Some for List.get: {}", js);
|
||||
assert!(js.contains("Lux.None"), "JS should contain Lux.None for List.get: {}", js);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_invalid_escape_sequence() {
|
||||
let result = eval(r#"let x = "\z""#);
|
||||
|
||||
Reference in New Issue
Block a user