(defun elpy-snippet-split-args (arg-string)
|
|
"Split a python argument string into ((name, default)..) tuples"
|
|
(mapcar (lambda (x)
|
|
(split-string x "[[:blank:]]*=[[:blank:]]*" t))
|
|
(split-string arg-string "[[:blank:]]*,[[:blank:]]*" t)))
|
|
|
|
(defun elpy-snippet-current-method-and-args ()
|
|
"Return information on the current definition."
|
|
(let ((current-defun (python-info-current-defun))
|
|
(current-arglist
|
|
(save-excursion
|
|
(python-nav-beginning-of-defun)
|
|
(when (re-search-forward "(" nil t)
|
|
(let* ((start (point))
|
|
(end (progn
|
|
(forward-char -1)
|
|
(forward-sexp)
|
|
(- (point) 1))))
|
|
(elpy-snippet-split-args
|
|
(buffer-substring-no-properties start end))))))
|
|
class method args)
|
|
(when (not current-arglist)
|
|
(setq current-arglist '(("self"))))
|
|
(if (and current-defun
|
|
(string-match "^\\(.*\\)\\.\\(.*\\)$" current-defun))
|
|
(setq class (match-string 1 current-defun)
|
|
method (match-string 2 current-defun))
|
|
(setq class "Class"
|
|
method "method"))
|
|
(setq args (mapcar #'car current-arglist))
|
|
(list class method args)))
|
|
|
|
(defun elpy-snippet-init-assignments (arg-string)
|
|
"Return the typical __init__ assignments for arguments."
|
|
(let ((indentation (make-string (save-excursion
|
|
(goto-char start-point)
|
|
(current-indentation))
|
|
?\s)))
|
|
(mapconcat (lambda (arg)
|
|
(if (string-match "^\\*" (car arg))
|
|
""
|
|
(format "self.%s = %s\n%s"
|
|
(car arg)
|
|
(car arg)
|
|
indentation)))
|
|
(elpy-snippet-split-args arg-string)
|
|
"")))
|
|
|
|
(defun elpy-snippet-super-form ()
|
|
"Return (Class, first-arg).method if Py2.
|
|
Else return ().method for Py3."
|
|
(let* ((defun-info (elpy-snippet-current-method-and-args))
|
|
(class (nth 0 defun-info))
|
|
(method (nth 1 defun-info))
|
|
(args (nth 2 defun-info))
|
|
(first-arg (nth 0 args))
|
|
(py-version-command " -c 'import sys ; print(sys.version_info.major)'")
|
|
;; Get the python version. Either 2 or 3
|
|
(py-version-num (substring (shell-command-to-string (concat elpy-rpc-python-command py-version-command))0 1)))
|
|
(if (string-match py-version-num "2")
|
|
(format "(%s, %s).%s" class first-arg method)
|
|
(format "().%s" method))))
|
|
|
|
(defun elpy-snippet-super-arguments ()
|
|
"Return the argument list for the current method."
|
|
(mapconcat (lambda (x) x)
|
|
(cdr (nth 2 (elpy-snippet-current-method-and-args)))
|
|
", "))
|