summaryrefslogtreecommitdiff
path: root/scheme/chibi
diff options
context:
space:
mode:
authorLockywolf <lockywolf@gmail.com>2019-08-09 01:51:14 +0800
committerLockywolf <lockywolf@gmail.com>2019-08-09 01:51:14 +0800
commit19a5daaec41aea330c081bd0b1fe228f7a5bb998 (patch)
tree7286636fc66707fdc9094ff34f02bb1a7e2b52ad /scheme/chibi
parentce933c3c54c2bbc836c0c87e9fa3ace57fa2689c (diff)
downloadgeiser-guile-19a5daaec41aea330c081bd0b1fe228f7a5bb998.tar.gz
geiser-guile-19a5daaec41aea330c081bd0b1fe228f7a5bb998.tar.bz2
Add a first version of geiser:symbol-location for local files.
Diffstat (limited to 'scheme/chibi')
-rw-r--r--scheme/chibi/geiser/geiser.scm132
-rw-r--r--scheme/chibi/geiser/geiser.sld7
2 files changed, 123 insertions, 16 deletions
diff --git a/scheme/chibi/geiser/geiser.scm b/scheme/chibi/geiser/geiser.scm
index 9218646..a147b36 100644
--- a/scheme/chibi/geiser/geiser.scm
+++ b/scheme/chibi/geiser/geiser.scm
@@ -19,6 +19,11 @@
(write form out)
(get-output-string out)))
+(define (geiser:write/ss-to-string form)
+ (let ((out (open-output-string)))
+ (write/ss form out)
+ (get-output-string out)))
+
;;> Evaluate a \var{form} in the namespace of the \var{module}.
;;> The meaning of \var{rest} is unknown.
;;> Return the alist with the first field, \scheme{result}, holds
@@ -30,15 +35,20 @@
rest
(guard (err (else (write `((result ,(show #f err))))))
(let* ((output (open-output-string))
- (result (parameterize ((current-output-port output))
- (if module
- (let ((mod (module-env (find-module module))))
- (eval form mod))
- (eval form)))))
+ (result (parameterize ((current-output-port output))
+ (if module
+ (let ((mod (module-env (find-module module))))
+ (eval form mod))
+ (eval form))
+ )
+ ))
(write `((result ,(write-to-string result))
(output . ,(get-output-string output))))))
(values))
+
+; (display "debug:Hello\n")
+
(define (geiser:module-completions prefix . rest)
;; (available-modules) walks the directory tree and is too slow
(let ((modules (map car *modules*)))
@@ -107,12 +117,104 @@
;;> \var{line} is the line number starting from 0 (scheme way).
(define (make-location file line)
- (list (cons "file" (if (string? file) file '()))
- (cons "line" (if (number? line) (+ 1 line) '()))))
-
-
-;TODO: (define (geiser:symbol-location) ; implement this method in order to make
+ (list (cons "file"
+ (if (string? file)
+ (path-resolve
+ file
+ (current-directory))
+ '()))
+ (cons "line" (if (number? line) (+ 1 line) '())))
+)
+
+
+;TODO: (define (geiser:symbol-location)
+; implement this method in order to make
; xref work better in Chibi. For reference, see [[geiser:module-location]]
+; (analyze-module (caar (modules-exporting-identifier 'symbol-in-question)))
+;(module-ast (analyze-module (caar (modules-exporting-identifier 'ckind))))
+(define (geiser:symbol-location symbol-in-question . rest)
+ (let* (
+ (result (tree-walker
+ (module-ast
+ (analyze-module
+ (caar
+ (modules-exporting-identifier
+ symbol-in-question))))
+ symbol-in-question))
+ (location
+ (make-location
+ (car result)
+ (- (cdr result) 1))) ; Ehh... line numbering in 'make-location starts from 0
+ )
+ location
+ )
+)
+
+(define (tree-walker node . symbol-in-question)
+; The reason this function used a (let), not a (begin) is that (begin)
+; for some reason does not allow (display)s inside. It
+; works in xfce4-terminal, but not here. I decided not to
+; debug it, since (do) "just worked". TODO.
+
+ (if (pair? node)
+ (let ((result
+ (tree-walker
+ (car node)
+ (car symbol-in-question)))
+ )
+ (if result
+ result
+ (tree-walker (cdr node) (car symbol-in-question))
+ )
+ )
+ (let () ; we have leaf
+ (if (set? node)
+ (if (equal? (ref-name (set-var node)) (car symbol-in-question))
+ (let ((thingy (set-value node)))
+ (if (lambda? thingy)
+ (lambda->lcons thingy)
+ (set-node->lcons/dirty-trick node)
+ )
+ )
+ #f
+ )
+ #f
+ )
+ )
+ )
+ )
+
+(define (lambda->lcons thingy)
+ (let* ((l-source (lambda-source thingy))
+ (l-location
+ (cons
+ (car l-source)
+ (cdr l-source))))
+ l-location
+ ))
+
+(define (set-node->lcons/dirty-trick node)
+ (let* ((exam2 (geiser:write/ss-to-string node))
+ (strl (string-length exam2))
+ (l-matches
+ (regexp-search
+ '(: "(\""
+ (-> filename (*? graphic) )
+ "\" . "
+ (-> lineno (+ num) )
+ ")}")
+ exam2 ))
+ (l-filename
+ (regexp-match-submatch l-matches 'filename))
+ (l-lineno
+ (string->number
+ (regexp-match-submatch l-matches 'lineno)))
+ (l-location
+ (cons l-filename l-lineno)))
+ l-location))
+
+;(geiser:symbol-location 'run-application)
+
;;> A function to find the file where the symbol
@@ -120,9 +222,11 @@
(define (geiser:module-location symbol-representing-module)
(make-location
- (string-append (current-directory) "/"
- (find-module-file
+ (find-module-file
(module-name->file
(module-name
- (find-module symbol-representing-module)))))
- 0 ) )
+ (find-module symbol-representing-module))))
+ 0 )
+)
+
+
diff --git a/scheme/chibi/geiser/geiser.sld b/scheme/chibi/geiser/geiser.sld
index 8e43fb8..86f871a 100644
--- a/scheme/chibi/geiser/geiser.sld
+++ b/scheme/chibi/geiser/geiser.sld
@@ -5,7 +5,7 @@
geiser:autodoc
geiser:module-completions
geiser:no-values
-;TODO: geiser:symbol-location ; implement this interface in [[file://./geiser.scm#geiser:symbol-location]] in order to make proper cross-referencing working.
+ geiser:symbol-location ; implement this interface in [[file://./geiser.scm#geiser:symbol-location]] in order to make proper cross-referencing working.
geiser:module-location
geiser:newline)
(import
@@ -13,10 +13,13 @@
(chibi modules)
(chibi)
(chibi filesystem)
+ (chibi pathname)
(meta)
(chibi ast)
(chibi string)
(srfi 1)
(srfi 95)
- (chibi show))
+ (srfi 38)
+ (chibi show)
+ (srfi 115))
(include "geiser.scm"))