@@ -1213,6 +1213,101 @@ Interactively, the behavior depends on ‘narrow-to-defun-include-comments’."
1213
1213
(progn (message " No sentence found " ) nil )
1214
1214
region )))
1215
1215
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
+
1216
1311
(provide 'swift-mode-beginning-of-defun )
1217
1312
1218
1313
; ;; swift-mode-beginning-of-defun.el ends here
0 commit comments