(defun delphi-jump-to-declaration ()
(interactive)
(let ( (pt (ignore-errors
(save-excursion
(end-of-line)
(re-search-backward "^\\(procedure\\|function\\|constructor\\|destructor\\)[ \t]+\\([_a-zA-Z][_a-zA-Z0-9]*\\>\\)?\\.?\\([_a-zA-Z][_a-zA-Z0-9]*\\)")
(let ( (method-type (match-string-no-properties 1))
(class-name (if (match-string 3) (match-string-no-properties 2) "" ))
(func-name (or (match-string-no-properties 3) (match-string-no-properties 2))) )
(beginning-of-buffer)
(if (> (length class-name) 0)
(re-search-forward (format "%s[ \t]+=" class-name)))
(when (re-search-forward (format "%s[ \t]+%s\\>" method-type func-name))
(backward-word)
(point)))))) )
(when pt (goto-char pt))))
(defun delphi-jump-to-implementaion()
(interactive)
(let ( (pt (ignore-errors
(beginning-of-line)
(when (re-search-forward "\\(procedure\\|function\\|constructor\\|destructor\\)[ \\t]+\\([_a-zA-Z][_a-zA-Z0-9]*\\)")
(let ( (method-type (match-string-no-properties 1)) ;;procedure/function/constructor
(func-name (match-string-no-properties 2))
type-name
type-type)
(when (re-search-backward "\\<\\([_a-zA-Z][_a-zA-Z0-9]*\\)[ \\t]*=[ \\t]*\\(class\\|interface\\)")
(setq type-name (match-string-no-properties 1))
(setq type-type (match-string-no-properties 2)))
(if (string= type-type "interface")
(error "interface has no implementation part: %s" type-name)
(progn
(re-search-forward "^implementation\\>" nil t)
;;(message "%s|%s|%s" method-type type-name func-name)
(if type-name
(re-search-forward (format "%s[ \\t]+%s\\.[ \\t]?%s\\>" method-type type-name func-name))
(re-search-forward (format "%s[ \\t]+%s\\>" method-type func-name))))))))) )
(when pt (progn
(goto-char pt)
(beginning-of-line)))))
(define-key delphi-mode-map (kbd "<C-S-up>") 'delphi-jump-to-declaration)
(define-key delphi-mode-map (kbd "<C-S-down>") 'delphi-jump-to-implementaion)
|