data: parse variable usage

* Implemented functions for parsing usages of fields and global variables in ASTBodyVisitor and ASTVisitor.
* Storage adds TokenLocatons and Edges for usages.
* Added tests for parsing usage of fields and global variables.

fortune cookie message = Fame, riches and love are yours for the taking.
This commit is contained in:
malte_langkabel
2014-07-17 15:09:53 +02:00
parent 4578c109ec
commit ad5056354d
12 changed files with 180 additions and 12 deletions
+4
View File
@@ -74,6 +74,10 @@ public:
const ParseLocation& location, const std::string& fullName, const std::string& baseName, AccessType access) = 0;
virtual void onCallParsed(
const ParseLocation& location, const std::string& callerName, const std::string& calleeName) = 0;
virtual void onFieldUsageParsed(
const ParseLocation& location, const std::string& userName, const std::string& usedName) = 0;
virtual void onGlobalVariableUsageParsed(
const ParseLocation& location, const std::string& userName, const std::string& usedName) = 0;
};
#endif // PARSER_CLIENT_H
@@ -39,3 +39,21 @@ void ASTBodyVisitor::VisitCXXConstructExpr(clang::CXXConstructExpr* expr)
VisitStmt(expr);
}
void ASTBodyVisitor::VisitMemberExpr(clang::make_ptr<clang::MemberExpr>::type expr)
{
if (expr->getMemberDecl()->getKind() == clang::Decl::Kind::Field)
{
m_client->VisitFieldUsageExprInDeclBody(m_parentDecl, expr);
}
VisitStmt(expr);
}
void ASTBodyVisitor::VisitDeclRefExpr(clang::make_ptr<clang::DeclRefExpr>::type expr)
{
if (expr->getDecl()->getKind() == clang::Decl::Var && expr->getDecl()->isDefinedOutsideFunctionOrMethod())
{
m_client->VisitGlobalVariableUsageExprInDeclBody(m_parentDecl, expr);
}
VisitStmt(expr);
}
+2
View File
@@ -14,6 +14,8 @@ public:
void VisitChildren(clang::Stmt* stmt);
void VisitCallExpr(clang::CallExpr* expr);
void VisitCXXConstructExpr(clang::CXXConstructExpr* expr);
void VisitMemberExpr(clang::make_ptr<clang::MemberExpr>::type expr);
void VisitDeclRefExpr(clang::make_ptr<clang::DeclRefExpr>::type expr);
private:
ASTBodyVisitorClient* m_client;
@@ -13,6 +13,8 @@ public:
virtual void VisitCallExprInDeclBody(clang::NamedDecl* decl, clang::CallExpr* expr) = 0;
virtual void VisitCXXConstructExprInDeclBody(clang::NamedDecl* decl, clang::CXXConstructExpr* expr) = 0;
virtual void VisitFieldUsageExprInDeclBody(clang::NamedDecl* decl, clang::MemberExpr* expr) = 0;
virtual void VisitGlobalVariableUsageExprInDeclBody(clang::NamedDecl* decl, clang::DeclRefExpr* expr) = 0;
};
#endif // AST_BODY_VISITOR_CLIENT_H
+44
View File
@@ -278,6 +278,50 @@ void ASTVisitor::VisitCXXConstructExprInDeclBody(clang::NamedDecl* decl, clang::
);
}
void ASTVisitor::VisitFieldUsageExprInDeclBody(clang::NamedDecl* decl, clang::MemberExpr* expr)
{
const clang::SourceManager& sourceManager = m_context->getSourceManager();
const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(expr->getSourceRange().getBegin());
const clang::PresumedLoc& presumedEnd = sourceManager.getPresumedLoc(expr->getSourceRange().getEnd());
const std::string exprName = expr->getMemberNameInfo().getAsString();
ParseLocation parseLocation(
presumedBegin.getFilename(),
presumedBegin.getLine(),
presumedBegin.getColumn(),
presumedEnd.getLine(),
presumedEnd.getColumn() + exprName.size() - 1
);
m_client->onFieldUsageParsed(
parseLocation,
decl->getQualifiedNameAsString(),
expr->getMemberDecl()->getQualifiedNameAsString()
);
}
void ASTVisitor::VisitGlobalVariableUsageExprInDeclBody(clang::NamedDecl* decl, clang::DeclRefExpr* expr)
{
const clang::SourceManager& sourceManager = m_context->getSourceManager();
const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(expr->getSourceRange().getBegin());
const clang::PresumedLoc& presumedEnd = sourceManager.getPresumedLoc(expr->getSourceRange().getEnd());
const std::string exprName = expr->getNameInfo().getAsString();
ParseLocation parseLocation(
presumedBegin.getFilename(),
presumedBegin.getLine(),
presumedBegin.getColumn(),
presumedEnd.getLine(),
presumedEnd.getColumn() + exprName.size() - 1
);
m_client->onGlobalVariableUsageParsed(
parseLocation,
decl->getQualifiedNameAsString(),
expr->getDecl()->getQualifiedNameAsString()
);
}
bool ASTVisitor::hasValidLocation(const clang::Decl* declaration) const
{
const clang::SourceLocation& location = declaration->getLocStart();
+2
View File
@@ -41,6 +41,8 @@ public:
// ASTBodyVisitorClient implementation
virtual void VisitCallExprInDeclBody(clang::NamedDecl* decl, clang::CallExpr* expr); // calls
virtual void VisitCXXConstructExprInDeclBody(clang::NamedDecl* decl, clang::CXXConstructExpr* expr); // constructor calls
virtual void VisitFieldUsageExprInDeclBody(clang::NamedDecl* decl, clang::MemberExpr* expr); // field usages
virtual void VisitGlobalVariableUsageExprInDeclBody(clang::NamedDecl* decl, clang::DeclRefExpr* expr); // global variable usage
private:
bool hasValidLocation(const clang::Decl* declaration) const;