data: parsing and saving method overrides

This change parses method overrides and saves them in the Storage with type EDGE_OVERRIDE.
This commit is contained in:
Eberhard Graether
2015-02-10 12:18:40 +01:00
parent 53eab0a517
commit 51c6675464
14 changed files with 195 additions and 52 deletions
+1
View File
@@ -82,6 +82,7 @@ public:
virtual Id onInheritanceParsed(
const ParseLocation& location, const std::vector<std::string>& nameHierarchy,
const std::vector<std::string>& baseNameHierarchy, AccessType access) = 0;
virtual Id onMethodOverrideParsed(const ParseFunction& base, const ParseFunction& overrider) = 0;
virtual Id onCallParsed(
const ParseLocation& location, const ParseFunction& caller, const ParseFunction& callee) = 0;
virtual Id onCallParsed(
+16 -8
View File
@@ -180,14 +180,22 @@ bool ASTVisitor::VisitCXXMethodDecl(clang::CXXMethodDecl* declaration)
abstraction = ParserClient::ABSTRACTION_VIRTUAL;
}
ParseFunction parseFunction = getParseFunction(declaration);
m_client->onMethodParsed(
getParseLocationForNamedDecl(declaration),
getParseFunction(declaration),
parseFunction,
convertAccessType(declaration->getAccess()),
abstraction,
getParseLocationOfFunctionBody(declaration)
);
for (clang::CXXMethodDecl::method_iterator it = declaration->begin_overridden_methods();
it != declaration->end_overridden_methods(); it++)
{
m_client->onMethodOverrideParsed(getParseFunction(*it), parseFunction);
}
if (declaration->hasBody() && declaration->getBody() != NULL && declaration->isThisDeclarationADefinition())
{
ASTBodyVisitor bodyVisitor(this, declaration);
@@ -725,7 +733,7 @@ ParseTypeUsage ASTVisitor::getParseTypeUsage(clang::TypeLoc typeLoc, const clang
return ParseTypeUsage(parseLocation, dataType);
}
ParseTypeUsage ASTVisitor::getParseTypeUsageOfReturnType(clang::FunctionDecl* declaration) const
ParseTypeUsage ASTVisitor::getParseTypeUsageOfReturnType(const clang::FunctionDecl* declaration) const
{
clang::TypeLoc typeLoc;
@@ -742,13 +750,13 @@ ParseTypeUsage ASTVisitor::getParseTypeUsageOfReturnType(clang::FunctionDecl* de
return getParseTypeUsage(typeLoc, declaration->getReturnType());
}
std::vector<ParseTypeUsage> ASTVisitor::getParameters(clang::FunctionDecl* declaration) const
std::vector<ParseTypeUsage> ASTVisitor::getParameters(const clang::FunctionDecl* declaration) const
{
std::vector<ParseTypeUsage> parameters;
for (unsigned i = 0; i < declaration->getNumParams(); i++)
{
clang::ParmVarDecl* paramDecl = declaration->getParamDecl(i);
const clang::ParmVarDecl* paramDecl = declaration->getParamDecl(i);
if (paramDecl->getTypeSourceInfo())
{
parameters.push_back(getParseTypeUsage(paramDecl->getTypeSourceInfo()->getTypeLoc(), paramDecl->getType()));
@@ -758,13 +766,13 @@ std::vector<ParseTypeUsage> ASTVisitor::getParameters(clang::FunctionDecl* decla
return parameters;
}
ParseVariable ASTVisitor::getParseVariable(clang::DeclaratorDecl* declaration) const
ParseVariable ASTVisitor::getParseVariable(const clang::DeclaratorDecl* declaration) const
{
bool isStatic = false;
std::vector<std::string> hameHierarchy = utility::getDeclNameHierarchy(declaration);
if (clang::isa<clang::VarDecl>(declaration))
{
clang::VarDecl* varDecl = clang::dyn_cast<clang::VarDecl>(declaration);
const clang::VarDecl* varDecl = clang::dyn_cast<const clang::VarDecl>(declaration);
isStatic = varDecl->isStaticDataMember() || varDecl->getStorageClass() == clang::SC_Static;
}
else if (clang::isa<clang::FieldDecl>(declaration))
@@ -779,14 +787,14 @@ ParseVariable ASTVisitor::getParseVariable(clang::DeclaratorDecl* declaration) c
);
}
ParseFunction ASTVisitor::getParseFunction(clang::FunctionDecl* declaration) const
ParseFunction ASTVisitor::getParseFunction(const clang::FunctionDecl* declaration) const
{
bool isStatic = false;
bool isConst = false;
if (clang::isa<clang::CXXMethodDecl>(declaration))
{
clang::CXXMethodDecl* methodDecl = clang::dyn_cast<clang::CXXMethodDecl>(declaration);
const clang::CXXMethodDecl* methodDecl = clang::dyn_cast<const clang::CXXMethodDecl>(declaration);
isStatic = methodDecl->isStatic();
isConst = methodDecl->isConst();
}
+4 -4
View File
@@ -68,11 +68,11 @@ private:
ParseLocation getParseLocationOfRecordBody(clang::CXXRecordDecl* decl) const;
ParseTypeUsage getParseTypeUsage(clang::TypeLoc typeLoc, const clang::QualType& type) const;
ParseTypeUsage getParseTypeUsageOfReturnType(clang::FunctionDecl* declaration) const;
std::vector<ParseTypeUsage> getParameters(clang::FunctionDecl* declaration) const;
ParseTypeUsage getParseTypeUsageOfReturnType(const clang::FunctionDecl* declaration) const;
std::vector<ParseTypeUsage> getParameters(const clang::FunctionDecl* declaration) const;
ParseVariable getParseVariable(clang::DeclaratorDecl* declaration) const;
ParseFunction getParseFunction(clang::FunctionDecl* declaration) const;
ParseVariable getParseVariable(const clang::DeclaratorDecl* declaration) const;
ParseFunction getParseFunction(const clang::FunctionDecl* declaration) const;
clang::ASTContext* m_context;
ParserClient* m_client;
+6 -6
View File
@@ -105,7 +105,7 @@ namespace utility
return DataType(typeNameHerarchy, qualifierList, modifierStack);
}
std::vector<std::string> getDeclNameHierarchy(clang::Decl* declaration)
std::vector<std::string> getDeclNameHierarchy(const clang::Decl* declaration)
{
std::vector<std::string> contextNameHierarchy;
if (declaration)
@@ -114,7 +114,7 @@ namespace utility
if (clang::isa<clang::NamedDecl>(declaration))
{
declName = getDeclName(clang::dyn_cast<clang::NamedDecl>(declaration));
declName = getDeclName(clang::dyn_cast<const clang::NamedDecl>(declaration));
}
else
{
@@ -133,11 +133,11 @@ namespace utility
return contextNameHierarchy;
}
std::vector<std::string> getContextNameHierarchy(clang::DeclContext* declContext)
std::vector<std::string> getContextNameHierarchy(const clang::DeclContext* declContext)
{
std::vector<std::string> contextNameHierarchy;
clang::DeclContext* parentContext = declContext->getParent();
const clang::DeclContext* parentContext = declContext->getParent();
if (parentContext)
{
contextNameHierarchy = getContextNameHierarchy(parentContext);
@@ -145,7 +145,7 @@ namespace utility
if (clang::isa<clang::NamedDecl>(declContext))
{
std::string declName = getDeclName(clang::dyn_cast<clang::NamedDecl>(declContext));
std::string declName = getDeclName(clang::dyn_cast<const clang::NamedDecl>(declContext));
if (declName != "")
{
contextNameHierarchy.push_back(declName);
@@ -154,7 +154,7 @@ namespace utility
return contextNameHierarchy;
}
std::string getDeclName(clang::NamedDecl* declaration)
std::string getDeclName(const clang::NamedDecl* declaration)
{
std::string declName = declaration->getNameAsString();
+3 -3
View File
@@ -15,9 +15,9 @@ namespace utility
{
DataType qualTypeToDataType(clang::QualType qualType);
std::vector<std::string> getDeclNameHierarchy(clang::Decl* declaration);
std::vector<std::string> getContextNameHierarchy(clang::DeclContext* declaration);
std::string getDeclName(clang::NamedDecl* declaration);
std::vector<std::string> getDeclNameHierarchy(const clang::Decl* declaration);
std::vector<std::string> getContextNameHierarchy(const clang::DeclContext* declaration);
std::string getDeclName(const clang::NamedDecl* declaration);
std::vector<std::string> getTemplateSpecializationParentNameHierarchy(clang::ClassTemplateSpecializationDecl* declaration);
DataType templateArgumentToDataType(const clang::TemplateArgument& argument);
}