diff options
author | mattkae <mattkae@protonmail.com> | 2022-06-07 08:23:47 -0400 |
---|---|---|
committer | mattkae <mattkae@protonmail.com> | 2022-06-07 08:23:47 -0400 |
commit | bd18a38c2898548a3664a9ddab9f79c84f2caf4a (patch) | |
tree | 95b9933376770381bd8859782ae763be81c2d72b /elpa/irony-20220110.849/irony-completion.el | |
parent | b07628dddf418d4f47b858e6c35fd3520fbaeed2 (diff) | |
parent | ef160dea332af4b4fe5e2717b962936c67e5fe9e (diff) |
Merge conflict
Diffstat (limited to 'elpa/irony-20220110.849/irony-completion.el')
-rw-r--r-- | elpa/irony-20220110.849/irony-completion.el | 426 |
1 files changed, 0 insertions, 426 deletions
diff --git a/elpa/irony-20220110.849/irony-completion.el b/elpa/irony-20220110.849/irony-completion.el deleted file mode 100644 index a994c32..0000000 --- a/elpa/irony-20220110.849/irony-completion.el +++ /dev/null @@ -1,426 +0,0 @@ -;;; irony-completion.el --- irony-mode completion interface -*- lexical-binding: t -*- - -;; Copyright (C) 2012-2014 Guillaume Papin - -;; Author: Guillaume Papin <guillaume.papin@epitech.eu> -;; Keywords: c, convenience, tools - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see <http://www.gnu.org/licenses/>. - -;;; Commentary: - -;; Handle the search of completion points, the triggering of the -;; completion when needed and the "parsing" of completion results. - -;;; Code: - -(require 'irony) -(require 'irony-snippet) - -(require 'cl-lib) - - -;; -;; Customizable variables -;; - -(defgroup irony-completion nil - "Irony's completion interface." - :group 'irony) - -(defcustom irony-completion-trigger-commands '(self-insert-command - newline-and-indent - c-context-line-break - c-scope-operator - ;; electric commands - c-electric-backspace - c-electric-brace - c-electric-colon - c-electric-lt-gt - c-electric-paren - c-electric-pound - c-electric-semi&comma - c-electric-slash - c-electric-star) - "List of commands to watch for asynchronous completion triggering." - :type '(repeat function) - :group 'irony-completion) - -(defcustom irony-duplicate-candidates-filter nil - "Remove duplicate candidates. - -If non-nil, the completion candidate list will not contain -duplicate entries. As an example, duplicate candidates are -displayed when a derived class overrides virtual methods." - :type 'boolean - :group 'irony-completion) - - -;; -;; Utility functions -;; - -(defun irony-completion-symbol-bounds () - (let ((pt (point)) - (syntax (syntax-ppss))) - ;; no prefix for strings or comments - ;; TODO: Use fontlock faces instead? at least - ;; #warning In the middle of a warning| - ;; will be handled properly but things like links when - ;; `goto-address-prog-mode' is enabled will mess up things: - ;; #error see bug report XY: http://example.com/XY - (unless (or (nth 3 syntax) ;skip strings - (nth 4 syntax)) ;skip comments - (save-excursion - (skip-chars-backward "_a-zA-Z0-9") - (let ((ch (char-after))) - (unless (and ch (>= ch ?0) (<= ch ?9)) ;skip numbers - (when (eq (char-before) ?~) - (backward-char)) - (setq pt (point)) - (skip-chars-forward "_a-zA-Z0-9~") - (cons pt (point)))))))) - -(defun irony-completion-beginning-of-symbol () - (car (irony-completion-symbol-bounds))) - -(defun irony-completion-end-of-symbol () - (cdr (irony-completion-symbol-bounds))) - -(defsubst irony-completion--skip-whitespaces-backward () - ;;(skip-syntax-backward "-") doesn't seem to care about newlines - (skip-chars-backward " \t\n\r")) - -(defun irony-completion--parse-context-position (&optional pos) - (save-excursion - (when pos - (goto-char pos)) - (irony-completion--skip-whitespaces-backward) - (point))) - -(defun irony--completion-line-column (&optional pos) - (save-excursion - (when pos - (goto-char pos)) - ;; `position-bytes' to handle multibytes and 'multicolumns' (i.e - ;; tabulations) characters properly - (irony--without-narrowing - (cons - (line-number-at-pos) - (1+ (- (position-bytes (point)) - (position-bytes (point-at-bol)))))))) - - -;; -;; Functions -;; - -(defun irony-completion--enter () - (add-hook 'completion-at-point-functions 'irony-completion-at-point nil t)) - -(defun irony-completion--exit () - (remove-hook 'completion-at-point-functions 'irony-completion-at-point t)) - -(defun irony-completion--post-complete-yas-snippet (str placeholders) - (let ((ph-count 0) - (from 0) - to snippet) - (while - (setq to (car placeholders) - snippet (concat - snippet - (substring str from to) - (format "${%d:%s}" - (cl-incf ph-count) - (substring str - (car placeholders) - (cadr placeholders)))) - from (cadr placeholders) - placeholders (cddr placeholders))) - ;; handle the remaining non-snippet string, if any. - (concat snippet (substring str from) "$0"))) - - -;; -;; Interface with irony-server -;; - -(irony-iotask-define-task irony--t-complete - "`complete' server command." - :start (lambda (file line column compile-options) - (apply #'irony--server-send-command "complete" file line column "--" - compile-options)) - :update irony--server-command-update) - -(defun irony--complete-task-1 (&optional buffer pos) - (with-current-buffer (or buffer (current-buffer)) - (let ((line-column (irony--completion-line-column pos))) - (irony-iotask-package-task irony--t-complete - (irony--get-buffer-path-for-server) - (car line-column) - (cdr line-column) - (irony--adjust-compile-options))))) - -(defun irony--complete-task (&optional buffer pos) - (let ((unsaved-tasks (irony--unsaved-buffers-tasks)) - (complete-task (irony--complete-task-1 buffer pos))) - (if unsaved-tasks - (irony-iotask-chain unsaved-tasks complete-task) - complete-task))) - -(irony-iotask-define-task irony--t-candidates - "`candidates' server command." - :start (lambda (prefix style) - (irony--server-send-command - "candidates" prefix - (cl-case style - (case-insensitive "case-insensitive") - (smart-case "smart-case") - (t "exact")))) - :update irony--server-query-update) - -(defun irony--candidates-task (&optional buffer pos prefix style) - (irony-iotask-chain - (irony--complete-task buffer pos) - (irony-iotask-package-task irony--t-candidates prefix style))) - - -;; -;; Irony Completion Interface -;; - -(defun irony-completion-typed-text (candidate) - (nth 0 candidate)) - -(defun irony-completion-priority (candidate) - (nth 1 candidate)) - -(defun irony-completion-type (candidate) - (nth 2 candidate)) - -(defun irony-completion-brief (candidate) - (nth 3 candidate)) - -(defun irony-completion-annotation (candidate) - (substring (nth 4 candidate) (nth 5 candidate))) - -(defun irony-completion-post-comp-str (candidate) - (car (nth 6 candidate))) - -(defun irony-completion-post-comp-placeholders (candidate) - (cdr (nth 6 candidate))) - -(defun irony-completion--filter-candidates (candidates) - "Filter candidates by removing duplicates if -`irony-duplicate-candidates-filter' is non nil; Duplicate -candidates are those that have the same -`irony-completion-typed-text', `irony-completion-annotation' and -`irony-completion-type'. An example of when this is useful is -when there are many derived classes that override a virtual -method resulting in redundant duplicate entries being displayed -in the list of completions." - (let (unique-candidates) - (cl-remove-if-not - (lambda (candidate) - (or (not irony-duplicate-candidates-filter) - (let ((unique-key (list (irony-completion-typed-text candidate) - (irony-completion-annotation candidate) - (irony-completion-type candidate)))) - (and (not (member unique-key unique-candidates)) - (push unique-key unique-candidates))))) - candidates))) - -(defun irony-completion-candidates (&optional prefix style) - "Return the list of candidates at point. - -A candidate is composed of the following elements: - 0. The typed text. Multiple candidates can share the same string - because of overloaded functions, default arguments, etc. - 1. The priority. - 2. The [result-]type of the candidate, if any. - 3. If non-nil, contains the Doxygen brief documentation of the - candidate. - 4. The signature of the candidate excluding the result-type - which is available separately. - Example: \"foo(int a, int b) const\" - 5. The annotation start, a 0-based index in the prototype string. - 6. Post-completion data. The text to insert followed by 0 or - more indices. These indices work by pairs and describe ranges - of placeholder text. - Example: (\"(int a, int b)\" 1 6 8 13)" - (irony--awhen (irony-completion-symbol-bounds) - (irony-completion--filter-candidates - (irony--run-task - (irony--candidates-task nil (car it) prefix style))))) - -(defun irony-completion-candidates-async (callback &optional prefix style) - (irony--aif (irony-completion-symbol-bounds) - (irony--run-task-asynchronously - (irony--candidates-task nil (car it) prefix style) - (lambda (candidates-result) - (funcall callback (irony-completion--filter-candidates - (irony-iotask-result-get candidates-result))))) - (funcall callback nil))) - -(defun irony-completion-post-complete (candidate) - (let ((str (irony-completion-post-comp-str candidate)) - (placeholders (irony-completion-post-comp-placeholders candidate))) - (if (and placeholders (irony-snippet-available-p)) - (irony-snippet-expand - (irony-completion--post-complete-yas-snippet str placeholders)) - (insert (substring str 0 (car placeholders)))))) - -(defun irony-completion-at-trigger-point-p () - (when (eq (point) (irony-completion-beginning-of-symbol)) - (save-excursion - (cond - ;; use `re-search-backward' so that the cursor is moved just before the - ;; member access, if any - ((re-search-backward - (format "%s\\=" (regexp-opt '("." ;object member access - "->" ;pointer member access - "::"))) ;scope operator - (point-at-bol) t) - (unless - ;; ignore most common uses of '.' where it's not a member access - (and (eq (char-after) ?.) - (or - ;; include statements: #include <foo.|> - (looking-back "^#\\s-*include\\s-+[<\"][^>\"]*" - (point-at-bol)) - ;; floating point numbers (not thorough, see: - ;; http://en.cppreference.com/w/cpp/language/floating_literal) - (looking-back "[^_a-zA-Z0-9][[:digit:]]+" (point-at-bol)))) - ;; except the above exceptions we use a "whitelist" for the places - ;; where it looks like a member access - (irony-completion--skip-whitespaces-backward) - (or - ;; after brackets consider it's a member access so things like - ;; 'getFoo().|' match - (memq (char-before) (list ?\) ?\] ?} ?>)) - ;; identifiers but ignoring some keywords - ;; - ;; handle only a subset of template parameter packs, where the - ;; ellipsis is preceded by a keyword, in situation like: - ;; template<typename ... Args> class X {...}; - ;; template<typename .| - ;; or just look if the face is: font-lock-keyword-face? - (save-excursion - (and (re-search-backward "\\b\\([_a-zA-Z][_a-zA-Z0-9]*\\)\\=" - (point-at-bol) t) - (not (member (match-string 0) - '("class" "sizeof" "typename")))))))))))) - - -;; -;; Irony CAPF -;; - -(defsubst irony-completion--capf-candidate (candidate) - (get-text-property 0 'irony-capf candidate)) - -(defun irony-completion--capf-annotate (candidate) - (irony-completion-annotation - (irony-completion--capf-candidate candidate))) - -(defun irony-completion--capf-postcomp-commonprefix (candidates) - (let ((prefixes (mapcar - (lambda (candidate) - (let ((str (irony-completion-post-comp-str candidate)) - (phs (irony-completion-post-comp-placeholders - candidate))) - (substring str 0 (car phs)))) - candidates))) - (cl-loop for i from 0 below (apply #'min (mapcar #'length prefixes)) - while (apply #'= (mapcar (lambda (string) (aref string i)) - prefixes)) - finally (return (cl-subseq (first prefixes) 0 i))))) - -(defun irony-completion--capf-postcomp-all-equal-p (candidates) - (when (cdr candidates) - (let ((expected-str (irony-completion-post-comp-str (car candidates))) - (expected-phs (irony-completion-post-comp-placeholders - (car candidates)))) - (while (and (setq candidates (cdr candidates)) - (string= expected-str (irony-completion-post-comp-str (car candidates))) - (equal expected-phs (irony-completion-post-comp-placeholders (car candidates)))))) - (null candidates))) - -(defun irony-completion--capf-exit-function (candidates str status) - "Insert post completion string or snippet after STR has been completed." - ;; according to `pcomplete-completions-at-point', - ;; react on `finished' but not `sole', - ;; because it does not work properly when cycling completions - (when (eq status 'finished) - (let ((candidate (irony-completion--capf-candidate str)) - matches) - ;; `completion-at-point' doesn't provides the propertized string created - ;; with the `irony-capf' text property - ;; but `company-capf' does, and maybe `completion-at-point' some day. - ;; So if the candidate data is found use it, - ;; otherwise try to find the candidate in the completion list - ;; at the risk of dealing with overloaded functions and not being able to - ;; make the right decision - (setq matches - (if candidate - (list candidate) - (cl-remove-if-not (lambda (candidate) - (string= (car candidate) str)) - candidates))) - ;; all equals can happen with when the difference in the annotation - ;; is the return type and constness attributes, - ;; for example `std::string' `at(n)' function is overloaded that way: - ;; const char & at(size_type n) const; - ;; char & at(size_type n); - (if (or (= (length matches) 1) - (irony-completion--capf-postcomp-all-equal-p matches)) - ;; with a perfect match we are able to give complete post-completion - (irony-completion-post-complete (car matches)) - ;; more than one candidates possible, - ;; provide the beginning of the post-completion data as a best effort. - ;; For overloaded functions this inserts the opening parenthesis. - (irony--awhen (irony-completion--capf-postcomp-commonprefix matches) - (insert it)))))) - -;;;###autoload -(defun irony-completion-at-point () - (irony--awhen (and irony-mode (irony-completion-symbol-bounds)) - (let ((candidates (irony-completion--filter-candidates - (irony--run-task - (irony--candidates-task - nil - (car it) - (buffer-substring-no-properties - (car it) (cdr it)) - (if completion-ignore-case - 'case-insensitive - 'exact)))))) - (list - (car it) ;start - (cdr it) ;end - (mapcar (lambda (candidate) ;completion table - (propertize (car candidate) 'irony-capf candidate)) - candidates) - :annotation-function #'irony-completion--capf-annotate - :exit-function - (lambda (str status) - (irony-completion--capf-exit-function candidates str status)))))) - -(provide 'irony-completion) - -;; Local Variables: -;; byte-compile-warnings: (not cl-functions) -;; End: - -;;; irony-completion.el ends here |