logic: Parsing Field Initializations
* extended use of ASTBodyVisitor methods for visiting VarDecls to include FieldDecls as well (part of C++ 11). * impemented handling of invalid source location in ASTVisitor to prevent crash.
This commit is contained in:
@@ -9,7 +9,7 @@ ASTBodyVisitor::ASTBodyVisitor(ASTBodyVisitorClient* client, clang::FunctionDecl
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTBodyVisitor::ASTBodyVisitor(ASTBodyVisitorClient* client, clang::VarDecl* varDecl)
|
ASTBodyVisitor::ASTBodyVisitor(ASTBodyVisitorClient* client, clang::DeclaratorDecl* varDecl)
|
||||||
: m_client(client)
|
: m_client(client)
|
||||||
, m_functionDecl(nullptr)
|
, m_functionDecl(nullptr)
|
||||||
, m_varDecl(varDecl)
|
, m_varDecl(varDecl)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class ASTBodyVisitor: public clang::StmtVisitor<ASTBodyVisitor>
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ASTBodyVisitor(ASTBodyVisitorClient* client, clang::FunctionDecl* functionDecl);
|
ASTBodyVisitor(ASTBodyVisitorClient* client, clang::FunctionDecl* functionDecl);
|
||||||
ASTBodyVisitor(ASTBodyVisitorClient* client, clang::VarDecl* varDecl);
|
ASTBodyVisitor(ASTBodyVisitorClient* client, clang::DeclaratorDecl* varDecl);
|
||||||
virtual ~ASTBodyVisitor();
|
virtual ~ASTBodyVisitor();
|
||||||
|
|
||||||
void VisitStmt(clang::Stmt* stmt);
|
void VisitStmt(clang::Stmt* stmt);
|
||||||
@@ -23,7 +23,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
ASTBodyVisitorClient* m_client;
|
ASTBodyVisitorClient* m_client;
|
||||||
clang::FunctionDecl* m_functionDecl;
|
clang::FunctionDecl* m_functionDecl;
|
||||||
clang::VarDecl* m_varDecl;
|
clang::DeclaratorDecl* m_varDecl;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // AST_BODY_VISITOR
|
#endif // AST_BODY_VISITOR
|
||||||
|
|||||||
@@ -12,17 +12,17 @@ public:
|
|||||||
virtual ~ASTBodyVisitorClient();
|
virtual ~ASTBodyVisitorClient();
|
||||||
|
|
||||||
virtual void VisitCallExprInDeclBody(clang::FunctionDecl* decl, clang::CallExpr* expr) = 0;
|
virtual void VisitCallExprInDeclBody(clang::FunctionDecl* decl, clang::CallExpr* expr) = 0;
|
||||||
virtual void VisitCallExprInDeclBody(clang::VarDecl* decl, clang::CallExpr* expr) = 0;
|
virtual void VisitCallExprInDeclBody(clang::DeclaratorDecl* decl, clang::CallExpr* expr) = 0;
|
||||||
virtual void VisitCXXConstructExprInDeclBody(clang::FunctionDecl* decl, clang::CXXConstructExpr* expr) = 0;
|
virtual void VisitCXXConstructExprInDeclBody(clang::FunctionDecl* decl, clang::CXXConstructExpr* expr) = 0;
|
||||||
virtual void VisitCXXConstructExprInDeclBody(clang::VarDecl* decl, clang::CXXConstructExpr* expr) = 0;
|
virtual void VisitCXXConstructExprInDeclBody(clang::DeclaratorDecl* decl, clang::CXXConstructExpr* expr) = 0;
|
||||||
virtual void VisitCXXNewExprInDeclBody(clang::FunctionDecl* decl, clang::CXXNewExpr* expr) = 0;
|
virtual void VisitCXXNewExprInDeclBody(clang::FunctionDecl* decl, clang::CXXNewExpr* expr) = 0;
|
||||||
virtual void VisitCXXNewExprInDeclBody(clang::VarDecl* decl, clang::CXXNewExpr* expr) = 0;
|
virtual void VisitCXXNewExprInDeclBody(clang::DeclaratorDecl* decl, clang::CXXNewExpr* expr) = 0;
|
||||||
virtual void VisitMemberExprInDeclBody(clang::FunctionDecl* decl, clang::MemberExpr* expr) = 0;
|
virtual void VisitMemberExprInDeclBody(clang::FunctionDecl* decl, clang::MemberExpr* expr) = 0;
|
||||||
virtual void VisitMemberExprInDeclBody(clang::VarDecl* decl, clang::MemberExpr* expr) = 0;
|
virtual void VisitMemberExprInDeclBody(clang::DeclaratorDecl* decl, clang::MemberExpr* expr) = 0;
|
||||||
virtual void VisitGlobalVariableExprInDeclBody(clang::FunctionDecl* decl, clang::DeclRefExpr* expr) = 0;
|
virtual void VisitGlobalVariableExprInDeclBody(clang::FunctionDecl* decl, clang::DeclRefExpr* expr) = 0;
|
||||||
virtual void VisitGlobalVariableExprInDeclBody(clang::VarDecl* decl, clang::DeclRefExpr* expr) = 0;
|
virtual void VisitGlobalVariableExprInDeclBody(clang::DeclaratorDecl* decl, clang::DeclRefExpr* expr) = 0;
|
||||||
virtual void VisitEnumExprInDeclBody(clang::FunctionDecl* decl, clang::DeclRefExpr* expr) = 0;
|
virtual void VisitEnumExprInDeclBody(clang::FunctionDecl* decl, clang::DeclRefExpr* expr) = 0;
|
||||||
virtual void VisitEnumExprInDeclBody(clang::VarDecl* decl, clang::DeclRefExpr* expr) = 0;
|
virtual void VisitEnumExprInDeclBody(clang::DeclaratorDecl* decl, clang::DeclRefExpr* expr) = 0;
|
||||||
virtual void VisitVarDeclInDeclBody(clang::FunctionDecl* decl, clang::VarDecl* varDecl) = 0;
|
virtual void VisitVarDeclInDeclBody(clang::FunctionDecl* decl, clang::VarDecl* varDecl) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -133,6 +133,11 @@ bool ASTVisitor::VisitFieldDecl(clang::FieldDecl* declaration)
|
|||||||
{
|
{
|
||||||
if (isLocatedInUnparsedProjectFile(declaration))
|
if (isLocatedInUnparsedProjectFile(declaration))
|
||||||
{
|
{
|
||||||
|
if (declaration->hasInClassInitializer())
|
||||||
|
{
|
||||||
|
ASTBodyVisitor bodyVisitor(this, declaration);
|
||||||
|
bodyVisitor.Visit(declaration->getInClassInitializer());
|
||||||
|
}
|
||||||
m_client->onFieldParsed(
|
m_client->onFieldParsed(
|
||||||
getParseLocationForNamedDecl(declaration),
|
getParseLocationForNamedDecl(declaration),
|
||||||
getParseVariable(declaration),
|
getParseVariable(declaration),
|
||||||
@@ -573,7 +578,7 @@ void ASTVisitor::VisitCallExprInDeclBody(clang::FunctionDecl* decl, clang::CallE
|
|||||||
expr->getDirectCallee(), expr->getSourceRange(), getParseFunction(decl));
|
expr->getDirectCallee(), expr->getSourceRange(), getParseFunction(decl));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTVisitor::VisitCallExprInDeclBody(clang::VarDecl* decl, clang::CallExpr* expr)
|
void ASTVisitor::VisitCallExprInDeclBody(clang::DeclaratorDecl* decl, clang::CallExpr* expr)
|
||||||
{
|
{
|
||||||
if (!expr->getDirectCallee())
|
if (!expr->getDirectCallee())
|
||||||
{
|
{
|
||||||
@@ -649,7 +654,7 @@ void ASTVisitor::VisitCXXConstructExprInDeclBody(clang::FunctionDecl* decl, clan
|
|||||||
expr->getConstructor(), expr->getSourceRange(), getParseFunction(decl));
|
expr->getConstructor(), expr->getSourceRange(), getParseFunction(decl));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTVisitor::VisitCXXConstructExprInDeclBody(clang::VarDecl* decl, clang::CXXConstructExpr* expr)
|
void ASTVisitor::VisitCXXConstructExprInDeclBody(clang::DeclaratorDecl* decl, clang::CXXConstructExpr* expr)
|
||||||
{
|
{
|
||||||
m_client->onCallParsed(
|
m_client->onCallParsed(
|
||||||
getParseLocation(expr->getSourceRange()),
|
getParseLocation(expr->getSourceRange()),
|
||||||
@@ -671,7 +676,7 @@ void ASTVisitor::VisitCXXNewExprInDeclBody(clang::FunctionDecl* decl, clang::CXX
|
|||||||
saveClassTemplateArgumentTypeUsages<ParseFunction>(expr->getAllocatedTypeSourceInfo(), getParseFunction(decl));
|
saveClassTemplateArgumentTypeUsages<ParseFunction>(expr->getAllocatedTypeSourceInfo(), getParseFunction(decl));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTVisitor::VisitCXXNewExprInDeclBody(clang::VarDecl* decl, clang::CXXNewExpr* expr)
|
void ASTVisitor::VisitCXXNewExprInDeclBody(clang::DeclaratorDecl* decl, clang::CXXNewExpr* expr)
|
||||||
{
|
{
|
||||||
m_client->onTypeUsageParsed(
|
m_client->onTypeUsageParsed(
|
||||||
getParseTypeUsage(expr->getAllocatedTypeSourceInfo()->getTypeLoc(), expr->getAllocatedType()),
|
getParseTypeUsage(expr->getAllocatedTypeSourceInfo()->getTypeLoc(), expr->getAllocatedType()),
|
||||||
@@ -695,7 +700,7 @@ void ASTVisitor::VisitMemberExprInDeclBody(clang::FunctionDecl* decl, clang::Mem
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTVisitor::VisitMemberExprInDeclBody(clang::VarDecl* decl, clang::MemberExpr* expr)
|
void ASTVisitor::VisitMemberExprInDeclBody(clang::DeclaratorDecl* decl, clang::MemberExpr* expr)
|
||||||
{
|
{
|
||||||
ParseLocation parseLocation = getParseLocation(expr->getSourceRange());
|
ParseLocation parseLocation = getParseLocation(expr->getSourceRange());
|
||||||
|
|
||||||
@@ -723,7 +728,7 @@ void ASTVisitor::VisitGlobalVariableExprInDeclBody(clang::FunctionDecl* decl, cl
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTVisitor::VisitGlobalVariableExprInDeclBody(clang::VarDecl* decl, clang::DeclRefExpr* expr)
|
void ASTVisitor::VisitGlobalVariableExprInDeclBody(clang::DeclaratorDecl* decl, clang::DeclRefExpr* expr)
|
||||||
{
|
{
|
||||||
ParseLocation parseLocation = getParseLocation(expr->getSourceRange());
|
ParseLocation parseLocation = getParseLocation(expr->getSourceRange());
|
||||||
|
|
||||||
@@ -751,7 +756,7 @@ void ASTVisitor::VisitEnumExprInDeclBody(clang::FunctionDecl* decl, clang::DeclR
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTVisitor::VisitEnumExprInDeclBody(clang::VarDecl* decl, clang::DeclRefExpr* expr)
|
void ASTVisitor::VisitEnumExprInDeclBody(clang::DeclaratorDecl* decl, clang::DeclRefExpr* expr)
|
||||||
{
|
{
|
||||||
ParseLocation parseLocation = getParseLocation(expr->getSourceRange());
|
ParseLocation parseLocation = getParseLocation(expr->getSourceRange());
|
||||||
|
|
||||||
@@ -864,6 +869,11 @@ ParseLocation ASTVisitor::getParseLocation(const clang::SourceRange& sourceRange
|
|||||||
|
|
||||||
ParseLocation ASTVisitor::getParseLocationForNamedDecl(const clang::NamedDecl* decl, const clang::SourceLocation& loc) const
|
ParseLocation ASTVisitor::getParseLocationForNamedDecl(const clang::NamedDecl* decl, const clang::SourceLocation& loc) const
|
||||||
{
|
{
|
||||||
|
if (loc.isInvalid())
|
||||||
|
{
|
||||||
|
return ParseLocation();
|
||||||
|
}
|
||||||
|
|
||||||
const clang::SourceManager& sourceManager = m_context->getSourceManager();
|
const clang::SourceManager& sourceManager = m_context->getSourceManager();
|
||||||
const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(loc);
|
const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(loc);
|
||||||
|
|
||||||
|
|||||||
@@ -46,17 +46,17 @@ public:
|
|||||||
|
|
||||||
// ASTBodyVisitorClient implementation
|
// ASTBodyVisitorClient implementation
|
||||||
virtual void VisitCallExprInDeclBody(clang::FunctionDecl* decl, clang::CallExpr* expr); // calls
|
virtual void VisitCallExprInDeclBody(clang::FunctionDecl* decl, clang::CallExpr* expr); // calls
|
||||||
virtual void VisitCallExprInDeclBody(clang::VarDecl* decl, clang::CallExpr* expr); // calls in initialization of global variables
|
virtual void VisitCallExprInDeclBody(clang::DeclaratorDecl* decl, clang::CallExpr* expr); // calls in initialization of global variables
|
||||||
virtual void VisitCXXConstructExprInDeclBody(clang::FunctionDecl* decl, clang::CXXConstructExpr* expr); // constructor calls
|
virtual void VisitCXXConstructExprInDeclBody(clang::FunctionDecl* decl, clang::CXXConstructExpr* expr); // constructor calls
|
||||||
virtual void VisitCXXConstructExprInDeclBody(clang::VarDecl* decl, clang::CXXConstructExpr* expr); // constructor calls of global variables
|
virtual void VisitCXXConstructExprInDeclBody(clang::DeclaratorDecl* decl, clang::CXXConstructExpr* expr); // constructor calls of global variables
|
||||||
virtual void VisitCXXNewExprInDeclBody(clang::FunctionDecl* decl, clang::CXXNewExpr* expr); // type use of new operator
|
virtual void VisitCXXNewExprInDeclBody(clang::FunctionDecl* decl, clang::CXXNewExpr* expr); // type use of new operator
|
||||||
virtual void VisitCXXNewExprInDeclBody(clang::VarDecl* decl, clang::CXXNewExpr* expr); // type use of new operator in global space
|
virtual void VisitCXXNewExprInDeclBody(clang::DeclaratorDecl* decl, clang::CXXNewExpr* expr); // type use of new operator in global space
|
||||||
virtual void VisitMemberExprInDeclBody(clang::FunctionDecl* decl, clang::MemberExpr* expr); // field usages
|
virtual void VisitMemberExprInDeclBody(clang::FunctionDecl* decl, clang::MemberExpr* expr); // field usages
|
||||||
virtual void VisitMemberExprInDeclBody(clang::VarDecl* decl, clang::MemberExpr* expr); // field usages
|
virtual void VisitMemberExprInDeclBody(clang::DeclaratorDecl* decl, clang::MemberExpr* expr); // field usages
|
||||||
virtual void VisitGlobalVariableExprInDeclBody(clang::FunctionDecl* decl, clang::DeclRefExpr* expr); // global variable usage
|
virtual void VisitGlobalVariableExprInDeclBody(clang::FunctionDecl* decl, clang::DeclRefExpr* expr); // global variable usage
|
||||||
virtual void VisitGlobalVariableExprInDeclBody(clang::VarDecl* decl, clang::DeclRefExpr* expr); // global variable usage
|
virtual void VisitGlobalVariableExprInDeclBody(clang::DeclaratorDecl* decl, clang::DeclRefExpr* expr); // global variable usage
|
||||||
virtual void VisitEnumExprInDeclBody(clang::FunctionDecl* decl, clang::DeclRefExpr* expr); // enum field usage
|
virtual void VisitEnumExprInDeclBody(clang::FunctionDecl* decl, clang::DeclRefExpr* expr); // enum field usage
|
||||||
virtual void VisitEnumExprInDeclBody(clang::VarDecl* decl, clang::DeclRefExpr* expr); // enum field usage in global variable
|
virtual void VisitEnumExprInDeclBody(clang::DeclaratorDecl* decl, clang::DeclRefExpr* expr); // enum field usage in global variable
|
||||||
virtual void VisitVarDeclInDeclBody(clang::FunctionDecl* decl, clang::VarDecl* varDecl); // type usages
|
virtual void VisitVarDeclInDeclBody(clang::FunctionDecl* decl, clang::VarDecl* varDecl); // type usages
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user