From 1b159338190cd89be0b932463a012d63e04a2335 Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Mon, 28 Nov 2016 16:10:01 +0100 Subject: [PATCH] logic: fixed some crashes * verbose ast visitor logs the file that is currently visited. * fixed crash in log controller * fixed crash when solving the name of an anonymous element that has no valid location --- src/lib/component/controller/LogController.cpp | 9 ++++++--- src/lib/component/controller/LogController.h | 4 +--- src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.cpp | 7 +++++++ src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.h | 1 + .../parser/cxx/name_resolver/CxxDeclNameResolver.cpp | 10 +++++++--- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/lib/component/controller/LogController.cpp b/src/lib/component/controller/LogController.cpp index 48072f94..0f8640a8 100644 --- a/src/lib/component/controller/LogController.cpp +++ b/src/lib/component/controller/LogController.cpp @@ -8,6 +8,7 @@ LogController::LogController() : Logger("WindowLogger") , m_enabled(false) , m_previousLogCount(0) + , m_waiting(false) { } @@ -97,14 +98,16 @@ void LogController::addLog(Logger::LogLevel type, const LogMessage& message) ) ); - if (m_waiting.try_lock()) + if (!m_waiting) { + m_waiting = true; std::thread([&]() { std::this_thread::sleep_for( std::chrono::seconds(1) ); syncLogs(); - m_waiting.unlock(); - }).detach(); + m_waiting = false; + } + ).detach(); } } diff --git a/src/lib/component/controller/LogController.h b/src/lib/component/controller/LogController.h index 96b18638..a7cc6103 100644 --- a/src/lib/component/controller/LogController.h +++ b/src/lib/component/controller/LogController.h @@ -1,8 +1,6 @@ #ifndef LOG_CONTROLLER_H #define LOG_CONTROLLER_H -#include - #include "component/controller/Controller.h" #include "component/view/LogView.h" @@ -44,7 +42,7 @@ private: void addLog(Logger::LogLevel type, const LogMessage& message); void syncLogs(); - std::mutex m_waiting; + bool m_waiting; int m_previousLogCount; Logger::LogLevelMask m_logLevel; }; diff --git a/src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.cpp b/src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.cpp index e7be4b59..13027952 100644 --- a/src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.cpp @@ -14,6 +14,7 @@ CxxVerboseAstVisitor::CxxVerboseAstVisitor(clang::ASTContext* context, clang::Preprocessor* preprocessor, ParserClient* client, FileRegister* fileRegister) : base(context, preprocessor, client, fileRegister) + , m_currentFilePath("") , m_indentation(0) { } @@ -36,6 +37,12 @@ bool CxxVerboseAstVisitor::TraverseDecl(clang::Decl *d) ParseLocation loc = getParseLocation(d->getSourceRange()); stream << " <" << loc.startLineNumber << ":" << loc.startColumnNumber << ", " << loc.endLineNumber << ":" << loc.endColumnNumber << ">"; + if (m_currentFilePath != loc.filePath.str()) + { + m_currentFilePath = loc.filePath.str(); + LOG_INFO_STREAM_BARE(<< "Indexer - Traversing \"" + m_currentFilePath + "\"" ); + } + LOG_INFO_STREAM_BARE(<< "Indexer - " << stream.str()); { diff --git a/src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.h b/src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.h index bd889405..4a2199c0 100644 --- a/src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.h +++ b/src/lib_cxx/data/parser/cxx/CxxVerboseAstVisitor.h @@ -40,6 +40,7 @@ private: return ""; } + std::string m_currentFilePath; unsigned int m_indentation; }; diff --git a/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp b/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp index fd3e91f6..ca015ccd 100644 --- a/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp +++ b/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp @@ -288,8 +288,12 @@ std::shared_ptr CxxDeclNameResolver::getDeclName(const clang::Named std::string CxxDeclNameResolver::getNameForAnonymousSymbol(const std::string& symbolKindName, const clang::PresumedLoc& presumedBegin) { - return "anonymous " + symbolKindName + - " (" + FilePath(presumedBegin.getFilename()).fileName() + "<" + std::to_string(presumedBegin.getLine()) + ":" + std::to_string(presumedBegin.getColumn()) + ">)"; + if (presumedBegin.isValid()) + { + return "anonymous " + symbolKindName + + " (" + FilePath(presumedBegin.getFilename()).fileName() + "<" + std::to_string(presumedBegin.getLine()) + ":" + std::to_string(presumedBegin.getColumn()) + ">)"; + } + return "anonymous " + symbolKindName; } std::string CxxDeclNameResolver::getTemplateParameterString(const clang::NamedDecl* parameter) @@ -333,7 +337,7 @@ std::string CxxDeclNameResolver::getTemplateParameterTypeString(const clang::Non { typeNameResolver.ignoreContextDecl(m_currentDecl); } - + std::string typeString = ""; std::shared_ptr typeName = typeNameResolver.getName(parameter->getType());