diff --git a/src/codegen/js_backend.rs b/src/codegen/js_backend.rs index cb19d8f..7358594 100644 --- a/src/codegen/js_backend.rs +++ b/src/codegen/js_backend.rs @@ -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, diff --git a/src/main.rs b/src/main.rs index 7fc4e02..27e96ba 100644 --- a/src/main.rs +++ b/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""#);