Function: python-imenu--build-tree
python-imenu--build-tree is a byte-compiled function defined in
python.el.gz.
Signature
(python-imenu--build-tree &optional MIN-INDENT PREV-INDENT TREE)
Documentation
Recursively build the tree of nested definitions of a node.
Arguments MIN-INDENT, PREV-INDENT and TREE are internal and should not be passed explicitly unless you know what you are doing.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/python.el.gz
(defun python-imenu--build-tree (&optional min-indent prev-indent tree)
"Recursively build the tree of nested definitions of a node.
Arguments MIN-INDENT, PREV-INDENT and TREE are internal and should
not be passed explicitly unless you know what you are doing."
(setq min-indent (or min-indent 0)
prev-indent (or prev-indent python-indent-offset))
(let* ((pos (python-nav-backward-defun))
(defun-type-name (and pos (python-imenu--get-defun-type-name)))
(type (car defun-type-name))
(name (cadr defun-type-name))
(label (when name
(funcall python-imenu-format-item-label-function type name)))
(indent (current-indentation))
(children-indent-limit (+ python-indent-offset min-indent)))
(cond ((not pos)
;; Nothing found, probably near to bobp.
nil)
((<= indent min-indent)
;; The current indentation points that this is a parent
;; node, add it to the tree and stop recursing.
(python-imenu--put-parent type name pos tree))
(t
(python-imenu--build-tree
min-indent
indent
(if (<= indent children-indent-limit)
;; This lies within the children indent offset range,
;; so it's a normal child of its parent (i.e., not
;; a child of a child).
(cons (cons label pos) tree)
;; Oh no, a child of a child?! Fear not, we
;; know how to roll. We recursively parse these by
;; swapping prev-indent and min-indent plus adding this
;; newly found item to a fresh subtree. This works, I
;; promise.
(cons
(python-imenu--build-tree
prev-indent indent (list (cons label pos)))
tree)))))))