Function: ebrowse-draw-tree-fn

ebrowse-draw-tree-fn is a byte-compiled function defined in ebrowse.el.gz.

Signature

(ebrowse-draw-tree-fn)

Documentation

Display a single class and recursively its subclasses.

This function may look weird, but this is faster than recursion.

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/ebrowse.el.gz
(cl-defun ebrowse-draw-tree-fn (&aux stack1 stack2 start)
  "Display a single class and recursively its subclasses.
This function may look weird, but this is faster than recursion."
  (setq stack1 (make-list (length ebrowse--tree) 0)
	stack2 (copy-sequence ebrowse--tree))
  (cl-loop while stack2
           as level = (pop stack1)
           as tree = (pop stack2)
           as class = (ebrowse-ts-class tree) do
           (let ((start-of-line (point))
                 start-of-class-name end-of-class-name)
             ;; Insert mark
             (insert (if (ebrowse-ts-mark tree) ">" " "))

             ;; Indent and insert class name
             (indent-to (+ (* level ebrowse--indentation)
                           ebrowse-tree-left-margin))
             (setq start (point))
             (insert (ebrowse-qualified-class-name class))

             ;; If template class, add <>
             (when (ebrowse-template-p class)
               (insert "<>"))
             (ebrowse-set-face start (point) (if (zerop level)
                                                 'ebrowse-root-class
                                               'ebrowse-default))
             (setf start-of-class-name start
                   end-of-class-name (point))
             ;; If filenames are to be displayed...
             (when ebrowse--show-file-names-flag
               (indent-to ebrowse-source-file-column)
               (setq start (point))
               (insert "("
                       (or (ebrowse-cs-file class)
                           "unknown")
                       ")")
               (ebrowse-set-face start (point) 'ebrowse-file-name))
             (ebrowse-set-mark-props start-of-line (1+ start-of-line) tree)
             (add-text-properties
              start-of-class-name end-of-class-name
              `(mouse-face highlight ebrowse-what class-name
                           ebrowse-tree ,tree
                           help-echo "double-mouse-1: (un)expand tree; mouse-2: member functions, mouse-3: menu"))
             (insert "\n"))
           ;; Push subclasses, if any.
           (when (ebrowse-ts-subclasses tree)
             (setq stack2
                   (nconc (copy-sequence (ebrowse-ts-subclasses tree)) stack2)
                   stack1
                   (nconc (make-list (length (ebrowse-ts-subclasses tree))
                                     (1+ level))
                          stack1)))))