diff --git a/dist/platform/elc b/dist/platform/elc index 9ec7b43..5e83d07 100755 Binary files a/dist/platform/elc and b/dist/platform/elc differ diff --git a/el-compiler/src/codegen-js.el b/el-compiler/src/codegen-js.el index c1b2f7e..f832551 100644 --- a/el-compiler/src/codegen-js.el +++ b/el-compiler/src/codegen-js.el @@ -566,8 +566,16 @@ fn js_cg_match(expr: Map) -> String { if str_eq(v, "true") { let bv = "true" } let parts = native_list_append(parts, "if (" + subj_var + " === " + bv + ") return (" + body_c + "); ") } else { - // unknown pattern → wildcard - let parts = native_list_append(parts, "return (" + body_c + "); ") + if str_eq(pkind, "Variant") { + // Enum::Variant patterns — El enums compile to plain + // strings (the variant name) or ints. Match the subject + // against the variant name string. + let variant: String = pat["variant"] + let parts = native_list_append(parts, "if (str_eq(" + subj_var + ", " + js_str_lit(variant) + ")) return (" + body_c + "); ") + } else { + // unknown pattern → wildcard + let parts = native_list_append(parts, "return (" + body_c + "); ") + } } } } diff --git a/el-compiler/src/codegen.el b/el-compiler/src/codegen.el index 81b164d..51ddc34 100644 --- a/el-compiler/src/codegen.el +++ b/el-compiler/src/codegen.el @@ -848,8 +848,15 @@ fn cg_match(expr: Map) -> String { } let parts = native_list_append(parts, "if (" + subj_var + " == " + bv + ") { " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") } else { - // unknown pattern -> wildcard - let parts = native_list_append(parts, "{ " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") + if str_eq(pkind, "Variant") { + // Enum::Variant pattern — match against the variant name + // string (El enums compile to plain strings). + let variant: String = pat["variant"] + let parts = native_list_append(parts, "if (str_eq(" + subj_var + ", EL_STR(" + c_str_lit(variant) + "))) { " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") + } else { + // unknown pattern -> wildcard + let parts = native_list_append(parts, "{ " + result_var + " = (" + body_c + "); goto " + done_label + "; } ") + } } } } diff --git a/el-compiler/src/parser.el b/el-compiler/src/parser.el index e91a288..afd1c33 100644 --- a/el-compiler/src/parser.el +++ b/el-compiler/src/parser.el @@ -408,6 +408,13 @@ fn parse_pattern(tokens: [Map], pos: Int) -> Map { if v == "_" { return make_result({ "pattern": "Wildcard" }, pos + 1) } + // Check for Enum::Variant pattern (Color::Red, Status::Ok, etc.) + // Lexed as: Ident ColonColon Ident + let next_k = tok_kind(tokens, pos + 1) + if next_k == "ColonColon" { + let variant_name = tok_value(tokens, pos + 2) + return make_result({ "pattern": "Variant", "enum_name": v, "variant": variant_name }, pos + 3) + } return make_result({ "pattern": "Binding", "name": v }, pos + 1) } if k == "Int" {