Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | ;; Copyright (C) 2007 Vesa Karvonen |
2 | ;; | |
3 | ;; MLton is released under a BSD-style license. | |
4 | ;; See the file MLton-LICENSE for details. | |
5 | ||
6 | (require 'def-use-sym) | |
7 | ||
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
9 | ;; Data records | |
10 | ||
11 | (defalias 'def-use-pos (function cons)) | |
12 | (defalias 'def-use-pos-line (function car)) | |
13 | (defalias 'def-use-pos-col (function cdr)) | |
14 | (defun def-use-pos< (lhs rhs) | |
15 | (or (< (def-use-pos-line lhs) (def-use-pos-line rhs)) | |
16 | (and (equal (def-use-pos-line lhs) (def-use-pos-line rhs)) | |
17 | (< (def-use-pos-col lhs) (def-use-pos-col rhs))))) | |
18 | ||
19 | (defalias 'def-use-ref (function cons)) | |
20 | (defalias 'def-use-ref-src (function car)) | |
21 | (defalias 'def-use-ref-pos (function cdr)) | |
22 | (defun def-use-ref< (lhs rhs) | |
23 | (or (string< (def-use-ref-src lhs) (def-use-ref-src rhs)) | |
24 | (and (equal (def-use-ref-src lhs) (def-use-ref-src rhs)) | |
25 | (def-use-pos< (def-use-ref-pos lhs) (def-use-ref-pos rhs))))) | |
26 | ||
27 | (defun def-use-sym (class msg name ref &optional face) | |
28 | "Symbol constructor." | |
29 | (cons ref (cons name (cons class (cons msg face))))) | |
30 | (defalias 'def-use-sym-face (function cddddr)) | |
31 | (defalias 'def-use-sym-msg (function cadddr)) | |
32 | (defalias 'def-use-sym-class (function caddr)) | |
33 | (defalias 'def-use-sym-name (function cadr)) | |
34 | (defalias 'def-use-sym-ref (function car)) | |
35 | ||
36 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
37 | ;; Def-use sources | |
38 | ||
39 | (defun def-use-add-dus (title sym-at-ref sym-to-uses finalize attr &rest args) | |
40 | (push `(,args ,sym-at-ref ,sym-to-uses ,attr ,title . ,finalize) | |
41 | def-use-dus-list) | |
42 | (def-use-show-dus-update)) | |
43 | ||
44 | (defun def-use-rem-dus (dus) | |
45 | (setq def-use-dus-list | |
46 | (remove dus def-use-dus-list)) | |
47 | (def-use-dus-finalize dus) | |
48 | (def-use-show-dus-update)) | |
49 | ||
50 | (defun def-use-dus-sym-at-ref (dus ref) | |
51 | (apply (cadr dus) ref (car dus))) | |
52 | ||
53 | (defun def-use-dus-sym-to-uses (dus sym) | |
54 | (apply (caddr dus) sym (car dus))) | |
55 | ||
56 | (defun def-use-dus-attr (dus) | |
57 | (apply (cadddr dus) (car dus))) | |
58 | ||
59 | (defun def-use-dus-title (dus) | |
60 | (apply (cadddr (cdr dus)) (car dus))) | |
61 | ||
62 | (defun def-use-dus-finalize (dus) | |
63 | (apply (cddddr (cdr dus)) (car dus))) | |
64 | ||
65 | (defvar def-use-dus-list nil) | |
66 | ||
67 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
68 | ;; Def-Use Sources -mode | |
69 | ||
70 | (defconst def-use-show-dus-buffer-name "<:Def-Use Sources:>") | |
71 | ||
72 | (defconst def-use-show-dus-mode-map | |
73 | (let ((result (make-sparse-keymap))) | |
74 | (mapc (function | |
75 | (lambda (key-command) | |
76 | (define-key result | |
77 | (read (car key-command)) | |
78 | (cdr key-command)))) | |
79 | `(("[(q)]" | |
80 | . ,(function def-use-kill-current-buffer)) | |
81 | ("[(k)]" | |
82 | . ,(function def-use-show-dus-del)))) | |
83 | result)) | |
84 | ||
85 | (define-derived-mode def-use-show-dus-mode fundamental-mode "Def-Use-DUS" | |
86 | "Major mode for browsing def-use sources." | |
87 | :group 'def-use-dus) | |
88 | ||
89 | (defun def-use-show-dus () | |
90 | "Show a list of def-use sources." | |
91 | (interactive) | |
92 | (let ((buffer (get-buffer-create def-use-show-dus-buffer-name))) | |
93 | (with-current-buffer buffer | |
94 | (buffer-disable-undo) | |
95 | (setq buffer-read-only t) | |
96 | (def-use-show-dus-mode)) | |
97 | (switch-to-buffer buffer)) | |
98 | (def-use-show-dus-update)) | |
99 | ||
100 | (defun def-use-show-dus-update () | |
101 | (let ((buffer (get-buffer def-use-show-dus-buffer-name))) | |
102 | (when buffer | |
103 | (with-current-buffer buffer | |
104 | (let ((point (point))) | |
105 | (setq buffer-read-only nil) | |
106 | (goto-char 1) | |
107 | (delete-char (buffer-size)) | |
108 | (insert "Def-Use Sources\n" | |
109 | "\n") | |
110 | (mapc (function | |
111 | (lambda (dus) | |
112 | (insert (def-use-dus-title dus) "\n"))) | |
113 | def-use-dus-list) | |
114 | (setq buffer-read-only t) | |
115 | (goto-char point)))))) | |
116 | ||
117 | (defun def-use-show-dus-del () | |
118 | "Kill the def-use source on the current line." | |
119 | (interactive) | |
120 | (let ((idx (- (def-use-current-line) 3))) | |
121 | (when (and (<= 0 idx) | |
122 | (< idx (length def-use-dus-list))) | |
123 | (def-use-rem-dus (nth idx def-use-dus-list))))) | |
124 | ||
125 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
126 | ;; Queries | |
127 | ||
128 | (defun def-use-attrs () | |
129 | (sort (mapcar (function def-use-dus-attr) | |
130 | def-use-dus-list) | |
131 | (function def-use-attr-newer?))) | |
132 | ||
133 | (defun def-use-query (fn) | |
134 | "Queries the def-use -sources with the given function and moves the | |
135 | satisfied dus to the front." | |
136 | (let ((prev nil) | |
137 | (work def-use-dus-list) | |
138 | (result nil)) | |
139 | (while (and work | |
140 | (not (setq result (funcall fn (car work))))) | |
141 | (setq prev work) | |
142 | (setq work (cdr work))) | |
143 | (when (and prev work) | |
144 | (setcdr prev (cdr work)) | |
145 | (setcdr work def-use-dus-list) | |
146 | (setq def-use-dus-list work) | |
147 | (def-use-show-dus-update)) | |
148 | result)) | |
149 | ||
150 | (defun def-use-sym-at-ref (ref &optional no-apology) | |
151 | (when ref | |
152 | (let ((sym | |
153 | (def-use-query | |
154 | (function | |
155 | (lambda (dus) | |
156 | (def-use-dus-sym-at-ref dus ref))))) | |
157 | (name (def-use-extract-sym-name-at-ref ref))) | |
158 | (if (and sym name (string= (def-use-sym-name sym) name)) | |
159 | sym | |
160 | (unless no-apology | |
161 | (cond | |
162 | ((not name) | |
163 | (message "Point does not appear to be on a symbol.")) | |
164 | ((and sym (not (string= (def-use-sym-name sym) name))) | |
165 | (message | |
166 | "Symbol at point, %s, does not match, %s, in info. Check mode." | |
167 | name | |
168 | (def-use-sym-name sym))) | |
169 | (t | |
170 | (let* ((attrs (def-use-attrs)) | |
171 | (file (def-use-ref-src ref)) | |
172 | (attr (file-attributes file)) | |
173 | (buffer (def-use-find-buffer-visiting-file file))) | |
174 | (message | |
175 | "Sorry, no valid info on the symbol: %s. Possible reason: %s." | |
176 | name | |
177 | (cond | |
178 | ((not attrs) | |
179 | "There are no def-use sources") | |
180 | ((def-use-attr-newer? attr (car attrs)) | |
181 | "The file is newer than any def-use source") | |
182 | ((buffer-modified-p buffer) | |
183 | "The buffer has been modified") | |
184 | (t | |
185 | "The symbol may not be in any def-use source"))))))) | |
186 | nil)))) | |
187 | ||
188 | (defun def-use-sym-to-uses (sym) | |
189 | (when sym | |
190 | (def-use-query | |
191 | (function | |
192 | (lambda (dus) | |
193 | (def-use-dus-sym-to-uses dus sym)))))) | |
194 | ||
195 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
196 | ||
197 | (provide 'def-use-data) |