change the way Scribble generates keys based on modules

svn: r10170
This commit is contained in:
Matthew Flatt 2008-06-06 13:24:58 +00:00
parent a33a97de59
commit 21fd7b93b3
14 changed files with 203 additions and 94 deletions

View File

@ -183,7 +183,9 @@
(let ([s (path->string p)])
;; this is the same check that setup/setup-unit is doing in
;; `make-cc*'
(unless (or (regexp-match? #rx"^[.]" s) (equal? "compiled" s)
(unless (or (regexp-match? #rx"^[.]" s)
(equal? "compiled" s)
(equal? "doc" s)
(and (pair? omit-paths) (member s omit-paths)))
(let ([p (build-path dir p)])
(compile-directory p (get-info/full p)))))))))

View File

@ -394,12 +394,8 @@
(and (checker id) lib)))
(or source-libs null))
(and (pair? libs) (car libs)))])
(and lib (let ([p (resolved-module-path-name
(module-path-index-resolve
(module-path-index-join lib #f)))])
(if (path? p)
(intern-taglet (path->main-collects-relative p))
p)))))
(and lib (module-path-index->taglet
(module-path-index-join lib #f)))))
(define (id-to-target-maker id dep?)
(*id-to-target-maker 'def id dep?))
@ -452,10 +448,8 @@
(lambda () (car content))))))
(define (make-binding-redirect-elements mod-path redirects)
(let ([taglet (path->main-collects-relative
(resolved-module-path-name
(module-path-index-resolve
(module-path-index-join mod-path #f))))])
(let ([taglet (module-path-index->taglet
(module-path-index-join mod-path #f))])
(make-element
#f
(map
@ -1980,11 +1974,7 @@
(define (id-info id)
(let ([b (identifier-label-binding id)])
(if b
(list (let ([p (resolved-module-path-name (module-path-index-resolve
(caddr b)))])
(if (path? p)
(intern-taglet (path->main-collects-relative p))
p))
(list (caddr b)
(list-ref b 3)
(list-ref b 4)
(list-ref b 5)

View File

@ -77,7 +77,7 @@
(let* ([key (and id-element-cache
(let ([b (identifier-label-binding c)])
(vector (syntax-e c)
(module-path-index-resolve (caddr b))
(module-path-index->taglet (caddr b))
(cadddr b)
(list-ref b 5))))])
(or (and key

View File

@ -2,10 +2,16 @@
(require "struct.ss"
"basic.ss"
setup/main-collects
syntax/modcode)
syntax/modcode
syntax/modcollapse
;; Needed to normalize planet version numbers:
(only-in planet/resolver get-planet-module-path/pkg)
(only-in planet/private/data pkg-maj pkg-min))
(provide find-scheme-tag
intern-taglet)
intern-taglet
module-path-index->taglet)
(define module-info-cache (make-hasheq))
@ -34,7 +40,35 @@
(hash-set! interned v (make-weak-box v))
v)))
v)))
(define (module-path-index->taglet mod)
;; Derive the name from the module path:
(let ([p (collapse-module-path-index
mod
(current-directory))])
(if (path? p)
;; If we got a path back anyway, then it's best to use the resolved
;; name; if the current directory has changed since we
;; the path-index was resolved, then p might not be right
(intern-taglet
(path->main-collects-relative
(resolved-module-path-name (module-path-index-resolve mod))))
(let ([p (if (and (pair? p)
(eq? (car p) 'planet))
;; Normalize planet verion number based on current
;; linking:
(let-values ([(path pkg)
(get-planet-module-path/pkg p #f #f)])
(list* 'planet
(cadr p)
(list (car (caddr p))
(cadr (caddr p))
(pkg-maj pkg)
(pkg-min pkg))
(cdddr p)))
;; Otherwise the path is fully normalized:
p)])
(intern-taglet p)))))
(define (find-scheme-tag part ri stx/binding phase-level)
;; The phase-level argument is used only when `stx/binding'
@ -59,22 +93,19 @@
stx/binding]
[else
(and (not (symbol? (car stx/binding)))
(let ([p (module-path-index-join
(main-collects-relative->path (car stx/binding))
#f)])
(list #f
(cadr stx/binding)
p
(cadr stx/binding)
(if (= 2 (length stx/binding))
0
(caddr stx/binding))
(if (= 2 (length stx/binding))
0
(cadddr stx/binding))
(if (= 2 (length stx/binding))
0
(cadddr (cdr stx/binding))))))])])
(list #f
(cadr stx/binding)
(car stx/binding)
(cadr stx/binding)
(if (= 2 (length stx/binding))
0
(caddr stx/binding))
(if (= 2 (length stx/binding))
0
(cadddr stx/binding))
(if (= 2 (length stx/binding))
0
(cadddr (cdr stx/binding)))))])])
(and
(pair? b)
(let ([seen (make-hasheq)]
@ -96,10 +127,7 @@
[queue (cdr queue)])
(let* ([rmp (module-path-index-resolve mod)]
[eb (and (equal? 0 export-phase) ;; look for the phase-0 export; good idea?
(list (let ([p (resolved-module-path-name rmp)])
(if (path? p)
(intern-taglet (path->main-collects-relative p))
p))
(list (module-path-index->taglet mod)
id))])
(when (and eb
(not search-key))

View File

@ -104,25 +104,14 @@
(= 2 (length id/binding)))
(let loop ([src (car id/binding)])
(cond
[(path? src)
(if (complete-path? src)
(search (list src (cadr id/binding)))
(loop (path->complete-path src)))]
[(path-string? src)
(loop (path->complete-path src))]
[(resolved-module-path? src)
(let ([n (resolved-module-path-name src)])
(if (pair? n)
(loop n)
(search n)))]
[(module-path-index? src)
(loop (module-path-index-resolve src))]
[(module-path? src)
(loop (module-path-index-join src #f))]
[else
(raise-type-error 'xref-binding-definition->tag
"list starting with module path, resolved module path, module path index, path, or string"
src)]))]
[(module-path-index? src)
(search src)]
[(module-path? src)
(loop (module-path-index-join src #f))]
[else
(raise-type-error 'xref-binding-definition->tag
"list starting with module path or module path index"
src)]))]
[else (raise-type-error 'xref-binding-definition->tag
"identifier, 2-element list, or 7-element list"
id/binding)]))]))

View File

@ -206,16 +206,19 @@ Legal only in a @tech{module begin context}, and handled by the
(planet id)
(planet string)
(planet rel-string
(user-string pkg-string vers ...)
(user-string pkg-string vers)
rel-string ...)]
[id-maybe-renamed id
[orig-id bind-id]]
[phase-level exact-integer #f]
[vers nat
(nat nat)
(= nat)
(+ nat)
(- nat)])]{
[vers code:blank
nat
(code:line nat minor-vers)]
[minor-vers nat
(nat nat)
((unsyntax (schemeidfont "=")) nat)
((unsyntax (schemeidfont "+")) nat)
((unsyntax (schemeidfont "-")) nat)])]{
In a @tech{top-level context}, @scheme[require] instantiates modules
(see @secref["module-eval-model"]). In a @tech{module context},
@ -374,7 +377,7 @@ corresponds to the default @tech{module name resolver}.
@defsubform*[((planet id)
(planet string)
(planet rel-string (user-string pkg-string vers ...)
(planet rel-string (user-string pkg-string vers)
rel-string ...))]{
Specifies a library available via the @PLaneT server.
@ -415,8 +418,18 @@ corresponds to the default @tech{module name resolver}.
In the more general last form of a @scheme[planet] module path, the
@scheme[rel-string]s are similar to the @scheme[lib] form, except
that the @scheme[(user-string pkg-string vers ...)] names a
@|PLaneT|-based package instead of a @tech{collection}.}
that the @scheme[(user-string pkg-string vers)] names a
@|PLaneT|-based package instead of a @tech{collection}. A version
specification can include an optional major and minor version, where
the minor version can be a specific number or a constraint:
@scheme[(_nat _nat)] specifies an inclusive range, @scheme[((unsyntax
(schemeidfont "=")) _nat)] specifies an exact match,
@scheme[((unsyntax (schemeidfont "+")) _nat)] specifies a minimum
version and is equivalent to just @scheme[_nat], and
@scheme[((unsyntax (schemeidfont "-")) _nat)] specifies a maximum
version. The @schemeidfont{=}, @schemeidfont{+}, and @schemeidfont{-}
identifiers in a minor-version constraint are recognized
symbolically.}
No identifier can be bound multiple times in a given @tech{phase
level} by an import, unless all of the bindings refer to the same

View File

@ -46,9 +46,7 @@ get all cross-reference information for installed documentation.}
@defproc[(xref-binding->definition-tag [xref xref?]
[binding (or/c identifier?
(list/c (or/c module-path?
module-path-index?
path?
resolved-module-path?)
module-path-index?)
symbol?)
(listof module-path-index?
symbol?

View File

@ -675,8 +675,8 @@ for making @filepath{.plt} archives:}
Returns @scheme[#t] unless @scheme[p], after stripping its
directory path and converting to a byte string, matches one of the
following regular expressions: @litchar{^CVS$}, @litchar{^[.]svn$},
@litchar{^[.]cvsignore}, @litchar{^compiled$}, @litchar{~$}, @litchar{^#.*#$},
@litchar{^[.]#}, or @litchar{[.]plt$}.}
@litchar{^[.]cvsignore}, @litchar{^compiled$}, @litchar{^doc},
@litchar{~$}, @litchar{^#.*#$}, @litchar{^[.]#}, or @litchar{[.]plt$}.}
@defproc[(mztar (path path-string?)
(output output-port?)

View File

@ -178,7 +178,7 @@
(define (std-filter path)
(let-values ([(base name dir?) (split-path path)])
(let ([name (path->bytes name)])
(not (or (regexp-match #rx#"^(?:CVS|[.]svn|[.]cvsignore|compiled)$"
(not (or (regexp-match #rx#"^(?:CVS|[.]svn|[.]cvsignore|compiled|doc)$"
name)
(regexp-match #rx#"~$|^#.*#$|^[.]#" name)
(regexp-match #rx#"[.]plt$" name))))))

View File

@ -20,7 +20,7 @@
(define verbose (make-parameter #t))
(define-struct doc (src-dir src-file dest-dir flags under-main? category))
(define-struct doc (src-dir src-spec src-file dest-dir flags under-main? category))
(define-struct info (doc sci provides undef searches deps
build? time out-time need-run?
need-in-write? need-out-write?
@ -55,7 +55,7 @@
(define (scribblings-flag? sym)
(memq sym '(main-doc main-doc-root user-doc-root user-doc multi-page
depends-all depends-all-main no-depend-on always-run)))
(define (validate-scribblings-infos infos dir)
(define (validate-scribblings-infos infos)
(define (validate path [flags '()] [cat '(library)] [name #f])
(and (string? path) (relative-path? path)
(list? flags) (andmap scribblings-flag? flags)
@ -74,8 +74,9 @@
(apply validate i)))
infos)])
(and (not (memq #f infos)) infos))))
(define (get-docs i dir)
(let ([s (validate-scribblings-infos (i 'scribblings) dir)])
(define (get-docs i rec)
(let ([s (validate-scribblings-infos (i 'scribblings))]
[dir (directory-record-path rec)])
(if s
(map (lambda (d)
(let* ([flags (cadr d)]
@ -86,6 +87,14 @@
(or (memq 'main-doc flags)
(pair? (path->main-collects-relative dir))))])
(make-doc dir
(let ([spec (directory-record-spec rec)])
(list* (car spec)
(car d)
(if (eq? 'planet (car spec))
(list (append (cdr spec)
(list (directory-record-maj rec)
(list '= (directory-record-min rec)))))
(cdr spec))))
(build-path dir (car d))
(doc-path dir (cadddr d) flags)
flags under-main? (caddr d))))
@ -95,9 +104,9 @@
"bad 'scribblings info: ~e from: ~e" (i 'scribblings) dir)
null))))
(define docs
(let* ([dirs (find-relevant-directories '(scribblings))]
[infos (map get-info/full dirs)])
(filter-user-docs (append-map get-docs infos dirs) make-user?)))
(let* ([recs (find-relevant-directory-records '(scribblings) 'all-available)]
[infos (map get-info/full (map directory-record-path recs))])
(filter-user-docs (append-map get-docs infos recs) make-user?)))
(define-values (main-docs user-docs) (partition doc-under-main? docs))
(define (can-build*? docs) (can-build? only-dirs docs))
(define auto-main? (and auto-start-doc? (ormap can-build*? main-docs)))
@ -396,7 +405,7 @@
(lambda ()
(parameterize ([current-directory (doc-src-dir doc)])
(let* ([v (ensure-doc-prefix
(dynamic-require-doc (doc-src-file doc))
(dynamic-require-doc (doc-src-spec doc))
(doc-src-file doc))]
[dest-dir (pick-dest latex-dest doc)]
[ci (send renderer collect (list v) (list dest-dir))]
@ -459,7 +468,7 @@
(parameterize ([current-directory (doc-src-dir doc)])
(let* ([v (ensure-doc-prefix (render-time
"load"
(dynamic-require-doc (doc-src-file doc)))
(dynamic-require-doc (doc-src-spec doc)))
(doc-src-file doc))]
[dest-dir (pick-dest latex-dest doc)]
[ci (render-time "collect"
@ -524,7 +533,7 @@
(parameterize ([current-namespace (namespace-anchor->empty-namespace anchor)])
(thunk)))
(define (dynamic-require-doc path)
(define (dynamic-require-doc mod-path)
;; Use a separate namespace so that we don't end up with all the
;; documentation loaded at once.
;; Use a custodian to compensate for examples executed during the build
@ -540,7 +549,7 @@
;; hard-wiring the "manual.ss" library:
(namespace-attach-module ns 'scribble/manual p)
(parameterize ([current-namespace p])
(call-in-nested-thread (lambda () (dynamic-require path 'doc)))))))
(call-in-nested-thread (lambda () (dynamic-require mod-path 'doc)))))))
(define (write- info name sel)
(let* ([doc (info-doc info)]

View File

@ -187,7 +187,9 @@
"ignoring `compile-subcollections' entry in info ~a\n"
path-name))
;; this check is also done in compiler/compiler-unit, in compile-directory
(and (not (or (regexp-match? #rx"^[.]" basename) (equal? "compiled" basename)
(and (not (or (regexp-match? #rx"^[.]" basename)
(equal? "compiled" basename)
(equal? "doc" basename)
(eq? 'all (info 'compile-omit-paths void))))
(make-cc collection path
(if name (string-append path-name " (" name ")") path-name)

View File

@ -11,7 +11,7 @@
(define cached-xref #f)
(define (get-dests)
(for*/list ([dir (find-relevant-directories '(scribblings))]
(for*/list ([dir (find-relevant-directories '(scribblings) 'all-available)]
[d ((get-info/full dir) 'scribblings)])
(unless (and (list? d) (pair? d))
(error 'xref "bad scribblings entry: ~e" d))

View File

@ -1,7 +1,9 @@
(module modcollapse mzscheme
(require mzlib/list
scheme/string
mzlib/contract
(only scheme/base regexp-split)
"private/modhelp.ss")
(define (collapse-module-path s relto-mp)
@ -100,23 +102,94 @@
(loop s2))))])
(let ([m (regexp-match #rx"^(.*)/([^/]*)$" simpler)])
(if m
`(lib ,(caddr m) ,(cadr m))
(normalize-lib `(lib ,(caddr m) ,(cadr m)))
(error 'combine-relative-elements
"relative path escapes collection: ~s relative to ~s"
elements relto-mp))))))]
[(eq? (car relto-mp) 'planet)
(let ([pathstr (attach-to-relative-path-string
elements (cadr relto-mp))])
`(planet ,pathstr ,(caddr relto-mp)))]
(normalize-planet `(planet ,pathstr ,(caddr relto-mp))))]
[else (error 'combine-relative-elements
"don't know how to deal with: ~s" relto-mp)]))
(define (normalize-lib s)
(if (null? (cddr s))
;; single-string version:
(let ([e (cadr s)])
(cond
[(regexp-match? #rx"[.]" e)
;; It has a suffix:
(if (regexp-match? #rx"/" e)
;; It has a path, so it's fine:
s
;; No path, so add "mzlib/":
`(lib ,(string-append "mzlib/" e)))]
[(regexp-match? #rx"/" e)
;; It has a separator, so add a suffix:
`(lib ,(string-append e ".ss"))]
[else
;; No separator or suffix, so add "/main.ss":
`(lib ,(string-append e "/main.ss"))]))
;; multi-string version:
(if (regexp-match? #rx"[.]" (cadr s))
;; there's a suffix, so we can collapse to a single string:
`(lib ,(string-join (append (cddr s)
(list (cadr s)))
"/"))
;; No suffix, so we must keep the old style:
s)))
(define (normalize-planet s)
(cond
[(symbol? (cadr s))
;; normalize via string form:
(normalize-planet `(planet ,(symbol->string (cadr s))))]
[(null? (cddr s))
;; normalize to long form:
(let* ([strs (regexp-split #rx"/" (cadr s))])
(let ([owner (car strs)]
[pkg+vers (regexp-split #rx":" (cadr strs))]
[path (cddr strs)])
`(planet ,(if (null? path)
"main.ss"
(let ([str (car (last-pair path))])
(if (regexp-match? #rx"[.]" str)
str
(string-append str ".ss"))))
(,owner
,(car pkg+vers)
,@(if (null? (cdr pkg+vers))
null
`(,(string->number (cadr pkg+vers))
,(let ([vers (caddr pkg+vers)])
(cond
[(regexp-match? #rx"<=" vers)
`(- ,(string->number (substring vers 2)))]
[(regexp-match? #rx">=" vers)
`(+ ,(string->number (substring vers 2)))]
[(regexp-match? #rx"=" vers)
(string->number (substring vers 1))]
[(regexp-match #rx"(.*)-(.*)" vers)
=> (lambda (m)
`(,(string->number (cadr m))
,(string->number (caddr m))))]
[else (error 'collapse-module-path
"confused when normalizing planet path: ~e"
s)])))))
,@(if (null? path)
null
(reverse (cdr (reverse path)))))))]
[else
;; Long form is the normal form:
s]))
(cond [(string? s)
;; Parse Unix-style relative path string
(combine-relative-elements (explode-relpath-string s))]
[(symbol? s)
;; Convert to `lib' form:
`(lib ,(symbol->string s))]
(normalize-lib `(lib ,(symbol->string s)))]
[(and (or (not (pair? s)) (not (list? s))) (not (path? s)))
#f]
[(or (path? s) (eq? (car s) 'file))
@ -128,8 +201,8 @@
(cond [(eq? base 'relative)
(combine-relative-elements (cons name elements))]
[else (loop base (cons name elements))])))))]
[(eq? (car s) 'lib) s]
[(eq? (car s) 'planet) s]
[(eq? (car s) 'lib) (normalize-lib s)]
[(eq? (car s) 'planet) (normalize-planet s)]
[(eq? (car s) 'quote) s]
[else #f]))

View File

@ -2054,7 +2054,7 @@ int scheme_is_module_path(Scheme_Object *obj)
}
} else if (SAME_OBJ(SCHEME_CAR(obj), planet_symbol)) {
Scheme_Object *a, *subs;
int len;
int len, counter;
len = scheme_proper_list_length(obj);
@ -2096,11 +2096,15 @@ int scheme_is_module_path(Scheme_Object *obj)
if (!ok_planet_string(a))
return 0;
/* planet allows a major and minor version number: */
counter = 0;
for (obj = SCHEME_CDR(obj); !SCHEME_NULLP(obj); obj = SCHEME_CDR(obj)) {
if (counter == 2)
return 0;
a = SCHEME_CAR(obj);
if (ok_planet_number(a)) {
/* ok */
} else if (SCHEME_PAIRP(a)) {
} else if ((counter == 1) && SCHEME_PAIRP(a)) {
if (scheme_proper_list_length(a) != 2)
return 0;
if (ok_planet_number(SCHEME_CAR(a))) {
@ -2127,6 +2131,7 @@ int scheme_is_module_path(Scheme_Object *obj)
return 0;
} else
return 0;
counter++;
}
for (; !SCHEME_NULLP(subs); subs = SCHEME_CDR(subs)) {