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"))
62 (defun clang-include-fixer ()
63 "Invoke the Include Fixer to insert missing C++ headers."
65 (message (concat "Calling the include fixer. "
67 (clang-include-fixer--start #'clang-include-fixer--add-header
71 (defun clang-include-fixer-at-point ()
72 "Invoke the Clang include fixer for the symbol at point."
74 (let ((symbol (clang-include-fixer--symbol-at-point)))
77 (clang-include-fixer-from-symbol symbol)))
80 (defun clang-include-fixer-from-symbol (symbol)
81 "Invoke the Clang include fixer for the SYMBOL.
84 (list (read-string "Symbol: " (clang-include-fixer--symbol-at-point))))
85 (clang-include-fixer--start #'clang-include-fixer--add-header
88 (defun clang-include-fixer--start (callback &rest args)
89 "Asynchronously start clang-include-fixer with parameters ARGS.
95 (user-error "clang-include-fixer works only in buffers that visit a file"))
100 (clang-include-fixer--make-process callback args)
101 (clang-include-fixer--start-process callback args))))
108 (defun clang-include-fixer--make-process (callback args)
115 (stdout (generate-new-buffer "*clang-include-fixer output*"))
116 (stderr (generate-new-buffer "*clang-include-fixer errors*")))
117 (make-process :name "clang-include-fixer"
119 :command (clang-include-fixer--command args)
123 :sentinel (clang-include-fixer--sentinel stdin stdout stderr
127 (defun clang-include-fixer--start-process (callback args)
134 (stdout (generate-new-buffer "*clang-include-fixer output*"))
136 (process (apply #'start-process "clang-include-fixer" stdout
137 (clang-include-fixer--command args))))
141 (clang-include-fixer--sentinel stdin stdout nil
145 (defun clang-include-fixer--command (args)
146 "Return the clang-include-fixer command line.
148 execute (`clang-include-fixer-executable'), and the remaining
150 for `clang-include-fixer-input-format' and
151 `clang-include-fixer-init-string'. Appends the current buffer's
154 `(,clang-include-fixer-executable
155 ,(format "-db=%s" clang-include-fixer-input-format)
156 ,(format "-input=%s" clang-include-fixer-init-string)
161 (defun clang-include-fixer--sentinel (stdin stdout stderr callback)
162 "Return a process sentinel for clang-include-fixer processes.
182 (message "clang-include-fixer failed")
189 (defun clang-include-fixer--replace-buffer (stdout)
194 ((clang-include-fixer--insert-line stdout (current-buffer)))
199 (defun clang-include-fixer--insert-line (from to)
241 (defun clang-include-fixer--add-header (stdout)
242 "Analyse the result of include-fixer stored in STDOUT.
246 clang-include-fixer to insert the selected header."
248 (let ((context (clang-include-fixer--parse-json stdout)))
262 (clang-include-fixer--select-header context)
263 ;; Call clang-include-fixer again to insert the selected header.
264 (clang-include-fixer--start
271 (clang-include-fixer--replace-buffer stdout)
275 (run-hook-with-args 'clang-include-fixer-add-include-hook
279 (clang-include-fixer--encode-json context))))))))
282 (defun clang-include-fixer--select-header (context)
284 CONTEXT must be a clang-include-fixer context object in
287 is modified to include only the selected element."
291 (clang-include-fixer--prompt-for-header context)
292 (message "Only one include is missing: %s"
296 (defvar clang-include-fixer--history nil
297 "History for `clang-include-fixer--prompt-for-header'.")
299 (defun clang-include-fixer--prompt-for-header (context)
304 (let ((symbol (clang-include-fixer--symbol-name .QuerySymbolInfos))
308 (mapcar #'clang-include-fixer--highlight .QuerySymbolInfos))))
314 (goto-char (clang-include-fixer--closest-overlay overlays)))
316 ;; The header-infos is already sorted by include-fixer.
318 (clang-include-fixer--format-message
319 "Select include for '%s': " symbol)
322 'clang-include-fixer--history))
329 (defun clang-include-fixer--symbol-name (symbol-infos)
339 (defun clang-include-fixer--highlight (symbol-info)
345 (clang-include-fixer--filepos-to-bufferpos
347 (clang-include-fixer--filepos-to-bufferpos
349 (overlay-put overlay 'face 'clang-include-fixer-highlight)
352 (defun clang-include-fixer--closest-overlay (overlays)
362 (defun clang-include-fixer--parse-json (buffer)
363 "Parse a JSON response from clang-include-fixer in BUFFER.
377 (defun clang-include
386 (defun clang-include-fixer--symbol-at-point ()
399 (while (and (clang-include-fixer--skip-double-colon-backward)
402 (clang-include-fixer--skip-double-colon-backward)
407 (while (and (clang-include-fixer--skip-double-colon-forward)
412 (defun clang-include-fixer--skip-double-colon-forward ()
422 (defun clang-include-fixer--skip-double-colon-backward ()
434 (defalias 'clang-include-fixer--filepos-to-bufferpos
442 (defalias 'clang-include-fixer--format-message
445 (provide 'clang-include-fixer)
446 ;;; clang-include-fixer.el ends here