Thread: [cedet-semantic] #include inside namespace
Brought to you by:
zappo
From: David E. <de...@ra...> - 2010-12-08 16:11:21
|
Yet another C++ namespace issue... The library 'Armadillo' uses constructs like these: namespace foo { #include "bar/baz.hpp" } First problem here is that the #include isn't parsed at all. This can be easily solved by extending 'namespacesubparts' in c.by: --- semantic/bovine/c.by 2010-10-07 19:46:02 +0000 +++ semantic/bovine/c.by 2010-12-08 11:27:40 +0000 @@ -376,6 +376,9 @@ ;; PUBLIC or PRIVATE bits. Ignore them for now. | template | using + ;; Includes inside namespaces + | spp-include + (INCLUDE-TAG $1 nil) | ;;EMPTY ; But what now? I don't know how to start. Should the #include tag be replaced with the actual tags from 'baz.hpp', maybe in a dereferencer? Or should we leave the include there and deal with this on-the-fly (but how and where)? -David |
From: David E. <de...@ra...> - 2010-12-14 20:07:35
|
David Engster writes: > Yet another C++ namespace issue... The library 'Armadillo' uses > constructs like these: > > namespace foo { > #include "bar/baz.hpp" > } Here's a suggestion. First, parse those includes with a special attribute 'inside-ns': --- semantic/bovine/c.by 2010-10-07 19:46:02 +0000 +++ semantic/bovine/c.by 2010-12-14 12:43:55 +0000 @@ -376,6 +376,9 @@ ;; PUBLIC or PRIVATE bits. Ignore them for now. | template | using + ;; Includes inside namespaces + | spp-include + (TAG $1 'include :inside-ns t) | ;;EMPTY ; Then we have to make sure Semantic finds those includes inside a namespaces... (defun semantic-find-tags-included (&optional table) "Find all tags in TABLE that are of the 'include class. TABLE is a tag table. See `semantic-something-to-tag-table'." (let ((tags (semantic-find-tags-by-class 'include table)) (namespaces (semantic-find-tags-by-type "namespace" table))) (dolist (cur namespaces) (setq tags (append tags (semantic-find-tags-by-class 'include (semantic-tag-get-attribute cur :members))))) tags)) ...and use a new override to wrap the tags in those includes inside a namespace type: (define-mode-local-override semanticdb-find-table-for-include c-mode (includetag &optional table) "" (let ((inctable (semanticdb-find-table-for-include-default includetag table)) tags newtags namespace prefix) (when (and (semantic-tag-get-attribute includetag :inside-ns) table) ;; Find namespace which had this include (setq namespaces (semantic-find-tags-by-type "namespace" table)) (when (and namespaces (slot-boundp inctable 'tags)) (dolist (cur namespaces) (when (semantic-find-tags-by-name (semantic-tag-name includetag) (semantic-tag-get-attribute cur :members)) (setq prefix (semantic-tag-name cur)))) (unless (semantic-find-tags-by-name prefix (semantic-find-tags-by-type "namespace" inctable)) (setq tags (oref inctable tags)) (setq newtags (list (semantic-tag-new-type prefix "namespace" tags nil))) (oset inctable tags newtags)))) inctable)) It's just a suggestion. I doesn't work recursively yet, but before digging further I'd like to know if the above makes sense. I'm not terribly happy with the extension of `semantic-find-tags-included', since I guess this is more or less C++-specific. -David |
From: David E. <de...@ra...> - 2010-12-15 20:08:50
Attachments:
semantic-include-inside-namespace.patch
|
David Engster writes: > It's just a suggestion. I doesn't work recursively yet, but before > digging further I'd like to know if the above makes sense. I'm not > terribly happy with the extension of `semantic-find-tags-included', > since I guess this is more or less C++-specific. Turns out I only had to make a few little changes to make this stuff correctly parsing the 'Armadillo' library, which is pretty neat. I've attached the patch I'm currently using. -David |