@@ -963,6 +963,21 @@ TEST(ScopeReflectionTest, GetNumBases) {
963963 // FIXME: Perhaps we should have a special number or error out as this
964964 // operation is not well defined if a class has no definition.
965965 EXPECT_EQ (Cpp::GetNumBases (Decls[5 ]), 0 );
966+
967+ // C API
968+ auto I = clang_createInterpreterFromPtr (Cpp::GetInterpreter ());
969+ auto C_API_SHIM = [&](auto Decl) {
970+ return clang_scope_getNumBases (CXScope{CXScope_Unexposed, Decl, I});
971+ };
972+ EXPECT_EQ (C_API_SHIM (Decls[0 ]), 0 );
973+ EXPECT_EQ (C_API_SHIM (Decls[1 ]), 1 );
974+ EXPECT_EQ (C_API_SHIM (Decls[2 ]), 1 );
975+ EXPECT_EQ (C_API_SHIM (Decls[3 ]), 2 );
976+ EXPECT_EQ (C_API_SHIM (Decls[4 ]), 1 );
977+ EXPECT_EQ (C_API_SHIM (Decls[5 ]), 0 );
978+ // Clean up resources
979+ clang_interpreter_takeInterpreterAsPtr (I);
980+ clang_interpreter_dispose (I);
966981}
967982
968983TEST (ScopeReflectionTest, GetBaseClass) {
@@ -1012,6 +1027,40 @@ TEST(ScopeReflectionTest, GetBaseClass) {
10121027 auto * TC3_A_Decl = Cpp::GetScopeFromType (VT1);
10131028 auto * A_class = Cpp::GetBaseClass (TC3_A_Decl, 0 );
10141029 EXPECT_EQ (Cpp::GetCompleteName (A_class), " A" );
1030+
1031+ // C API
1032+ auto I = clang_createInterpreterFromPtr (Cpp::GetInterpreter ());
1033+ auto C_API_SHIM = [&](auto Decl, int i) {
1034+ auto Scope =
1035+ clang_scope_getBaseClass (CXScope{CXScope_Unexposed, Decl, I}, i);
1036+ auto Str = clang_scope_getQualifiedName (Scope);
1037+ auto Res = std::string (clang_getCString (Str));
1038+ clang_disposeString (Str);
1039+ return Res;
1040+ };
1041+ EXPECT_EQ (C_API_SHIM (Decls[1 ], 0 ), " A" );
1042+ EXPECT_EQ (C_API_SHIM (Decls[2 ], 0 ), " A" );
1043+ EXPECT_EQ (C_API_SHIM (Decls[3 ], 0 ), " B" );
1044+ EXPECT_EQ (C_API_SHIM (Decls[3 ], 1 ), " C" );
1045+ EXPECT_EQ (C_API_SHIM (Decls[4 ], 0 ), " D" );
1046+ EXPECT_EQ (C_API_SHIM (Decls[10 ], 0 ), " <unnamed>" );
1047+
1048+ auto C_API_SHIM2 = [&](const char * name) {
1049+ auto GS = clang_scope_getGlobalScope (I);
1050+ auto VD = clang_scope_getNamed (name, GS);
1051+ auto VT = clang_scope_getVariableType (VD);
1052+ auto TC2_A_Decl = clang_scope_getScopeFromType (VT);
1053+ auto TC1_A_Decl = clang_scope_getBaseClass (TC2_A_Decl, 0 );
1054+ auto Str = clang_scope_getCompleteName (TC1_A_Decl);
1055+ auto Res = std::string (clang_getCString (Str));
1056+ clang_disposeString (Str);
1057+ return Res;
1058+ };
1059+ EXPECT_EQ (C_API_SHIM2 (" var" ), " TC1<A>" );
1060+ EXPECT_EQ (C_API_SHIM2 (" var1" ), " A" );
1061+ // Clean up resources
1062+ clang_interpreter_takeInterpreterAsPtr (I);
1063+ clang_interpreter_dispose (I);
10151064}
10161065
10171066TEST (ScopeReflectionTest, IsSubclass) {
@@ -1054,6 +1103,38 @@ TEST(ScopeReflectionTest, IsSubclass) {
10541103 EXPECT_TRUE (Cpp::IsSubclass (Decls[4 ], Decls[4 ]));
10551104 EXPECT_FALSE (Cpp::IsSubclass (Decls[4 ], Decls[5 ]));
10561105 EXPECT_FALSE (Cpp::IsSubclass (Decls[4 ], nullptr ));
1106+
1107+ // C API
1108+ auto I = clang_createInterpreterFromPtr (Cpp::GetInterpreter ());
1109+ auto C_API_SHIM = [&](auto D, auto B) {
1110+ return clang_scope_isSubclass (CXScope{CXScope_Unexposed, D, I},
1111+ CXScope{CXScope_Unexposed, B, I});
1112+ };
1113+ EXPECT_FALSE (C_API_SHIM (Decls[0 ], Decls[1 ]));
1114+ EXPECT_TRUE (C_API_SHIM (Decls[1 ], Decls[1 ]));
1115+ EXPECT_FALSE (C_API_SHIM (Decls[2 ], Decls[1 ]));
1116+ EXPECT_TRUE (C_API_SHIM (Decls[3 ], Decls[1 ]));
1117+ EXPECT_TRUE (C_API_SHIM (Decls[4 ], Decls[1 ]));
1118+ EXPECT_FALSE (C_API_SHIM (Decls[0 ], Decls[2 ]));
1119+ EXPECT_FALSE (C_API_SHIM (Decls[1 ], Decls[2 ]));
1120+ EXPECT_TRUE (C_API_SHIM (Decls[2 ], Decls[2 ]));
1121+ EXPECT_TRUE (C_API_SHIM (Decls[3 ], Decls[2 ]));
1122+ EXPECT_TRUE (C_API_SHIM (Decls[4 ], Decls[2 ]));
1123+ EXPECT_FALSE (C_API_SHIM (Decls[0 ], Decls[3 ]));
1124+ EXPECT_FALSE (C_API_SHIM (Decls[1 ], Decls[3 ]));
1125+ EXPECT_FALSE (C_API_SHIM (Decls[2 ], Decls[3 ]));
1126+ EXPECT_TRUE (C_API_SHIM (Decls[3 ], Decls[3 ]));
1127+ EXPECT_TRUE (C_API_SHIM (Decls[4 ], Decls[3 ]));
1128+ EXPECT_FALSE (C_API_SHIM (Decls[0 ], Decls[4 ]));
1129+ EXPECT_FALSE (C_API_SHIM (Decls[1 ], Decls[4 ]));
1130+ EXPECT_FALSE (C_API_SHIM (Decls[2 ], Decls[4 ]));
1131+ EXPECT_FALSE (C_API_SHIM (Decls[3 ], Decls[4 ]));
1132+ EXPECT_TRUE (C_API_SHIM (Decls[4 ], Decls[4 ]));
1133+ EXPECT_FALSE (C_API_SHIM (Decls[4 ], Decls[5 ]));
1134+ EXPECT_FALSE (C_API_SHIM (Decls[4 ], nullptr ));
1135+ // Clean up resources
1136+ clang_interpreter_takeInterpreterAsPtr (I);
1137+ clang_interpreter_dispose (I);
10571138}
10581139
10591140TEST (ScopeReflectionTest, GetBaseClassOffset) {
@@ -1113,6 +1194,24 @@ TEST(ScopeReflectionTest, GetBaseClassOffset) {
11131194 auto * g = new G ();
11141195 EXPECT_EQ (Cpp::GetBaseClassOffset (Decls[6 ], Decls[0 ]),
11151196 (char *)(A*)g - (char *)g);
1197+
1198+ // C API
1199+ auto I = clang_createInterpreterFromPtr (Cpp::GetInterpreter ());
1200+ auto C_API_SHIM = [&](auto D, auto B) {
1201+ return clang_scope_getBaseClassOffset (CXScope{CXScope_Unexposed, D, I},
1202+ CXScope{CXScope_Unexposed, B, I});
1203+ };
1204+ EXPECT_EQ (C_API_SHIM (Decls[2 ], Decls[0 ]), (char *)(A*)c - (char *)c);
1205+ EXPECT_EQ (C_API_SHIM (Decls[2 ], Decls[1 ]), (char *)(B*)c - (char *)c);
1206+ EXPECT_EQ (C_API_SHIM (Decls[3 ], Decls[0 ]), (char *)(A*)d - (char *)d);
1207+ EXPECT_EQ (C_API_SHIM (Decls[3 ], Decls[1 ]), (char *)(B*)d - (char *)d);
1208+ EXPECT_EQ (C_API_SHIM (Decls[3 ], Decls[2 ]), (char *)(C*)d - (char *)d);
1209+ EXPECT_EQ (C_API_SHIM (Decls[4 ], Decls[0 ]), (char *)(A*)e - (char *)e);
1210+ EXPECT_EQ (C_API_SHIM (Decls[4 ], Decls[1 ]), (char *)(B*)e - (char *)e);
1211+ EXPECT_EQ (C_API_SHIM (Decls[6 ], Decls[0 ]), (char *)(A*)g - (char *)g);
1212+ // Clean up resources
1213+ clang_interpreter_takeInterpreterAsPtr (I);
1214+ clang_interpreter_dispose (I);
11161215}
11171216
11181217TEST (ScopeReflectionTest, GetAllCppNames) {
@@ -1173,6 +1272,19 @@ TEST(ScopeReflectionTest, InstantiateNNTPClassTemplate) {
11731272 std::vector<Cpp::TemplateArgInfo> args1 = {{IntTy, " 5" }};
11741273 EXPECT_TRUE (Cpp::InstantiateTemplate (Decls[0 ], args1.data (),
11751274 /* type_size*/ args1.size ()));
1275+
1276+ // C API
1277+ auto I = clang_createInterpreterFromPtr (Cpp::GetInterpreter ());
1278+ CXTemplateArgInfo Args1[] = {{IntTy, " 5" }};
1279+ auto C_API_SHIM = [&](auto Decl) {
1280+ return clang_scope_instantiateTemplate (CXScope{CXScope_Function, Decl, I},
1281+ Args1, 1 )
1282+ .data ;
1283+ };
1284+ EXPECT_NE (C_API_SHIM (Decls[0 ]), nullptr );
1285+ // Clean up resources
1286+ clang_interpreter_takeInterpreterAsPtr (I);
1287+ clang_interpreter_dispose (I);
11761288}
11771289
11781290TEST (ScopeReflectionTest, InstantiateVarTemplate) {
0 commit comments