branch: elpa/geiser-kawa commit 266413bdfaf1eb574e18920ab108be0132fa72be Author: spellcard199 <spellcard...@protonmail.com> Commit: spellcard199 <spellcard...@protonmail.com>
Refactor: replace Kawa procedures with primitive methods + update kawa-devutil dep --- elisp/geiser-kawa.el | 4 +- pom.xml | 2 +- src/main/java/kawageiser/Geiser.java | 76 +++++++++++++--- src/main/java/kawageiser/GeiserAutodoc.java | 101 ++++++++++----------- src/main/java/kawageiser/GeiserCompleteModule.java | 59 +++--------- src/main/java/kawageiser/GeiserCompleteSymbol.java | 44 +-------- src/main/java/kawageiser/GeiserEval.java | 29 +----- src/main/java/kawageiser/GeiserLoadFile.java | 24 +---- src/main/java/kawageiser/GeiserMacroexpand.java | 24 ++--- src/main/java/kawageiser/GeiserNoValues.java | 11 +-- .../geiserDoc/ManualEpubUnzipToTmpDir.java | 26 ++---- .../java/kawageiser/java/GeiserCompleteJava.java | 48 +++------- 12 files changed, 165 insertions(+), 283 deletions(-) diff --git a/elisp/geiser-kawa.el b/elisp/geiser-kawa.el index cf55eb8..14b4f05 100644 --- a/elisp/geiser-kawa.el +++ b/elisp/geiser-kawa.el @@ -186,6 +186,7 @@ (format "(geiser:eval (interaction-environment) %S)" (cadr args)))) + (setq moo send-this) send-this)) ((load-file compile-file) @@ -248,9 +249,8 @@ ;;;; Support for manual in .epub format -;; FIXME: port old scheme logic to java (cl-defun geiser-kawa--manual-epub-unzip-to-tmpdir - (&optional (epub-path geiser-kawa--manual)) + (&optional (epub-path geiser-kawa-manual-path)) "Unzip the .epub file with kawa/java, since: - kawa is already a dependency - kawa/java is more portable that using emacs' arc-mode, which relies diff --git a/pom.xml b/pom.xml index 37e1ed1..8efbdb8 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ <dependency> <groupId>com.gitlab.spellcard199</groupId> <artifactId>kawa-devutil</artifactId> - <version>833e0805034a5479496e454f4d9645a46d8f136b</version> + <version>5f6dd112820e2c56bb2456edb069d4e2c8c5bc64</version> </dependency> <!-- https://mvnrepository.com/artifact/org.testng/testng --> diff --git a/src/main/java/kawageiser/Geiser.java b/src/main/java/kawageiser/Geiser.java index 4c57b92..4574c7d 100644 --- a/src/main/java/kawageiser/Geiser.java +++ b/src/main/java/kawageiser/Geiser.java @@ -6,27 +6,73 @@ package kawageiser; import gnu.expr.Language; -import kawageiser.geiserDoc.ManualEpubUnzipToTmpDir; -import kawageiser.java.GeiserCompleteJava; public class Geiser implements Runnable { + private static boolean prettyPrintResult = true; - public static boolean isPrettyPrintResult() { return prettyPrintResult; } - public static boolean isPrettyPrintOutput() { return GeiserEval.evaluator.isPrettyPrintOutput(); } - public static void setPrettyPrintResult(boolean v) { prettyPrintResult = v; } - public static void setPrettyPrintOutput(boolean v) { GeiserEval.evaluator.setPrettyPrintOutput(v); } + + public static boolean isPrettyPrintResult() { + return prettyPrintResult; + } + + public static boolean isPrettyPrintOutput() { + return GeiserEval.evaluator.isPrettyPrintOutput(); + } + + public static void setPrettyPrintResult(boolean v) { + prettyPrintResult = v; + } + + public static void setPrettyPrintOutput(boolean v) { + GeiserEval.evaluator.setPrettyPrintOutput(v); + } @Override public void run() { + Language lang = Language.getDefaultLanguage(); - lang.defineFunction(new GeiserEval("geiser:eval")); - lang.defineFunction(new GeiserNoValues("geiser:no-values")); - lang.defineFunction(new GeiserLoadFile("geiser:load-file")); - lang.defineFunction(new GeiserCompleteSymbol("geiser:completions")); - lang.defineFunction(new GeiserCompleteModule("geiser:module-completions")); - lang.defineFunction(new GeiserAutodoc("geiser:autodoc", lang)); - lang.defineFunction(new GeiserCompleteJava("geiser:complete-java")); - lang.defineFunction(new ManualEpubUnzipToTmpDir("geiser:manual-epub-unzip-to-tmp-dir")); - lang.defineFunction(new GeiserMacroexpand("geiser:macroexpand")); + + // In a previous version definitions were like this: + // lang.defineFunction(new GeiserEval("geiser:eval")); + // However, that meant you were forced to extend Procedure1, Procedure2, ... + // which can only have arguments of type Object and must be instanced to be used. + // This means that compared to static methods you don't have: + // - parameter names in autodoc: I couldn't find a way to get parameter names for instance methods + // - parameter types in autodoc: because their types must be be Object + // - type warnings: for the same reason of the previous point + // Another advantage with this new approach is we don't have to add all the boilerplate + // for checking argument types. + try { + lang.defineFunction( + "geiser:eval", + lang.eval("kawageiser.GeiserEval:evalStr")); + lang.defineFunction( + "geiser:autodoc", + lang.eval("kawageiser.GeiserAutodoc:autodoc")); + lang.defineFunction( + "geiser:module-completions", + lang.eval("kawageiser.GeiserCompleteModule:completeModule")); + lang.defineFunction( + "geiser:load-file", + lang.eval("kawageiser.GeiserLoadFile:loadFile")); + lang.defineFunction( + "geiser:completions", + lang.eval("kawageiser.GeiserCompleteSymbol:getCompletions")); + lang.defineFunction( + "geiser:no-values", + lang.eval("kawageiser.GeiserNoValues:noValues")); + lang.defineFunction( + "geiser:complete-java", + lang.eval("kawageiser.java.GeiserCompleteJava:completeJava")); + lang.defineFunction( + "geiser:manual-epub-unzip-to-tmp-dir", + lang.eval("kawageiser.geiserDoc.ManualEpubUnzipToTmpDir:unzipToTmpDir")); + lang.defineFunction( + "geiser:macroexpand", + lang.eval("kawageiser.GeiserMacroexpand:expand")); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } } + } diff --git a/src/main/java/kawageiser/GeiserAutodoc.java b/src/main/java/kawageiser/GeiserAutodoc.java index 5a49a46..f393cb4 100644 --- a/src/main/java/kawageiser/GeiserAutodoc.java +++ b/src/main/java/kawageiser/GeiserAutodoc.java @@ -11,43 +11,38 @@ import gnu.kawa.functions.Format; import gnu.lists.LList; import gnu.mapping.Environment; import gnu.mapping.Procedure; -import gnu.mapping.Procedure1or2; import gnu.mapping.Symbol; import kawadevutil.data.ParamData; import kawadevutil.data.ProcDataGeneric; import kawadevutil.data.ProcDataNonGeneric; +import kawadevutil.eval.EvalResult; import kawadevutil.kawa.GnuMappingLocation; import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class GeiserAutodoc extends Procedure1or2 { +public class GeiserAutodoc { public static boolean showTypes = true; - Language lang; - GeiserAutodoc(String name, Language lang) { - super(name); - this.lang = lang; - } - - // TODO: find the "right" way to get modules for symbols. - // TODO: support for procedures defined in java, like `append' - // TODO: support for macros (possible?) - // TODO: support for getting parameter names for java instance + // TODO: Find the "right" way to get modules for symbols. + // TODO: Support for macros (possible?) + // TODO: Support for getting parameter names for java instance // methods getMethods bytecode with ClassType (not so simple) - // TODO: support names with special characters, like |a[)| + // TODO: Support names with special characters, like |a[)| + // Problem is that resulting name is without the || around + // the name and since the name that emacs is different from + // the one we are given back autodoc is not accepted as valid // Maybe we can: // 1. keep a list of special chars // 2. when `id' contains one: surround with || (e.g. |id|) - // TODO: consider multiple ids: + // TODO: Consider multiple ids: // - Examples: to get more add (message (format "(geiser:%s %s)" proc form)) // in the t clause of the geiser-kawa--geiser-procedure: // - (display [cursor] -> (geiser:autodoc ’(display)) // - (display (symbol? (string->symbol [cursor] -> (geiser:autodoc ’(string->symbol symbol? display)) - // At the moment arguments are enclosed in double quotes. The // reason is that geiser's output is `read' by elisp, but java types // may contain characters that are not valid in elisp symbols @@ -61,38 +56,32 @@ public class GeiserAutodoc extends Procedure1or2 { // return (new SymToAutodoc()).apply2(symId, env); // }) - // @Override - public Object apply1(Object ids) { - return apply2(ids, Language.getDefaultLanguage().getEnvironment()); + public static String autodoc(LList ids) { + Language language = Language.getDefaultLanguage(); + return autodoc(ids, language, language.getEnvironment()); } - // @Override - public Object apply2(Object ids, Object env) { + public static String autodoc(LList ids, Environment env) { + Language language = Language.getDefaultLanguage(); + return autodoc(ids, language, env); + } - if (!LList.class.isAssignableFrom(ids.getClass())) { - throw new IllegalArgumentException(String.format( - "GeiserAutodoc's 1st arg should be a gnu.lists.LList")); - } - if (!Environment.class.isAssignableFrom(env.getClass())) { - throw new IllegalArgumentException(String.format( - "GeiserAutodoc's 2nd arg should be a gnu.mapping.Environment")); - } + public static String autodoc(LList ids, Language lang, Environment env) { + String formattedAutodoc = null; try { ArrayList<Object> autodocList = new ArrayList<>(); for (Object symId : (LList) ids) { AutodocDataForSymId autodocDataForSymId = - new AutodocDataForSymId((Symbol) symId, (Environment) env, this.lang); + new AutodocDataForSymId((Symbol) symId, env, lang); autodocList.add(autodocDataForSymId.toLList()); } - String formattedAutodoc = - Format - .format("~S", LList.makeList(autodocList)) - .toString(); - return formattedAutodoc; + formattedAutodoc = Format + .format("~S", LList.makeList(autodocList)) + .toString(); } catch (Throwable throwable) { throwable.printStackTrace(); - return throwable; } + return formattedAutodoc; } public static class OperatorArgListData { @@ -129,7 +118,7 @@ public class GeiserAutodoc extends Procedure1or2 { } else if (!isOptionalParam && !showTypes) { return formatParam(param, "~a"); } else { - throw new Error("No worries, can't happen (2 booleans == 4 possibilities)." + + throw new Error("No worries, this clause can't happen (2 booleans == 4 possibilities)." + "Just silencing the \"Missing return statement\" error."); } } @@ -195,7 +184,7 @@ public class GeiserAutodoc extends Procedure1or2 { public static class AutodocDataForSymId { private boolean symExists; private Symbol symId; - private Object operator; + private Optional<Object> operatorMaybe; private Environment environment; private Optional<OperatorArgListData> operatorArgListMaybe; // TODO: fix type, write way to get it @@ -206,33 +195,35 @@ public class GeiserAutodoc extends Procedure1or2 { this.symId = symId; this.environment = env; + Optional<Object> operatorMaybe = Optional.empty(); Optional<OperatorArgListData> operatorArgListMaybe = Optional.empty(); - Object operator = null; - boolean symExists = false; try { - // env.get(symId) works with the < procedure, while lang.eval(symId.toString()) - // raises NullPointerException (maybe a bug?). + // env.get(symId) works with the < procedure, while + // lang.eval(symId.toString()) raises NullPointerException (maybe a bug?). // On the other hand, env.get(symId) does not work with procedures defined // from java with lang.defineFunction(), like the various geiser:... // Since kawadevutil's eval works for both we are using that for now. - operator = GeiserEval.evaluator.eval(lang, env, symId).getResult(); - symExists = true; // If it didn't exist env.get(symId) would have raised UnboundLocationException - if (!Procedure.class.isAssignableFrom(operator.getClass())) { + EvalResult evalResult = GeiserEval.evaluator.eval(lang, env, symId); + operatorMaybe = evalResult.getResult() != null + ? Optional.of(evalResult.getResult()) + : Optional.empty(); + if (operatorMaybe.isPresent() && Procedure.class.isAssignableFrom(operatorMaybe.get().getClass())) { + Procedure operator = (Procedure) operatorMaybe.get(); + ProcDataGeneric procDataGeneric = ProcDataGeneric.makeForProcedure(operator); + operatorArgListMaybe = Optional.of(new OperatorArgListData(procDataGeneric)); + } else { // Not a procedure // TODO : is it possible to implement autodoc for macros? // If not: write a comment why. operatorArgListMaybe = Optional.empty(); - } else { - ProcDataGeneric procDataGeneric = ProcDataGeneric.makeForProcedure((Procedure) operator); - operatorArgListMaybe = Optional.of(new OperatorArgListData(procDataGeneric)); } } catch (Throwable throwable) { throwable.printStackTrace(); } this.operatorArgListMaybe = operatorArgListMaybe; - this.operator = operator; - this.symExists = symExists; + this.operatorMaybe = operatorMaybe; + this.symExists = operatorMaybe.isPresent(); } public LList toLList() { @@ -251,8 +242,8 @@ public class GeiserAutodoc extends Procedure1or2 { // TODO: When we find the correct way to do it, refactor moduleValue inside // ProcDataNonGeneric or a generic wrapper for Procedure data LList moduleValue = null; - if (operator.getClass() == CompiledProc.class) { - CompiledProc compProc = (CompiledProc) operator; + if (operatorMaybe.isPresent() && operatorMaybe.get().getClass() == CompiledProc.class) { + CompiledProc compProc = (CompiledProc) operatorMaybe.get(); moduleValue = LList.makeList( java.util.Arrays .asList(compProc @@ -289,26 +280,26 @@ public class GeiserAutodoc extends Procedure1or2 { // java.lang.String:format // so geiser ignores it. String symIdAsStr = symId.toString(); - LList returnMe; + LList res; if (moduleValue.size() > 0) { ArrayList<Object> moduleList = new ArrayList<>(); moduleList.add("module"); for (Object m : moduleValue) { moduleList.add(Symbol.valueOf(m.toString())); } - returnMe = LList.list3( + res = LList.list3( symIdAsStr, operatorArgListAsLList, LList.makeList(moduleList) ); } else { - returnMe = LList.list2( + res = LList.list2( symIdAsStr, operatorArgListAsLList ); } - return returnMe; + return res; } } } diff --git a/src/main/java/kawageiser/GeiserCompleteModule.java b/src/main/java/kawageiser/GeiserCompleteModule.java index fe00508..4a7d1f4 100644 --- a/src/main/java/kawageiser/GeiserCompleteModule.java +++ b/src/main/java/kawageiser/GeiserCompleteModule.java @@ -6,59 +6,31 @@ package kawageiser; import gnu.expr.Language; -import gnu.lists.IString; import gnu.lists.LList; import gnu.mapping.Environment; -import gnu.mapping.Procedure1or2; +import gnu.mapping.NamedLocation; import kawadevutil.kawa.GnuMappingLocation; import java.util.ArrayList; +public class GeiserCompleteModule { -public class GeiserCompleteModule extends Procedure1or2 { - - GeiserCompleteModule(String name) { - super(name); - } - - @Override - public Object apply1(Object prefix) throws Throwable { - return apply2( - prefix, - Language.getDefaultLanguage().getEnvironment()); + public static String completeModule(String prefix) { + return completeModule(prefix, Language.getDefaultLanguage().getEnvironment()); } - @Override - public Object apply2(Object prefix, Object env) throws Throwable { - - String prefixStr = null; - if (prefix instanceof String) { - prefixStr = (String) prefix; - } else if (prefix instanceof IString) { - prefixStr = prefix.toString(); - } else { - throw new IllegalArgumentException( - "`prefix' arg should be either a String or an IString"); - } - - Environment castedEnv; - if (Environment.class.isAssignableFrom(env.getClass())) { - castedEnv = (Environment) env; - } else { - throw new IllegalArgumentException( - "`env' arg should be an gnu.mapping.Environment"); - } - - ArrayList<String> moduleCompletions = getCompletions(prefixStr, castedEnv); + public static String completeModule(String prefix, Environment env) { + ArrayList<String> moduleCompletions = getCompletions(prefix, env); // Geiser protocol wants modules in the result to be printed // between double quotes // ("(... ... ...)" "(... ...)") // Kawa repl doesn't show returned strings with surrounding // quotes, so we have to manually surround completions. - return gnu.kawa.functions.Format.format("~S", LList.makeList(moduleCompletions)); + return gnu.kawa.functions.Format.format( + "~S", LList.makeList(moduleCompletions)).toString(); } - private ArrayList<String> getCompletions(String prefix, Environment env) { + public static ArrayList<String> getCompletions(String prefix, Environment env) { ArrayList<String> moduleCompletions = new ArrayList<>(); @@ -68,14 +40,11 @@ public class GeiserCompleteModule extends Procedure1or2 { // TODO: this is an hack. If it exists, find a way to list // modules directly. env.enumerateAllLocations().forEachRemaining( - loc -> - { - String moduleStrRepr = GnuMappingLocation - .baseLocationToModuleName(loc.getBase()); - if ((!moduleCompletions.contains(moduleStrRepr)) - && (!(moduleStrRepr.equals(""))) - && (moduleStrRepr.startsWith(prefix)) - ) { + (NamedLocation loc) -> { + String moduleStrRepr = GnuMappingLocation.baseLocationToModuleName(loc.getBase()); + if (!moduleCompletions.contains(moduleStrRepr) + && !moduleStrRepr.equals("") + && moduleStrRepr.startsWith(prefix)) { moduleCompletions.add(moduleStrRepr); } } diff --git a/src/main/java/kawageiser/GeiserCompleteSymbol.java b/src/main/java/kawageiser/GeiserCompleteSymbol.java index 5dda5c7..7c17397 100644 --- a/src/main/java/kawageiser/GeiserCompleteSymbol.java +++ b/src/main/java/kawageiser/GeiserCompleteSymbol.java @@ -5,56 +5,20 @@ package kawageiser; -import gnu.expr.Language; import gnu.lists.IString; import gnu.lists.LList; import gnu.mapping.Environment; -import gnu.mapping.Procedure1or2; import gnu.mapping.Symbol; import java.util.ArrayList; -public class GeiserCompleteSymbol extends Procedure1or2 { +public class GeiserCompleteSymbol { - GeiserCompleteSymbol(String name) { - super(name); + public static LList getCompletions(IString prefix) { + return getCompletions(prefix, Environment.user()); } - @Override - public Object apply1(Object prefix) { - return apply2( - prefix, - Language.getDefaultLanguage().getEnvironment()); - } - - @Override - public Object apply2(Object prefix, Object module) { - - String prefixStr = null; - if (prefix instanceof String) { - prefixStr = (String) prefix; - } else if (prefix instanceof IString) { - prefixStr = prefix.toString(); - } else { - throw new IllegalArgumentException( - "prefix arg should be either String or IString"); - } - - Environment env = null; - if (Environment.class.isAssignableFrom(module.getClass())) { - // already an Environment - env = (Environment) module; - } else if (kawa.lib.lists.isList(module)) { - env = kawa.lib.scheme.eval.environment$V(((LList) module)); - } else { - throw new IllegalArgumentException( - "module argument should be either a proper list or an Environment."); - } - - return getCompletions(prefixStr, env); - } - - private LList getCompletions(String prefix, Environment env) { + public static LList getCompletions(IString prefix, Environment env) { ArrayList<Symbol> resultArrList = new ArrayList<>(); env.enumerateAllLocations().forEachRemaining( loc -> { diff --git a/src/main/java/kawageiser/GeiserEval.java b/src/main/java/kawageiser/GeiserEval.java index 842d7b1..1d99542 100644 --- a/src/main/java/kawageiser/GeiserEval.java +++ b/src/main/java/kawageiser/GeiserEval.java @@ -10,13 +10,12 @@ import gnu.lists.IString; import gnu.lists.LList; import gnu.lists.Pair; import gnu.mapping.Environment; -import gnu.mapping.Procedure2; import gnu.mapping.Symbol; import kawadevutil.eval.EvalResult; import kawadevutil.eval.EvalResultAndOutput; import kawadevutil.redirect.RedirectedOutErr; -public class GeiserEval extends Procedure2 { +public class GeiserEval { /* * Actual evaluation happens in kawadevutil.eval.Eval. * Here we are just sending arguments and converting our own @@ -24,13 +23,8 @@ public class GeiserEval extends Procedure2 { */ public static kawadevutil.eval.Eval evaluator = new kawadevutil.eval.Eval(); - GeiserEval(String procName) { - super(procName); - } - - @Override - public String - apply2(Object module, Object codeStr) { + public static String + evalStr(Environment module, IString codeIStr) { // The reason this method takes a string instead of a quoted sexpr has been solved // on 2019-12-19 in Kawa's master branch: // https://gitlab.com/kashell/Kawa/-/commit/537e135c0101194702ebee53faf92b98a4ea8c6b @@ -45,22 +39,7 @@ public class GeiserEval extends Procedure2 { // (print send-this) // send-this)) // - - String code; - if (codeStr instanceof IString) { - code = ((IString) codeStr).toString(); - } else if (codeStr instanceof String) { - code = (String) codeStr; - } else { - throw new IllegalArgumentException( - "`codeStr' arg should be either a String or an IString"); - } - return evalStr((Environment) module, code); - } - - public static String - evalStr(Environment module, String codeStr) { - EvalResultAndOutput resOutErr = evaluator.evalCatchingOutErr(module, codeStr); + EvalResultAndOutput resOutErr = evaluator.evalCatchingOutErr(module, codeIStr.toString()); return formatGeiserProtocol(evaluationDataToGeiserProtocol(resOutErr)); } diff --git a/src/main/java/kawageiser/GeiserLoadFile.java b/src/main/java/kawageiser/GeiserLoadFile.java index 0ad10f1..6904c84 100644 --- a/src/main/java/kawageiser/GeiserLoadFile.java +++ b/src/main/java/kawageiser/GeiserLoadFile.java @@ -6,32 +6,12 @@ package kawageiser; import gnu.expr.Language; -import gnu.lists.IString; import gnu.lists.LList; -import gnu.mapping.Procedure1; import kawa.standard.load; -public class GeiserLoadFile extends Procedure1 { +public class GeiserLoadFile { - GeiserLoadFile(String name) { - super(name); - } - - @Override - public Object apply1(Object o) throws Throwable { - String filepath; - if (o instanceof String) { - filepath = (String) o; - } else if (o instanceof IString) { - filepath = ((IString) o).toString(); - } else { - throw new IllegalArgumentException( - "geiser:load should take a String or an IString as argument"); - } - return load(filepath); - } - - public Object load(String filepath) { + public static String loadFile(String filepath) { return GeiserEval.evalForm( Language.getDefaultLanguage().getEnvironment(), LList.list2(load.load, filepath)); diff --git a/src/main/java/kawageiser/GeiserMacroexpand.java b/src/main/java/kawageiser/GeiserMacroexpand.java index 32e982f..e0295b8 100644 --- a/src/main/java/kawageiser/GeiserMacroexpand.java +++ b/src/main/java/kawageiser/GeiserMacroexpand.java @@ -9,28 +9,20 @@ import gnu.expr.Language; import gnu.kawa.functions.Format; import gnu.kawa.slib.syntaxutils; import gnu.mapping.Environment; -import gnu.mapping.Procedure1or2; -public class GeiserMacroexpand extends Procedure1or2 { +public class GeiserMacroexpand { - GeiserMacroexpand(String name) { - super(name); + public static String expand(Object form) throws Throwable { + return expand(form, true); } - @Override - public Object apply1(Object form) throws Throwable { - return apply2(form, false); - } - - @Override - public Object apply2(Object form, Object all) throws Throwable { - // I think Kawa macro expansion can only expand to the whole tree, so: - // 1. There is no macroexpand-1 - // 2. The `all' argument that geiser passes is ignored + public static String expand(Object form, boolean all) throws Throwable { + // `all' is ignored: geiser passes #t or #f depending on whether it needs + // expand-1 or expand-all, but Kawa's `expand' can only expand the whole tree. return expand(form, Language.getDefaultLanguage().getEnvironment()); } - public Object expand(Object form, Environment env) throws Throwable { + public static String expand(Object form, Environment env) throws Throwable { // TODO: How do you invoke kawa procedures with keyword arguments from java? // - ignoring env and using apply1, for now // - an alternative would be to port gnu.kawa.slib.syntaxutils.expand from scheme to java (it's easy) @@ -69,6 +61,6 @@ public class GeiserMacroexpand extends Procedure1or2 { // Double formatting so that double quotes around strings are not lost. return Format.format( "~S", - Format.format("~S", expanded)); + Format.format("~S", expanded)).toString(); } } diff --git a/src/main/java/kawageiser/GeiserNoValues.java b/src/main/java/kawageiser/GeiserNoValues.java index b15b29c..dddade4 100644 --- a/src/main/java/kawageiser/GeiserNoValues.java +++ b/src/main/java/kawageiser/GeiserNoValues.java @@ -5,20 +5,15 @@ package kawageiser; -import gnu.mapping.Procedure0; import gnu.mapping.Values; -public class GeiserNoValues extends Procedure0 { +public class GeiserNoValues { - GeiserNoValues(String name) { - super(name); - } - - @Override - public Object apply0() throws Throwable { + public static Object noValues() { gnu.kawa.io.InPort.inDefault().setLineNumber( gnu.kawa.io.InPort.inDefault().getLineNumber() - 1); // apply0 signature doesn't allow us to return void return Values.FromArray.make(); } + } diff --git a/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java b/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java index f24b035..170c2de 100644 --- a/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java +++ b/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java @@ -1,31 +1,17 @@ /* - * Copyright (C) 2020 spellcard199 <spellcard...@protonmail.com> + * Copyright (C) 2020 spellcard199 <spellcard...@protonmail.com> * This is free software; for terms and warranty disclaimer see ./COPYING. */ package kawageiser.geiserDoc; -import gnu.lists.IString; -import gnu.mapping.Procedure1; - import java.io.File; +import java.io.IOException; import java.nio.file.Path; -import java.util.Arrays; -import java.util.List; - -public class ManualEpubUnzipToTmpDir extends Procedure1 { - public ManualEpubUnzipToTmpDir(String name) { - super(name); - } +public class ManualEpubUnzipToTmpDir { - @Override - public Object apply1(Object kawaEpubManualPath) throws Throwable { - if (! (kawaEpubManualPath.getClass() == String.class || - kawaEpubManualPath.getClass() == IString.class)) { - throw new IllegalArgumentException( - "`kawaEpubManualPath' arg must be either String or IString"); - } + public static String unzipToTmpDir(String kawaEpubManualPath) throws IOException { String systemTmpDir = System.getProperty("java.io.tmpdir"); String manualUnzippedTmpDir = String.join( File.separator, @@ -33,10 +19,10 @@ public class ManualEpubUnzipToTmpDir extends Procedure1 { "geiser-kawa", "manual-epub-unzipped"); - File zipArchiveFile = new File(kawaEpubManualPath.toString()); + File zipArchiveFile = new File(kawaEpubManualPath); Path destDirPath = new File(manualUnzippedTmpDir).toPath(); kawadevutil.util.ZipExtractor.unzip(zipArchiveFile, destDirPath); - return gnu.kawa.functions.Format.format("~S", manualUnzippedTmpDir); + return gnu.kawa.functions.Format.format("~S", manualUnzippedTmpDir).toString(); } } diff --git a/src/main/java/kawageiser/java/GeiserCompleteJava.java b/src/main/java/kawageiser/java/GeiserCompleteJava.java index b9cb060..ec4d2b7 100644 --- a/src/main/java/kawageiser/java/GeiserCompleteJava.java +++ b/src/main/java/kawageiser/java/GeiserCompleteJava.java @@ -9,7 +9,6 @@ import gnu.expr.Language; import gnu.lists.IString; import gnu.lists.LList; import gnu.mapping.Environment; -import gnu.mapping.Procedure4; import gnu.math.IntNum; import kawadevutil.complete.*; @@ -19,44 +18,24 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -public class GeiserCompleteJava extends Procedure4 { +public class GeiserCompleteJava { - public static boolean showTypes = true; - - public GeiserCompleteJava(String name) { - super(name); - } - - @Override - public Object - apply4(Object codeStr, Object cursorIndex, Object lang, Object env) throws Throwable { - - String codeStrChecked = null; - if (codeStr.getClass().equals(IString.class) || codeStr.getClass().equals(String.class)) { - codeStrChecked = codeStr.toString(); - } else { - throw new IllegalArgumentException( - "`codeStr` must be either String or IString: " + codeStr.getClass().toString()); - } - - Integer cursorIndexChecked = null; - if (cursorIndex.getClass().equals(Integer.class)) { - cursorIndexChecked = (Integer) cursorIndex; - } else if (cursorIndex.getClass().equals(IntNum.class)) { - cursorIndexChecked = ((IntNum) cursorIndex).intValue(); - } else { - throw new IllegalArgumentException( - "`cursorIndex` must be either Integer or IntNum: " - + cursorIndex.getClass().toString()); - } + public static String + completeJava(IString codeStr, IntNum cursorIndex, Language lang, Environment env) + throws Throwable { // Get Data Optional<CompletionDataForJava> complDataMaybe = kawadevutil.complete.Complete.complete( - codeStrChecked, cursorIndexChecked, (Language) lang, (Environment) env, (String name) -> true); + codeStr.toString(), + Integer.valueOf(cursorIndex.toString()), + lang, + env, + (String name) -> true); // Wrap data of interest in Scheme's LList + String resAsStr; if (!complDataMaybe.isPresent()) { - return LList.Empty; + resAsStr = gnu.kawa.functions.Format.format("~A", LList.Empty).toString(); } else { CompletionDataForJava complData = complDataMaybe.get(); LList res = null; @@ -69,8 +48,10 @@ public class GeiserCompleteJava extends Procedure4 { throw new Error("[BUG SPOTTED] `complData's class is one not expected: " + complData.getClass().toString()); } - return gnu.kawa.functions.Format.format("~S", res); + resAsStr = gnu.kawa.functions.Format.format("~S", res).toString(); } + + return resAsStr; } private static LList toLList(CompletionDataForJavaFOM complData) { @@ -112,5 +93,4 @@ public class GeiserCompleteJava extends Procedure4 { ); return res; } - }