Browse Source

Refactored common template handling code in native AST.

pull/1138/head
Joao Matos 9 years ago
parent
commit
8f8648eec1
  1. 38
      src/CppParser/AST.cpp
  2. 16
      src/CppParser/AST.h
  3. 6
      src/CppParser/Parser.cpp

38
src/CppParser/AST.cpp

@ -479,44 +479,6 @@ Function* DeclarationContext::FindFunction(const std::string& USR)
return nullptr; return nullptr;
} }
ClassTemplate*
DeclarationContext::FindClassTemplate(const std::string& USR)
{
auto foundTemplate = std::find_if(Templates.begin(), Templates.end(),
[&](Template* t) { return t->USR == USR; });
if (foundTemplate != Templates.end())
return static_cast<ClassTemplate*>(*foundTemplate);
return nullptr;
}
TypeAliasTemplate*
DeclarationContext::FindTypeAliasTemplate(const std::string& USR)
{
auto foundTemplate = std::find_if(Templates.begin(), Templates.end(),
[&](Template* t) { return t->USR == USR; }
);
if (foundTemplate != Templates.end())
return static_cast<TypeAliasTemplate*>(*foundTemplate);
return nullptr;
}
FunctionTemplate*
DeclarationContext::FindFunctionTemplate(const std::string& USR)
{
auto foundTemplate = std::find_if(Templates.begin(), Templates.end(),
[&](Template* t) { return t->USR == USR; }
);
if (foundTemplate != Templates.end())
return static_cast<FunctionTemplate*>(*foundTemplate);
return nullptr;
}
TypedefDecl* DeclarationContext::FindTypedef(const std::string& Name, bool Create) TypedefDecl* DeclarationContext::FindTypedef(const std::string& Name, bool Create)
{ {
auto foundTypedef = std::find_if(Typedefs.begin(), Typedefs.end(), auto foundTypedef = std::find_if(Typedefs.begin(), Typedefs.end(),

16
src/CppParser/AST.h

@ -472,9 +472,7 @@ public:
CS_IGNORE Class* FindClass(const std::string& Name, bool IsComplete, CS_IGNORE Class* FindClass(const std::string& Name, bool IsComplete,
bool Create); bool Create);
CS_IGNORE TypeAliasTemplate* FindTypeAliasTemplate(const std::string& USR); CS_IGNORE template<typename T> T* FindTemplate(const std::string& USR);
CS_IGNORE ClassTemplate* FindClassTemplate(const std::string& USR);
CS_IGNORE FunctionTemplate* FindFunctionTemplate(const std::string& USR);
CS_IGNORE Enumeration* FindEnum(const void* OriginalPtr); CS_IGNORE Enumeration* FindEnum(const void* OriginalPtr);
CS_IGNORE Enumeration* FindEnum(const std::string& Name, bool Create = false); CS_IGNORE Enumeration* FindEnum(const std::string& Name, bool Create = false);
@ -505,6 +503,18 @@ public:
bool IsAnonymous; bool IsAnonymous;
}; };
template<typename T>
T* DeclarationContext::FindTemplate(const std::string& USR)
{
auto foundTemplate = std::find_if(Templates.begin(), Templates.end(),
[&](Template* t) { return t->USR == USR; });
if (foundTemplate != Templates.end())
return static_cast<T*>(*foundTemplate);
return nullptr;
}
class CS_API TypedefNameDecl : public Declaration class CS_API TypedefNameDecl : public Declaration
{ {
public: public:

6
src/CppParser/Parser.cpp

@ -1169,7 +1169,7 @@ ClassTemplate* Parser::WalkClassTemplate(const clang::ClassTemplateDecl* TD)
assert(NS && "Expected a valid namespace"); assert(NS && "Expected a valid namespace");
auto USR = GetDeclUSR(TD); auto USR = GetDeclUSR(TD);
auto CT = NS->FindClassTemplate(USR); auto CT = NS->FindTemplate<ClassTemplate>(USR);
if (CT != nullptr) if (CT != nullptr)
return CT; return CT;
@ -1354,7 +1354,7 @@ TypeAliasTemplate* Parser::WalkTypeAliasTemplate(
assert(NS && "Expected a valid namespace"); assert(NS && "Expected a valid namespace");
auto USR = GetDeclUSR(TD); auto USR = GetDeclUSR(TD);
auto TA = NS->FindTypeAliasTemplate(USR); auto TA = NS->FindTemplate<TypeAliasTemplate>(USR);
if (TA != nullptr) if (TA != nullptr)
return TA; return TA;
@ -1380,7 +1380,7 @@ FunctionTemplate* Parser::WalkFunctionTemplate(const clang::FunctionTemplateDecl
assert(NS && "Expected a valid namespace"); assert(NS && "Expected a valid namespace");
auto USR = GetDeclUSR(TD); auto USR = GetDeclUSR(TD);
auto FT = NS->FindFunctionTemplate(USR); auto FT = NS->FindTemplate<FunctionTemplate>(USR);
if (FT != nullptr) if (FT != nullptr)
return FT; return FT;

Loading…
Cancel
Save