diff --git a/include/clang/Interpreter/CppInterOp.h b/include/clang/Interpreter/CppInterOp.h index ef630de96..5d8180c88 100644 --- a/include/clang/Interpreter/CppInterOp.h +++ b/include/clang/Interpreter/CppInterOp.h @@ -424,11 +424,16 @@ namespace Cpp { /// Checks if the provided parameter is a 'Virtual' method. CPPINTEROP_API bool IsVirtualMethod(TCppFunction_t method); - /// Gets all the Fields/Data Members of a Class. For now, it - /// only gets non-static data members but in a future update, - /// it may support getting static data members as well. + /// Gets all the Fields/Data Members of a Class CPPINTEROP_API std::vector GetDatamembers(TCppScope_t scope); + /// Gets all the Static Fields/Data Members of a Class + ///\param[in] scope - class + ///\param[out] funcs - vector of static data members + CPPINTEROP_API void + GetStaticDatamembers(TCppScope_t scope, + std::vector& datamembers); + /// This is a Lookup function to be used specifically for data members. CPPINTEROP_API TCppScope_t LookupDatamember(const std::string& name, TCppScope_t parent); diff --git a/lib/Interpreter/CppInterOp.cpp b/lib/Interpreter/CppInterOp.cpp index c91b26d79..d4b1578ea 100644 --- a/lib/Interpreter/CppInterOp.cpp +++ b/lib/Interpreter/CppInterOp.cpp @@ -1161,6 +1161,11 @@ namespace Cpp { return {}; } + void GetStaticDatamembers(TCppScope_t scope, + std::vector& datamembers) { + GetClassDecls(scope, datamembers); + } + TCppScope_t LookupDatamember(const std::string& name, TCppScope_t parent) { clang::DeclContext *Within = 0; if (parent) { diff --git a/unittests/CppInterOp/VariableReflectionTest.cpp b/unittests/CppInterOp/VariableReflectionTest.cpp index efb604cde..0cc01c9de 100644 --- a/unittests/CppInterOp/VariableReflectionTest.cpp +++ b/unittests/CppInterOp/VariableReflectionTest.cpp @@ -32,11 +32,25 @@ TEST(VariableReflectionTest, GetDatamembers) { auto datamembers = Cpp::GetDatamembers(Decls[0]); auto datamembers1 = Cpp::GetDatamembers(Decls[1]); + // non static field EXPECT_EQ(Cpp::GetQualifiedName(datamembers[0]), "C::a"); EXPECT_EQ(Cpp::GetQualifiedName(datamembers[1]), "C::c"); EXPECT_EQ(Cpp::GetQualifiedName(datamembers[2]), "C::e"); EXPECT_EQ(datamembers.size(), 3); EXPECT_EQ(datamembers1.size(), 0); + + // static fields + datamembers.clear(); + datamembers1.clear(); + + Cpp::GetStaticDatamembers(Decls[0], datamembers); + Cpp::GetStaticDatamembers(Decls[1], datamembers1); + + EXPECT_EQ(Cpp::GetQualifiedName(datamembers[0]), "C::b"); + EXPECT_EQ(Cpp::GetQualifiedName(datamembers[1]), "C::d"); + EXPECT_EQ(Cpp::GetQualifiedName(datamembers[2]), "C::f"); + EXPECT_EQ(datamembers.size(), 3); + EXPECT_EQ(datamembers1.size(), 0); } #define CODE \