62 lines
1.8 KiB
Scheme
62 lines
1.8 KiB
Scheme
;;; (gulie rule) — rule record type, registry, convenience macros
|
|
;;;
|
|
;;; Rules are the units of analysis. Each rule has a name, metadata,
|
|
;;; and a check procedure whose signature depends on the rule type.
|
|
|
|
(define-module (gulie rule)
|
|
#:use-module (srfi srfi-9)
|
|
#:use-module (srfi srfi-1)
|
|
#:export (<rule>
|
|
make-rule
|
|
rule?
|
|
rule-name
|
|
rule-description
|
|
rule-severity
|
|
rule-category
|
|
rule-type
|
|
rule-check-proc
|
|
rule-fix-proc
|
|
|
|
register-rule!
|
|
all-rules
|
|
rules-of-type
|
|
find-rule
|
|
clear-rules!))
|
|
|
|
;; A lint/format rule.
|
|
(define-record-type <rule>
|
|
(make-rule name description severity category type check-proc fix-proc)
|
|
rule?
|
|
(name rule-name) ;; symbol
|
|
(description rule-description) ;; string
|
|
(severity rule-severity) ;; symbol: error | warning | info
|
|
(category rule-category) ;; symbol: format | style | correctness | idiom
|
|
(type rule-type) ;; symbol: line | cst | tree-il
|
|
(check-proc rule-check-proc) ;; procedure
|
|
(fix-proc rule-fix-proc)) ;; procedure | #f
|
|
|
|
;; Global rule registry.
|
|
(define *rules* '())
|
|
|
|
(define (register-rule! rule)
|
|
"Register a rule in the global registry."
|
|
(set! *rules* (cons rule *rules*)))
|
|
|
|
(define (all-rules)
|
|
"Return all registered rules."
|
|
(reverse *rules*))
|
|
|
|
(define (rules-of-type type)
|
|
"Return all registered rules of the given TYPE."
|
|
(filter (lambda (r) (eq? (rule-type r) type))
|
|
*rules*))
|
|
|
|
(define (find-rule name)
|
|
"Find a rule by NAME, or #f."
|
|
(find (lambda (r) (eq? (rule-name r) name))
|
|
*rules*))
|
|
|
|
(define (clear-rules!)
|
|
"Clear all registered rules. Useful for testing."
|
|
(set! *rules* '()))
|