[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/geiser-kawa 79dec54 061/119: Add support for viewing Expre
From: |
Philip Kaludercic |
Subject: |
[nongnu] elpa/geiser-kawa 79dec54 061/119: Add support for viewing Expression tree |
Date: |
Sun, 1 Aug 2021 18:30:39 -0400 (EDT) |
branch: elpa/geiser-kawa
commit 79dec5450e57495f9e38b1006bd104b3bed746eb
Author: spellcard199 <spellcard199@protonmail.com>
Commit: spellcard199 <spellcard199@protonmail.com>
Add support for viewing Expression tree
---
elisp/geiser-kawa-etree.el | 85 +++++++++++++
elisp/geiser-kawa-exprtree.el | 85 +++++++++++++
elisp/geiser-kawa.el | 1 +
pom.xml | 2 +-
.../java/kawageiser/java/GeiserCompleteJava.java | 133 ++++++++++++++++-----
5 files changed, 278 insertions(+), 28 deletions(-)
diff --git a/elisp/geiser-kawa-etree.el b/elisp/geiser-kawa-etree.el
new file mode 100644
index 0000000..9941068
--- /dev/null
+++ b/elisp/geiser-kawa-etree.el
@@ -0,0 +1,85 @@
+;; Copyright (C) 2020 spellcard199 <spellcard199@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-kawa-complete-java)
+
+(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)
+ (View-quit)
+ (delete-region (point-min) (point-max))
+ (insert expr-tree)
+ (goto-char (point-min)))
+
+ (view-buffer-other-window
+ geiser-kawa-exprtree-buffer))
+
+(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)))
+
+(defun geiser-kawa-exprtree-for-expression ()
+ (interactive)
+ "If region is active send region, otherwise send last expression."
+ (let* ((code-str
+ (if (region-active-p)
+ (buffer-substring-no-properties reg-beg reg-end)
+ (save-excursion
+ (let ((sexp-beg (progn (backward-sexp) (point)))
+ (sexp-end (progn (forward-sexp) (point))))
+ (buffer-substring-no-properties sexp-beg sexp-end)))))
+ (expr-tree (geiser-kawa-exprtree--for-expression
+ 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/elisp/geiser-kawa-exprtree.el b/elisp/geiser-kawa-exprtree.el
new file mode 100644
index 0000000..9941068
--- /dev/null
+++ b/elisp/geiser-kawa-exprtree.el
@@ -0,0 +1,85 @@
+;; Copyright (C) 2020 spellcard199 <spellcard199@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-kawa-complete-java)
+
+(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)
+ (View-quit)
+ (delete-region (point-min) (point-max))
+ (insert expr-tree)
+ (goto-char (point-min)))
+
+ (view-buffer-other-window
+ geiser-kawa-exprtree-buffer))
+
+(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)))
+
+(defun geiser-kawa-exprtree-for-expression ()
+ (interactive)
+ "If region is active send region, otherwise send last expression."
+ (let* ((code-str
+ (if (region-active-p)
+ (buffer-substring-no-properties reg-beg reg-end)
+ (save-excursion
+ (let ((sexp-beg (progn (backward-sexp) (point)))
+ (sexp-end (progn (forward-sexp) (point))))
+ (buffer-substring-no-properties sexp-beg sexp-end)))))
+ (expr-tree (geiser-kawa-exprtree--for-expression
+ 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/elisp/geiser-kawa.el b/elisp/geiser-kawa.el
index ff9011c..c9207a2 100644
--- a/elisp/geiser-kawa.el
+++ b/elisp/geiser-kawa.el
@@ -37,6 +37,7 @@
(require 'cl)
(require 'geiser-kawa-complete-java)
+(require 'geiser-kawa-exprtree)
;;; Code:
diff --git a/pom.xml b/pom.xml
index 935aa0d..ae97614 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,7 +63,7 @@
<dependency>
<groupId>com.gitlab.spellcard199</groupId>
<artifactId>kawa-devutil</artifactId>
- <version>5aa298138d09904a0370d93f8a4bcb46e253e71c</version>
+ <version>28c5ea885835974a52ff51682d176267596c5a82</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
diff --git a/src/main/java/kawageiser/java/GeiserCompleteJava.java
b/src/main/java/kawageiser/java/GeiserCompleteJava.java
index f1d2e4b..dd21220 100644
--- a/src/main/java/kawageiser/java/GeiserCompleteJava.java
+++ b/src/main/java/kawageiser/java/GeiserCompleteJava.java
@@ -6,12 +6,15 @@
package kawageiser.java;
import gnu.expr.Language;
+import gnu.kawa.functions.Format;
import gnu.lists.IString;
import gnu.lists.LList;
import gnu.mapping.Environment;
import gnu.math.IntNum;
+import kawadevutil.ast.AstElemWrapper;
import kawadevutil.complete.*;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -21,40 +24,59 @@ import java.util.stream.Collectors;
public class GeiserCompleteJava {
public static String
- completeJava(IString codeStr, IntNum cursorIndex, Language lang,
Environment env)
+ completeJava(
+ IString codeStr,
+ IntNum cursorIndex)
+ throws Throwable {
+ return completeJava(
+ codeStr,
+ cursorIndex,
+ Language.getDefaultLanguage(),
+ Environment.user());
+ }
+
+ public static String
+ completeJava(
+ IString codeStr,
+ IntNum cursorIndex,
+ Language lang,
+ Environment env)
throws Throwable {
// Get Data
- Optional<CompletionDataForJava> complDataMaybe =
kawadevutil.complete.Complete.complete(
- codeStr.toString(),
- Integer.valueOf(cursorIndex.toString()),
- lang,
- env,
- (String name) -> true);
+ Optional<CompletionDataForJava> complDataMaybe =
+ kawadevutil.complete.Complete.complete(
+ codeStr.toString(),
+ Integer.valueOf(cursorIndex.toString()),
+ lang,
+ env);
+ return complDataMaybe
+ .map(GeiserCompleteJava::complDataForJavaToLList)
+ .map(x -> Format.format("~S", x).toString())
+ .orElse(Format.format("~A", LList.Empty).toString());
+ }
+
+ public static LList
+ complDataForJavaToLList(
+ CompletionDataForJava complData) {
// Wrap data of interest in Scheme's LList
- String resAsStr;
- if (!complDataMaybe.isPresent()) {
- resAsStr = gnu.kawa.functions.Format.format("~A",
LList.Empty).toString();
+ LList complDataAsLList = null;
+ if (complData.getClass().equals(CompletionDataForJavaField.class)
+ ||
complData.getClass().equals(CompletionDataForJavaMethod.class)) {
+ complDataAsLList = toLList((CompletionDataForJavaFOM) complData);
+ } else if
(complData.getClass().equals(CompletionDataForJavaPackage.class)) {
+ complDataAsLList = toLList((CompletionDataForJavaPackage)
complData);
} else {
- CompletionDataForJava complData = complDataMaybe.get();
- LList res = null;
- if (complData.getClass().equals(CompletionDataForJavaField.class)
- ||
complData.getClass().equals(CompletionDataForJavaMethod.class)) {
- res = toLList((CompletionDataForJavaFOM) complData);
- } else if
(complData.getClass().equals(CompletionDataForJavaPackage.class)) {
- res = toLList((CompletionDataForJavaPackage) complData);
- } else {
- throw new Error("[BUG SPOTTED] `complData's class is one not
expected: "
- + complData.getClass().toString());
- }
- resAsStr = gnu.kawa.functions.Format.format("~S", res).toString();
+ throw new Error("[BUG SPOTTED] `complData's class is one not
expected: "
+ + complData.getClass().toString());
}
-
- return resAsStr;
+ return complDataAsLList;
}
- private static LList toLList(CompletionDataForJavaFOM complData) {
+ private static LList
+ 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<>();
@@ -71,7 +93,9 @@ public class GeiserCompleteJava {
}
- private static LList toLList(CompletionDataForJavaPackage complData) {
+ private static LList
+ toLList(
+ CompletionDataForJavaPackage complData) {
ArrayList<LList> res = new ArrayList<>(getCommonData(complData));
res.addAll(Arrays.asList(
LList.list2("package-name", complData.getPinfo().getName())
@@ -79,7 +103,9 @@ public class GeiserCompleteJava {
return LList.makeList(res);
}
- private static List<LList> getCommonData(CompletionDataForJava complData) {
+ private static List<LList>
+ 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();
@@ -93,4 +119,57 @@ public class GeiserCompleteJava {
);
return res;
}
+
+ public static Optional<AstElemWrapper>
+ getExprTreeMaybe(
+ IString codeStr,
+ IntNum cursorIndex,
+ Language lang,
+ Environment env)
+ throws IOException {
+ Optional<CompletionDataForJava> complDataMaybe =
+ kawadevutil.complete.Complete.complete(
+ codeStr.toString(),
+ Integer.valueOf(cursorIndex.toString()),
+ lang,
+ env
+ );
+ return complDataMaybe.map(complData ->
+ complData.getCursorMatcher().getRootWrapper());
+ }
+
+ public static Optional<AstElemWrapper>
+ getExprTreeMaybe(
+ IString codeStr,
+ IntNum cursorIndex)
+ throws IOException {
+ return getExprTreeMaybe(
+ codeStr,
+ cursorIndex,
+ Language.getDefaultLanguage(),
+ Environment.user());
+
+ }
+
+ public static String getExprTreeAndFormat(
+ 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)
+ throws IOException {
+ return getExprTreeAndFormat(
+ codeStr,
+ cursorIndex,
+ Language.getDefaultLanguage(),
+ Environment.user()
+ );
+ }
}
- [nongnu] elpa/geiser-kawa 4938a98 049/119: Update kawa-devutil dep + fix code accordingly, (continued)
- [nongnu] elpa/geiser-kawa 4938a98 049/119: Update kawa-devutil dep + fix code accordingly, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 5521b28 025/119: Update README after joining of geiser-kawa and kawa-geiser projects, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa b95e191 003/119: README - Add small recap table about difference from geiser-kawa-scheme, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 5549434 005/119: Add Cask file, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 590968e 045/119: Add autodoc support for constructor methods, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 47a2956 044/119: Refactor kawageiser.Geiser.java, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 9f3a057 050/119: README - Add more information about java completion + update kawa-devutil dep, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 34b68ce 052/119: Add check for deps with run-kawa is called. Uses emacs advice on run-kawa., Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 0aa42cb 040/119: Fix broken test, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa b8647aa 057/119: Fix error in func name, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 79dec54 061/119: Add support for viewing Expression tree,
Philip Kaludercic <=
- [nongnu] elpa/geiser-kawa 8d6202f 081/119: Refactor + Fix style + Copyright notices, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 1ffe084 097/119: Fixes for windows support + README.org: add instructions, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa ad862b1 090/119: Update README.org, TODO.org, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa d7cb7d9 105/119: Remove advice from "run-kawa" + add "geiser-kawa-run-kawa" function, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa ff93297 112/119: README.org - small changes, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 71f8a69 114/119: Fix checkdoc and lint warnings in preparation for melpa recipe update, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 1538f1f 062/119: TODO.org: update, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 2016503 063/119: Fix error caused by undefined reg-beg and reg-end, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa e4fc302 065/119: pom.xml: update kawa-devutil dep, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-kawa 69fbe9c 067/119: Refactor: several changes + update pom.xml for kawa-devutil, Philip Kaludercic, 2021/08/01