racket/collects/macro-debugger/analysis/private/reftable.rkt
2010-09-13 13:21:02 -06:00

47 lines
1.4 KiB
Racket

#lang racket/base
(require syntax/id-table
"util.rkt")
(provide new-reftable
reftable-get-phase
reftable-add-all!
reftable-add!)
;; ========
;; A RefTable = hash[Phase => free-id-table[bool]]
;; Phase = nat
#|
For the calculations at the end, we only want to consider identifiers
from the expanded module (ie, syntax-source-module = here.)
That means that instead of a free-id-table, we really want a dict/set
that distinguishes between identifiers imported different ways. eg,
hash keyed on (nom-name, nom-mod). The reason is that a not-from-here
identifier can block/clobber a from-here identifier if they happen to
refer to the same binding. That messes up the analysis.
Temporary solution: only add from-here identifiers to the reftable.
|#
;; new-reftable : -> RefTable
(define (new-reftable)
(make-hash))
;; reftable-get-phase : RefTable Phase -> free-id-table[bool]
(define (reftable-get-phase refs phase)
(hash-ref! refs phase (lambda () (make-free-id-table #:phase phase))))
;; reftable-add-all! : RefTable Phase (listof identifier) -> void
(define (reftable-add-all! refs phase ids)
(let ([id-table (reftable-get-phase refs phase)])
(for ([id (in-list ids)]
#:when (here-mpi? (syntax-source-module id)))
(free-id-table-set! id-table id #t))))
;; reftable-add! : RefTable Phase identifier -> void
(define (reftable-add! refs phase id)
(reftable-add-all! refs phase (list id)))