Function: semanticdb-ebrowse-add-tree-to-table
semanticdb-ebrowse-add-tree-to-table is a byte-compiled function
defined in db-ebrowse.el.gz.
Signature
(semanticdb-ebrowse-add-tree-to-table DBE TREE &optional FNAME BASECLASSES)
Documentation
For database DBE, add the ebrowse TREE into the table for FNAME.
Optional argument BASECLASSES specifies a baseclass to the tree being provided.
Source Code
;; Defined in /usr/src/emacs/lisp/cedet/semantic/db-ebrowse.el.gz
(defun semanticdb-ebrowse-add-tree-to-table (dbe tree &optional fname baseclasses)
"For database DBE, add the ebrowse TREE into the table for FNAME.
Optional argument BASECLASSES specifies a baseclass to the tree being provided."
(if (not (ebrowse-ts-p tree))
(signal 'wrong-type-argument (list 'ebrowse-ts-p tree)))
;; Strategy overview:
;; 1) Calculate the filename for this tree.
;; 2) Find a matching namespace in TAB, or create a new one.
;; 3) Fabricate a tag proxy for CLASS
;; 4) Add it to the namespace
;; 5) Add subclasses
;; 1 - Find the filename
(if (not fname)
(setq fname (or (ebrowse-cs-source-file (ebrowse-ts-class tree))
(ebrowse-cs-file (ebrowse-ts-class tree))
;; Not def'd here, assume our current
;; file
(concat default-directory "/unknown-proxy.hh"))))
(let* ((tab (or (semanticdb-file-table dbe fname)
(semanticdb-create-table dbe fname)))
(class (ebrowse-ts-class tree))
(scope (ebrowse-cs-scope class))
(ns (when scope (split-string scope ":" t)))
(nst nil)
(cls nil)
)
;; 2 - Get the namespace tag
(when ns
(let ((taglst (if (slot-boundp tab 'tags) (oref tab tags) nil)))
(setq nst (semantic-find-first-tag-by-name (car ns) taglst))
(when (not nst)
(setq nst (semantic-tag (car ns) 'type :type "namespace"))
(oset tab tags (cons nst taglst))
)))
;; 3 - Create a proxy tg.
(setq cls (semantic-tag (ebrowse-cs-name class)
'type
:type "class"
:superclasses baseclasses
:faux t
:filename fname
))
(let ((defpoint (ebrowse-bs-point class)))
(when defpoint
(semantic--tag-set-overlay cls
(vector defpoint defpoint))))
;; 4 - add to namespace
(if nst
(semantic-tag-put-attribute
nst :members (cons cls (semantic-tag-get-attribute nst :members)))
(oset tab tags (cons cls (when (slot-boundp tab 'tags)
(oref tab tags)))))
;; 5 - Subclasses
(let* ((subclass (ebrowse-ts-subclasses tree))
(pname (ebrowse-cs-name class)))
(when (ebrowse-cs-scope class)
(setq pname (concat (mapconcat (lambda (a) a) (cdr ns) "::") "::" pname)))
(while subclass
(let* ((scc (ebrowse-ts-class (car subclass)))
(fname (or (ebrowse-cs-source-file scc)
(ebrowse-cs-file scc)
;; Not def'd here, assume our current
;; file
fname
)))
(when fname
(semanticdb-ebrowse-add-tree-to-table
dbe (car subclass) fname pname)))
(setq subclass (cdr subclass))))
))