diff options
author | mattkae <mattkae@protonmail.com> | 2022-05-11 09:23:58 -0400 |
---|---|---|
committer | mattkae <mattkae@protonmail.com> | 2022-05-11 09:23:58 -0400 |
commit | 3f4a0d5370ae6c34afe180df96add3b8522f4af1 (patch) | |
tree | ae901409e02bde8ee278475f8cf6818f8f680a60 /elpa/irony-20220110.849/irony-snippet.el |
initial commit
Diffstat (limited to 'elpa/irony-20220110.849/irony-snippet.el')
-rw-r--r-- | elpa/irony-20220110.849/irony-snippet.el | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/elpa/irony-20220110.849/irony-snippet.el b/elpa/irony-20220110.849/irony-snippet.el new file mode 100644 index 0000000..b12b587 --- /dev/null +++ b/elpa/irony-20220110.849/irony-snippet.el @@ -0,0 +1,135 @@ +;;; irony-snippet.el --- Snippet support for Irony-Mode + +;; Copyright (C) 2013-2014 Guillaume Papin + +;; Author: Guillaume Papin <guillaume.papin@epitech.eu> +;; Keywords: c, convenience + +;; 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: + +;; Snippet support functions, support all version of YASnippet and +;; maybe further frameworks later. +;; +;; It is possible to check snippet support by calling +;; `irony-snippet-available-p'. +;; +;; Note: Some YASnippet versions require to have +;; `yas/minor-mode' or `yas-minor-mode' enabled to work. + +;;; Code: + + +;; Private variables +;; +(defvar irony-snippet--expand-function nil + "Function to expand a snippet at a given point (by default to +the current position). + +e.g: (defun my-expand-snippet (snippet-str &optional pos) + (do-stuff (or pos (point))) + +Will be set to nil if no snippet expansion function is found.") + + +;; +;; "Public" functions +;; +(defun irony-snippet-available-p () + "Return t if snippets are supported." + (and (irony-snippet--get-expand-function) + (not (irony-snippet--yas-disabled-p)))) + +(defun irony-snippet-expand (snippet-str &optional pos) + "Expand SNIPPET-STR starting at POS. + +If `irony-snippet-available-p' return t then" + (let ((expand-func (irony-snippet--get-expand-function))) + (funcall expand-func snippet-str pos))) + + +;; Private functions +;; +(defun irony-snippet--get-expand-function () + (unless irony-snippet--expand-function + (irony-snippet--init-yas)) + irony-snippet--expand-function) + +(defun irony-snippet--init-yas () + ;; find the snippet expand function + (when (require 'yasnippet nil t) + (let ((yas-version (or (and (boundp 'yas--version) yas--version) + (and (boundp 'yas/version) yas/version)))) ;for old versions + (when (stringp yas-version) + (setq yas-version (replace-regexp-in-string "(\\|)" "" yas-version)) + (setq irony-snippet--expand-function + ;; (string= ... "0.6.0c"), the 'c' suffix is not supported by + ;; `version-to-list' in emacs versions < 24, treat this one + ;; specifically. + (cond + ((or (string= yas-version "0.6.0c") + (version<= yas-version "0.6.0b")) + 'irony-snippet--expand-yas-1) + ;; `version<' thinks "0.8beta" < "0.8", we want to consider + ;; anything starting with "0.8" as "0.8" and more. + ((and (version< yas-version "0.8") + (not (string-prefix-p "0.8" yas-version))) + 'irony-snippet--expand-yas-2) + (t + 'irony-snippet--expand-yas-3))))))) + +(defun irony-snippet--yas-disabled-p () + "If the current yasnippet version offers a minor-mode, check if +this mode is disable by returning t, otherwise returns nil and +it's partially safe to assume that yasnippet expansion can be +used." + ;; XXX: work only when yasnippet is enabled, otherwise some + ;; variables used for the snippet expansion are not set and it + ;; causes some errors. + (if (boundp 'yas-minor-mode) + (not yas-minor-mode) + (if (boundp 'yas/minor-mode) + (not yas/minor-mode)))) + +(defun irony-snippet--expand-yas-1 (snippet-str &optional pos) + "Expand snippets for YASnippet version <= 0.6.0c." + (declare-function yas/expand-snippet "ext:yasnippet" t nil) + (unless (irony-snippet--yas-disabled-p) + (yas/expand-snippet (or pos (point)) + (or pos (point)) + snippet-str))) + +(defun irony-snippet--expand-yas-2 (snippet-str &optional pos) + "Expand snippets for YASnippet version < 0.8. + +See also `irony-snippet--expand-yas-1'." + (declare-function yas/expand-snippet "ext:yasnippet" t nil) + (unless (irony-snippet--yas-disabled-p) + (when pos + (goto-char pos)) + (yas/expand-snippet snippet-str))) + +(defun irony-snippet--expand-yas-3 (snippet-str &optional pos) + "Expand snippets for YASnippet version >= 0.8. + +See also `irony-snippet--expand-yas-2'." + (declare-function yas-expand-snippet "ext:yasnippet" t nil) + (unless (irony-snippet--yas-disabled-p) + (when pos + (goto-char pos)) + (yas-expand-snippet snippet-str))) + +(provide 'irony-snippet) +;;; irony-snippet.el ends here |