From e6d05abd0353f1fcd5dcac5f0efe3a3221929668 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Fri, 20 Feb 2026 12:52:40 -0600 Subject: [PATCH] harsher compile error --- internal/engine.cm | 68 ++++++++++++++++++++++++++++++++++++++++++++-- streamline.cm | 9 ++++++ 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/internal/engine.cm b/internal/engine.cm index 4a035cfa..7ff2b6ae 100644 --- a/internal/engine.cm +++ b/internal/engine.cm @@ -191,6 +191,7 @@ function extract_module_summaries(compiled) { if (_summary_resolver == null) return null var instrs = null var summaries = [] + var unresolved = [] var i = 0 var j = 0 var n = 0 @@ -205,6 +206,7 @@ function extract_module_summaries(compiled) { var path = null var result_slot = 0 var summary = null + var inv_n = 0 if (compiled.main == null) return null instrs = compiled.main.instructions @@ -254,6 +256,9 @@ function extract_module_summaries(compiled) { summary = _summary_resolver(path) if (summary != null) { summaries[] = {slot: result_slot, summary: summary} + } else { + inv_n = length(instr) + unresolved[] = {path: path, line: instr[inv_n - 2], col: instr[inv_n - 1]} } } } @@ -261,7 +266,9 @@ function extract_module_summaries(compiled) { i = i + 1 } - if (length(summaries) > 0) return summaries + if (length(summaries) > 0 || length(unresolved) > 0) { + return {summaries: summaries, unresolved: unresolved} + } return null } @@ -269,6 +276,8 @@ function extract_module_summaries(compiled) { function run_ast_fn(name, ast, env) { var compiled = mcode_mod(ast) var ms = null + var _ui = 0 + var _ur = null var optimized = null var _di = 0 var _diag = null @@ -286,9 +295,23 @@ function run_ast_fn(name, ast, env) { compiled._warn = true ms = extract_module_summaries(compiled) if (ms != null) { - compiled._module_summaries = ms + if (length(ms.summaries) > 0) { + compiled._module_summaries = ms.summaries + } + if (length(ms.unresolved) > 0) { + compiled._unresolved_imports = ms.unresolved + } } } + if (compiled._unresolved_imports != null) { + _ui = 0 + while (_ui < length(compiled._unresolved_imports)) { + _ur = compiled._unresolved_imports[_ui] + print(`${name}:${text(_ur.line)}:${text(_ur.col)}: error: cannot resolve module '${_ur.path}'\n`) + _ui = _ui + 1 + } + disrupt + } optimized = streamline_mod(compiled) if (optimized._verify) { delete optimized._verify @@ -321,7 +344,46 @@ function run_ast_noopt_fn(name, ast, env) { // Compile AST to blob without loading (for caching) function compile_to_blob(name, ast) { var compiled = mcode_mod(ast) - var optimized = streamline_mod(compiled) + var ms = null + var _ui = 0 + var _ur = null + var optimized = null + var _di = 0 + var _diag = null + var _has_errors = false + if (!_no_warn) { + compiled._warn = true + ms = extract_module_summaries(compiled) + if (ms != null) { + if (length(ms.summaries) > 0) { + compiled._module_summaries = ms.summaries + } + if (length(ms.unresolved) > 0) { + compiled._unresolved_imports = ms.unresolved + } + } + } + if (compiled._unresolved_imports != null) { + _ui = 0 + while (_ui < length(compiled._unresolved_imports)) { + _ur = compiled._unresolved_imports[_ui] + print(`${name}:${text(_ur.line)}:${text(_ur.col)}: error: cannot resolve module '${_ur.path}'\n`) + _ui = _ui + 1 + } + disrupt + } + optimized = streamline_mod(compiled) + if (optimized._diagnostics != null && length(optimized._diagnostics) > 0) { + _di = 0 + _has_errors = false + while (_di < length(optimized._diagnostics)) { + _diag = optimized._diagnostics[_di] + print(`${_diag.file}:${text(_diag.line)}:${text(_diag.col)}: ${_diag.severity}: ${_diag.message}\n`) + if (_diag.severity == "error") _has_errors = true + _di = _di + 1 + } + if (_has_errors) disrupt + } return mach_compile_mcode_bin(name, json.encode(optimized)) } diff --git a/streamline.cm b/streamline.cm index 0d0c2064..a53f1106 100644 --- a/streamline.cm +++ b/streamline.cm @@ -1864,6 +1864,7 @@ var streamline = function(ir, log) { var cs = null var argc = null var known_arity = null + var load_field_null = false // Build module_slots map from ir._module_summaries if (ir._module_summaries != null) { @@ -2007,12 +2008,15 @@ var streamline = function(ir, log) { // --- Warning checks (likely bug) --- + load_field_null = false if (op == "load_field") { obj_type = cur_types[instr[2]] if (obj_type == T_ARRAY) { emit("warning", line, col, "named property access on array — always returns null") + load_field_null = true } else if (obj_type == T_TEXT) { emit("warning", line, col, "named property access on text — always returns null") + load_field_null = true } // Cross-module: check if obj is a module with known exports ms = module_slots[text(instr[2])] @@ -2044,6 +2048,11 @@ var streamline = function(ir, log) { // Update types for this instruction track_types(cur_types, instr) + // Override: load_field on array/text always returns null + if (load_field_null) { + cur_types[instr[1]] = T_NULL + } + i = i + 1 }