@@ -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
0 commit comments