Skip to content

Commit 69efea4

Browse files
committed
Add current-defun-name
1 parent 27e959e commit 69efea4

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

swift-mode-beginning-of-defun.el

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,6 +1213,101 @@ Interactively, the behavior depends on ‘narrow-to-defun-include-comments’."
12131213
(progn (message "No sentence found") nil)
12141214
region)))
12151215

1216+
(defun swift-mode:current-defun-name ()
1217+
"Return fully qualified name of defun under the point."
1218+
(save-excursion
1219+
(let ((token-list (reverse (swift-mode:current-defun-name-token-list))))
1220+
(if token-list
1221+
(mapconcat #'swift-mode:token:text token-list ".")
1222+
nil))))
1223+
1224+
(defun swift-mode:current-defun-name-token-list ()
1225+
"Return a list of defun name tokens under the point.
1226+
1227+
The first element is the name token of the current defun. The rest are the ones
1228+
of ancestors."
1229+
(if (bobp)
1230+
nil
1231+
(let ((name-token (swift-mode:current-defun-name-token)))
1232+
(swift-mode:backward-sexps-until '({))
1233+
(if name-token
1234+
(cons name-token (swift-mode:current-defun-name-token-list))
1235+
(swift-mode:current-defun-name-token-list)))))
1236+
1237+
(defun swift-mode:current-defun-name-token ()
1238+
"Return the name token of the defun under the point."
1239+
(let ((pos (point))
1240+
keyword-token
1241+
keyword-text
1242+
next-token
1243+
name-token)
1244+
(goto-char (car (swift-mode:containing-generic-block-region
1245+
#'swift-mode:end-of-defun
1246+
#'swift-mode:beginning-of-defun)))
1247+
1248+
(save-excursion
1249+
(setq keyword-token (swift-mode:find-defun-keyword))
1250+
(setq keyword-text (swift-mode:token:text keyword-token))
1251+
(when keyword-token
1252+
(goto-char (swift-mode:token:end keyword-token)))
1253+
(setq
1254+
name-token
1255+
(cond
1256+
((member keyword-text
1257+
'("typealias" "associatedtype" "precedencegroup" "func"
1258+
"class" "enum" "struct" "protocol" "extension"))
1259+
(swift-mode:forward-token))
1260+
1261+
((member keyword-text '("init" "deinit" "subscript"))
1262+
keyword-token)
1263+
1264+
((member keyword-text '("case" "var" "let"))
1265+
;; enum Foo {
1266+
;; case A, B(x: (Int, Int)), C
1267+
;; }
1268+
;;
1269+
;; class Foo {
1270+
;; let x = 1,
1271+
;; y = 1,
1272+
;; z = 1
1273+
;; var x {
1274+
;; get {
1275+
;; return 1
1276+
;; }
1277+
;; }
1278+
;; var x = 1 {
1279+
;; willSet {
1280+
;; }
1281+
;; }
1282+
;;
1283+
;; let (x, y) = (1, 1) // not supported yet
1284+
;; }
1285+
(while (< (point) pos)
1286+
(setq next-token (swift-mode:forward-token-or-list)))
1287+
(when next-token
1288+
(goto-char (swift-mode:token:start next-token)))
1289+
(goto-char (swift-mode:token:end
1290+
(swift-mode:backward-sexps-until (list keyword-text '\,))))
1291+
(setq next-token (swift-mode:forward-token))
1292+
(if (and
1293+
(eq (swift-mode:token:type next-token) 'identifier)
1294+
(not
1295+
(equal (swift-mode:token:text (swift-mode:forward-token)) ".")))
1296+
next-token
1297+
;; FIXME: Complex patterns.
1298+
nil))
1299+
1300+
((member keyword-text '("prefix" "postfix" "infix"))
1301+
(and (equal (swift-mode:token:text (swift-mode:forward-token))
1302+
"operator")
1303+
(swift-mode:forward-token)))
1304+
1305+
;; Ignored: "import" "get" "set" "willSet" "didSet"
1306+
(t nil))))
1307+
(if (memq (swift-mode:token:type name-token) '(identifier operator))
1308+
name-token
1309+
nil)))
1310+
12161311
(provide 'swift-mode-beginning-of-defun)
12171312

12181313
;;; swift-mode-beginning-of-defun.el ends here

swift-mode.el

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,10 @@ Signal `scan-error' if it hits opening parentheses."
213213
(setq-local swift-mode:anchor-overlay
214214
(make-overlay (point-min) (point-min) nil t))
215215

216-
(delete-overlay swift-mode:anchor-overlay))
216+
(delete-overlay swift-mode:anchor-overlay)
217+
218+
(add-hook 'which-func-functions #'swift-mode:current-defun-name)
219+
(setq-local add-log-current-defun-function #'swift-mode:current-defun-name))
217220

218221
;;;###autoload (add-to-list 'auto-mode-alist '("\\.swift\\'" . swift-mode))
219222

0 commit comments

Comments
 (0)