Fixing snow doc extraction for multiple levels of includes.

This commit is contained in:
Alex Shinn 2017-01-19 23:58:09 +09:00
parent a169e19159
commit 29328bfc9d
8 changed files with 152 additions and 45 deletions

View file

@ -556,10 +556,11 @@ div#footer {padding-bottom: 50px}
'())))))))))))) '()))))))))))))
(define (get-procedure-signature mod id proc) (define (get-procedure-signature mod id proc)
(protect (exn (else '()))
(cond ((and mod (procedure? proc) (procedure-signature id mod)) (cond ((and mod (procedure? proc) (procedure-signature id mod))
=> (lambda (sig) => (lambda (sig)
(list (cons (or id (procedure-name proc)) (cdr sig))))) (list (cons (or id (procedure-name proc)) (cdr sig)))))
(else '()))) (else '()))))
(define (get-value-signature mod id proc name value) (define (get-value-signature mod id proc name value)
(match value (match value
@ -904,21 +905,27 @@ div#footer {padding-bottom: 50px}
(else #f))) (else #f)))
;; helper for below functions ;; helper for below functions
(define (extract-module-docs-from-files mod srcs includes stubs strict? exports) (define (extract-module-docs-from-files mod srcs includes stubs strict? exports . o)
(let ((defs (map (lambda (x) (let ((dir (or (and (pair? o) (car o)) (module-dir mod)))
(defs (map (lambda (x)
(let ((val (and mod (module-ref mod x)))) (let ((val (and mod (module-ref mod x))))
`(,x ,val ,(object-source val)))) `(,x ,val ,(object-source val))))
exports))) exports)))
(define (resolve-file file)
(let ((res (make-path dir file)))
(if (file-exists? res)
res
file)))
(append (append
(reverse (reverse
(append-map (lambda (x) (append-map (lambda (x)
(extract-file-docs mod x defs strict? 'module)) (extract-file-docs mod (resolve-file x) defs strict? 'module))
srcs)) srcs))
(reverse (reverse
(append-map (lambda (x) (extract-file-docs mod x defs strict?)) (append-map (lambda (x) (extract-file-docs mod (resolve-file x) defs strict?))
includes)) includes))
(reverse (reverse
(append-map (lambda (x) (extract-file-docs mod x defs strict? 'ffi)) (append-map (lambda (x) (extract-file-docs mod (resolve-file x) defs strict? 'ffi))
stubs))))) stubs)))))
;;> Extract the literate Scribble docs from module \var{mod-name} and ;;> Extract the literate Scribble docs from module \var{mod-name} and
@ -949,30 +956,54 @@ div#footer {padding-bottom: 50px}
(memq (caar forms) '(define-library library)))) (memq (caar forms) '(define-library library))))
(error "file doesn't define a library" file)) (error "file doesn't define a library" file))
(let* ((mod-form (car forms)) (let* ((mod-form (car forms))
(mod-name (cadr mod-form))) (mod-name (cadr mod-form))
(load file (vector-ref (find-module '(meta)) 1)) (lib-dir (module-lib-dir file mod-name))
(let* ((mod (protect (exn (else #f)) (load-module mod-name))) (orig-mod-path (current-module-path))
(dir (path-directory file)) (new-mod-path (cons lib-dir orig-mod-path))
(resolve (lambda (f) (make-path dir f)))) (mod (protect (exn (else #f))
(define (get-forms name) (dynamic-wind
(lambda () (current-module-path new-mod-path))
(lambda ()
(let ((mod (load-module mod-name)))
(protect (exn (else #f)) (analyze-module mod-name))
mod))
(lambda () (current-module-path orig-mod-path)))))
(dir (path-directory file)))
(define (get-forms ls names dir . o)
(let ((resolve? (and (pair? o) (car o))))
(let lp ((ls ls) (res '()))
(if (null? ls)
(reverse res)
(let ((x (car ls)))
(lp (cdr ls)
(append
(if (and (pair? x) (memq (car x) names))
(map (lambda (y)
(if (and resolve? (string? y))
(make-path dir y)
y))
(reverse (cdr x)))
'())
(if (and (pair? x)
(eq? 'include-library-declarations (car x)))
(append-map (append-map
(lambda (x) (if (and (pair? x) (eq? name (car x))) (cdr x) '())) (lambda (inc)
(cddr mod-form))) (let* ((file (make-path dir inc))
(sexps (file->sexp-list file))
(dir (path-directory file)))
(get-forms sexps names dir resolve?)))
(cdr x))
'())
res)))))))
(define (get-exports) (define (get-exports)
(if mod (module-exports mod) (get-forms 'exports))) (if mod (module-exports mod) (get-forms (cddr mod-form) '(exports) dir)))
(define (get-decls) (define (get-decls)
(if mod (get-forms (cddr mod-form) '(include-library-declarations) dir #t))
(module-include-library-declarations mod)
(map resolve (get-forms 'include-library-declarations))))
(define (get-includes) (define (get-includes)
(if mod (get-forms (cddr mod-form) '(include include-ci) dir #t))
(module-includes mod)
(map resolve (get-forms 'include))))
(define (get-shared-includes) (define (get-shared-includes)
(if mod (get-forms (cddr mod-form) '(shared-include) dir #t))
(module-shared-includes mod)
(map resolve (get-forms 'shared-include))))
(let* ((exports (if (pair? o) (car o) (get-exports))) (let* ((exports (if (pair? o) (car o) (get-exports)))
(srcs (cons file (get-decls)))) (srcs (cons file (get-decls))))
(extract-module-docs-from-files (extract-module-docs-from-files
mod srcs (get-includes) (get-shared-includes) strict? exports)))))) mod srcs (get-includes) (get-shared-includes) strict? exports)))))

View file

@ -36,8 +36,21 @@
"" ""
(module-name-prefix name)))) (module-name-prefix name))))
(define (module-metas mod metas) ;; assuming mod-name was found in file, resolves to the containing lib dir
(let ((mod (if (module? mod) mod (find-module mod)))) (define (module-lib-dir file mod-name)
(let lp ((ls (map (lambda (x)
(if (number? x) (number->string x) (symbol->string x)))
(reverse mod-name)))
(path (reverse (string-split (path-strip-extension file) #\/))))
(if (and (pair? ls) (pair? path) (equal? (car ls) (car path)))
(lp (cdr ls) (cdr path))
(if (null? path)
"."
(string-join (reverse path) "/")))))
(define (module-metas mod metas . o)
(let* ((mod (if (module? mod) mod (find-module mod)))
(dir (if (pair? o) (car o) (module-dir mod))))
(let lp ((ls (module-meta-data mod)) (res '())) (let lp ((ls (module-meta-data mod)) (res '()))
(cond (cond
((not (pair? ls)) (reverse res)) ((not (pair? ls)) (reverse res))
@ -50,7 +63,7 @@
(dir (module-dir mod))) (dir (module-dir mod)))
(define (module-file f) (define (module-file f)
(find-module-file (string-append dir f))) (find-module-file (string-append dir f)))
(map module-file (reverse (module-metas mod decls))))) (map module-file (reverse (module-metas mod decls dir)))))
(define (module-includes mod) (define (module-includes mod)
(module-extract-declaration-files mod '(include))) (module-extract-declaration-files mod '(include)))
@ -71,8 +84,10 @@
(define (analyze-module-source name mod recursive?) (define (analyze-module-source name mod recursive?)
(let ((env (make-environment)) (let ((env (make-environment))
(dir (module-dir mod))) (dir (module-dir mod)))
(define (resolve-file file)
(find-module-file (string-append dir file)))
(define (include-source file) (define (include-source file)
(cond ((find-module-file (string-append dir file)) (cond ((resolve-file file)
=> (lambda (x) (cons 'begin (file->sexp-list x)))) => (lambda (x) (cons 'begin (file->sexp-list x))))
(else (error "couldn't find include" file)))) (else (error "couldn't find include" file))))
(cond (cond
@ -100,7 +115,7 @@
((include include-ci) ((include include-ci)
(lp (append (map include-source (cdar ls)) (cdr ls)) res)) (lp (append (map include-source (cdar ls)) (cdr ls)) res))
((include-library-declarations) ((include-library-declarations)
(lp (append (append-map file->sexp-list (cdar ls)) (cdr ls)) res)) (lp (append (append-map file->sexp-list (map resolve-file (cdar ls))) (cdr ls)) res))
((begin body) ((begin body)
(let lp2 ((ls2 (cdar ls)) (res res)) (let lp2 ((ls2 (cdar ls)) (res res))
(cond (cond

View file

@ -1,16 +1,23 @@
(define-library (chibi modules) (define-library (chibi modules)
(export module? module-name module-dir module-includes module-shared-includes (export module? module-name module-dir module-includes module-shared-includes
module-include-library-declarations module-include-library-declarations module-meta-data
module-ast module-ast-set! module-ref module-contains? module-ast module-ast-set! module-ref module-contains?
analyze-module containing-module load-module module-exports analyze-module containing-module load-module module-exports
module-name->file procedure-analysis find-module module-name->file module-lib-dir procedure-analysis find-module
available-modules-in-directory available-modules available-modules-in-directory available-modules
modules-exporting-identifier file->sexp-list) modules-exporting-identifier file->sexp-list)
(import (chibi) (srfi 1) (chibi ast) (chibi filesystem) (import (chibi)
(srfi 1)
(chibi ast)
(chibi pathname)
(chibi filesystem)
(chibi string)
(only (meta) (only (meta)
module-env module-meta-data module-exports module-env module-meta-data module-exports
make-module load-module find-module resolve-import make-module load-module find-module resolve-import
resolve-module-imports resolve-module-imports
module-name-prefix module-name->file *modules*)) module-name-prefix
module-name->file
*modules*))
(include "modules.scm")) (include "modules.scm"))

View file

@ -0,0 +1,3 @@
;;> Library for computing the natural exponential function.
(include "exponential.scm")

View file

@ -0,0 +1,19 @@
(define-library (euler exponential-test)
(export run-tests)
(import (scheme base) (scheme process-context) (euler exponential))
(begin
(define (test expect expr)
(cond
((not (or (equal? expect expr)
(and (or (inexact? expect) (inexact? expr))
(let ((a (min expect expr))
(b (max expect expr)))
(< (abs (/ (- a b) b)) 0.000001)))))
(write-string "FAIL\n")
(exit 1))))
(define (run-tests)
(test 0.36788 (e -1.0))
(test 1.0 (e 0.0))
(test 2.71828 (e 1.0))
(test 4.48167 (e 1.5))
(test 7.38871 (e 2.0)))))

View file

@ -0,0 +1,10 @@
;;> Returns e^\var{x}.
(define e
(let ((iterations 10))
(lambda (x)
(let lp ((i 1) (num 1) (den 1) (res 0))
(if (> i iterations)
res
(lp (+ i 1) (* num x) (* den i) (+ res (/ num den))))))))

View file

@ -0,0 +1,5 @@
(define-library (euler exponential)
(export e)
(import (scheme base) (scheme inexact))
(include-library-declarations "exponential-include.sld"))

View file

@ -288,6 +288,8 @@
(snow ,@repo4 package --output-dir tests/snow/repo4/ (snow ,@repo4 package --output-dir tests/snow/repo4/
tests/snow/repo4/euler/interest.sld) tests/snow/repo4/euler/interest.sld)
(snow ,@repo4 package --output-dir tests/snow/repo4/
tests/snow/repo4/euler/exponential.sld)
(snow index ,(cadr repo4)) (snow index ,(cadr repo4))
(let* ((pkg-file "tests/snow/repo4/euler-interest-2.3.tgz") (let* ((pkg-file "tests/snow/repo4/euler-interest-2.3.tgz")
(pkg (package-file-meta pkg-file)) (pkg (package-file-meta pkg-file))
@ -304,6 +306,21 @@
(run-tests run-euler-interest-test-tests))) (run-tests run-euler-interest-test-tests)))
(run-euler-interest-test-tests)) (run-euler-interest-test-tests))
(snowball-test->sexp-list pkg pkg-file))) (snowball-test->sexp-list pkg pkg-file)))
(let* ((pkg-file "tests/snow/repo4/euler-exponential-2.3.tgz")
(pkg (package-file-meta pkg-file))
(libs (package-libraries pkg)))
(test 2 (length libs))
(for-each
(lambda (lib)
(test "Leonhard Euler" (assoc-get lib 'author)))
libs)
(test 'bsd (assoc-get pkg 'license))
(test "Library for computing the natural exponential function."
(assoc-get pkg 'description))
(test '((import (rename (euler exponential-test)
(run-tests run-euler-exponential-test-tests)))
(run-euler-exponential-test-tests))
(snowball-test->sexp-list pkg pkg-file)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; multiple repos ;; multiple repos