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