Thread: [CEDET-devel] semantic-analyse-proto-impl-toggle doesn't work
Brought to you by:
zappo
From: Vincent S. <vin...@gm...> - 2013-10-28 21:16:08
|
Hello, I've currently setup my c++ projects with an ede-root-project, where I input the list of directories where my .h header files are. For the .cpp files, I've run gtags (GNU Global) at the root directory of my project, and got the 3 files GPATH, GRTAGS, GTAGS. To activate GNU Global in semantic I used (semanticdb-enable-gnu-global-databases 'c-mode) (semanticdb-enable-gnu-global-databases 'c++-mode) (setq ede-locate-setup-options '(ede-locate-global ede-locate-base)) Now semantic-ia-fast-jump and semantic-symref-symbol work ; the first gives me class prototypes in the headers and the second references in both the .h and .cpp files. However semantic-analyse-proto-impl-toggle doesn't work. In .h files it always says "Could not find suitable implementation". Am I missing something ? How can I be sure that semantic-analyse-proto-impl-toggle uses the gtags database to find the .cpp files ? Thanks, Vincent |
From: David E. <de...@ra...> - 2013-10-29 18:42:11
|
Vincent Semeria writes: > However semantic-analyse-proto-impl-toggle doesn't work. In .h files it always > says "Could not find suitable implementation". > > Am I missing something ? How can I be sure that > semantic-analyse-proto-impl-toggle uses the gtags database to find the .cpp > files ? To narrow this down, please try the following: - In the command line, go to the root of your project and call global -xa TheFunction were 'TheFunction' is the implementation your searching for. Does it output the correct .cpp file with the correct implementation (possibly among others)? - In any file in your project run M-x semanticdb-find-test-translate-path In the buffer that pops up, scroll down and look at the last few lines. There should be a line saying something like 'global (proxy)'. - When Semantic says "Could not find suitable implementation", load the correct .cpp file manually so that it is being parsed. Does Semantic find the implementation now? -David |
From: Vincent S. <vin...@gm...> - 2013-10-30 09:38:46
|
Hi, Yes global -xa gives me the correct .cpp file and all functions with the name I'm looking for, including the exact function I want. By the way, I can only query global for a function's short name, not the full class::function name, which would be more convenient. Now semanticdb-find-test-translate-path gives me semanticdb-table-global entries for some .cpp files, for some others it doesn't, I don't know why. For the particular .cpp file where my function is, it does give me #<semanticdb-table-global GNU Global Search Table (proxy)>. With my particular .cpp file opened and parsed, semantic still says it cannot find the implementation from the header. Finally I read semantic's .cache files myself and I found the function I'm looking for. Semantic knows the function, and the character positions it has for it are correct. Vincent On Tue, Oct 29, 2013 at 7:42 PM, David Engster <de...@ra...> wrote: > Vincent Semeria writes: > > However semantic-analyse-proto-impl-toggle doesn't work. In .h files it > always > > says "Could not find suitable implementation". > > > > Am I missing something ? How can I be sure that > > semantic-analyse-proto-impl-toggle uses the gtags database to find the > .cpp > > files ? > > To narrow this down, please try the following: > > - In the command line, go to the root of your project and call > > global -xa TheFunction > > were 'TheFunction' is the implementation your searching for. Does it > output the correct .cpp file with the correct implementation (possibly > among others)? > > - In any file in your project run > > M-x semanticdb-find-test-translate-path > > In the buffer that pops up, scroll down and look at the last few > lines. There should be a line saying something like 'global (proxy)'. > > - When Semantic says "Could not find suitable implementation", load the > correct .cpp file manually so that it is being parsed. Does Semantic > find the implementation now? > > -David > > |
From: David E. <de...@ra...> - 2013-10-30 16:57:32
|
Vincent Semeria writes: > Yes global -xa gives me the correct .cpp file and all functions with the name > I'm looking for, including the exact function I want. By the way, I can only > query global for a function's short name, not the full class::function name, > which would be more convenient. Maybe that's possible somehow, but at least '-xa' is what CEDET uses. > Now semanticdb-find-test-translate-path gives me semanticdb-table-global > entries for some .cpp files, for some others it doesn't, I don't know > why. It should show up for all files which are part of your project. > With my particular .cpp file opened and parsed, semantic still says it cannot > find the implementation from the header. > > Finally I read semantic's .cache files myself and I found the function I'm > looking for. Semantic knows the function, and the character positions it has > for it are correct. What happens if you put declaration and definition in the same file? Can you toggle between them then? If not, could you send me the file? If that isn't possible, could you somehow create a test case with which I can reproduce the problem? -David |
From: David E. <de...@ra...> - 2013-10-31 19:31:15
|
Vincent Semeria writes: > Here is the test case. Thank you. The problem you have is in how you create the scope for your implementation. In the header, you have something like namespace foo { namespace bar { class TheClass { int theFunc(); } } } Now, since this is C++, there are many ways how to write the definition for foo::bar::TheClass::theFunc. In your code, you have using namespace foo; using namespace bar; int TheClass::theFunc() { ... } which, to be frank, I consider to be the worst choice, since this definition is outside of the two namespaces. It is not clear at all to which namespace this definition belongs. We would have to search all namespaces in scope (and the allowed combinations) for a proper declaration. While this could be implemented in Semantic, it's pretty tedious, so I don't think someone will implement this soon... :-) You will see that Semantic will find the implementation if you use namespace foo { namespace bar { int TheClass::theFunc() { ... } } } or alternatively int foo::bar::TheClass::theFunc() { ... } since in both cases the definition has a fully qualified name. Sorry, but that's the best I can tell you at the moment. -David |
From: Vincent S. <vin...@gm...> - 2013-10-31 20:55:45
|
Haha, I hear poems about the proper ways of coding quite often, sometimes even in rhymes :) However I cannot change the way my functions are implemented. I work on 14000 c++ files, most of which are 20 years old, and all of which are written like I showed you. I already wrote my version of proto-impl-toggle in elisp which works pretty good. I can send it to you if you're interested. Thanks, Vincent On Thu, Oct 31, 2013 at 8:31 PM, David Engster <de...@ra...> wrote: > Vincent Semeria writes: > > Here is the test case. > > Thank you. The problem you have is in how you create the scope for your > implementation. > > In the header, you have something like > > namespace foo { > namespace bar { > class TheClass { int theFunc(); } > } > } > > Now, since this is C++, there are many ways how to write the definition > for foo::bar::TheClass::theFunc. In your code, you have > > using namespace foo; > using namespace bar; > > int TheClass::theFunc() { ... } > > which, to be frank, I consider to be the worst choice, since this > definition is outside of the two namespaces. It is not clear at all to > which namespace this definition belongs. We would have to search all > namespaces in scope (and the allowed combinations) for a proper > declaration. While this could be implemented in Semantic, it's pretty > tedious, so I don't think someone will implement this soon... :-) > > You will see that Semantic will find the implementation if you use > > namespace foo { > namespace bar { > int TheClass::theFunc() { ... } > } > } > > or alternatively > > int foo::bar::TheClass::theFunc() { ... } > > since in both cases the definition has a fully qualified name. > > Sorry, but that's the best I can tell you at the moment. > > -David > > |
From: David E. <de...@ra...> - 2013-10-31 21:22:50
|
Vincent Semeria writes: > Haha, I hear poems about the proper ways of coding quite often, sometimes even > in rhymes :) > > However I cannot change the way my functions are implemented. I work on 14000 > c++ files, most of which are 20 years old, and all of which are written like I > showed you. Yeah well, I already assumed it was something like this... :-) > I already wrote my version of proto-impl-toggle in elisp which works pretty > good. I can send it to you if you're interested. If it's something that could be applied to CEDET as a patch, I'm interested, of course (although if it's longer than ~15 lines, we would need a copyright assignment from you...). -David |
From: Vincent S. <vin...@gm...> - 2013-10-31 22:08:31
|
If semantic-analyse-proto-impl-toggle fails, jump to any implementation with the correct class, function name and signature. In the huge (huge !) majority of cases there is only one such match ; and even if there are more than one and you pick the wrong one, it's not worse than returning an error... To reduce the scope of my searches (and the number of possible mismatches), I also added a notion of project, which I define as a list of header files and a list of source files. For proto-impl-toggle, I only search inside the header's project. Vincent On Thu, Oct 31, 2013 at 10:22 PM, David Engster <de...@ra...>wrote: > Vincent Semeria writes: > > Haha, I hear poems about the proper ways of coding quite often, > sometimes even > > in rhymes :) > > > > However I cannot change the way my functions are implemented. I work on > 14000 > > c++ files, most of which are 20 years old, and all of which are written > like I > > showed you. > > Yeah well, I already assumed it was something like this... :-) > > > I already wrote my version of proto-impl-toggle in elisp which works > pretty > > good. I can send it to you if you're interested. > > If it's something that could be applied to CEDET as a patch, I'm > interested, of course (although if it's longer than ~15 lines, we would > need a copyright assignment from you...). > > -David > |
From: David E. <de...@ra...> - 2013-11-04 21:28:10
|
Vincent Semeria writes: > If semantic-analyse-proto-impl-toggle fails, jump to any implementation with > the correct class, function name and signature. > > In the huge (huge !) majority of cases there is only one such match ; and even > if there are more than one and you pick the wrong one, it's not worse than > returning an error... Yes, that's a good idea and pretty much what I implemented now. When no implementation could be found, a new search is performed with all namespaces dropped from scope. Since it's specific to C++, this is now done through a new override of semantic-analyze-tag-references for c-mode. -David |