emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/swift-mode 69efea4 386/496: Add `current-defun-name`


From: ELPA Syncer
Subject: [nongnu] elpa/swift-mode 69efea4 386/496: Add `current-defun-name`
Date: Sun, 29 Aug 2021 11:34:12 -0400 (EDT)

branch: elpa/swift-mode
commit 69efea415ea9f21f8bac19c9b6d26f13e6774fe9
Author: taku0 <mxxouy6x3m_github@tatapa.org>
Commit: taku0 <mxxouy6x3m_github@tatapa.org>

    Add `current-defun-name`
---
 swift-mode-beginning-of-defun.el | 95 ++++++++++++++++++++++++++++++++++++++++
 swift-mode.el                    |  5 ++-
 2 files changed, 99 insertions(+), 1 deletion(-)

diff --git a/swift-mode-beginning-of-defun.el b/swift-mode-beginning-of-defun.el
index 19120ff..e03be8e 100644
--- a/swift-mode-beginning-of-defun.el
+++ b/swift-mode-beginning-of-defun.el
@@ -1213,6 +1213,101 @@ Interactively, the behavior depends on 
‘narrow-to-defun-include-comments’."
         (progn (message "No sentence found") nil)
       region)))
 
+(defun swift-mode:current-defun-name ()
+  "Return fully qualified name of defun under the point."
+  (save-excursion
+    (let ((token-list (reverse (swift-mode:current-defun-name-token-list))))
+      (if token-list
+          (mapconcat #'swift-mode:token:text token-list ".")
+        nil))))
+
+(defun swift-mode:current-defun-name-token-list ()
+  "Return a list of defun name tokens under the point.
+
+The first element is the name token of the current defun.  The rest are the 
ones
+of ancestors."
+  (if (bobp)
+      nil
+    (let ((name-token (swift-mode:current-defun-name-token)))
+      (swift-mode:backward-sexps-until '({))
+      (if name-token
+          (cons name-token (swift-mode:current-defun-name-token-list))
+        (swift-mode:current-defun-name-token-list)))))
+
+(defun swift-mode:current-defun-name-token ()
+  "Return the name token of the defun under the point."
+  (let ((pos (point))
+        keyword-token
+        keyword-text
+        next-token
+        name-token)
+    (goto-char (car (swift-mode:containing-generic-block-region
+                     #'swift-mode:end-of-defun
+                     #'swift-mode:beginning-of-defun)))
+
+    (save-excursion
+      (setq keyword-token (swift-mode:find-defun-keyword))
+      (setq keyword-text (swift-mode:token:text keyword-token))
+      (when keyword-token
+        (goto-char (swift-mode:token:end keyword-token)))
+      (setq
+       name-token
+       (cond
+        ((member keyword-text
+                 '("typealias" "associatedtype" "precedencegroup" "func"
+                   "class" "enum" "struct" "protocol" "extension"))
+         (swift-mode:forward-token))
+
+        ((member keyword-text '("init" "deinit" "subscript"))
+         keyword-token)
+
+        ((member keyword-text '("case" "var" "let"))
+         ;; enum Foo {
+         ;;   case A, B(x: (Int, Int)), C
+         ;; }
+         ;;
+         ;; class Foo {
+         ;;   let x = 1,
+         ;;       y = 1,
+         ;;       z = 1
+         ;;   var x {
+         ;;     get {
+         ;;       return 1
+         ;;     }
+         ;;   }
+         ;;   var x = 1 {
+         ;;     willSet {
+         ;;     }
+         ;;   }
+         ;;
+         ;;   let (x, y) = (1, 1) // not supported yet
+         ;; }
+         (while (< (point) pos)
+           (setq next-token (swift-mode:forward-token-or-list)))
+         (when next-token
+           (goto-char (swift-mode:token:start next-token)))
+         (goto-char (swift-mode:token:end
+                     (swift-mode:backward-sexps-until (list keyword-text 
'\,))))
+         (setq next-token (swift-mode:forward-token))
+         (if (and
+              (eq (swift-mode:token:type next-token) 'identifier)
+              (not
+               (equal (swift-mode:token:text (swift-mode:forward-token)) ".")))
+             next-token
+           ;; FIXME: Complex patterns.
+           nil))
+
+        ((member keyword-text '("prefix" "postfix" "infix"))
+         (and (equal (swift-mode:token:text (swift-mode:forward-token))
+                     "operator")
+              (swift-mode:forward-token)))
+
+        ;; Ignored: "import" "get" "set" "willSet" "didSet"
+        (t nil))))
+    (if (memq (swift-mode:token:type name-token) '(identifier operator))
+        name-token
+      nil)))
+
 (provide 'swift-mode-beginning-of-defun)
 
 ;;; swift-mode-beginning-of-defun.el ends here
diff --git a/swift-mode.el b/swift-mode.el
index 6191741..878211f 100644
--- a/swift-mode.el
+++ b/swift-mode.el
@@ -213,7 +213,10 @@ Signal `scan-error' if it hits opening parentheses."
   (setq-local swift-mode:anchor-overlay
               (make-overlay (point-min) (point-min) nil t))
 
-  (delete-overlay swift-mode:anchor-overlay))
+  (delete-overlay swift-mode:anchor-overlay)
+
+  (add-hook 'which-func-functions #'swift-mode:current-defun-name)
+  (setq-local add-log-current-defun-function #'swift-mode:current-defun-name))
 
 ;;;###autoload (add-to-list 'auto-mode-alist '("\\.swift\\'" . swift-mode))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]