From 3351e4aad79b691f669833ab8368489cdc408a84 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Tue, 10 Nov 2015 10:25:47 +0100 Subject: [PATCH] data: fixed parsing problems * fixed calleeDecl pointer not checked for CallExpr * fixed CommentHandler not checking if valid file in FileRegister --- src/lib/data/parser/cxx/ASTAction.cpp | 2 +- src/lib/data/parser/cxx/ASTBodyVisitor.cpp | 2 +- src/lib/data/parser/cxx/CommentHandler.cpp | 26 ++++++++++++++-------- src/lib/data/parser/cxx/CommentHandler.h | 4 +++- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/lib/data/parser/cxx/ASTAction.cpp b/src/lib/data/parser/cxx/ASTAction.cpp index cc74a695..0ae2509d 100644 --- a/src/lib/data/parser/cxx/ASTAction.cpp +++ b/src/lib/data/parser/cxx/ASTAction.cpp @@ -8,7 +8,7 @@ ASTAction::ASTAction(ParserClient* client, FileRegister* fileRegister) : m_client(client) , m_fileRegister(fileRegister) - , m_commentHandler(client) + , m_commentHandler(client, fileRegister) { } diff --git a/src/lib/data/parser/cxx/ASTBodyVisitor.cpp b/src/lib/data/parser/cxx/ASTBodyVisitor.cpp index 73009071..467a6010 100644 --- a/src/lib/data/parser/cxx/ASTBodyVisitor.cpp +++ b/src/lib/data/parser/cxx/ASTBodyVisitor.cpp @@ -45,7 +45,7 @@ void ASTBodyVisitor::VisitCallExpr(clang::CallExpr* expr) { clang::Decl* calleeDecl = expr->getCalleeDecl(); - if (clang::isa(calleeDecl)) + if (calleeDecl && clang::isa(calleeDecl)) { clang::CXXRecordDecl* recordDecl = clang::dyn_cast(calleeDecl)->getParent(); ignore = recordDecl->isLambda(); diff --git a/src/lib/data/parser/cxx/CommentHandler.cpp b/src/lib/data/parser/cxx/CommentHandler.cpp index ae77840e..45578e13 100644 --- a/src/lib/data/parser/cxx/CommentHandler.cpp +++ b/src/lib/data/parser/cxx/CommentHandler.cpp @@ -1,8 +1,12 @@ #include "data/parser/cxx/CommentHandler.h" #include "data/parser/ParserClient.h" -CommentHandler::CommentHandler(ParserClient* client) +#include "utility/file/FileManager.h" +#include "utility/file/FileRegister.h" + +CommentHandler::CommentHandler(ParserClient* client, FileRegister* fileRegister) : m_client(client) + , m_fileRegister(fileRegister) { } @@ -15,14 +19,18 @@ bool CommentHandler::HandleComment(clang::Preprocessor& preprocessor, clang::Sou clang::SourceManager& sourceManager = preprocessor.getSourceManager(); const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(sourceRange.getBegin(), false); const clang::PresumedLoc& presumedEnd = sourceManager.getPresumedLoc(sourceRange.getEnd(), false); - - m_client->onCommentParsed(ParseLocation( - presumedBegin.getFilename(), - presumedBegin.getLine(), - presumedBegin.getColumn(), - presumedEnd.getLine(), - presumedEnd.getColumn() - )); + + FilePath filePath = FilePath(presumedBegin.getFilename()); + if (m_fileRegister->getFileManager()->hasFilePath(filePath) && !m_fileRegister->fileIsParsed(filePath)) + { + m_client->onCommentParsed(ParseLocation( + presumedBegin.getFilename(), + presumedBegin.getLine(), + presumedBegin.getColumn(), + presumedEnd.getLine(), + presumedEnd.getColumn() + )); + } return false; } diff --git a/src/lib/data/parser/cxx/CommentHandler.h b/src/lib/data/parser/cxx/CommentHandler.h index 306244c8..0c49f35e 100644 --- a/src/lib/data/parser/cxx/CommentHandler.h +++ b/src/lib/data/parser/cxx/CommentHandler.h @@ -3,19 +3,21 @@ #include "clang/Lex/Preprocessor.h" +class FileRegister; class ParserClient; class CommentHandler : public clang::CommentHandler { public: - CommentHandler(ParserClient* client); + CommentHandler(ParserClient* client, FileRegister* fileRegister); virtual ~CommentHandler(); virtual bool HandleComment(clang::Preprocessor& preprocessor, clang::SourceRange sourceRange); private: ParserClient* m_client; + FileRegister* m_fileRegister; }; #endif // COMMENT_HANDLER_H