diff options
author | jao <jao@gnu.org> | 2022-10-15 07:15:54 +0100 |
---|---|---|
committer | jao <jao@gnu.org> | 2022-10-15 07:15:54 +0100 |
commit | f00dcb93477ef97c215debf6267192cd0dd94e22 (patch) | |
tree | 6c0e48169e0249864bed851c1365677834e7b93f /src/geiser | |
parent | d956d445a375494135dab4780d7feede99e4ce34 (diff) | |
download | geiser-chez-f00dcb93477ef97c215debf6267192cd0dd94e22.tar.gz geiser-chez-f00dcb93477ef97c215debf6267192cd0dd94e22.tar.bz2 |
namespace-conscientious completion
Diffstat (limited to 'src/geiser')
-rw-r--r-- | src/geiser/geiser.ss | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/src/geiser/geiser.ss b/src/geiser/geiser.ss index 8311dd5..8434d19 100644 --- a/src/geiser/geiser.ss +++ b/src/geiser/geiser.ss @@ -22,8 +22,9 @@ geiser:symbol-location geiser:module-location geiser:add-to-load-path) - (import (chezscheme)) - (import (geiser-data)) + + (import (chezscheme)) + (import (geiser-data)) (define-syntax as-string (syntax-rules () ((_ b ...) (with-output-to-string (lambda () b ...))))) @@ -99,19 +100,34 @@ (and (char=? (string-ref x i) (string-ref y i)) (prefix? (fx+ i 1))))))))) - (define (geiser:completions prefix . rest) - (sort string-ci<? - (filter (lambda (el) - (string-prefix? prefix el)) - (map write-to-string - (environment-symbols (interaction-environment)))))) - (define current-library (make-parameter #f)) (define (transitive-env . lib) (let ((lib (if (null? lib) (current-library) (car lib)))) (and lib (apply environment lib (library-requirements lib))))) + (define (known-symbols) + (let ((lib (current-library))) + (if lib + (apply append (map library-exports + (cons lib (library-requirements lib)))) + (environment-symbols (interaction-environment))))) + + (define symbol-lib + (rec symbol-lib + (case-lambda + ((s) + (let ((libs (if (current-library) + (cons (current-library) + (library-requirements (current-library))) + (interaction-environment)))) + (symbol-lib s libs))) + ((s l) + (cond ((null? l) #f) + ((and (environment? l) (memq s (environment-symbols l))) "*top*") + ((memq s (library-exports (car l))) (car l)) + (else (symbol-lib s (cdr l)))))))) + (define not-found (gensym)) (define (try-eval sym) @@ -131,6 +147,11 @@ (parameterize ([current-library lib]) (call-with-result (lambda () (eval form))))) + (define (geiser:completions prefix) + (sort string-ci<? + (filter (lambda (el) (string-prefix? prefix el)) + (map symbol->string (known-symbols))))) + (define (geiser:module-completions prefix . rest) (define (substring? s1 s2) (let ([n1 (string-length s1)] [n2 (string-length s2)]) @@ -190,11 +211,6 @@ (l (string-length s))) (if (<= l max-len) s (string-append (substring s 0 sub-len) sub-str)))) - (define (known-symbol? id) - (memq id - (environment-symbols (or (transitive-env) - (interaction-environment))))) - (define (id-autodoc id) (define (procedure-parameter-list id p) (and (procedure? p) @@ -207,12 +223,15 @@ (else `(("required" . ,(reverse req)) ("optional" ,args))))) (define (autodoc-arglist arglist) (autodoc-arglist* arglist '())) - (define (signature as) `(,id ("args" ,@(map autodoc-arglist as)))) - (let ([binding (try-eval id)]) - (cond ((not (eq? binding not-found)) + (define lib (symbol-lib id)) + (define (signature as) + `(,id ("args" ,@(map autodoc-arglist as)) + ,@(if (list? lib) (list (cons "module" (write-to-string lib))) '()))) + (let ((binding (and lib (try-eval id)))) + (cond ((and binding (not (eq? binding not-found))) (let ([as (procedure-parameter-list id binding)]) (if as (signature as) `(,id ("value" . ,(value->string binding)))))) - ((and (known-symbol? id) (symbol-signatures id)) => signature) + ((and lib (symbol-signatures id)) => signature) (else '())))) (define (geiser:autodoc ids) |