aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2021-12-22 22:43:28 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2021-12-22 22:48:37 +0100
commitc01452242c2f4def27c0639c68bc6c12513f9b61 (patch)
treebcc6702118bfbcf69502f0954f013e991e581a4e /scripts
parentAdd texinfo documentation for calp util. (diff)
downloadcalp-c01452242c2f4def27c0639c68bc6c12513f9b61.tar.gz
calp-c01452242c2f4def27c0639c68bc6c12513f9b61.tar.xz
Add script to find unused imports.
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/all-symbols.scm95
1 files changed, 95 insertions, 0 deletions
diff --git a/scripts/all-symbols.scm b/scripts/all-symbols.scm
new file mode 100755
index 00000000..a200fb6c
--- /dev/null
+++ b/scripts/all-symbols.scm
@@ -0,0 +1,95 @@
+#!/usr/bin/guile \
+-e main -s
+!#
+
+;;; Commentary:
+;;;
+;;; Scripts which finds unused imports in each file.
+;;; Uses Guile's module system reflection to find what is imported,
+;;; but simple looks at all unique symbols in the source file for what
+;;; is used, which might lead to some discrepancies.
+;;;
+;;; Code:
+
+(add-to-load-path (string-append (dirname (dirname (current-filename))) "/module"))
+
+(use-modules (calp util)
+ (srfi srfi-1))
+
+
+(define (get-forms port)
+ (let loop ((done '()))
+ (let ((form (read port)))
+ (if (eof-object? form)
+ done
+ (loop (cons form done))))))
+
+(define (flatten-tree tree)
+ (cond ((null? tree) '())
+ ((pair? tree)
+ (append (flatten-tree (car tree))
+ (flatten-tree (cdr tree))))
+ (else (list tree))))
+
+
+
+(define (uniq lst)
+ (cond ((null? lst) lst)
+ ((null? (cdr lst)) lst)
+ ((and (pair? lst)
+ (eqv? (car lst) (cadr lst)))
+ (uniq (cons (car lst) (cddr lst))))
+ (else (cons (car lst)
+ (uniq (cdr lst))))))
+
+(define (unique-symbols tree)
+ (uniq
+ (sort* (filter symbol? (flatten-tree tree))
+ string<? symbol->string)))
+
+(define (find-module-declaration forms)
+ (cadr
+ (find (lambda (form)
+ (cond ((null? form) #f)
+ ((not (pair? form)) #f)
+ (else (eq? 'define-module (car form)))))
+ forms)))
+
+
+;;; Module use high scores
+;;; $ grop -Ho '#\?:use-module' -R module | uniq -c | sort -n
+
+(define (main args)
+ (define filename (cadr args))
+ (define forms (reverse (call-with-input-file filename get-forms)))
+ (define symbs (unique-symbols forms))
+ ;; (format #t "~y" (find-module-declaration forms))
+ ;; (format #t "~a~%" symbs)
+
+ (format #t "=== ~a ===~%" filename)
+ (for-each (lambda (mod)
+
+ (define used-symbols
+ (map (lambda (symb)
+ (if (memv symb symbs)
+ #f symb))
+ (module-map (lambda (key value) key) mod)))
+
+ (define used-count (count not used-symbols))
+ (define total-count (length (module-map list mod)))
+
+ (format #t "~a/~a ~a~% used ~s~% unused ~s~%"
+ used-count total-count (module-name mod)
+ (lset-difference eq? (module-map (lambda (key value) key) mod) (filter identity used-symbols))
+ (filter identity used-symbols)
+ ))
+ (remove (lambda (mod)
+ (member (module-name mod)
+ '((guile)
+ (guile-user)
+ (srfi srfi-1)
+ )))
+ (module-uses (resolve-module
+ (find-module-declaration
+ forms)))))
+ (newline))