From beea56e5aedd3b41a674d6ea548d34d428fa2678 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 21 Mar 2014 13:23:33 -0400 Subject: Output: Drop from Namespace members="" non-inline class members Clang presents non-inline class members in the list of declarations in a namespace. Teach PrintMembersAttribute to skip declarations whose actual context is not the context that listed them. --- src/Output.cxx | 5 +++++ test/CMakeLists.txt | 3 +++ test/expect/gccxml.Namespace-Class-members-xml.txt | 20 ++++++++++++++++++++ .../gccxml.Namespace-Class-template-members-xml.txt | 5 +++++ ...ccxml.Namespace-Function-template-members-xml.txt | 5 +++++ test/input/Namespace-Class-members.cxx | 6 ++++++ test/input/Namespace-Class-template-members.cxx | 6 ++++++ test/input/Namespace-Function-template-members.cxx | 3 +++ 8 files changed, 53 insertions(+) create mode 100644 test/expect/gccxml.Namespace-Class-members-xml.txt create mode 100644 test/expect/gccxml.Namespace-Class-template-members-xml.txt create mode 100644 test/expect/gccxml.Namespace-Function-template-members-xml.txt create mode 100644 test/input/Namespace-Class-members.cxx create mode 100644 test/input/Namespace-Class-template-members.cxx create mode 100644 test/input/Namespace-Function-template-members.cxx diff --git a/src/Output.cxx b/src/Output.cxx index 08519cc..ebbe175 100644 --- a/src/Output.cxx +++ b/src/Output.cxx @@ -828,6 +828,11 @@ void ASTVisitor::PrintMembersAttribute(clang::DeclContext const* dc) e = dc->decls_end(); i != e; ++i) { clang::Decl const* d = *i; + // Skip declarations that are not really members of this context. + if(d->getDeclContext() != dc) { + continue; + } + // Ignore certain members. switch (d->getKind()) { case clang::Decl::CXXRecord: { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c73186e..b406172 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -118,6 +118,9 @@ castxml_test_gccxml(Method) castxml_test_gccxml(MethodType) castxml_test_gccxml(MethodType-cv) castxml_test_gccxml(Namespace) +castxml_test_gccxml(Namespace-Class-members) +castxml_test_gccxml(Namespace-Class-template-members) +castxml_test_gccxml(Namespace-Function-template-members) castxml_test_gccxml(OffsetType) castxml_test_gccxml(OffsetType-cv) castxml_test_gccxml(OperatorFunction) diff --git a/test/expect/gccxml.Namespace-Class-members-xml.txt b/test/expect/gccxml.Namespace-Class-members-xml.txt new file mode 100644 index 0000000..44146be --- /dev/null +++ b/test/expect/gccxml.Namespace-Class-members-xml.txt @@ -0,0 +1,20 @@ +^<\?xml version="1.0"\?> +]*> + + + + + + + + + + + + + + + + + +$ diff --git a/test/expect/gccxml.Namespace-Class-template-members-xml.txt b/test/expect/gccxml.Namespace-Class-template-members-xml.txt new file mode 100644 index 0000000..763161e --- /dev/null +++ b/test/expect/gccxml.Namespace-Class-template-members-xml.txt @@ -0,0 +1,5 @@ +^<\?xml version="1.0"\?> +]*> + + +$ diff --git a/test/expect/gccxml.Namespace-Function-template-members-xml.txt b/test/expect/gccxml.Namespace-Function-template-members-xml.txt new file mode 100644 index 0000000..763161e --- /dev/null +++ b/test/expect/gccxml.Namespace-Function-template-members-xml.txt @@ -0,0 +1,5 @@ +^<\?xml version="1.0"\?> +]*> + + +$ diff --git a/test/input/Namespace-Class-members.cxx b/test/input/Namespace-Class-members.cxx new file mode 100644 index 0000000..0b196ea --- /dev/null +++ b/test/input/Namespace-Class-members.cxx @@ -0,0 +1,6 @@ +namespace start { + class A { + static int data; + }; + int A::data; +} diff --git a/test/input/Namespace-Class-template-members.cxx b/test/input/Namespace-Class-template-members.cxx new file mode 100644 index 0000000..5367a14 --- /dev/null +++ b/test/input/Namespace-Class-template-members.cxx @@ -0,0 +1,6 @@ +namespace start { + template class A { + static int data; + }; + template int A::data; +} diff --git a/test/input/Namespace-Function-template-members.cxx b/test/input/Namespace-Function-template-members.cxx new file mode 100644 index 0000000..925281f --- /dev/null +++ b/test/input/Namespace-Function-template-members.cxx @@ -0,0 +1,3 @@ +namespace start { + template T function(T); +} -- cgit v0.12