64 lines
1.8 KiB
Racket
64 lines
1.8 KiB
Racket
#lang scheme/base
|
|
(require "../struct.rkt"
|
|
"../search.rkt"
|
|
"../scheme.rkt"
|
|
"../basic.rkt"
|
|
"manual-scheme.rkt"
|
|
(for-syntax scheme/base))
|
|
|
|
(provide ;; public:
|
|
method xmethod)
|
|
; XXX unknown contracts
|
|
(provide *method **method
|
|
method-tag
|
|
constructor-tag
|
|
name-this-object)
|
|
|
|
(define-syntax-rule (method class/interface method-name)
|
|
(*method 'method-name (quote-syntax class/interface)))
|
|
|
|
(define-syntax-rule (xmethod class/intf-id method-id)
|
|
(elem (method class/intf-id method-id) " in " (racket class/intf-id)))
|
|
|
|
(define (*method sym id
|
|
#:defn? [defn? #f])
|
|
(**method sym id #:defn? defn?))
|
|
|
|
(define (**method sym id/tag
|
|
#:defn? [defn? #f])
|
|
(define content (list (symbol->string sym)))
|
|
(define (mk tag)
|
|
(make-element symbol-color
|
|
(list (make-link-element (if defn?
|
|
value-def-color
|
|
value-link-color)
|
|
content
|
|
(method-tag tag sym)))))
|
|
(if (identifier? id/tag)
|
|
(make-delayed-element
|
|
(λ (ren p ri)
|
|
(let ([tag (find-scheme-tag p ri id/tag #f)])
|
|
(if tag (list (mk tag)) content)))
|
|
(λ () (car content))
|
|
(λ () (car content)))
|
|
(mk id/tag)))
|
|
|
|
(define (method-tag vtag sym)
|
|
(list 'meth (list (cadr vtag) sym)))
|
|
|
|
(define (constructor-tag vtag)
|
|
(list 'constructor (cadr vtag)))
|
|
|
|
(define (name-this-object type-sym)
|
|
(to-element
|
|
(string->symbol
|
|
(regexp-replace
|
|
#rx"(%|<%>|-mixin)$"
|
|
(format "_a~a-~s"
|
|
(if (member (string-ref (symbol->string type-sym) 0)
|
|
'(#\a #\e #\i #\o #\u))
|
|
"n"
|
|
"")
|
|
type-sym)
|
|
""))))
|