From 64f33e4e4b0665c50812f153aaa471aa1b63995d Mon Sep 17 00:00:00 2001 From: Brandon Lucas Date: Fri, 20 Feb 2026 20:22:15 -0500 Subject: [PATCH] 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 --- src/codegen/js_backend.rs | 8 ++++++++ src/main.rs | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) 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""#);