Re: [CEDET-devel] semantic-analyze-tag-references bug
Brought to you by:
zappo
From: Eric M. L. <er...@si...> - 2009-10-03 15:13:32
|
On Sat, 2009-10-03 at 05:40 +0300, Hannu Koivisto wrote: > Greetings, > > If I have, for example, in foo.hpp > > class Foo { > void sur(); > }; > > and in foo.cpp > > #include "foo.hpp" > > void Foo::sur(int a) { > > } > > If I move on top of void sur(); prototype in foo.hpp and evaluate > (semantic-analyze-current-tag), void Foo::sur(int a) tag is listed > as a reference. > > This means that for example semantic-ia-fast-jump happily jumps > from "void sur();" line to "void Foo::sur(int a) {" line. > > I started to write a tool that generates implementation skeletons > for prototypes for which there are no corresponding implementations > (and prototypes for implementations for which there are no > prototypes) and noticed this. > > What I would also like to do is update prototypes/implementations > when the other one changes but in order to do that properly, I > would need tag history information. That is, if the code > corresponding to a tag is changed, I'd like to get from the new, > updated tag to the previous tag that matched the code before it was > changed. But I guess that wouldn't be easy. Hi, That is also a project I wanted to build, but I had to build SRecode first, and have not yet gotten that far. If you are interested in doing that, and can provide paperwork to the FSF to release your work to be included in Emacs, that would be great. If you take a tag parsed from sources with a :prototype-flag attribute of t; (semantic-tag-get-attribute TAG :prototype-flag) you can insert an implementation somewhere else like this: (srecode-semantic-insert-tag F) If the prototype flag is nil, and you want to create a prototype, you can do that like this: (srecode-semantic-insert-tag F '(prototype)) If the tag is properly set up with :parent information, it will also succeed in creating methods in or out of a class declaration, though the parameters to srecode-semantic-insert-tag gets more complex. See cedet/tests/cit-cpp.el for more. I started this in srecode-expandproto.el in 2007, but never finished because I had to build the tag reconstruction templates in SRecode first, which only started working this past winter. For your more detailed question on connecting the two bits of text together in some way such that changes in one get reflected in the other, that is a bit more complex, and sounds like something that would require a new semantic utility. Since Semantic tags are managed in buffers with overlays, you could add add a modification hook that first identifies what tag the current tag might be linked to, and then do that linking. You would then be able to add a semantic-after-partial-cache-change-hook for when the tag changes to do your work. Eric |