1 ;;; fuel-debug-uses.el -- retrieving USING: stanzas
3 ;; Copyright (C) 2008, 2009 Jose Antonio Ortega Ruiz
4 ;; See http://factorcode.org/license.txt for BSD license.
6 ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
7 ;; Keywords: languages, fuel, factor
8 ;; Start date: Tue Dec 23, 2008 04:23
12 ;; Support for getting and updating factor source vocabulary lists.
19 (require 'fuel-font-lock)
26 (fuel-font-lock--defface fuel-font-lock-debug-uses-header
27 'bold fuel-debug "headers in Uses buffers")
29 (fuel-font-lock--defface fuel-font-lock-debug-uses-prompt
30 'italic fuel-debug "prompts in Uses buffers")
33 ;;; Utility functions:
35 (defsubst fuel-debug--chomp (s)
36 (replace-regexp-in-string "[\n\r\f]" "" s))
38 (defun fuel-debug--file-lines (file)
39 (when (file-readable-p file)
40 (with-current-buffer (find-file-noselect file)
42 (goto-char (point-min))
43 (let ((lines) (in-usings))
45 (when (looking-at "^USING: ") (setq in-usings t))
46 (let ((line (fuel-debug--chomp
47 (substring-no-properties (thing-at-point 'line)))))
48 (when in-usings (setq line (concat "! " line)))
50 (when (and in-usings (looking-at ".*\\_<;\\_>")) (setq in-usings nil))
54 (defun fuel-debug--uses-filter (restarts)
55 (let ((result) (i 1) (rn 0))
56 (dolist (r restarts (reverse result))
58 (when (string-match "Use the .+ vocabulary\\|Defer" r)
59 (push (list i rn r) result)
63 ;;; Retrieving USINGs:
65 (fuel-popup--define fuel-debug--uses-buffer
66 "*fuel uses*" 'fuel-debug-uses-mode)
68 (make-variable-buffer-local
69 (defvar fuel-debug--uses-file nil))
71 (make-variable-buffer-local
72 (defvar fuel-debug--uses-restarts nil))
74 (defsubst fuel-debug--uses-insert-title ()
75 (insert "Infering USING: stanza for " fuel-debug--uses-file ".\n\n"))
77 (defun fuel-debug--uses-prepare (file)
78 (fuel--with-popup (fuel-debug--uses-buffer)
79 (setq fuel-debug--uses-file file
81 fuel-debug--uses-restarts nil)
83 (fuel-debug--uses-insert-title)))
85 (defun fuel-debug--uses-clean ()
86 (setq fuel-debug--uses-file nil
88 fuel-debug--uses-restarts nil))
90 (defun fuel-debug--uses-for-file (file)
91 (let* ((lines (fuel-debug--file-lines file))
92 (cmd `(:fuel ((V{ ,@lines } fuel-get-uses)) t t)))
93 (fuel-debug--uses-prepare file)
94 (fuel--with-popup (fuel-debug--uses-buffer)
95 (insert "Asking Factor. Please, wait ...\n")
96 (fuel-eval--send cmd 'fuel-debug--uses-cont))
97 (fuel-popup--display (fuel-debug--uses-buffer))))
99 (defun fuel-debug--uses-cont (retort)
100 (let ((uses (fuel-debug--uses retort))
101 (err (fuel-eval--retort-error retort)))
102 (if uses (fuel-debug--uses-display uses)
103 (fuel-debug--uses-display-err retort))))
105 (defun fuel-debug--uses-display (uses)
106 (let* ((inhibit-read-only t)
107 (old (with-current-buffer (find-file-noselect fuel-debug--uses-file)
108 (sort (fuel-syntax--find-usings t) 'string<)))
109 (new (sort uses 'string<)))
111 (fuel-debug--uses-insert-title)
114 (insert "Current USING: is already fine!. Type 'q' to bury buffer.\n")
115 (fuel-debug--uses-clean))
116 (fuel-debug--highlight-names old new 'fuel-font-lock-debug-unneeded-vocab)
117 (fuel-debug--highlight-names new old 'fuel-font-lock-debug-missing-vocab)
118 (fuel-debug--insert-vlist "Current vocabulary list:" old)
120 (fuel-debug--insert-vlist "Correct vocabulary list:" new)
121 (setq fuel-debug--uses new)
122 (insert "\nType 'y' to update your USING: to the new one.\n"))))
124 (defun fuel-debug--uses-display-err (retort)
125 (let* ((inhibit-read-only t)
126 (err (fuel-eval--retort-error retort))
127 (restarts (fuel-debug--uses-filter (fuel-eval--error-restarts err)))
128 (unique (= 1 (length restarts))))
130 (fuel-debug--uses-insert-title)
131 (insert (fuel-eval--retort-output retort))
134 (insert "\nSorry, couldn't infer the vocabulary list.\n")
135 (setq fuel-debug--uses-restarts restarts)
136 (if unique (fuel-debug--uses-restart 1)
137 (insert "\nPlease, type the number of the desired vocabulary:\n\n")
139 (insert (format " :%s %s\n" (first r) (third r))))))))
141 (defun fuel-debug--uses-update-usings ()
143 (let ((inhibit-read-only t)
144 (file fuel-debug--uses-file)
145 (uses fuel-debug--uses))
146 (when (and uses file)
148 (fuel-debug--uses-clean)
150 (fuel-debug--replace-usings file uses)
151 (message "USING: updated!"))))
153 (defun fuel-debug--uses-restart (n)
154 (when (and (> n 0) (<= n (length fuel-debug--uses-restarts)))
155 (let* ((inhibit-read-only t)
156 (restart (format ":%s" (cadr (nth (1- n) fuel-debug--uses-restarts))))
157 (cmd `(:fuel ([ (:factor ,restart) ] fuel-with-autouse) t t)))
158 (setq fuel-debug--uses-restarts nil)
159 (insert "\nAsking Factor. Please, wait ...\n")
160 (fuel-eval--send cmd 'fuel-debug--uses-cont))))
165 (defvar fuel-debug-uses-mode-map
166 (let ((map (make-keymap)))
167 (suppress-keymap map)
169 (define-key map (vector (+ ?1 n))
170 `(lambda () (interactive) (fuel-debug--uses-restart ,(1+ n)))))
171 (define-key map "y" 'fuel-debug--uses-update-usings)
172 (define-key map "\C-c\C-c" 'fuel-debug--uses-update-usings)
175 (defconst fuel-debug--uses-header-regex
176 (format "^%s.*$" (regexp-opt '("Infering USING: stanza for "
177 "Current USING: is already fine!"
178 "Current vocabulary list:"
179 "Correct vocabulary list:"
180 "Sorry, couldn't infer the vocabulary list."
183 (defconst fuel-debug--uses-prompt-regex
184 (format "^%s" (regexp-opt '("Asking Factor. Please, wait ..."
185 "Please, type the number of the desired vocabulary:"
186 "Type 'y' to update your USING: to the new one."))))
188 (defconst fuel-debug--uses-font-lock-keywords
189 `((,fuel-debug--uses-header-regex . 'fuel-font-lock-debug-uses-header)
190 (,fuel-debug--uses-prompt-regex . 'fuel-font-lock-debug-uses-prompt)
191 (,fuel-debug--restart-regex (1 'fuel-font-lock-debug-restart-number)
192 (2 'fuel-font-lock-debug-restart-name))))
194 (defun fuel-debug-uses-mode ()
195 "A major mode for displaying Factor's USING: inference results."
197 (kill-all-local-variables)
198 (buffer-disable-undo)
199 (setq major-mode 'fuel-debug-uses-mode)
200 (setq mode-name "Fuel Uses:")
201 (set (make-local-variable 'font-lock-defaults)
202 '(fuel-debug--uses-font-lock-keywords t nil nil nil))
203 (use-local-map fuel-debug-uses-mode-map))
206 (provide 'fuel-debug-uses)
207 ;;; fuel-debug-uses.el ends here