From 567f9cf7b5f955d2e162ea168f6df9a25df4f6b7 Mon Sep 17 00:00:00 2001 From: Vipul Cariappa Date: Tue, 17 Sep 2024 14:33:02 +0000 Subject: [PATCH 1/3] resolve static attributes of records --- lib/Interpreter/CppInterOp.cpp | 3 +++ unittests/CppInterOp/VariableReflectionTest.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/Interpreter/CppInterOp.cpp b/lib/Interpreter/CppInterOp.cpp index c91b26d79..49814927d 100644 --- a/lib/Interpreter/CppInterOp.cpp +++ b/lib/Interpreter/CppInterOp.cpp @@ -1155,6 +1155,9 @@ namespace Cpp { stack_begin.back()++; } + // static field member + GetClassDecls(scope, datamembers); + return datamembers; } diff --git a/unittests/CppInterOp/VariableReflectionTest.cpp b/unittests/CppInterOp/VariableReflectionTest.cpp index efb604cde..bbccb21f1 100644 --- a/unittests/CppInterOp/VariableReflectionTest.cpp +++ b/unittests/CppInterOp/VariableReflectionTest.cpp @@ -32,10 +32,15 @@ TEST(VariableReflectionTest, GetDatamembers) { auto datamembers = Cpp::GetDatamembers(Decls[0]); auto datamembers1 = Cpp::GetDatamembers(Decls[1]); + // non static field first 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); + // static fields + EXPECT_EQ(Cpp::GetQualifiedName(datamembers[3]), "C::b"); + EXPECT_EQ(Cpp::GetQualifiedName(datamembers[4]), "C::d"); + EXPECT_EQ(Cpp::GetQualifiedName(datamembers[5]), "C::f"); + EXPECT_EQ(datamembers.size(), 6); EXPECT_EQ(datamembers1.size(), 0); } From d1803347d30f277dffbf1da342e16c44f8d8b019 Mon Sep 17 00:00:00 2001 From: Vipul Cariappa Date: Wed, 18 Sep 2024 03:53:26 +0000 Subject: [PATCH 2/3] extracted to `GetStaticDatamembers` --- include/clang/Interpreter/CppInterOp.h | 8 +++++--- lib/Interpreter/CppInterOp.cpp | 9 ++++++--- unittests/CppInterOp/VariableReflectionTest.cpp | 15 ++++++++++----- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/include/clang/Interpreter/CppInterOp.h b/include/clang/Interpreter/CppInterOp.h index ef630de96..226a2ff99 100644 --- a/include/clang/Interpreter/CppInterOp.h +++ b/include/clang/Interpreter/CppInterOp.h @@ -424,11 +424,13 @@ 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 + CPPINTEROP_API std::vector + GetStaticDatamembers(TCppScope_t scope); + /// 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 49814927d..1773abe99 100644 --- a/lib/Interpreter/CppInterOp.cpp +++ b/lib/Interpreter/CppInterOp.cpp @@ -1155,15 +1155,18 @@ namespace Cpp { stack_begin.back()++; } - // static field member - GetClassDecls(scope, datamembers); - return datamembers; } return {}; } + std::vector GetStaticDatamembers(TCppScope_t scope) { + std::vector datamembers; + GetClassDecls(scope, datamembers); + return 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 bbccb21f1..7dc694297 100644 --- a/unittests/CppInterOp/VariableReflectionTest.cpp +++ b/unittests/CppInterOp/VariableReflectionTest.cpp @@ -31,17 +31,22 @@ TEST(VariableReflectionTest, GetDatamembers) { GetAllTopLevelDecls(code, Decls); auto datamembers = Cpp::GetDatamembers(Decls[0]); auto datamembers1 = Cpp::GetDatamembers(Decls[1]); + auto static_datamembers = Cpp::GetStaticDatamembers(Decls[0]); + auto static_datamembers1 = Cpp::GetStaticDatamembers(Decls[1]); // non static field first EXPECT_EQ(Cpp::GetQualifiedName(datamembers[0]), "C::a"); EXPECT_EQ(Cpp::GetQualifiedName(datamembers[1]), "C::c"); EXPECT_EQ(Cpp::GetQualifiedName(datamembers[2]), "C::e"); - // static fields - EXPECT_EQ(Cpp::GetQualifiedName(datamembers[3]), "C::b"); - EXPECT_EQ(Cpp::GetQualifiedName(datamembers[4]), "C::d"); - EXPECT_EQ(Cpp::GetQualifiedName(datamembers[5]), "C::f"); - EXPECT_EQ(datamembers.size(), 6); + EXPECT_EQ(datamembers.size(), 3); EXPECT_EQ(datamembers1.size(), 0); + + // static fields + EXPECT_EQ(Cpp::GetQualifiedName(static_datamembers[0]), "C::b"); + EXPECT_EQ(Cpp::GetQualifiedName(static_datamembers[1]), "C::d"); + EXPECT_EQ(Cpp::GetQualifiedName(static_datamembers[2]), "C::f"); + EXPECT_EQ(static_datamembers.size(), 3); + EXPECT_EQ(static_datamembers1.size(), 0); } #define CODE \ From 4ff92daa48921f47a375f6c78036dcedf57a472f Mon Sep 17 00:00:00 2001 From: Vipul Cariappa Date: Wed, 18 Sep 2024 14:33:01 +0000 Subject: [PATCH 3/3] apply changes from code review --- include/clang/Interpreter/CppInterOp.h | 7 +++++-- lib/Interpreter/CppInterOp.cpp | 5 ++--- .../CppInterOp/VariableReflectionTest.cpp | 20 +++++++++++-------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/include/clang/Interpreter/CppInterOp.h b/include/clang/Interpreter/CppInterOp.h index 226a2ff99..5d8180c88 100644 --- a/include/clang/Interpreter/CppInterOp.h +++ b/include/clang/Interpreter/CppInterOp.h @@ -428,8 +428,11 @@ namespace Cpp { CPPINTEROP_API std::vector GetDatamembers(TCppScope_t scope); /// Gets all the Static Fields/Data Members of a Class - CPPINTEROP_API std::vector - GetStaticDatamembers(TCppScope_t scope); + ///\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, diff --git a/lib/Interpreter/CppInterOp.cpp b/lib/Interpreter/CppInterOp.cpp index 1773abe99..d4b1578ea 100644 --- a/lib/Interpreter/CppInterOp.cpp +++ b/lib/Interpreter/CppInterOp.cpp @@ -1161,10 +1161,9 @@ namespace Cpp { return {}; } - std::vector GetStaticDatamembers(TCppScope_t scope) { - std::vector datamembers; + void GetStaticDatamembers(TCppScope_t scope, + std::vector& datamembers) { GetClassDecls(scope, datamembers); - return datamembers; } TCppScope_t LookupDatamember(const std::string& name, TCppScope_t parent) { diff --git a/unittests/CppInterOp/VariableReflectionTest.cpp b/unittests/CppInterOp/VariableReflectionTest.cpp index 7dc694297..0cc01c9de 100644 --- a/unittests/CppInterOp/VariableReflectionTest.cpp +++ b/unittests/CppInterOp/VariableReflectionTest.cpp @@ -31,10 +31,8 @@ TEST(VariableReflectionTest, GetDatamembers) { GetAllTopLevelDecls(code, Decls); auto datamembers = Cpp::GetDatamembers(Decls[0]); auto datamembers1 = Cpp::GetDatamembers(Decls[1]); - auto static_datamembers = Cpp::GetStaticDatamembers(Decls[0]); - auto static_datamembers1 = Cpp::GetStaticDatamembers(Decls[1]); - // non static field first + // 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"); @@ -42,11 +40,17 @@ TEST(VariableReflectionTest, GetDatamembers) { EXPECT_EQ(datamembers1.size(), 0); // static fields - EXPECT_EQ(Cpp::GetQualifiedName(static_datamembers[0]), "C::b"); - EXPECT_EQ(Cpp::GetQualifiedName(static_datamembers[1]), "C::d"); - EXPECT_EQ(Cpp::GetQualifiedName(static_datamembers[2]), "C::f"); - EXPECT_EQ(static_datamembers.size(), 3); - EXPECT_EQ(static_datamembers1.size(), 0); + 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 \