Home | History | Annotate | Download | only in clang

Lines Matching defs:include

1 ;;; clang-include-fixer.el --- Emacs integration of the clang include fixer  -*- lexical-binding: t; -*-
8 ;; This package allows Emacs users to invoke the 'clang-include-fixer' within
9 ;; Emacs. 'clang-include-fixer' provides an automated way of adding #include
11 ;; <http://clang.llvm.org/extra/include-fixer.html>.
19 (defgroup clang-include-fixer nil
20 "Clang-based include fixer."
23 (defvar clang-include-fixer-add-include-hook nil
24 "A hook that will be called for every added include.
25 The first argument is the filename of the include, the second argument is
26 non-nil if the include is a system-header.")
28 (defcustom clang-include-fixer-executable
29 "clang-include-fixer"
30 "Location of the clang-include-fixer executable.
33 :group 'clang-include-fixer
37 (defcustom clang-include-fixer-input-format
39 "Input format for clang-include-fixer.
41 `clang-include-fixer-executable'."
42 :group 'clang-include-fixer
49 (defcustom clang-include-fixer-init-string
51 "Database initialization string for clang-include-fixer.
53 `clang-include-fixer-executable'."
54 :group 'clang-include-fixer
58 (defface clang-include-fixer-highlight '((t :background "green"))
61 (defun clang-include-fixer ()
62 "Invoke the Include Fixer to insert missing C++ headers."
64 (message (concat "Calling the include fixer. "
66 (clang-include-fixer--start #'clang-include-fixer--add-header
69 (defun clang-include-fixer-at-point ()
70 "Invoke the Clang include fixer for the symbol at point."
72 (let ((symbol (clang-include-fixer--symbol-at-point)))
75 (clang-include-fixer-from-symbol symbol)))
77 (defun clang-include-fixer-from-symbol (symbol)
78 "Invoke the Clang include fixer for the SYMBOL.
81 (list (read-string "Symbol: " (clang-include-fixer--symbol-at-point))))
82 (clang-include-fixer--start #'clang-include-fixer--add-header
85 (defun clang-include-fixer--start (callback &rest args)
86 "Asynchronously start clang-include-fixer with parameters ARGS.
95 (clang-include-fixer--make-process callback args)
96 (clang-include-fixer--start-process callback args))))
103 (defun clang-include-fixer--make-process (callback args)
110 (stdout (generate-new-buffer "*clang-include-fixer output*"))
111 (stderr (generate-new-buffer "*clang-include-fixer errors*")))
112 (make-process :name "clang-include-fixer"
114 :command (clang-include-fixer--command args)
118 :sentinel (clang-include-fixer--sentinel stdin stdout stderr
122 (defun clang-include-fixer--start-process (callback args)
129 (stdout (generate-new-buffer "*clang-include-fixer output*"))
131 (process (apply #'start-process "clang-include-fixer" stdout
132 (clang-include-fixer--command args))))
136 (clang-include-fixer--sentinel stdin stdout nil
140 (defun clang-include-fixer--command (args)
141 "Return the clang-include-fixer command line.
143 execute (`clang-include-fixer-executable'), and the remaining
145 for `clang-include-fixer-input-format' and
146 `clang-include-fixer-init-string'. Appends the current buffer's
149 `(,clang-include-fixer-executable
150 ,(format "-db=%s" clang-include-fixer-input-format)
151 ,(format "-input=%s" clang-include-fixer-init-string)
156 (defun clang-include-fixer--sentinel (stdin stdout stderr callback)
157 "Return a process sentinel for clang-include-fixer processes.
177 (message "clang-include-fixer failed")
184 (defun clang-include-fixer--replace-buffer (stdout)
188 (unless (clang-include-fixer--insert-line stdout (current-buffer))
194 (defun clang-include-fixer--insert-line (from to)
236 (defun clang-include-fixer--add-header (stdout)
237 "Analyse the result of include-fixer stored in STDOUT.
241 clang-include-fixer to insert the selected header."
243 (let ((context (clang-include-fixer--parse-json stdout)))
257 (clang-include-fixer--select-header context)
258 ;; Call clang-include-fixer again to insert the selected header.
259 (clang-include-fixer--start
266 (clang-include-fixer--replace-buffer stdout)
270 (run-hook-with-args 'clang-include-fixer-add-include-hook
274 (clang-include-fixer--encode-json context))))))))
277 (defun clang-include-fixer--select-header (context)
279 CONTEXT must be a clang-include-fixer context object in
282 is modified to include only the selected element."
286 (clang-include-fixer--prompt-for-header context)
287 (message "Only one include is missing: %s"
291 (defvar clang-include-fixer--history nil
292 "History for `clang-include-fixer--prompt-for-header'.")
294 (defun clang-include-fixer--prompt-for-header (context)
299 (let ((symbol (clang-include-fixer--symbol-name .QuerySymbolInfos))
303 (mapcar #'clang-include-fixer--highlight .QuerySymbolInfos))))
309 (goto-char (clang-include-fixer--closest-overlay overlays)))
311 ;; The header-infos is already sorted by include-fixer.
313 (clang-include-fixer--format-message
314 "Select include for '%s': " symbol)
317 'clang-include-fixer--history))
324 (defun clang-include-fixer--symbol-name (symbol-infos)
334 (defun clang-include-fixer--highlight (symbol-info)
340 (clang-include-fixer--filepos-to-bufferpos
342 (clang-include-fixer--filepos-to-bufferpos
344 (overlay-put overlay 'face 'clang-include-fixer-highlight)
347 (defun clang-include-fixer--closest-overlay (overlays)
357 (defun clang-include-fixer--parse-json (buffer)
358 "Parse a JSON response from clang-include-fixer in BUFFER.
372 (defun clang-include-fixer--encode-json (object)
381 (defun clang-include-fixer--symbol-at-point ()
394 (while (and (clang-include-fixer--skip-double-colon-backward)
397 (clang-include-fixer--skip-double-colon-backward)
402 (while (and (clang-include-fixer--skip-double-colon-forward)
407 (defun clang-include-fixer--skip-double-colon-forward ()
417 (defun clang-include-fixer--skip-double-colon-backward ()
429 (defalias 'clang-include-fixer--filepos-to-bufferpos
437 (defalias 'clang-include-fixer--format-message
440 (provide 'clang-include-fixer)
441 ;;; clang-include-fixer.el ends here