[CEDET-devel] C++ Namespaces and Typedefs
Brought to you by:
zappo
From: Brad H. <bra...@ma...> - 2010-03-26 21:21:11
|
Hi, Long time GNU Emacs user, first-time CEDET caller. Running the a CVS version in Emacs 23.1. Everything appears to be working OK, but there is a (known?) issue of limited typedef and namespace support. As I am not familiar yet with CEDET code, I thought I'd throw out what I found for others to comment on and/or guide me in the right direction so that I may help out. I have a code base that relies on boost::shared_ptr. Writing simple test cases using it, CEDET works just fine, but the code base is more complicated with namespaces and typedefs, and my attempts to get completion working when using my types has failed. Below is a test case I have worked up that illustrates the problem I'm seeing. I would like to complete on all variants flagged as BAD: #include <boost/shared_ptr.hpp> namespace NS { namespace NS1 { class Foo { public: void foo1() {}; private: void foo2() {}; }; template <typename T> class TFoo { public: void tfoo1() {}; private: void tfoo2() {}; }; } // end NS1 namespace NS2 { class Bar : public NS1::Foo, NS1::TFoo<Bar> { public: void bar1() {}; void bar2() {}; }; typedef boost::shared_ptr<Bar> Ref1; typedef boost::shared_ptr<NS2::Bar> Ref2; typedef boost::shared_ptr<NS::NS2::Bar> Ref3; typedef boost::shared_ptr<NS1::Foo> Ref4; typedef boost::shared_ptr<NS::NS1::Foo> Ref5; // typedef boost::shared_ptr< ::NS::NS1::Foo > Ref6; // CEDET Parse failure // typedef boost::shared_ptr< ::NS::NS2::Bar > Ref7; // CEDET Parse failure } // end NS2 } // end NS // // Replace ";;" with "foo1();" to compile // void test1() { NS::NS1::Foo foo; foo. // GOOD ;; NS::NS2::Bar bar; bar. // GOOD ;; NS::NS2::Ref1 t1; t1-> // BAD ;; NS::NS2::Ref2 t2; t2-> // BAD ;; NS::NS2::Ref3 t3; t3-> // GOOD ;; NS::NS2::Ref4 t4; t4-> // BAD ;; NS::NS2::Ref5 t5; t5-> // GOOD ;; } void test2() { using namespace NS; NS1::Foo foo; foo. // GOOD ;; NS2::Bar bar; bar. // GOOD ;; NS2::Ref1 t1; t1-> // BAD ;; NS2::Ref2 t2; t2-> // GOOD ;; NS2::Ref3 t3; t3-> // GOOD ;; NS2::Ref4 t4; t4-> // GOOD ;; NS2::Ref5 t5; t5-> // GOOD ;; } void test3() { using namespace NS::NS1; using namespace NS::NS2; Foo foo; foo. // GOOD ;; Bar bar; bar. // GOOD ;; Ref1 t1; t1-> // GOOD ;; Ref2 t2; t2-> // GOOD ;; Ref3 t3; t3-> // GOOD ;; Ref4 t4; t4-> // GOOD ;; Ref5 t5; t5-> // GOOD ;; } int main( int argc, const char* argv[] ) { return 0; } Regards, Brad Howes |