From 953dd1c2a5b28ade49e67e2d7a73754c2dd8a736 Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 10 Jan 2020 17:31:26 -0400 Subject: [PATCH] import reports imports --- src/main/java/carpet/script/Expression.java | 10 +++++++--- src/main/java/carpet/script/ScriptHost.java | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/carpet/script/Expression.java b/src/main/java/carpet/script/Expression.java index 03bf2566..b11599c3 100644 --- a/src/main/java/carpet/script/Expression.java +++ b/src/main/java/carpet/script/Expression.java @@ -857,11 +857,15 @@ public class Expression // artificial construct to handle user defined functions and function definitions addLazyFunction("import", -1, (c, t, lv) -> { - if (lv.size() < 2) throw new InternalExpressionException("'import' needs at least a module name to import, and list of values to import"); + if (lv.size() < 1) throw new InternalExpressionException("'import' needs at least a module name to import, and list of values to import"); String moduleName = lv.get(0).evalValue(c).getString(); c.host.importModule(c, moduleName); - c.host.importNames(c, module, moduleName, lv.subList(1, lv.size()).stream().map((l) -> l.evalValue(c).getString()).collect(Collectors.toList())); - return (cc, tt) -> Value.NULL; + if (lv.size() > 1) + c.host.importNames(c, module, moduleName, lv.subList(1, lv.size()).stream().map((l) -> l.evalValue(c).getString()).collect(Collectors.toList())); + if (t == Context.VOID) + return LazyValue.NULL; + ListValue list = ListValue.wrap(c.host.availableImports(moduleName).map(StringValue::new).collect(Collectors.toList())); + return (cc, tt) -> list; }); addLazyFunctionWithDelegation("call",-1, (c, t, expr, tok, lv) -> { // adjust based on c diff --git a/src/main/java/carpet/script/ScriptHost.java b/src/main/java/carpet/script/ScriptHost.java index 063625e4..840070b6 100644 --- a/src/main/java/carpet/script/ScriptHost.java +++ b/src/main/java/carpet/script/ScriptHost.java @@ -14,7 +14,7 @@ import java.util.stream.Stream; public abstract class ScriptHost { - public class ModuleData + public static class ModuleData { Module parent; public Map globalFunctions = new Object2ObjectOpenHashMap<>(); @@ -96,7 +96,7 @@ public abstract class ScriptHost Module module = getModuleOrLibraryByName(moduleName); if (modules.containsKey(module.getName())) return; // aready imported, once again, in case some discrepancies in names? modules.put(module.getName(), module); - ModuleData data = new ModuleData(module); + ModuleData data = new ModuleData(module); initializeModuleGlobals(data); moduleData.put(module, data); runModuleCode(c, module); @@ -134,6 +134,20 @@ public abstract class ScriptHost } } + public Stream availableImports(String moduleName) + { + Module source = modules.get(moduleName); + ModuleData sourceData = moduleData.get(source); + if (sourceData == null) + { + throw new InternalExpressionException("Cannot import from module that is not imported"); + } + return Stream.concat( + globaVariableNames(source, s -> s.startsWith("global_")), + globaFunctionNames(source, s -> true) + ).distinct().sorted(); + } + protected abstract Module getModuleOrLibraryByName(String name); // this should be shell out in the executor protected abstract void runModuleCode(Context c, Module module); // this should be shell out in the executor