(module debug-tool mzscheme (require mzlib/etc mzlib/list mzlib/class mzlib/unit mzlib/contract mred mzlib/match drscheme/tool "marks.ss" mrlib/switchable-button mrlib/bitmap-label "annotator.ss" "load-sandbox.ss" framework string-constants lang/debugger-language-interface) (provide tool@) ; QUESTIONS/IDEAS ; what is the right way to deal with macros? ; how can the three tool classes communicate with each other safely (define tool@ (unit (import drscheme:tool^) (export drscheme:tool-exports^) (define (phase1) (drscheme:language:extend-language-interface debugger-language<%> (lambda (superclass) (class* superclass (debugger-language<%>) (public debugger:supported?) (define (debugger:supported?) #t) (super-instantiate ()))))) (define phase2 void) (define (extract-language-level settings) (drscheme:language-configuration:language-settings-language settings)) (define (debugger-does-not-work-for? lang) (not (send lang debugger:supported?))) (define (robust-syntax-source stx) (and (syntax? stx) (syntax-source stx))) (define (robust-vector-ref vec idx) (if (< idx (vector-length vec)) (vector-ref vec idx) #f)) (define (safe-vector-set! vec idx val) (when (< idx (vector-length vec)) (vector-set! vec idx val)) (void)) (define (truncate str n) (cond [(< (string-length str) n) str] [(>= n 3) (string-append (substring str 0 (- n 3)) "...")] [else (substring str 0 (min n (string-length str)))])) (define (clean-status s) (truncate (regexp-replace* #rx"\n" s " ") 200)) (define (index-of chr str) (let loop ([i 0]) (if (< i (string-length str)) (if (char=? chr (string-ref str i)) i (loop (add1 i))) #f))) (define (safe-min . args) (apply min (filter identity args))) ;; trim-expr-str: string -> string ;; examples: ;; short-id => short-id ;; really-long-identifier => really-lon... ;; (