branch: elpa/geiser-kawa commit 69fbe9cbe895895f237606bc63face848ea9bd00 Author: spellcard199 <spellcard...@protonmail.com> Commit: spellcard199 <spellcard...@protonmail.com>
Refactor: several changes + update pom.xml for kawa-devutil --- elisp/geiser-kawa-complete-java.el | 53 +++++++++++++++++----- elisp/geiser-kawa-eval-util.el | 28 ++++++++++++ elisp/geiser-kawa-exprtree.el | 47 ++----------------- pom.xml | 2 +- src/main/java/kawageiser/Geiser.java | 4 +- .../ManualEpubUnzipToTmpDir.java | 2 +- src/main/java/kawageiser/exprtree/ExprTree.java | 37 +++++++++++++++ .../java/kawageiser/java/GeiserCompleteJava.java | 51 ++++++--------------- 8 files changed, 129 insertions(+), 95 deletions(-) diff --git a/elisp/geiser-kawa-complete-java.el b/elisp/geiser-kawa-complete-java.el index 579871a..aeccf53 100644 --- a/elisp/geiser-kawa-complete-java.el +++ b/elisp/geiser-kawa-complete-java.el @@ -6,6 +6,12 @@ ;; not, see <http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5>. (require 'subr-x) +(require 'geiser-kawa-exprtree) + +;; fmp stands for: +;; 1. Field +;; 2. Method +;; 3. Package (defun geiser-kawa--repl--point-after-prompt () (save-excursion @@ -21,7 +27,7 @@ (geiser-syntax--pop-to-top) (point)))) -(defun geiser-kawa-complete-java--get-data (code-str cursor-index) +(defun geiser-kawa-complete-fmp--get-data (code-str cursor-index) "`code' is a string containing the code. It must be syntatically scheme, including balanced parentheses. `cursor' is an integer representing where the cursor is in that code." @@ -46,7 +52,7 @@ "\t"))))) (geiser-eval--retort-result geiser-answer)))) -(defun geiser-kawa-complete-java--user-choice--field-or-method +(defun geiser-kawa-complete-fmp--user-choice--field-or-method (fm-compl-data) ;; fm stands for field or method. (let ((compl-for-class @@ -74,7 +80,7 @@ nil before-cursor))) -(defun geiser-kawa-complete-java--user-choice--package +(defun geiser-kawa-complete-fmp--user-choice--package (package-compl-data) (let ((field-or-method-or-package (cadr (assoc "field-or-method-or-package" package-compl-data))) @@ -102,18 +108,18 @@ "." (string-remove-prefix package-name before-cursor)) ))) -(defun geiser-kawa-complete-java--user-choice-dispatch +(defun geiser-kawa-complete-fmp--user-choice-dispatch (compl-data) (let ((compl-for (cadr (assoc "field-or-method-or-package" compl-data)))) (cond ((equal compl-for "FIELD") - (geiser-kawa-complete-java--user-choice--field-or-method + (geiser-kawa-complete-fmp--user-choice--field-or-method compl-data)) ((equal compl-for "METHOD") - (geiser-kawa-complete-java--user-choice--field-or-method + (geiser-kawa-complete-fmp--user-choice--field-or-method compl-data)) ((equal compl-for "PACKAGE") - (geiser-kawa-complete-java--user-choice--package + (geiser-kawa-complete-fmp--user-choice--package compl-data)) ((equal compl-for nil) (message "No completions found.") @@ -121,7 +127,7 @@ (t (error (format "[Unexpected condition] compl-for: %s" (prin1-to-string compl-for))))))) -(defun geiser-kawa-complete-java--code-point-from-toplevel () +(defun geiser-kawa-complete-fmp--code-point-from-toplevel () (let* (reg-beg reg-end code-str @@ -157,14 +163,14 @@ "Complete java field or method or package (fmp) at point" (let* ((code-and-point-data - (geiser-kawa-complete-java--code-point-from-toplevel)) + (geiser-kawa-complete-fmp--code-point-from-toplevel)) (code-str (cdr (assoc "code-str" code-and-point-data))) (cursor-index (cdr (assoc "cursor-index" code-and-point-data))) - (compl-data (geiser-kawa-complete-java--get-data + (compl-data (geiser-kawa-complete-fmp--get-data code-str cursor-index)) - (user-choice (geiser-kawa-complete-java--user-choice-dispatch + (user-choice (geiser-kawa-complete-fmp--user-choice-dispatch compl-data))) (when (thing-at-point 'word) (if (looking-back ":" (- (point) 2)) @@ -175,6 +181,29 @@ ;; (kill-word 1) )) + +;;;; Functions to get the Expression tree that is made to try and get +;;;; java completions. Useful when debugging why java completion fails. + +(defun geiser-kawa-complete-fmp--exprtree (code-str cursor-index) + (geiser-kawa-eval--to-res + `(geiser:complete-java-show-expr-tree + ,code-str + ,cursor-index))) + +(defun geiser-kawa-complete-fmp-at-point-exprtree () + (interactive) + (let* ((code-and-point-data + (geiser-kawa-complete-fmp--code-point-from-toplevel)) + (code-str (cdr (assoc "code-str" + code-and-point-data))) + (cursor-index (cdr (assoc "cursor-index" + code-and-point-data))) + (expr-tree (geiser-kawa-complete-fmp--exprtree + code-str cursor-index))) + (geiser-kawa-exprtree--view expr-tree))) + + (provide 'geiser-kawa-complete-java) -;;; geiser-kawa-complete-java.el ends here +;;; geiser-kawa-complete-fmp.el ends here diff --git a/elisp/geiser-kawa-eval-util.el b/elisp/geiser-kawa-eval-util.el new file mode 100644 index 0000000..6f235f4 --- /dev/null +++ b/elisp/geiser-kawa-eval-util.el @@ -0,0 +1,28 @@ +;; Copyright (C) 2020 spellcard199 <spellcard...@protonmail.com> + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the Modified BSD License. You should +;; have received a copy of the license along with this program. If +;; not, see <http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5>. + +(require 'geiser-eval) + +;; Simple wrappers for geiser functions. + +(defun geiser-kawa-eval--to-res (sexp) + (let* ((question + (format "(geiser:eval (interaction-environment) %S)" + (format "%S" sexp))) + (answer (geiser-eval--send/wait question))) + + (if (assoc 'error answer) + (signal 'peculiar-error + (list (string-trim + (car (split-string (geiser-eval--retort-output + answer) + "\t"))))) + ;; from: ((result "expr-tree") (output . ...)) + ;; to: "expr-tree" + (cadr (car answer))))) + +(provide 'geiser-kawa-eval-util) diff --git a/elisp/geiser-kawa-exprtree.el b/elisp/geiser-kawa-exprtree.el index 61a2b07..24a735a 100644 --- a/elisp/geiser-kawa-exprtree.el +++ b/elisp/geiser-kawa-exprtree.el @@ -5,27 +5,11 @@ ;; have received a copy of the license along with this program. If ;; not, see <http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5>. -(require 'geiser-kawa-complete-java) +(require 'geiser-kawa-eval-util) (defvar geiser-kawa-exprtree-buffer "*kawa exprtree*" "Buffer where Expression tree is showed") -(defun geiser-kawa-eval--to-res (sexp) - (let* ((question - (format "(geiser:eval (interaction-environment) %S)" - (format "%S" sexp))) - (answer (geiser-eval--send/wait question))) - - (if (assoc 'error answer) - (signal 'peculiar-error - (list (string-trim - (car (split-string (geiser-eval--retort-output - answer) - "\t"))))) - ;; from: ((result "expr-tree") (output . ...)) - ;; to: "expr-tree" - (cadr (car answer))))) - (defun geiser-kawa-exprtree--view (expr-tree) (with-current-buffer (get-buffer-create geiser-kawa-exprtree-buffer) @@ -39,14 +23,9 @@ (defun geiser-kawa-exprtree--for-expression (code-str) (geiser-kawa-eval--to-res - ;; Kawa sexp here - `(invoke - (kawadevutil.ast.AstElemWrapper - (kawadevutil.compile.Compile:compileStr - ,code-str)) - 'formatElem java.lang.Boolean:TRUE))) + `(geiser:expr-tree-formatted ,code-str))) -(defun geiser-kawa-exprtree-for-expression () +(defun geiser-kawa-exprtree-sexp () (interactive) "If region is active send region, otherwise send last expression." (let* ((code-str @@ -60,26 +39,6 @@ code-str))) (geiser-kawa-exprtree--view expr-tree))) -(defun geiser-kawa-exprtree--for-fmp-completion(code-str cursor-index) - (geiser-kawa-eval--to-res - ;; Kawa sexp here - `(kawageiser.java.GeiserCompleteJava:getExprTreeAndFormat - ,code-str - ,cursor-index))) - -(defun geiser-kawa-exprtree-for-fmp-completion () - (interactive) - (let* ((code-and-point-data - (geiser-kawa-complete-java--code-point-from-toplevel)) - (code-str (cdr (assoc "code-str" - code-and-point-data))) - (cursor-index (cdr (assoc "cursor-index" - code-and-point-data))) - (expr-tree (geiser-kawa-exprtree--for-fmp-completion - code-str cursor-index))) - (geiser-kawa-exprtree--view expr-tree))) - (provide 'geiser-kawa-exprtree) ;;; geiser-kawa-exprtree.el ends here - diff --git a/pom.xml b/pom.xml index 407c9b8..e524782 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ <dependency> <groupId>com.gitlab.spellcard199</groupId> <artifactId>kawa-devutil</artifactId> - <version>457dd8be41dd4d0a97097c3a56a6931878233fb2</version> + <version>8e0eefcee1e7cd12d6929cbecd2584f8fc5bca2e</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 2a20ca3..1909257 100644 --- a/src/main/java/kawageiser/Geiser.java +++ b/src/main/java/kawageiser/Geiser.java @@ -39,8 +39,10 @@ public class Geiser implements Runnable { procMap.put("geiser:completions", "kawageiser.GeiserCompleteSymbol:getCompletions"); procMap.put("geiser:no-values", "kawageiser.GeiserNoValues:noValues"); procMap.put("geiser:complete-java", "kawageiser.java.GeiserCompleteJava:completeJava"); - procMap.put("geiser:manual-epub-unzip-to-tmp-dir", "kawageiser.geiserDoc.ManualEpubUnzipToTmpDir:unzipToTmpDir"); + procMap.put("geiser:complete-java-show-expr-tree", "kawageiser.java.GeiserCompleteJava:getExprTreeFormatted"); + procMap.put("geiser:manual-epub-unzip-to-tmp-dir", "kawageiser.docutil.ManualEpubUnzipToTmpDir:unzipToTmpDir"); procMap.put("geiser:macroexpand", "kawageiser.GeiserMacroexpand:expand"); + procMap.put("geiser:expr-tree-formatted", "kawageiser.exprtree.ExprTree:getExprTreeFormatted"); try { if (lang.lookup("geiser:eval") == null) { diff --git a/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java b/src/main/java/kawageiser/docutil/ManualEpubUnzipToTmpDir.java similarity index 96% rename from src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java rename to src/main/java/kawageiser/docutil/ManualEpubUnzipToTmpDir.java index 170c2de..25876b6 100644 --- a/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java +++ b/src/main/java/kawageiser/docutil/ManualEpubUnzipToTmpDir.java @@ -3,7 +3,7 @@ * This is free software; for terms and warranty disclaimer see ./COPYING. */ -package kawageiser.geiserDoc; +package kawageiser.docutil; import java.io.File; import java.io.IOException; diff --git a/src/main/java/kawageiser/exprtree/ExprTree.java b/src/main/java/kawageiser/exprtree/ExprTree.java new file mode 100644 index 0000000..dd3b42b --- /dev/null +++ b/src/main/java/kawageiser/exprtree/ExprTree.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2020 spellcard199 <spellcard...@protonmail.com> + * This is free software; for terms and warranty disclaimer see ./COPYING. + */ + +package kawageiser.exprtree; + +import gnu.expr.Language; +import gnu.mapping.Environment; +import kawadevutil.ast.AstElemWrapper; + +import java.io.IOException; + +public class ExprTree { + + public static AstElemWrapper + getExprTree(String codeStr, Language lang, Environment env) + throws IOException { + return new kawadevutil.ast.AstElemWrapper(codeStr, lang, env); + } + + public static AstElemWrapper + getExprTree(String codeStr) throws IOException { + return getExprTree(codeStr, Language.getDefaultLanguage(), Environment.user()); + } + + public static String + getExprTreeFormatted(String codeStr, Language lang, Environment env) + throws IOException { + return getExprTree(codeStr, lang, env).formatElem(true); + } + + public static String + getExprTreeFormatted(String codeStr) throws IOException { + return getExprTree(codeStr).formatElem(true); + } +} diff --git a/src/main/java/kawageiser/java/GeiserCompleteJava.java b/src/main/java/kawageiser/java/GeiserCompleteJava.java index 653e2fe..d2664ce 100644 --- a/src/main/java/kawageiser/java/GeiserCompleteJava.java +++ b/src/main/java/kawageiser/java/GeiserCompleteJava.java @@ -24,9 +24,7 @@ import java.util.stream.Collectors; public class GeiserCompleteJava { public static String - completeJava( - IString codeStr, - IntNum cursorIndex) + completeJava(IString codeStr, IntNum cursorIndex) throws Throwable { return completeJava( codeStr, @@ -36,11 +34,8 @@ public class GeiserCompleteJava { } public static String - completeJava( - IString codeStr, - IntNum cursorIndex, - Language lang, - Environment env) + completeJava(IString codeStr, IntNum cursorIndex, Language lang, + Environment env) throws Throwable { // Get Data @@ -74,8 +69,7 @@ public class GeiserCompleteJava { } private static LList - toLList( - CompletionDataForJavaFOM complData) { + toLList(CompletionDataForJavaFOM complData) { String completionsForClass = complData.getForClass().getName(); // I don't know why it says "unchecked call" when using complData.getRequiredModifiers().stream() ArrayList<String> modifiers = new ArrayList<>(); @@ -93,8 +87,7 @@ public class GeiserCompleteJava { } private static LList - toLList( - CompletionDataForJavaPackage complData) { + toLList(CompletionDataForJavaPackage complData) { ArrayList<LList> res = new ArrayList<>(getCommonData(complData)); res.addAll(Arrays.asList( LList.list2("package-name", complData.getPinfo().getName()) @@ -103,8 +96,7 @@ public class GeiserCompleteJava { } private static List<LList> - getCommonData( - CompletionDataForJava complData) { + getCommonData(CompletionDataForJava complData) { CompletionDataForJava.FieldOrMethodOrPackage fieldOrMethod = complData.getFieldOrMethodOrPackage(); List<String> names = (List<String>) complData.getNames().stream().distinct().collect(Collectors.toList()); String beforeCursor = complData.getCursorMatcher().getCursorMatch().getBeforeCursor(); @@ -120,11 +112,8 @@ public class GeiserCompleteJava { } public static Optional<AstElemWrapper> - getExprTreeMaybe( - IString codeStr, - IntNum cursorIndex, - Language lang, - Environment env) + getExprTreeMaybe(IString codeStr, IntNum cursorIndex, Language lang, + Environment env) throws IOException { Optional<CompletionDataForJava> complDataMaybe = kawadevutil.complete.java.CompleteJavaFMP.complete( @@ -138,33 +127,23 @@ public class GeiserCompleteJava { } public static Optional<AstElemWrapper> - getExprTreeMaybe( - IString codeStr, - IntNum cursorIndex) + getExprTreeMaybe(IString codeStr, IntNum cursorIndex) throws IOException { return getExprTreeMaybe( - codeStr, - cursorIndex, - Language.getDefaultLanguage(), - Environment.user()); - + codeStr, cursorIndex, + Language.getDefaultLanguage(), Environment.user()); } - public static String getExprTreeAndFormat( - IString codeStr, - IntNum cursorIndex, - Language lang, - Environment env) + public static String getExprTreeFormatted(IString codeStr, IntNum cursorIndex, + Language lang, Environment env) throws IOException { return getExprTreeMaybe(codeStr, cursorIndex, lang, env) .map(complData -> complData.formatElem(true)).get(); } - public static String getExprTreeAndFormat( - IString codeStr, - IntNum cursorIndex) + public static String getExprTreeFormatted(IString codeStr, IntNum cursorIndex) throws IOException { - return getExprTreeAndFormat( + return getExprTreeFormatted( codeStr, cursorIndex, Language.getDefaultLanguage(),