|
14 | 14 | (require 'subr-x)
|
15 | 15 | (require 'merlin)
|
16 | 16 |
|
17 |
| -;;; enable depth and size threshold for OCaml modules with big size |
18 |
| -(setq max-lisp-eval-depth 10000) |
19 |
| -(setq max-specpdl-size 10000) |
20 |
| - |
21 | 17 | ;; lists of different outline items
|
22 |
| -(defvar-local value-list nil) |
23 |
| -(defvar-local type-list nil) |
24 |
| -(defvar-local exception-list nil) |
| 18 | +(defvar-local merlin-imenu--value-list nil) |
| 19 | +(defvar-local merlin-imenu--type-list nil) |
| 20 | +(defvar-local merlin-imenu--exception-list nil) |
25 | 21 |
|
26 | 22 | (defun merlin-imenu-compute-position (line col)
|
27 | 23 | "Get location of the item."
|
|
47 | 43 | (type (propertize type 'face 'font-lock-doc-face)))
|
48 | 44 | (if (string= type "null") name (concat name " : " type))))
|
49 | 45 |
|
50 |
| -(defun merlin-imenu-parse-outline-item (prefix item) |
51 |
| - "Parse one item of the outline tree." |
52 |
| - (let* ((line (cdr (assoc 'line (assoc 'start item)))) |
53 |
| - (col (cdr (assoc 'col (assoc 'start item)))) |
54 |
| - (name (cdr (assoc 'name item))) |
55 |
| - (kind (cdr (assoc 'kind item))) |
56 |
| - (type (cdr (assoc 'type item))) |
57 |
| - (sub-trees (cdr (assoc 'children item))) |
58 |
| - (entry (merlin-imenu-create-entry prefix name type kind line col)) |
59 |
| - (position (merlin-imenu-compute-position line col)) |
60 |
| - (marker (cons entry (set-marker (make-marker) position)))) |
61 |
| - (cond ((string= kind "Value") |
62 |
| - (setq value-list (cons marker value-list))) |
63 |
| - ((string= kind "Type") |
64 |
| - (setq type-list (cons marker type-list))) |
65 |
| - ((string= kind "Exn") |
66 |
| - (setq exception-list (cons marker exception-list)))) |
67 |
| - (if (and (listp sub-trees) (not (null sub-trees))) |
68 |
| - (merlin-imenu-parse-outline-tree (concat prefix entry ".") sub-trees)))) |
69 |
| - |
70 |
| -(defun merlin-imenu-parse-outline-tree (prefix outline) |
71 |
| - "Parse outline tree." |
72 |
| - (when (not (null outline)) |
73 |
| - (merlin-imenu-parse-outline-item prefix (car outline)) |
74 |
| - (merlin-imenu-parse-outline-tree prefix (cdr outline)))) |
| 46 | +(defun merlin-imenu-parse-outline (prefix outline) |
| 47 | + (dolist (item outline) |
| 48 | + (let* ((line (cdr (assoc 'line (assoc 'start item)))) |
| 49 | + (col (cdr (assoc 'col (assoc 'start item)))) |
| 50 | + (name (cdr (assoc 'name item))) |
| 51 | + (kind (cdr (assoc 'kind item))) |
| 52 | + (type (cdr (assoc 'type item))) |
| 53 | + (sub-trees (cdr (assoc 'children item))) |
| 54 | + (entry (merlin-imenu-create-entry prefix name type kind line col)) |
| 55 | + (position (merlin-imenu-compute-position line col)) |
| 56 | + (marker (cons entry (set-marker (make-marker) position)))) |
| 57 | + (cond ((string= kind "Value") |
| 58 | + (setq merlin-imenu--value-list (cons marker merlin-imenu--value-list))) |
| 59 | + ((string= kind "Type") |
| 60 | + (setq merlin-imenu--type-list (cons marker merlin-imenu--type-list))) |
| 61 | + ((string= kind "Exn") |
| 62 | + (setq merlin-imenu--exception-list (cons marker merlin-imenu--exception-list)))) |
| 63 | + (when sub-trees |
| 64 | + (merlin-imenu-parse-outline (concat prefix entry ".") sub-trees))))) |
75 | 65 |
|
76 | 66 | (defun merlin-imenu-create-index ()
|
77 | 67 | "Create data for imenu using the merlin outline feature."
|
78 | 68 | ;; Reset local vars
|
79 |
| - (setq value-list nil |
80 |
| - type-list nil |
81 |
| - exception-list nil) |
| 69 | + (setq merlin-imenu--value-list nil |
| 70 | + merlin-imenu--type-list nil |
| 71 | + merlin-imenu--exception-list nil) |
82 | 72 | ;; Read outline tree
|
83 |
| - (merlin-imenu-parse-outline-tree "" (merlin/call "outline")) |
84 |
| - (let ((index ())) |
85 |
| - (when value-list (push (cons "Value" value-list) index)) |
86 |
| - (when exception-list (push (cons "Exception" exception-list) index)) |
87 |
| - (when type-list (push (cons "Type" type-list) index)) |
| 73 | + (merlin-imenu-parse-outline "" (merlin/call "outline")) |
| 74 | + (let ((index nil)) |
| 75 | + (when merlin-imenu--value-list |
| 76 | + (push (cons "Value" merlin-imenu--value-list) index)) |
| 77 | + (when merlin-imenu--exception-list |
| 78 | + (push (cons "Exception" merlin-imenu--exception-list) index)) |
| 79 | + (when merlin-imenu--type-list |
| 80 | + (push (cons "Type" merlin-imenu--type-list) index)) |
88 | 81 | index))
|
89 | 82 |
|
90 | 83 | ;;;###autoload
|
|
0 commit comments