Remove drracket/private/module-interface.
With permission from Jon Rafkind.
This commit is contained in:
parent
f34258e253
commit
a00cd7ebff
|
@ -1,560 +0,0 @@
|
||||||
#lang racket/base
|
|
||||||
|
|
||||||
#|
|
|
||||||
Show imports (symbols that come from requires) and exports (symbols that are provided)
|
|
||||||
|
|
||||||
1. How can I avoid showing imported symbols from the lang line? It would be nice to
|
|
||||||
ignore all the symbols from racket/base if a file starts with
|
|
||||||
#lang racket/base
|
|
||||||
|
|
||||||
|#
|
|
||||||
|
|
||||||
(require racket/match
|
|
||||||
unstable/generics
|
|
||||||
racket/pretty
|
|
||||||
syntax/parse
|
|
||||||
(for-syntax racket/struct-info
|
|
||||||
racket/base
|
|
||||||
syntax/parse
|
|
||||||
racket/match))
|
|
||||||
|
|
||||||
(provide get-exports
|
|
||||||
(struct-out provided))
|
|
||||||
|
|
||||||
(define module-name
|
|
||||||
(compose resolved-module-path-name module-path-index-resolve))
|
|
||||||
|
|
||||||
(define-syntax (import-struct stx)
|
|
||||||
(syntax-parse stx
|
|
||||||
[(_ ([struct-name:identifier instance:identifier] more ...) body ...)
|
|
||||||
(define (get-fields struct instance)
|
|
||||||
;; (printf "Import struct for ~a\n" #'struct-name)
|
|
||||||
(let ([info (syntax-local-value struct (lambda () #f))])
|
|
||||||
(match (extract-struct-info info)
|
|
||||||
[(list name init-field-count auto-field-count accessor-proc
|
|
||||||
mutator-proc immutable-k-list)
|
|
||||||
(begin
|
|
||||||
;; messing around with strings is bad, whats a better solution?
|
|
||||||
(define (make-local-field field-stx)
|
|
||||||
(let* ([field (substring (symbol->string (syntax->datum field-stx))
|
|
||||||
(- (string-length (string-append (symbol->string (syntax->datum name)) "-"))
|
|
||||||
(string-length "struct:")))]
|
|
||||||
[final (string->symbol (string-append (symbol->string
|
|
||||||
(syntax->datum instance))
|
|
||||||
"."
|
|
||||||
field))])
|
|
||||||
(datum->syntax instance final instance instance)))
|
|
||||||
#;
|
|
||||||
(apply printf "name: ~a init-field-count: ~a auto-field-count: ~a accessor-proc: ~a mutator-proc: ~a immutable-k-list: ~a\n"
|
|
||||||
(list name init-field-count auto-field-count (map syntax->datum accessor-proc)
|
|
||||||
mutator-proc immutable-k-list))
|
|
||||||
(with-syntax ([(field ...)
|
|
||||||
(map make-local-field accessor-proc)]
|
|
||||||
[(setter! ...) mutator-proc]
|
|
||||||
[instance instance]
|
|
||||||
[(accessor ...) accessor-proc])
|
|
||||||
#|
|
|
||||||
(printf "bind: ~a\n" (map syntax->datum (syntax->list #'(field ...))))
|
|
||||||
(printf "setter: ~a\n" (map syntax->datum (syntax->list #'(setter! ...))))
|
|
||||||
|#
|
|
||||||
(begin
|
|
||||||
#;syntax-local-introduce
|
|
||||||
#;
|
|
||||||
#'(let ([my-accessor])
|
|
||||||
let-syntax ([field (make-rename-transformer my-accessor)] ...)
|
|
||||||
body)
|
|
||||||
|
|
||||||
#;
|
|
||||||
#'(let ([field (make-rename-transformer #'field
|
|
||||||
(accessor instance))]
|
|
||||||
...)
|
|
||||||
body)
|
|
||||||
|
|
||||||
#'([field (make-set!-transformer
|
|
||||||
(lambda (stx)
|
|
||||||
(syntax-case stx (set!)
|
|
||||||
[(set! id v) (if #'setter!
|
|
||||||
#'(setter! instance v)
|
|
||||||
#'(error 'with-struct "field ~a is not mutable so no set! is available" 'field))]
|
|
||||||
[id #'(accessor instance)])))]
|
|
||||||
...)
|
|
||||||
|
|
||||||
#;
|
|
||||||
#'(let-syntax ([field (make-set!-transformer
|
|
||||||
(lambda (stx)
|
|
||||||
(syntax-case stx (set!)
|
|
||||||
[(set! id v) (if #'setter!
|
|
||||||
#'(setter! instance v)
|
|
||||||
#'(error 'with-struct "field ~a is not mutable so no set! is available" 'field))]
|
|
||||||
[id #'(accessor instance)])))]
|
|
||||||
...)
|
|
||||||
body ...)
|
|
||||||
|
|
||||||
#;
|
|
||||||
#'(let-syntax ([field (lambda (stx)
|
|
||||||
#'(accessor instance))]
|
|
||||||
...)
|
|
||||||
body1 body ...))))])))
|
|
||||||
(with-syntax ([(field ...) (get-fields #'struct-name #'instance)])
|
|
||||||
;; (printf "Final let syntax is ~a\n" (syntax->datum #'(let-syntax (field ...) body ...)))
|
|
||||||
#'(let-syntax (field ...)
|
|
||||||
(import-struct (more ...) body ...)))]
|
|
||||||
[(_ () body ...)
|
|
||||||
#'(begin body ...)]))
|
|
||||||
|
|
||||||
(generics module-symbol
|
|
||||||
(print module-symbol)
|
|
||||||
(get-symbol module-symbol))
|
|
||||||
|
|
||||||
(provide print)
|
|
||||||
|
|
||||||
(define-syntax-rule (define-module-symbol name (fields ...) rest ...)
|
|
||||||
(define-struct name (fields ...)
|
|
||||||
#:property prop:module-symbol
|
|
||||||
rest ...))
|
|
||||||
|
|
||||||
(define-module-symbol symbol:normal (name)
|
|
||||||
(define-methods module-symbol
|
|
||||||
(define (get-symbol self) (symbol:normal-name self))
|
|
||||||
(define (print self)
|
|
||||||
(import-struct ([symbol:normal self])
|
|
||||||
(format "~a" self.name)))))
|
|
||||||
|
|
||||||
(define-module-symbol symbol:normal/contract (name contract)
|
|
||||||
(define-methods module-symbol
|
|
||||||
(define (get-symbol self) (symbol:normal-name self))
|
|
||||||
(define (print self)
|
|
||||||
(import-struct ([symbol:normal/contract self])
|
|
||||||
(format "~a contract ~a" self.name self.contract)))))
|
|
||||||
|
|
||||||
(define-module-symbol symbol:renamed (provided defined)
|
|
||||||
(define-methods module-symbol
|
|
||||||
(define (get-symbol self) (symbol:renamed-provided self))
|
|
||||||
(define (print self)
|
|
||||||
(import-struct ([symbol:renamed self])
|
|
||||||
(format "~a as ~a" self.defined self.provided)))))
|
|
||||||
|
|
||||||
(define-module-symbol symbol:module-exported (where)
|
|
||||||
(define-methods module-symbol
|
|
||||||
(define/generic symbol-print print)
|
|
||||||
(define (get-symbol self)
|
|
||||||
(raise 'get-symbol "Not defined"))
|
|
||||||
(define (print self)
|
|
||||||
(format "from ~a"
|
|
||||||
(module-name
|
|
||||||
(symbol:module-exported-where self))
|
|
||||||
))))
|
|
||||||
|
|
||||||
(define-module-symbol symbol:module-exported-from (original where)
|
|
||||||
(define-methods module-symbol
|
|
||||||
(define/generic symbol-print print)
|
|
||||||
(define (get-symbol self)
|
|
||||||
(raise 'get-symbol "Not defined"))
|
|
||||||
(define (print self)
|
|
||||||
(import-struct ([symbol:module-exported-from self])
|
|
||||||
(format "from ~a ~a"
|
|
||||||
(module-name self.where)
|
|
||||||
(symbol-print self.original))))))
|
|
||||||
|
|
||||||
(define-module-symbol symbol:module-exported-as
|
|
||||||
(where phase-shift imported-name import-shift)
|
|
||||||
(define-methods module-symbol
|
|
||||||
(define/generic symbol-print print)
|
|
||||||
(define (get-symbol self)
|
|
||||||
(symbol:module-exported-as-imported-name self))
|
|
||||||
(define (print self)
|
|
||||||
(import-struct ([symbol:module-exported-as self])
|
|
||||||
(format "from ~a as ~a"
|
|
||||||
(module-name self.where)
|
|
||||||
self.imported-name)))))
|
|
||||||
|
|
||||||
(define-module-symbol symbol:multiple-modules (symbol modules)
|
|
||||||
(define-methods module-symbol
|
|
||||||
(define/generic symbol-print print)
|
|
||||||
(define/generic symbol-get-symbol get-symbol)
|
|
||||||
(define (get-symbol self)
|
|
||||||
(symbol-get-symbol
|
|
||||||
(symbol:multiple-modules-symbol self)))
|
|
||||||
(define (print self)
|
|
||||||
(import-struct ([symbol:multiple-modules self])
|
|
||||||
(format "~a ~a"
|
|
||||||
(symbol-print self.symbol)
|
|
||||||
(let ([modules self.modules])
|
|
||||||
(if (null? modules)
|
|
||||||
""
|
|
||||||
(for/fold ([start (symbol-print (car modules))])
|
|
||||||
([next (cdr modules)])
|
|
||||||
(format "~a and ~a" start (symbol-print next))))))))))
|
|
||||||
|
|
||||||
(struct provided (phase variables syntaxes))
|
|
||||||
|
|
||||||
(define get-namespace
|
|
||||||
(let ([namespaces (make-hash)])
|
|
||||||
(lambda (file)
|
|
||||||
(hash-ref namespaces file (lambda ()
|
|
||||||
(let ([new (make-base-namespace)])
|
|
||||||
(hash-set! namespaces file new)
|
|
||||||
new))))))
|
|
||||||
|
|
||||||
(define (read-file file)
|
|
||||||
(parameterize ([read-accept-reader #t])
|
|
||||||
(with-input-from-file file (lambda () (read)))))
|
|
||||||
|
|
||||||
;; extract the symbol from the module and call `contract-name' on its contract
|
|
||||||
(define (get-contract symbol file)
|
|
||||||
(parameterize ([current-namespace
|
|
||||||
(get-namespace file)
|
|
||||||
#;
|
|
||||||
(make-base-namespace)])
|
|
||||||
;; FIXME! it would be nice if we could pull multiple symbols out
|
|
||||||
;; in the same `dynamic-require' call
|
|
||||||
(define has-contract? (dynamic-require 'racket/contract 'has-contract?))
|
|
||||||
(define value-contract (dynamic-require 'racket/contract 'value-contract))
|
|
||||||
(define contract-name (dynamic-require 'racket/contract 'contract-name))
|
|
||||||
;; syntax expansion might fail, just ignore it
|
|
||||||
(with-handlers ([exn:fail:syntax? (lambda (e) #f)])
|
|
||||||
(let ([result (dynamic-require file symbol (lambda () #f))])
|
|
||||||
#;
|
|
||||||
(printf "Result is ~a\n" result)
|
|
||||||
#;
|
|
||||||
(printf "v is ~a\n" v)
|
|
||||||
#;
|
|
||||||
(printf "v has contract? ~a\n" (has-contract? v))
|
|
||||||
(if (has-contract? result)
|
|
||||||
(contract-name (value-contract result))
|
|
||||||
#f)))))
|
|
||||||
|
|
||||||
(define (make-symbol something file get-contract?)
|
|
||||||
(define (populate-symbol symbol)
|
|
||||||
(if (not get-contract?)
|
|
||||||
(symbol:normal symbol)
|
|
||||||
(let ([contract (get-contract symbol file)])
|
|
||||||
(if contract
|
|
||||||
(symbol:normal/contract symbol contract)
|
|
||||||
(symbol:normal symbol)))))
|
|
||||||
(define (extract-module path)
|
|
||||||
(match path
|
|
||||||
[(and (? module-path-index?) module)
|
|
||||||
(symbol:module-exported module)]
|
|
||||||
[(list path phase-shift imported-name imported-phase)
|
|
||||||
(symbol:module-exported-as path
|
|
||||||
phase-shift
|
|
||||||
imported-name
|
|
||||||
imported-phase)]))
|
|
||||||
(match something
|
|
||||||
[(list exported (list paths ...))
|
|
||||||
(symbol:multiple-modules (populate-symbol exported)
|
|
||||||
(map extract-module paths))]))
|
|
||||||
|
|
||||||
(define (extract-base-module module-code)
|
|
||||||
(syntax-parse module-code
|
|
||||||
[(module name base . rest) (syntax->datum #'base)]))
|
|
||||||
|
|
||||||
(define (module=? module1 module2)
|
|
||||||
(define (resolve module)
|
|
||||||
(cond
|
|
||||||
[(symbol? module) (module-path-index-resolve (module-path-index-join module #f))]
|
|
||||||
[(resolved-module-path? module) module]
|
|
||||||
;; [(module-path-index? module) (
|
|
||||||
[(module-path-index? module)
|
|
||||||
(module-path-index-resolve module)
|
|
||||||
#;
|
|
||||||
(let-values ([(path base) (module-path-index-split module)])
|
|
||||||
(printf "Split module path ~a base ~a\n" path base)
|
|
||||||
((current-module-name-resolver) path))]
|
|
||||||
[else (error 'module=? "Dont understand ~a" module)]))
|
|
||||||
(define (raw-exports module)
|
|
||||||
(parameterize ([current-namespace
|
|
||||||
(get-namespace (resolved-module-path-name module))
|
|
||||||
#;
|
|
||||||
(make-base-namespace)])
|
|
||||||
(dynamic-require (resolved-module-path-name module) #f)
|
|
||||||
(call-with-values (lambda () (module->exports (resolved-module-path-name module)))
|
|
||||||
(lambda v v))))
|
|
||||||
#;
|
|
||||||
(printf "~a resolved ~a. ~a resolved ~a\n" module1 (resolve module1)
|
|
||||||
module2 (resolve module2))
|
|
||||||
(eq? (resolve module1) (resolve module2))
|
|
||||||
#;
|
|
||||||
(equal? (raw-exports (resolve module1))
|
|
||||||
(raw-exports (resolve module2)))
|
|
||||||
#;
|
|
||||||
(equal? (resolve module1) (resolve module2)))
|
|
||||||
|
|
||||||
(define (get-imports file all?)
|
|
||||||
(let ([imports (parameterize ([current-namespace
|
|
||||||
(get-namespace file)
|
|
||||||
#;
|
|
||||||
(make-base-namespace)])
|
|
||||||
(dynamic-require file #f)
|
|
||||||
(module->imports file))])
|
|
||||||
(define (combine-provides provides)
|
|
||||||
;; provides is guaranteed to have at least one thing or we wouldn't get here
|
|
||||||
(for/fold ([all (car provides)])
|
|
||||||
([provide (cdr provides)])
|
|
||||||
(provided (provided-phase all)
|
|
||||||
(append (provided-variables all)
|
|
||||||
(provided-variables provide))
|
|
||||||
(append (provided-syntaxes all)
|
|
||||||
(provided-syntaxes provide)))))
|
|
||||||
(define phase-imports (make-hash))
|
|
||||||
(define base-module (extract-base-module (read-file file)))
|
|
||||||
(define (fixup-paths path exports)
|
|
||||||
(for/list ([export exports])
|
|
||||||
(match export
|
|
||||||
[(symbol:multiple-modules symbol modules)
|
|
||||||
(symbol:multiple-modules symbol
|
|
||||||
(if (null? modules)
|
|
||||||
(list (symbol:module-exported path))
|
|
||||||
(map (lambda (module)
|
|
||||||
(symbol:module-exported-from
|
|
||||||
module path))
|
|
||||||
modules)))])))
|
|
||||||
(define (add-provide phase provide)
|
|
||||||
(hash-set! phase-imports
|
|
||||||
phase
|
|
||||||
(cons provide (hash-ref phase-imports phase (lambda () (list))))))
|
|
||||||
;; (printf "Base module is ~a ~a\n" base-module (make-resolved-module-path base-module))
|
|
||||||
(for ([import imports])
|
|
||||||
(match import
|
|
||||||
[(list phase-shift paths ...)
|
|
||||||
;; (printf "Import at phase shift ~a\n" phase-shift)
|
|
||||||
(for ([path paths])
|
|
||||||
;; (printf " Module ~a\n" (module-name path))
|
|
||||||
(define module-path (let-values ([(module-path rest) (module-path-index-split path)])
|
|
||||||
;; (printf "Module path is ~a. Rest is ~a\n" module-path rest)
|
|
||||||
module-path))
|
|
||||||
; (define resolved-module-path (module-path-index-resolve path))
|
|
||||||
;; (define resolved-module-path (make-resolved-module-path module-path))
|
|
||||||
;; (printf "base ~a = resolved ~a is ~a\n" base-module path (module=? base-module path))
|
|
||||||
(when (or all? (not (module=? path base-module)))
|
|
||||||
(let ([exports (get-exports module-path #f)])
|
|
||||||
(for ([export exports])
|
|
||||||
(match export
|
|
||||||
[(provided phase variables syntaxes)
|
|
||||||
(add-provide (+ phase phase-shift)
|
|
||||||
(provided (+ phase phase-shift)
|
|
||||||
(fixup-paths path variables)
|
|
||||||
(fixup-paths path syntaxes)))])))))]))
|
|
||||||
(hash-map phase-imports (lambda (phase provides)
|
|
||||||
(combine-provides provides)))))
|
|
||||||
|
|
||||||
(define (get-exports file get-contracts?)
|
|
||||||
(define (sort-symbols symbols)
|
|
||||||
(sort symbols (lambda (a b)
|
|
||||||
(define (get-symbol what)
|
|
||||||
(match what
|
|
||||||
[(list name rest ...) (symbol->string name)]))
|
|
||||||
(string<? (get-symbol a)
|
|
||||||
(get-symbol b)))))
|
|
||||||
(define (make-symbol* export)
|
|
||||||
(make-symbol export file get-contracts?))
|
|
||||||
(let-values ([(exported-variables
|
|
||||||
exported-syntaxes)
|
|
||||||
(parameterize ([current-namespace
|
|
||||||
(get-namespace file)
|
|
||||||
#;
|
|
||||||
(make-base-namespace)])
|
|
||||||
(dynamic-require file #f)
|
|
||||||
(module->exports file))])
|
|
||||||
#;
|
|
||||||
(pretty-print (syntax->datum
|
|
||||||
(parameterize ([current-namespace (make-base-namespace)])
|
|
||||||
(expand (read-file file)))))
|
|
||||||
|
|
||||||
|
|
||||||
; (printf "Expanded is ~a\n" expanded)
|
|
||||||
; (printf "Variables ~a\n" (syntax-property expanded 'module-variable-provides))
|
|
||||||
; (printf "Syntaxes ~a\n" (syntax-property expanded 'module-syntax-provides))
|
|
||||||
(define exports (make-hash))
|
|
||||||
(for ([export exported-variables])
|
|
||||||
(match export
|
|
||||||
[(list (and (? number?) phase) symbols ...)
|
|
||||||
(hash-set! exports phase (provided phase
|
|
||||||
(map make-symbol* (sort-symbols symbols))
|
|
||||||
'()))]))
|
|
||||||
(for ([export exported-syntaxes])
|
|
||||||
(match export
|
|
||||||
[(list (and (? number?) phase) symbols ...)
|
|
||||||
(hash-set! exports phase
|
|
||||||
(let ([existing (hash-ref exports phase (lambda () (provided phase '() '())))])
|
|
||||||
(provided phase
|
|
||||||
(provided-variables existing)
|
|
||||||
(map make-symbol* (sort-symbols symbols)))))]))
|
|
||||||
(hash-map exports (lambda (a b) b))))
|
|
||||||
|
|
||||||
|
|
||||||
(define (phase-name phase)
|
|
||||||
(case phase
|
|
||||||
[(0) " (runtime)"]
|
|
||||||
[(1) " (syntax)"]
|
|
||||||
[(-1) " (template)"]
|
|
||||||
[else ""]))
|
|
||||||
|
|
||||||
#|
|
|
||||||
(define (find-file provides category search)
|
|
||||||
(struct levenshtein (name distance phase))
|
|
||||||
;; find the levenshtein distance between the searched-for term and the name
|
|
||||||
(define (fuzzy-search search name)
|
|
||||||
(local-require (prefix-in neil: (planet neil/levenshtein:1:3/levenshtein)))
|
|
||||||
;; (printf "Name is ~a\n" name)
|
|
||||||
(define real-name (symbol->string (get-symbol name)))
|
|
||||||
(let ([search-in real-name])
|
|
||||||
(define distance (neil:string-levenshtein search search-in))
|
|
||||||
(levenshtein real-name distance 0)))
|
|
||||||
|
|
||||||
(define (compare-levenshtein object1 object2)
|
|
||||||
(< (levenshtein-distance object1)
|
|
||||||
(levenshtein-distance object2)))
|
|
||||||
(define (do-search export)
|
|
||||||
(match export
|
|
||||||
[(provided phase variables syntaxes)
|
|
||||||
;; replace the phase from the fuzzy-search with the phase from the export
|
|
||||||
(define (update-phase stuff)
|
|
||||||
(for/list ([object stuff])
|
|
||||||
(match object
|
|
||||||
[(levenshtein name distance dont-care)
|
|
||||||
(levenshtein name distance phase)])))
|
|
||||||
(let ([found-variables (map (lambda (variable)
|
|
||||||
(fuzzy-search search variable))
|
|
||||||
variables)]
|
|
||||||
[found-syntaxes (map (lambda (syntax)
|
|
||||||
(fuzzy-search search syntax))
|
|
||||||
syntaxes)])
|
|
||||||
(append (update-phase found-variables)
|
|
||||||
(update-phase found-syntaxes)))]))
|
|
||||||
(let* ([exports provides]
|
|
||||||
[found (apply append (map do-search exports))]
|
|
||||||
[sorted (sort found compare-levenshtein)])
|
|
||||||
(if (null? sorted)
|
|
||||||
(printf "No ~as available\n" category)
|
|
||||||
(for ([i (in-range 1 6)]
|
|
||||||
[found sorted])
|
|
||||||
(match found
|
|
||||||
[(levenshtein name distance phase)
|
|
||||||
(printf "~a. Found ~a `~a' at phase ~a\n" i category name phase)])))))
|
|
||||||
|
|
||||||
(define (find-file-export file search)
|
|
||||||
(find-file (get-exports file #f) "export" search))
|
|
||||||
|
|
||||||
(define (find-file-import file search)
|
|
||||||
(find-file (get-imports file #t) "import" search))
|
|
||||||
|#
|
|
||||||
|
|
||||||
(define (find-defines file)
|
|
||||||
(define defines
|
|
||||||
(parameterize ([current-load-relative-directory (let-values ([(care a b)
|
|
||||||
(split-path (path->complete-path (resolve-path (string->path file))))])
|
|
||||||
care)])
|
|
||||||
(let ([code (parameterize ([current-namespace (make-base-namespace)])
|
|
||||||
(expand (read-file file)))])
|
|
||||||
(syntax-case code (module)
|
|
||||||
[(module name base (module-begin stuff ...))
|
|
||||||
(apply append
|
|
||||||
(for/list ([top-level (syntax->list #'(stuff ...))])
|
|
||||||
(syntax-case top-level (define-values define-syntaxes)
|
|
||||||
[(define-values (name ...) . body)
|
|
||||||
(for/list ([name (syntax->list #'(name ...))])
|
|
||||||
(symbol->string (syntax->datum name))
|
|
||||||
#;
|
|
||||||
(printf "~a\n" (syntax->datum name)))]
|
|
||||||
[(define-syntaxes (name ...) . body)
|
|
||||||
(for/list ([name (syntax->list #'(name ...))])
|
|
||||||
(symbol->string (syntax->datum name))
|
|
||||||
#;
|
|
||||||
(printf "~a\n" (syntax->datum name)))]
|
|
||||||
[else (list)])))]))))
|
|
||||||
(for ([item (sort defines string<?)])
|
|
||||||
(printf "~a\n" item)))
|
|
||||||
|
|
||||||
(define (check-file/raw file phase show-imports? show-exports?)
|
|
||||||
(define (print-all stuff)
|
|
||||||
(for ([symbol stuff])
|
|
||||||
(printf "~a\n" (print symbol))))
|
|
||||||
(define (show-all provides)
|
|
||||||
(for ([provide provides])
|
|
||||||
(when (or (eq? phase 'all)
|
|
||||||
(equal? phase (provided-phase provide)))
|
|
||||||
(print-all (provided-variables provide))
|
|
||||||
(print-all (provided-syntaxes provide)))))
|
|
||||||
|
|
||||||
(define (show-imports)
|
|
||||||
(show-all (get-imports file #f)))
|
|
||||||
(define (show-exports)
|
|
||||||
(show-all (get-exports file #f)))
|
|
||||||
(when show-imports?
|
|
||||||
(show-imports))
|
|
||||||
(when show-exports?
|
|
||||||
(show-exports)))
|
|
||||||
|
|
||||||
(define (check-file file phase show-imports? show-exports?)
|
|
||||||
(define (print-all prefix stuff)
|
|
||||||
(for ([symbol stuff])
|
|
||||||
(printf "~a~a\n" prefix (print symbol))))
|
|
||||||
(define (show-all what provides)
|
|
||||||
(define (space n)
|
|
||||||
(make-string n #\space))
|
|
||||||
(printf "~a\n" what)
|
|
||||||
(for ([provide provides])
|
|
||||||
(when (or (eq? phase 'all)
|
|
||||||
(equal? phase (provided-phase provide)))
|
|
||||||
(printf " Phase ~a~a\n" (provided-phase provide)
|
|
||||||
(phase-name (provided-phase provide)))
|
|
||||||
(printf " Variables\n")
|
|
||||||
(print-all (space 6) (provided-variables provide))
|
|
||||||
(printf " Syntaxes\n")
|
|
||||||
(print-all (space 6) (provided-syntaxes provide)))))
|
|
||||||
(define (show-imports)
|
|
||||||
(show-all "Imports" (get-imports file #f)))
|
|
||||||
(define (show-exports)
|
|
||||||
(show-all "Exports" (get-exports file #t)))
|
|
||||||
(when show-imports?
|
|
||||||
(show-imports)
|
|
||||||
(printf "\n"))
|
|
||||||
(when show-exports?
|
|
||||||
(show-exports)))
|
|
||||||
|
|
||||||
#|
|
|
||||||
(define mode (make-parameter 'show))
|
|
||||||
(define only-phase (make-parameter 'all))
|
|
||||||
(define show-imports (make-parameter #t))
|
|
||||||
(define show-exports (make-parameter #t))
|
|
||||||
(define find-export (make-parameter #f))
|
|
||||||
(define find-import (make-parameter #f))
|
|
||||||
|
|
||||||
(define (do-parse-command-line)
|
|
||||||
(local-require racket/cmdline)
|
|
||||||
(command-line
|
|
||||||
#:program "checker"
|
|
||||||
#:once-each
|
|
||||||
[("--raw") "Just print a list of identifiers without any formatting"
|
|
||||||
(mode 'raw)]
|
|
||||||
[("--phase") phase
|
|
||||||
"Only show identifiers at this phase"
|
|
||||||
(only-phase (string->number phase))]
|
|
||||||
[("--exports") "Only show exports"
|
|
||||||
(show-imports #f)]
|
|
||||||
[("--imports") "Only show imports"
|
|
||||||
(show-exports #f)]
|
|
||||||
[("--defines") "Only show defined identifiers"
|
|
||||||
(mode 'defines)]
|
|
||||||
[("--find-export") export "Do a fuzzy match for an export"
|
|
||||||
(begin
|
|
||||||
(mode 'find-export)
|
|
||||||
(find-export export))]
|
|
||||||
[("--find-import") import "Do a fuzzy match for an import"
|
|
||||||
(begin
|
|
||||||
(mode 'find-import)
|
|
||||||
(find-import import))]
|
|
||||||
#:args files
|
|
||||||
files))
|
|
||||||
|
|
||||||
(for ([file (do-parse-command-line)])
|
|
||||||
(printf "Checking file ~a\n" file)
|
|
||||||
(case (mode)
|
|
||||||
[(show) (check-file (string->path file) (only-phase) (show-imports) (show-exports))]
|
|
||||||
[(raw) (check-file/raw (string->path file) (only-phase) (show-imports) (show-exports))]
|
|
||||||
[(defines) (find-defines file)]
|
|
||||||
[(find-export) (find-file-export file (find-export))]
|
|
||||||
[(find-import) (find-file-import file (find-import))]))
|
|
||||||
|#
|
|
|
@ -1,52 +0,0 @@
|
||||||
#lang racket/base
|
|
||||||
|
|
||||||
;; Shows a gui of provided identifiers with some extra information such as
|
|
||||||
;; contracts (works)
|
|
||||||
;; typed racket types (doesn't work)
|
|
||||||
|
|
||||||
(require (prefix-in check: "check.rkt")
|
|
||||||
framework/framework
|
|
||||||
racket/gui/base
|
|
||||||
racket/class)
|
|
||||||
|
|
||||||
(provide build-gui)
|
|
||||||
|
|
||||||
(define (build-gui gui-parent file)
|
|
||||||
(define exports (check:get-exports file #true))
|
|
||||||
(for ([provide (map check:provided-syntaxes exports)])
|
|
||||||
(printf "syntaxes exports (~a): ~a\n" (length provide) (map check:print provide)))
|
|
||||||
|
|
||||||
(for ([provide (map check:provided-variables exports)])
|
|
||||||
(printf "variables (~a): ~a\n" (length provide) (map check:print provide)))
|
|
||||||
|
|
||||||
#;
|
|
||||||
(printf "exports: ~a\n" (map check:print
|
|
||||||
(map check:provided-syntaxes
|
|
||||||
(check:get-exports "x.rkt" #true))))
|
|
||||||
|
|
||||||
(define stuff (new vertical-pane% [parent gui-parent]))
|
|
||||||
(new message% [parent stuff] [label "Contracts"])
|
|
||||||
(define contract-pane (new horizontal-panel% [parent stuff]))
|
|
||||||
(define contract-text (new racket:text%))
|
|
||||||
(define contract-editor (new editor-canvas% [parent contract-pane] [editor contract-text]))
|
|
||||||
(new message% [parent stuff] [label "No contracts"])
|
|
||||||
(define non-contract-pane (new horizontal-panel% [parent stuff]))
|
|
||||||
(define non-contract-text (new racket:text%))
|
|
||||||
(define non-contract-editor (new editor-canvas% [parent non-contract-pane] [editor non-contract-text]))
|
|
||||||
(for ([provide/phase (map check:provided-syntaxes exports)])
|
|
||||||
(for ([symbol provide/phase])
|
|
||||||
(send contract-text insert (check:print symbol))
|
|
||||||
(send contract-text insert "\n")
|
|
||||||
))
|
|
||||||
(for ([provide/phase (map check:provided-variables exports)])
|
|
||||||
(for ([symbol provide/phase])
|
|
||||||
(send non-contract-text insert (check:print symbol))
|
|
||||||
(send non-contract-text insert "\n")
|
|
||||||
))
|
|
||||||
)
|
|
||||||
|
|
||||||
#|
|
|
||||||
(let ([frame (new frame:basic% [label ""] [width 500] [height 500])])
|
|
||||||
(build-gui (send frame get-area-container))
|
|
||||||
(send frame show #true))
|
|
||||||
|#
|
|
Loading…
Reference in New Issue
Block a user