]> gitweb.factorcode.org Git - factor.git/blob - misc/fuel/fuel-syntax.el
e7d4f0ef17a699db47933d28d35113ad3a32f0af
[factor.git] / misc / fuel / fuel-syntax.el
1 \r
2 ;;; fuel-syntax.el --- auxiliar definitions for factor code navigation.\r
3 \r
4 ;; Copyright (C) 2008, 2009  Jose Antonio Ortega Ruiz\r
5 ;; See http://factorcode.org/license.txt for BSD license.\r
6 \r
7 ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>\r
8 ;; Keywords: languages\r
9 \r
10 ;;; Commentary:\r
11 \r
12 ;; Auxiliar constants and functions to parse factor code.\r
13 \r
14 ;;; Code:\r
15 \r
16 (require 'thingatpt)\r
17 \r
18 \f\r
19 ;;; Thing-at-point support for factor symbols:\r
20 \r
21 (defun fuel-syntax--beginning-of-symbol ()\r
22   "Move point to the beginning of the current symbol."\r
23   (skip-syntax-backward "w_()"))\r
24 \r
25 (defsubst fuel-syntax--beginning-of-symbol-pos ()\r
26   (save-excursion (fuel-syntax--beginning-of-symbol) (point)))\r
27 \r
28 (defun fuel-syntax--end-of-symbol ()\r
29   "Move point to the end of the current symbol."\r
30   (skip-syntax-forward "w_()"))\r
31 \r
32 (defsubst fuel-syntax--end-of-symbol-pos ()\r
33   (save-excursion (fuel-syntax--end-of-symbol) (point)))\r
34 \r
35 (put 'factor-symbol 'end-op 'fuel-syntax--end-of-symbol)\r
36 (put 'factor-symbol 'beginning-op 'fuel-syntax--beginning-of-symbol)\r
37 \r
38 (defsubst fuel-syntax-symbol-at-point ()\r
39   (let ((s (substring-no-properties (thing-at-point 'factor-symbol))))\r
40     (and (> (length s) 0) s)))\r
41 \r
42 \r
43 \f\r
44 ;;; Regexps galore:\r
45 \r
46 (defconst fuel-syntax--parsing-words\r
47   '(":" "::" ";" "&:" "<<" "<PRIVATE" ">>"\r
48     "ABOUT:" "AFTER:" "ALIAS:" "ALIEN:" "ARTICLE:"\r
49     "B" "BEFORE:"\r
50     "C:" "CALLBACK:" "C-GLOBAL:" "C-TYPE:" "CHAR:" "COM-INTERFACE:" "CONSTANT:" "CONSULT:" "call-next-method"\r
51     "DEFER:" "DESTRUCTOR:"\r
52     "EBNF:" ";EBNF" "ENUM:" "ERROR:" "EXCLUDE:"\r
53     "f" "FORGET:" "FROM:" "FUNCTION:" "FUNCTION-ALIAS:"\r
54     "GAME:" "GENERIC#" "GENERIC:"\r
55     "GLSL-SHADER:" "GLSL-PROGRAM:"\r
56     "HELP:" "HOOK:"\r
57     "IN:" "initial:" "INSTANCE:" "INTERSECTION:"\r
58     "LIBRARY:"\r
59     "M:" "M::" "MACRO:" "MACRO::" "MAIN:" "MATH:"\r
60     "MEMO:" "MEMO:" "METHOD:" "MIXIN:"\r
61     "NAN:"\r
62     "POSTPONE:" "PREDICATE:" "PRIMITIVE:" "PRIVATE>" "PROTOCOL:" "PROVIDE:"\r
63     "QUALIFIED-WITH:" "QUALIFIED:"\r
64     "read-only" "RENAME:" "REQUIRE:"  "REQUIRES:"\r
65     "SINGLETON:" "SINGLETONS:" "SLOT:" "SPECIALIZED-ARRAY:" "SPECIALIZED-ARRAYS:" "STRING:" "STRUCT:" "SYMBOL:" "SYMBOLS:" "SYNTAX:"\r
66     "TUPLE:" "t" "t?" "TYPEDEF:" "TYPED:" "TYPED::"\r
67     "UNIFORM-TUPLE:" "UNION:" "UNION-STRUCT:" "USE:" "USING:"\r
68     "VARIANT:" "VERTEX-FORMAT:"))\r
69 \r
70 (defconst fuel-syntax--parsing-words-regex\r
71   (regexp-opt fuel-syntax--parsing-words 'words))\r
72 \r
73 (defconst fuel-syntax--bracers\r
74   '("B" "BV" "C" "CS" "H" "T" "V" "W"))\r
75 \r
76 (defconst fuel-syntax--brace-words-regex\r
77   (format "%s{" (regexp-opt fuel-syntax--bracers t)))\r
78 \r
79 (defconst fuel-syntax--declaration-words\r
80   '("flushable" "foldable" "inline" "parsing" "recursive" "delimiter"))\r
81 \r
82 (defconst fuel-syntax--declaration-words-regex\r
83   (regexp-opt fuel-syntax--declaration-words 'words))\r
84 \r
85 (defsubst fuel-syntax--second-word-regex (prefixes)\r
86   (format "%s +\\([^ \r\n]+\\)" (regexp-opt prefixes t)))\r
87 \r
88 (defconst fuel-syntax--method-definition-regex\r
89   "^M::? +\\([^ ]+\\) +\\([^ ]+\\)")\r
90 \r
91 (defconst fuel-syntax--before-definition-regex\r
92   "^BEFORE: +\\([^ ]+\\) +\\([^ ]+\\)")\r
93 \r
94 (defconst fuel-syntax--after-definition-regex\r
95   "^AFTER: +\\([^ ]+\\) +\\([^ ]+\\)")\r
96 \r
97 (defconst fuel-syntax--integer-regex\r
98   "\\_<-?[0-9]+\\_>")\r
99 \r
100 (defconst fuel-syntax--raw-float-regex\r
101   "[0-9]*\\.[0-9]*\\([eEpP][+-]?[0-9]+\\)?")\r
102 \r
103 (defconst fuel-syntax--float-regex\r
104   (format "\\_<-?%s\\_>" fuel-syntax--raw-float-regex))\r
105 \r
106 (defconst fuel-syntax--number-regex\r
107   (format "\\([0-9]+\\|%s\\)" fuel-syntax--raw-float-regex))\r
108 \r
109 (defconst fuel-syntax--ratio-regex\r
110   (format "\\_<[+-]?%s/-?%s\\_>"\r
111           fuel-syntax--number-regex\r
112           fuel-syntax--number-regex))\r
113 \r
114 (defconst fuel-syntax--bad-string-regex\r
115   "\\_<\"[^>]\\([^\"\n]\\|\\\\\"\\)*\n")\r
116 \r
117 (defconst fuel-syntax--word-definition-regex\r
118   (format "\\_<\\(%s\\)?: +\\_<\\(\\w+\\)\\_>"\r
119           (regexp-opt\r
120            '(":" "GENERIC" "DEFER" "HOOK" "MAIN" "MATH" "POSTPONE"\r
121              "SYMBOL" "SYNTAX" "TYPED" "TYPED:" "RENAME"))))\r
122 \r
123 (defconst fuel-syntax--alias-definition-regex\r
124   "^ALIAS: +\\(\\_<.+?\\_>\\) +\\(\\_<.+?\\_>\\)")\r
125 \r
126 (defconst fuel-syntax--vocab-ref-regexp\r
127   (fuel-syntax--second-word-regex\r
128    '("IN:" "USE:" "FROM:" "EXCLUDE:" "QUALIFIED:" "QUALIFIED-WITH:")))\r
129 \r
130 (defconst fuel-syntax--int-constant-def-regex\r
131   (fuel-syntax--second-word-regex '("ALIEN:" "CHAR:" "NAN:")))\r
132 \r
133 (defconst fuel-syntax--type-definition-regex\r
134   (fuel-syntax--second-word-regex\r
135    '("C-STRUCT:" "C-UNION:" "COM-INTERFACE:" "MIXIN:" "TUPLE:" "SINGLETON:" "SPECIALIZED-ARRAY:" "STRUCT:" "UNION:" "UNION-STRUCT:")))\r
136 \r
137 (defconst fuel-syntax--error-regex\r
138   (fuel-syntax--second-word-regex '("ERROR:")))\r
139 \r
140 (defconst fuel-syntax--tuple-decl-regex\r
141   "^TUPLE: +\\([^ \n]+\\) +< +\\([^ \n]+\\)\\_>")\r
142 \r
143 (defconst fuel-syntax--constructor-regex "<[^ >]+>")\r
144 \r
145 (defconst fuel-syntax--getter-regex "\\(^\\|\\_<\\)[^ ]+?>>\\_>")\r
146 (defconst fuel-syntax--setter-regex "\\_<>>.+?\\_>")\r
147 \r
148 (defconst fuel-syntax--symbol-definition-regex\r
149   (fuel-syntax--second-word-regex '("&:" "SYMBOL:" "VAR:")))\r
150 \r
151 (defconst fuel-syntax--stack-effect-regex\r
152   "\\( ( [^\n]* )\\)\\|\\( (( [^\n]* ))\\)")\r
153 \r
154 (defconst fuel-syntax--using-lines-regex "^USING: +\\([^;]+\\);")\r
155 \r
156 (defconst fuel-syntax--use-line-regex "^USE: +\\(.*\\)$")\r
157 \r
158 (defconst fuel-syntax--current-vocab-regex "^IN: +\\([^ \r\n\f]+\\)")\r
159 \r
160 (defconst fuel-syntax--sub-vocab-regex "^<\\([^ \n]+\\) *$")\r
161 \r
162 (defconst fuel-syntax--alien-function-regex\r
163   "\\_<FUNCTION: +\\(\\w+\\)[\n ]+\\(\\w+\\)")\r
164 \r
165 (defconst fuel-syntax--alien-function-alias-regex\r
166   "\\_<FUNCTION-ALIAS: +\\(\\w+\\)[\n ]+\\(\\w+\\)[\n ]+\\(\\w+\\)")\r
167 \r
168 (defconst fuel-syntax--alien-callback-regex\r
169   "\\_<CALLBACK: +\\(\\w+\\) +\\(\\w+\\)")\r
170 \r
171 (defconst fuel-syntax--indent-def-starts '("" ":"\r
172                                            "AFTER" "BEFORE"\r
173                                            "COM-INTERFACE" "CONSULT"\r
174                                            "ENUM" "ERROR"\r
175                                            "FROM" "FUNCTION:" "FUNCTION-ALIAS:"\r
176                                            "INTERSECTION:"\r
177                                            "M" "M:" "MACRO" "MACRO:"\r
178                                            "MEMO" "MEMO:" "METHOD"\r
179                                            "SYNTAX"\r
180                                            "PREDICATE" "PRIMITIVE" "PROTOCOL"\r
181                                            "SINGLETONS"\r
182                                            "STRUCT" "SYMBOLS" "TAG" "TUPLE"\r
183                                            "TYPED" "TYPED:"\r
184                                            "UNIFORM-TUPLE"\r
185                                            "UNION-STRUCT" "UNION"\r
186                                            "VARIANT" "VERTEX-FORMAT"))\r
187 \r
188 (defconst fuel-syntax--no-indent-def-starts '("ARTICLE"\r
189                                               "HELP"\r
190                                               "SPECIALIZED-ARRAYS"))\r
191 \r
192 (defconst fuel-syntax--indent-def-start-regex\r
193   (format "^\\(%s:\\)\\( \\|\n\\)" (regexp-opt fuel-syntax--indent-def-starts)))\r
194 \r
195 (defconst fuel-syntax--definition-start-regex\r
196   (format "^\\(%s:\\) " (regexp-opt (append fuel-syntax--no-indent-def-starts\r
197                                             fuel-syntax--indent-def-starts))))\r
198 \r
199 (defconst fuel-syntax--definition-end-regex\r
200   (format "\\(\\(^\\| +\\);\\( *%s\\)*\\($\\| +\\)\\)"\r
201           fuel-syntax--declaration-words-regex))\r
202 \r
203 (defconst fuel-syntax--single-liner-regex\r
204   (regexp-opt '("ABOUT:"\r
205                 "ALIAS:"\r
206                 "CONSTANT:" "C:" "C-GLOBAL:" "C-TYPE:"\r
207                 "DEFER:" "DESTRUCTOR:"\r
208                 "FORGET:"\r
209                 "GAME:" "GENERIC:" "GENERIC#" "GLSL-PROGRAM:"\r
210                 "HOOK:"\r
211                 "IN:" "INSTANCE:"\r
212                 "LIBRARY:"\r
213                 "MAIN:" "MATH:" "MIXIN:"\r
214                 "NAN:"\r
215                 "POSTPONE:" "PRIVATE>" "<PRIVATE"\r
216                 "QUALIFIED-WITH:" "QUALIFIED:"\r
217                 "RENAME:"\r
218                 "SINGLETON:" "SLOT:" "SPECIALIZED-ARRAY:" "SYMBOL:"\r
219                 "TYPEDEF:"\r
220                 "USE:"\r
221                 "VAR:")))\r
222 \r
223 (defconst fuel-syntax--begin-of-def-regex\r
224   (format "^USING: \\|\\(%s\\)\\|\\(^%s .*\\)"\r
225           fuel-syntax--definition-start-regex\r
226           fuel-syntax--single-liner-regex))\r
227 \r
228 (defconst fuel-syntax--end-of-def-line-regex\r
229   (format "^.*%s" fuel-syntax--definition-end-regex))\r
230 \r
231 (defconst fuel-syntax--end-of-def-regex\r
232   (format "\\(%s\\)\\|\\(^%s .*\\)"\r
233           fuel-syntax--end-of-def-line-regex\r
234           fuel-syntax--single-liner-regex))\r
235 \r
236 (defconst fuel-syntax--word-signature-regex\r
237   (format ":[^ ]* \\([^ ]+\\)\\(%s\\)*" fuel-syntax--stack-effect-regex))\r
238 \r
239 (defconst fuel-syntax--defun-signature-regex\r
240   (format "\\(%s\\|%s\\)"\r
241           fuel-syntax--word-signature-regex\r
242           "M[^:]*: [^ ]+ [^ ]+"))\r
243 \r
244 (defconst fuel-syntax--constructor-decl-regex\r
245   "\\_<C: +\\(\\w+\\) +\\(\\w+\\)\\( .*\\)?$")\r
246 \r
247 (defconst fuel-syntax--typedef-regex\r
248   "\\_<TYPEDEF: +\\(\\w+\\) +\\(\\w+\\)\\( .*\\)?$")\r
249 \r
250 (defconst fuel-syntax--c-global-regex\r
251   "\\_<C-GLOBAL: +\\(\\w+\\) +\\(\\w+\\)\\( .*\\)?$")\r
252 \r
253 (defconst fuel-syntax--c-type-regex\r
254   "\\_<C-TYPE: +\\(\\w+\\)\\( .*\\)?$")\r
255 \r
256 (defconst fuel-syntax--rename-regex\r
257   "\\_<RENAME: +\\(\\w+\\) +\\(\\w+\\) +=> +\\(\\w+\\)\\( .*\\)?$")\r
258 \r
259 \f\r
260 ;;; Factor syntax table\r
261 \r
262 (setq fuel-syntax--syntax-table\r
263   (let ((table (make-syntax-table)))\r
264     ;; Default is word constituent\r
265     (dotimes (i 256)\r
266       (modify-syntax-entry i "w" table))\r
267     ;; Whitespace (TAB is not whitespace)\r
268     (modify-syntax-entry ?\f " " table)\r
269     (modify-syntax-entry ?\r " " table)\r
270     (modify-syntax-entry ?\  " " table)\r
271     (modify-syntax-entry ?\n " " table)\r
272     table))\r
273 \r
274 (defconst fuel-syntax--syntactic-keywords\r
275   `(;; Strings and chars\r
276     ("\\_<<\\(\"\\)\\_>" (1 "<b"))\r
277     ("\\_<\\(\"\\)>\\_>" (1 ">b"))\r
278     ("\\( \\|^\\)\\(DLL\\|P\\|SBUF\\)?\\(\"\\)\\(\\([^\n\r\f\"\\]\\|\\\\.\\)*\\)\\(\"\\)"\r
279      (3 "\"") (6 "\""))\r
280     ("CHAR: \\(\"\\) [^\\\"]*?\\(\"\\)\\([^\\\"]\\|\\\\.\\)*?\\(\"\\)"\r
281      (1 "w") (2 "<b") (4 ">b"))\r
282     ("\\(CHAR:\\|\\\\\\) \\(\\w\\|!\\)\\( \\|$\\)" (2 "w"))\r
283     ;; Comments\r
284     ("\\_<\\(#?!\\) .*\\(\n\\|$\\)" (1 "<") (2 ">"))\r
285     ("\\_<\\(#?!\\)\\(\n\\|$\\)" (1 "<") (2 ">"))\r
286     ;; postpone\r
287     ("\\_<POSTPONE:\\( \\).*\\(\n\\)" (1 "<b") (2 ">b"))\r
288     ;; Multiline constructs\r
289     ("\\_<\\(E\\)BNF:\\( \\|\n\\)" (1 "<b"))\r
290     ("\\_<;EBN\\(F\\)\\_>" (1 ">b"))\r
291     ("\\_<\\(U\\)SING: \\(;\\)" (1 "<b") (2 ">b"))\r
292     ("\\_<USING:\\( \\)" (1 "<b"))\r
293     ("\\_<\\(C\\)-ENUM: \\(;\\)" (1 "<b") (2 ">b"))\r
294     ("\\_<ENUM:\\( \\|\n\\)" (1 "<b"))\r
295     ("\\_<TUPLE: +\\w+? +< +\\w+? *\\( \\|\n\\)\\([^;]\\|$\\)" (1 "<b"))\r
296     ("\\_<TUPLE: +\\w+? *\\( \\|\n\\)\\([^;<\n]\\|\\_>\\)" (1 "<b"))\r
297     ("\\_<\\(SYMBOLS\\|SPECIALIZED-ARRAYS\\|SINGLETONS\\|VARIANT\\): *?\\( \\|\n\\)\\([^;\n]\\|\\_>\\)"\r
298      (2 "<b"))\r
299     ("\\(\n\\| \\);\\_>" (1 ">b"))\r
300     ;; Let and lambda:\r
301     ("\\_<\\(!(\\) .* \\()\\)" (1 "<") (2 ">"))\r
302     ("\\(\\[\\)\\(let\\|let\\*\\)\\( \\|$\\)" (1 "(]"))\r
303     ("\\(\\[\\)\\(|\\) +[^|]* \\(|\\)" (1 "(]") (2 "(|") (3 ")|"))\r
304     (" \\(|\\) " (1 "(|"))\r
305     (" \\(|\\)$" (1 ")"))\r
306     ;; Opening brace words:\r
307     ("\\_<\\w*\\({\\)\\_>" (1 "(}"))\r
308     ("\\_<\\(}\\)\\_>" (1 "){"))\r
309     ;; Parenthesis:\r
310     ("\\_<\\((\\)\\_>" (1 "()"))\r
311     ("\\_<\\w*\\((\\)\\_>" (1 "()"))\r
312     ("\\_<\\()\\)\\_>" (1 ")("))\r
313     ("\\_<(\\((\\)\\_>" (1 "()"))\r
314     ("\\_<\\()\\))\\_>" (1 ")("))\r
315     ;; Quotations:\r
316     ("\\_<'\\(\\[\\)\\_>" (1 "(]"))      ; fried\r
317     ("\\_<$\\(\\[\\)\\_>" (1 "(]"))      ; parse-time\r
318     ("\\_<\\(\\[\\)\\_>" (1 "(]"))\r
319     ("\\_<\\(\\]\\)\\_>" (1 ")["))))\r
320 \r
321 \f\r
322 ;;; Source code analysis:\r
323 \r
324 (defsubst fuel-syntax--brackets-depth ()\r
325   (nth 0 (syntax-ppss)))\r
326 \r
327 (defsubst fuel-syntax--brackets-start ()\r
328   (nth 1 (syntax-ppss)))\r
329 \r
330 (defun fuel-syntax--brackets-end ()\r
331   (save-excursion\r
332     (goto-char (fuel-syntax--brackets-start))\r
333     (condition-case nil\r
334         (progn (forward-sexp)\r
335                (1- (point)))\r
336       (error -1))))\r
337 \r
338 (defsubst fuel-syntax--indentation-at (pos)\r
339   (save-excursion (goto-char pos) (current-indentation)))\r
340 \r
341 (defsubst fuel-syntax--increased-indentation (&optional i)\r
342   (+ (or i (current-indentation)) factor-indent-width))\r
343 (defsubst fuel-syntax--decreased-indentation (&optional i)\r
344   (- (or i (current-indentation)) factor-indent-width))\r
345 \r
346 (defsubst fuel-syntax--at-begin-of-def ()\r
347   (looking-at fuel-syntax--begin-of-def-regex))\r
348 \r
349 (defsubst fuel-syntax--at-begin-of-indent-def ()\r
350   (looking-at fuel-syntax--indent-def-start-regex))\r
351 \r
352 (defsubst fuel-syntax--at-end-of-def ()\r
353   (looking-at fuel-syntax--end-of-def-regex))\r
354 \r
355 (defsubst fuel-syntax--looking-at-emptiness ()\r
356   (looking-at "^[ ]*$\\|$"))\r
357 \r
358 (defsubst fuel-syntax--is-last-char (pos)\r
359   (save-excursion\r
360     (goto-char (1+ pos))\r
361     (looking-at-p "[ ]*$")))\r
362 \r
363 (defsubst fuel-syntax--line-offset (pos)\r
364   (- pos (save-excursion\r
365            (goto-char pos)\r
366            (beginning-of-line)\r
367            (point))))\r
368 \r
369 (defun fuel-syntax--previous-non-blank ()\r
370   (forward-line -1)\r
371   (while (and (not (bobp)) (fuel-syntax--looking-at-emptiness))\r
372     (forward-line -1)))\r
373 \r
374 (defun fuel-syntax--beginning-of-block-pos ()\r
375   (save-excursion\r
376     (if (> (fuel-syntax--brackets-depth) 0)\r
377         (fuel-syntax--brackets-start)\r
378       (fuel-syntax--beginning-of-defun)\r
379       (point))))\r
380 \r
381 (defun fuel-syntax--at-setter-line ()\r
382   (save-excursion\r
383     (beginning-of-line)\r
384     (when (re-search-forward fuel-syntax--setter-regex\r
385                              (line-end-position)\r
386                              t)\r
387       (let* ((to (match-beginning 0))\r
388              (from (fuel-syntax--beginning-of-block-pos)))\r
389         (goto-char from)\r
390         (let ((depth (fuel-syntax--brackets-depth)))\r
391           (and (or (re-search-forward fuel-syntax--constructor-regex to t)\r
392                    (re-search-forward fuel-syntax--setter-regex to t))\r
393                (= depth (fuel-syntax--brackets-depth))))))))\r
394 \r
395 (defun fuel-syntax--at-constructor-line ()\r
396   (save-excursion\r
397     (beginning-of-line)\r
398     (re-search-forward fuel-syntax--constructor-regex (line-end-position) t)))\r
399 \r
400 (defsubst fuel-syntax--at-using ()\r
401   (looking-at fuel-syntax--using-lines-regex))\r
402 \r
403 (defun fuel-syntax--in-using ()\r
404   (let ((p (point)))\r
405     (save-excursion\r
406       (and (re-search-backward "^USING: " nil t)\r
407            (re-search-forward " ;" nil t)\r
408            (< p (match-end 0))))))\r
409 \r
410 (defsubst fuel-syntax--beginning-of-defun (&optional times)\r
411   (re-search-backward fuel-syntax--begin-of-def-regex nil t times))\r
412 \r
413 (defsubst fuel-syntax--end-of-defun ()\r
414   (re-search-forward fuel-syntax--end-of-def-regex nil t))\r
415 \r
416 (defsubst fuel-syntax--end-of-defun-pos ()\r
417   (save-excursion\r
418     (re-search-forward fuel-syntax--end-of-def-regex nil t)\r
419     (point)))\r
420 \r
421 (defun fuel-syntax--beginning-of-body ()\r
422   (let ((p (point)))\r
423     (and (fuel-syntax--beginning-of-defun)\r
424          (re-search-forward fuel-syntax--defun-signature-regex p t)\r
425          (not (re-search-forward fuel-syntax--end-of-def-regex p t)))))\r
426 \r
427 (defun fuel-syntax--beginning-of-sexp ()\r
428   (if (> (fuel-syntax--brackets-depth) 0)\r
429       (goto-char (fuel-syntax--brackets-start))\r
430     (fuel-syntax--beginning-of-body)))\r
431 \r
432 (defsubst fuel-syntax--beginning-of-sexp-pos ()\r
433   (save-excursion (fuel-syntax--beginning-of-sexp) (point)))\r
434 \r
435 \f\r
436 ;;; USING/IN:\r
437 \r
438 (make-variable-buffer-local\r
439  (defvar fuel-syntax--current-vocab-function 'fuel-syntax--find-in))\r
440 \r
441 (defsubst fuel-syntax--current-vocab ()\r
442   (funcall fuel-syntax--current-vocab-function))\r
443 \r
444 (defun fuel-syntax--find-in ()\r
445   (save-excursion\r
446     (when (re-search-backward fuel-syntax--current-vocab-regex nil t)\r
447       (match-string-no-properties 1))))\r
448 \r
449 (make-variable-buffer-local\r
450  (defvar fuel-syntax--usings-function 'fuel-syntax--find-usings))\r
451 \r
452 (defsubst fuel-syntax--usings ()\r
453   (funcall fuel-syntax--usings-function))\r
454 \r
455 (defun fuel-syntax--file-has-private ()\r
456   (save-excursion\r
457     (goto-char (point-min))\r
458     (and (re-search-forward "\\_<<PRIVATE\\_>" nil t)\r
459          (re-search-forward "\\_<PRIVATE>\\_>" nil t))))\r
460 \r
461 (defun fuel-syntax--find-usings (&optional no-private)\r
462   (save-excursion\r
463     (let ((usings))\r
464       (goto-char (point-max))\r
465       (while (re-search-backward fuel-syntax--using-lines-regex nil t)\r
466         (dolist (u (split-string (match-string-no-properties 1) nil t))\r
467           (push u usings)))\r
468       (when (and (not no-private) (fuel-syntax--file-has-private))\r
469         (goto-char (point-max))\r
470         (push (concat (fuel-syntax--find-in) ".private") usings))\r
471       usings)))\r
472 \r
473 \f\r
474 (provide 'fuel-syntax)\r
475 ;;; fuel-syntax.el ends here\r