102 lines
3.5 KiB
Scheme
102 lines
3.5 KiB
Scheme
|
|
#lang scheme/base
|
|
(require (for-syntax scheme/base)
|
|
scheme/match
|
|
syntax/boundmap)
|
|
(provide (all-defined-out))
|
|
|
|
(define-struct hiding-policy
|
|
(opaque-modules opaque-ids opaque-kernel opaque-libs transparent-ids)
|
|
#:mutable)
|
|
|
|
(define (policy-hide-module p m)
|
|
(hash-table-put! (hiding-policy-opaque-modules p) m #t))
|
|
(define (policy-unhide-module p m)
|
|
(hash-table-remove! (hiding-policy-opaque-modules p) m))
|
|
|
|
(define (policy-hide-kernel p)
|
|
(set-hiding-policy-opaque-kernel! p #t))
|
|
(define (policy-unhide-kernel p)
|
|
(set-hiding-policy-opaque-kernel! p #f))
|
|
|
|
(define (policy-hide-libs p)
|
|
(set-hiding-policy-opaque-libs! p #t))
|
|
(define (policy-unhide-libs p)
|
|
(set-hiding-policy-opaque-libs! p #f))
|
|
|
|
(define (policy-hide-id p id)
|
|
(policy-unshow-id p id)
|
|
(module-identifier-mapping-put! (hiding-policy-opaque-ids p) id #t))
|
|
(define (policy-unhide-id p id)
|
|
(module-identifier-mapping-put! (hiding-policy-opaque-ids p) id #f))
|
|
|
|
(define (policy-show-id p id)
|
|
(policy-unhide-id p id)
|
|
(module-identifier-mapping-put! (hiding-policy-transparent-ids p) id #t))
|
|
(define (policy-unshow-id p id)
|
|
(module-identifier-mapping-put! (hiding-policy-transparent-ids p) id #f))
|
|
|
|
(define (new-hiding-policy)
|
|
(make-hiding-policy (make-hash-table)
|
|
(make-module-identifier-mapping)
|
|
#f
|
|
#f
|
|
(make-module-identifier-mapping)))
|
|
|
|
(define (new-standard-hiding-policy)
|
|
(let ([p (new-hiding-policy)])
|
|
(policy-hide-kernel p)
|
|
(policy-hide-libs p)
|
|
p))
|
|
|
|
;; ---
|
|
|
|
(define-syntax inline
|
|
(syntax-rules ()
|
|
[(inline ([name expr] ...) . body)
|
|
(let-syntax ([name
|
|
(lambda (x)
|
|
(syntax-case x ()
|
|
[xx (identifier? #'xx) #'expr]))] ...)
|
|
. body)]))
|
|
|
|
(define (/false) #f)
|
|
|
|
(define (policy-show-macro? policy id)
|
|
(match policy
|
|
[(struct hiding-policy (opaque-modules
|
|
opaque-identifiers
|
|
opaque-kernel
|
|
opaque-libs
|
|
transparent-identifiers))
|
|
(inline ([not-opaque-id
|
|
(not (module-identifier-mapping-get opaque-identifiers id /false))]
|
|
[transparent-id
|
|
(module-identifier-mapping-get transparent-identifiers id /false)])
|
|
(let ([binding (identifier-binding id)])
|
|
(if (list? binding)
|
|
(let-values ([(srcmod srcname nommod nomname _) (apply values binding)])
|
|
(inline ([opaque-srcmod (hash-table-get opaque-modules srcmod /false)]
|
|
[opaque-nommod (hash-table-get opaque-modules nommod /false)]
|
|
;; FIXME
|
|
[in-kernel?
|
|
(and (symbol? srcmod)
|
|
(eq? #\# (string-ref (symbol->string srcmod) 0)))]
|
|
[in-lib-module?
|
|
(lib-module? srcmod)])
|
|
(or transparent-id
|
|
(and (not opaque-srcmod)
|
|
(not opaque-nommod)
|
|
(not (and in-kernel? opaque-kernel))
|
|
(not (and in-lib-module? opaque-libs))
|
|
not-opaque-id))))
|
|
(or transparent-id
|
|
not-opaque-id))))]))
|
|
|
|
(define (lib-module? mpi)
|
|
(and (module-path-index? mpi)
|
|
(let-values ([(path rel) (module-path-index-split mpi)])
|
|
(cond [(pair? path) (memq (car path) '(lib planet))]
|
|
[(string? path) (lib-module? rel)]
|
|
[else #f]))))
|