@@ -662,6 +662,45 @@ TEST(FunctionReflectionTest, InstantiateTemplateMethod) {
662662 EXPECT_TRUE (TA1.getAsType ()->isIntegerType ());
663663}
664664
665+ TEST (FunctionReflectionTest, LookupConstructors) {
666+ std::vector<Decl*> Decls;
667+ std::string code = R"(
668+ class MyClass {
669+ public:
670+ MyClass();
671+ void helperMethod();
672+ MyClass(const MyClass&);
673+ static void staticFunc();
674+ MyClass(MyClass&&);
675+ template<typename T>
676+ MyClass(T);
677+ ~MyClass();
678+ };
679+
680+ MyClass::MyClass() {}
681+ void MyClass::helperMethod() {}
682+ MyClass::MyClass(const MyClass&) {}
683+ void MyClass::staticFunc() {}
684+ MyClass::MyClass(MyClass&&) {}
685+ template<typename T>
686+ MyClass::MyClass(T t) {}
687+ MyClass::~MyClass() {}
688+ )" ;
689+
690+ GetAllTopLevelDecls (code, Decls);
691+ std::vector<Cpp::TCppFunction_t> ctors;
692+ Cpp::LookupConstructors (" MyClass" , Decls[0 ], ctors);
693+
694+ EXPECT_EQ (ctors.size (), 4 )
695+ << " Constructor lookup did not retrieve the expected set" ;
696+ EXPECT_EQ (Cpp::GetFunctionSignature (ctors[0 ]), " MyClass::MyClass()" );
697+ EXPECT_EQ (Cpp::GetFunctionSignature (ctors[1 ]),
698+ " MyClass::MyClass(const MyClass &)" );
699+ EXPECT_EQ (Cpp::GetFunctionSignature (ctors[2 ]),
700+ " MyClass::MyClass(MyClass &&)" );
701+ EXPECT_EQ (Cpp::GetFunctionSignature (ctors[3 ]), " MyClass::MyClass(T t)" );
702+ }
703+
665704TEST (FunctionReflectionTest, BestOverloadFunctionMatch1) {
666705 std::vector<Decl*> Decls;
667706 std::string code = R"(
@@ -1061,6 +1100,28 @@ TEST(FunctionReflectionTest, IsConstructor) {
10611100 EXPECT_FALSE (Cpp::IsConstructor (SubDecls[4 ]));
10621101 EXPECT_FALSE (Cpp::IsConstructor (SubDecls[6 ]));
10631102 EXPECT_FALSE (Cpp::IsConstructor (SubDecls[8 ]));
1103+
1104+ // Test for templated constructor
1105+ std::vector<Decl*> templDecls, templSubDecls;
1106+ std::string templCode = R"(
1107+ class T {
1108+ public:
1109+ template<typename U>
1110+ T(U) {}
1111+ void func() {}
1112+ ~T() {}
1113+ };
1114+ )" ;
1115+
1116+ GetAllTopLevelDecls (templCode, templDecls);
1117+ GetAllSubDecls (templDecls[0 ], templSubDecls);
1118+
1119+ int templCtorCount = 0 ;
1120+ for (auto * decl : templSubDecls) {
1121+ if (Cpp::IsConstructor (decl))
1122+ templCtorCount++;
1123+ }
1124+ EXPECT_EQ (templCtorCount, 1 );
10641125}
10651126
10661127TEST (FunctionReflectionTest, IsDestructor) {
0 commit comments