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))))
    ))