Skip to content

Commit 6661aae

Browse files
faze-geekVipul-Cariappavgvassilevgithub-actions[bot]
authored
update GetVariableType to return qualified name (#401)
update `GetVariableType` to return Canonical Type --------- Co-authored-by: Vipul Cariappa <vipulcariappa@gmail.com> Co-authored-by: Vassil Vassilev <v.g.vassilev@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent cb640db commit 6661aae

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

lib/Interpreter/CppInterOp.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,12 +1212,20 @@ namespace Cpp {
12121212
return 0;
12131213
}
12141214

1215-
TCppType_t GetVariableType(TCppScope_t var)
1216-
{
1217-
auto D = (Decl *) var;
1215+
TCppType_t GetVariableType(TCppScope_t var) {
1216+
auto* D = static_cast<Decl*>(var);
12181217

12191218
if (auto DD = llvm::dyn_cast_or_null<DeclaratorDecl>(D)) {
1220-
return DD->getType().getAsOpaquePtr();
1219+
QualType QT = DD->getType();
1220+
1221+
// Check if the type is a typedef type
1222+
if (QT->isTypedefNameType()) {
1223+
return QT.getAsOpaquePtr();
1224+
}
1225+
1226+
// Else, return the canonical type
1227+
QT = QT.getCanonicalType();
1228+
return QT.getAsOpaquePtr();
12211229
}
12221230

12231231
return 0;

unittests/CppInterOp/VariableReflectionTest.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "clang/Sema/Sema.h"
77

88
#include "gtest/gtest.h"
9+
#include <string>
910

1011
#include <cstddef>
1112

@@ -159,6 +160,39 @@ TEST(VariableReflectionTest, DatamembersWithAnonymousStructOrUnion) {
159160
#endif
160161
}
161162

163+
TEST(VariableReflectionTest, GetTypeAsString) {
164+
if (llvm::sys::RunningOnValgrind())
165+
GTEST_SKIP() << "XFAIL due to Valgrind report";
166+
167+
std::string code = R"(
168+
namespace my_namespace {
169+
170+
struct Container {
171+
int value;
172+
};
173+
174+
struct Wrapper {
175+
Container item;
176+
};
177+
178+
}
179+
)";
180+
181+
Cpp::CreateInterpreter();
182+
EXPECT_EQ(Cpp::Declare(code.c_str()), 0);
183+
184+
Cpp::TCppScope_t wrapper =
185+
Cpp::GetScopeFromCompleteName("my_namespace::Wrapper");
186+
EXPECT_TRUE(wrapper);
187+
188+
std::vector<Cpp::TCppScope_t> datamembers;
189+
Cpp::GetDatamembers(wrapper, datamembers);
190+
EXPECT_EQ(datamembers.size(), 1);
191+
192+
EXPECT_EQ(Cpp::GetTypeAsString(Cpp::GetVariableType(datamembers[0])),
193+
"my_namespace::Container");
194+
}
195+
162196
TEST(VariableReflectionTest, LookupDatamember) {
163197
std::vector<Decl*> Decls;
164198
std::string code = R"(

0 commit comments

Comments
 (0)