From 336caba667fe2b8b11b3b21faf69dbe2d208948c Mon Sep 17 00:00:00 2001 From: Dmitry Vasilev Date: Sat, 2 Mar 2024 13:43:31 +0800 Subject: [PATCH] fix parse --- src/cmd.js | 40 +++++++++++++--------------------------- src/parse_js.js | 13 +++++++------ test/test.js | 1 - test/utils.js | 1 + 4 files changed, 21 insertions(+), 34 deletions(-) diff --git a/src/cmd.js b/src/cmd.js index 46505ed..16b63d9 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -74,35 +74,14 @@ const run_code = (s, globals) => { ? globals == null : set_is_eq(s.globals, globals) - const parse_result = load_modules(s.entrypoint, module => { - if(s.dirty_files != null && s.dirty_files.has(module)) { - return s.files[module] - } - - // If globals change, then errors for using undeclared identifiers may be - // no longer valid. Do not use cache - if(is_globals_eq) { - const result = s.parse_result.cache[module] - if(result != null) { - return result - } else { - return s.files[module] - } - } else { - return s.files[module] - } - - }, globals) - - const dirty_files = new Set( - [...(s.dirty_files ?? new Set())].filter(file => - parse_result.modules[file] == null - ) - ) + // If globals change, then errors for using undeclared identifiers may be + // no longer valid. Do not use cache + const parse_cache = is_globals_eq ? s.parse_result.cache : {} + const loader = module => s.files[module] + const parse_result = load_modules(s.entrypoint, loader, parse_cache, globals) const state = { ...s, - dirty_files, globals, parse_result, calltree: null, @@ -255,7 +234,14 @@ const input = (state, code, index) => { const with_files = { ...state, files, - dirty_files: new Set([...(state.dirty_files ?? []), state.current_module]) + parse_result: state.parse_result == null + ? null + : { + ...state.parse_result, + cache: filter_object(state.parse_result.cache, module => + module != state.current_module + ) + } } const next = set_cursor_position(with_files, index) const effect_save = { diff --git a/src/parse_js.js b/src/parse_js.js index bc185be..18461a0 100644 --- a/src/parse_js.js +++ b/src/parse_js.js @@ -1774,16 +1774,16 @@ export const print_debug_node = node => { return stringify(do_print_debug_node(node)) } -const do_load_modules = (module_names, loader, already_loaded, globals) => { +const do_load_modules = (module_names, loader, already_loaded, parse_cache, globals) => { const parsed = module_names .filter(module_name => already_loaded[module_name] == null) .map(module_name => { + if(parse_cache[module_name] != null) { + return [module_name, parse_cache[module_name]] + } const m = loader(module_name) if(m == null) { return [module_name, {ok: false, problems: [{is_load_error: true}]}] - } else if(typeof(m) == 'object' && m.ok != null) { - // Allows cache parse result - return [module_name, m] } else if(typeof(m) == 'string') { return [module_name, parse(m, globals, true, module_name)] } else { @@ -1831,6 +1831,7 @@ const do_load_modules = (module_names, loader, already_loaded, globals) => { deps, loader, {...already_loaded, ...modules}, + parse_cache, globals ) if(loaded_deps.ok) { @@ -1874,11 +1875,11 @@ const do_load_modules = (module_names, loader, already_loaded, globals) => { } } -export const load_modules = (entry_module, loader, globals) => { +export const load_modules = (entry_module, loader, parse_cache, globals) => { // TODO check_imports. detect cycles while modules are loading, in // do_load_modules - const result = do_load_modules([entry_module], loader, {}, globals) + const result = do_load_modules([entry_module], loader, {}, parse_cache, globals) if(!result.ok) { return result } else { diff --git a/test/test.js b/test/test.js index e9f6692..b210cb2 100644 --- a/test/test.js +++ b/test/test.js @@ -1013,7 +1013,6 @@ export const tests = [ // change module '' const {state: s2} = input(spoil_file, 'import {c} from "c"', 0) - assert_equal(s2.dirty_files, new Set()) assert_equal(s2.parse_result.ok, true) }), diff --git a/test/utils.js b/test/utils.js index 0421eb9..5daac32 100644 --- a/test/utils.js +++ b/test/utils.js @@ -25,6 +25,7 @@ export const parse_modules = (entry, modules) => load_modules( entry, module_name => modules[module_name], + {}, new Set(Object.getOwnPropertyNames(globalThis.app_window)) )