From 0df32f239ef196433ab2a513f549980e37b875a9 Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Fri, 23 Feb 2018 18:20:55 +0100 Subject: [PATCH] logic: switched to wstring in include processing * this allows for non-ascii characters in detected include paths and in processed include directives. --- CMakeLists.txt | 6 ++-- src/lib/utility/utilityString.cpp | 12 -------- src/lib/utility/utilityString.h | 18 ++++++++++- src/lib_cxx/utility/IncludeProcessing.cpp | 30 +++++++++++-------- src/lib_cxx/utility/IncludeProcessing.h | 2 +- .../cxx_header/utilityCxxHeaderDetection.cpp | 2 +- 6 files changed, 40 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aa6e8188..f8232cc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -343,6 +343,7 @@ set_property( TARGET ${LIB_CXX_PROJECT_NAME} PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/src/lib_cxx" + "${CMAKE_SOURCE_DIR}/src/lib_utility" "${CMAKE_SOURCE_DIR}/src/lib" ) @@ -355,7 +356,7 @@ target_include_directories(${LIB_CXX_PROJECT_NAME} SYSTEM link_directories(${LLVM_LIBRARY_DIRS} ${CLANG_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS}) llvm_map_components_to_libnames(REQ_LLVM_LIBS support core libdriver passes x86asmparser x86codegen) -target_link_libraries(${LIB_CXX_PROJECT_NAME} ${CLANG_LIBRARIES} ${REQ_LLVM_LIBS}) +target_link_libraries(${LIB_CXX_PROJECT_NAME} ${LIB_UTILITY_PROJECT_NAME} ${CLANG_LIBRARIES} ${REQ_LLVM_LIBS}) if (WIN32) target_link_libraries(${LIB_CXX_PROJECT_NAME} version) @@ -376,6 +377,7 @@ set_property( TARGET ${LIB_JAVA_PROJECT_NAME} PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/src/lib_java" + "${CMAKE_SOURCE_DIR}/src/lib_utility" "${CMAKE_SOURCE_DIR}/src/lib" "${CMAKE_SOURCE_DIR}/src/lib_gui" ) @@ -387,7 +389,7 @@ target_include_directories(${LIB_JAVA_PROJECT_NAME} SYSTEM link_directories(${Boost_LIBRARY_DIRS}) -target_link_libraries(${LIB_JAVA_PROJECT_NAME} ${LIB_PROJECT_NAME}) +target_link_libraries(${LIB_JAVA_PROJECT_NAME} ${LIB_UTILITY_PROJECT_NAME} ${LIB_PROJECT_NAME}) add_custom_command( TARGET ${LIB_JAVA_PROJECT_NAME} diff --git a/src/lib/utility/utilityString.cpp b/src/lib/utility/utilityString.cpp index d24117e3..c003225f 100644 --- a/src/lib/utility/utilityString.cpp +++ b/src/lib/utility/utilityString.cpp @@ -474,16 +474,4 @@ namespace utility return str.substr(0, size - 3) + L"..."; } } - - std::string substrBetween(const std::string &str, const std::string &delimiter1, const std::string &delimiter2) - { - size_t found_delimiter1 = str.find(delimiter1); - found_delimiter1 += delimiter1.length(); - size_t found_delimiter2 = str.find(delimiter2,found_delimiter1); - if(found_delimiter1 != str.npos && found_delimiter2 != str.npos) - { - return str.substr(found_delimiter1, found_delimiter2-found_delimiter1); - } - return ""; - } } diff --git a/src/lib/utility/utilityString.h b/src/lib/utility/utilityString.h index 9c4a396b..7cfa954e 100644 --- a/src/lib/utility/utilityString.h +++ b/src/lib/utility/utilityString.h @@ -47,7 +47,8 @@ namespace utility std::string substrAfter(const std::string& str, char delimiter); std::string substrAfter(const std::string& str, const std::string& delimiter); - std::string substrBetween(const std::string& str, const std::string& delimiter1, const std::string& delimiter2); + template + StringType substrBetween(const StringType& str, const StringType& delimiter1, const StringType& delimiter2); template bool isPrefix(const StringType& prefix, const StringType& text); @@ -157,6 +158,21 @@ namespace utility return ss.str(); } + + template + StringType substrBetween(const StringType& str, const StringType& delimiter1, const StringType& delimiter2) + { + size_t found_delimiter1 = str.find(delimiter1); + found_delimiter1 += delimiter1.length(); + size_t found_delimiter2 = str.find(delimiter2, found_delimiter1); + if (found_delimiter1 != str.npos && found_delimiter2 != str.npos) + { + return str.substr(found_delimiter1, found_delimiter2 - found_delimiter1); + } + return StringType(); + } + + template bool isPrefix(const StringType& prefix, const StringType& text) { diff --git a/src/lib_cxx/utility/IncludeProcessing.cpp b/src/lib_cxx/utility/IncludeProcessing.cpp index 53e76024..c98b694d 100644 --- a/src/lib_cxx/utility/IncludeProcessing.cpp +++ b/src/lib_cxx/utility/IncludeProcessing.cpp @@ -3,10 +3,12 @@ #include #include +#include "settings/ApplicationSettings.h" #include "utility/IncludeDirective.h" #include "utility/file/FilePath.h" #include "utility/file/FileTree.h" #include "utility/text/TextAccess.h" +#include "utility/TextCodec.h" #include "utility/utility.h" #include "utility/utilityString.h" @@ -50,7 +52,7 @@ std::vector IncludeProcessing::getUnresolvedIncludeDirectives( const size_t desiredQuantileCount, std::function progress ) { - std::unordered_set processedFilePaths; + std::unordered_set processedFilePaths; std::set unresolvedIncludeDirectives; std::vector> quantiles = splitToQuantiles(sourceFilePaths, desiredQuantileCount); @@ -96,7 +98,7 @@ std::set IncludeProcessing::getHeaderSearchDirectories( } std::set headerSearchDirectories; - std::unordered_set processedFilePaths; + std::unordered_set processedFilePaths; std::vector> quantiles = splitToQuantiles(sourceFilePaths, desiredQuantileCount); for (size_t i = 0; i < quantiles.size(); i++) @@ -110,7 +112,7 @@ std::set IncludeProcessing::getHeaderSearchDirectories( std::transform( unprocessedFilePaths.begin(), unprocessedFilePaths.end(), std::inserter(processedFilePaths, processedFilePaths.begin()), - [](const FilePath& p) { return p.getAbsolute().str(); } + [](const FilePath& p) { return p.getAbsolute().wstr(); } ); std::set unprocessedFilePathsForNextIteration; @@ -141,7 +143,7 @@ std::set IncludeProcessing::getHeaderSearchDirectories( } if (foundIncludedPath.exists()) { - if (processedFilePaths.find(foundIncludedPath.str()) == processedFilePaths.end()) + if (processedFilePaths.find(foundIncludedPath.wstr()) == processedFilePaths.end()) { unprocessedFilePathsForNextIteration.insert(foundIncludedPath); } @@ -171,20 +173,22 @@ std::vector IncludeProcessing::getIncludeDirectives(std::share { std::vector includeDirectives; + TextCodec codec(ApplicationSettings::getInstance()->getTextEncoding()); const std::vector lines = textAccess->getAllLines(); for (size_t i = 0; i < lines.size(); i++) { - const std::string lineTrimmedToHash = utility::trim(lines[i]); - if (utility::isPrefix("#", lineTrimmedToHash)) + const std::wstring line = codec.decode(lines[i]); + const std::wstring lineTrimmedToHash = utility::trim(line); + if (utility::isPrefix(L"#", lineTrimmedToHash)) { - const std::string lineTrimmedToInclude = utility::trim(lineTrimmedToHash.substr(1)); - if (utility::isPrefix("include", lineTrimmedToInclude)) + const std::wstring lineTrimmedToInclude = utility::trim(lineTrimmedToHash.substr(1)); + if (utility::isPrefix(L"include", lineTrimmedToInclude)) { - std::string includeString = utility::substrBetween(lineTrimmedToInclude, "<", ">"); + std::wstring includeString = utility::substrBetween(lineTrimmedToInclude, L"<", L">"); bool usesBrackets = true; if (includeString.empty()) { - includeString = utility::substrBetween(lineTrimmedToInclude, "\"", "\""); + includeString = utility::substrBetween(lineTrimmedToInclude, L"\"", L"\""); usesBrackets = false; } @@ -202,7 +206,7 @@ std::vector IncludeProcessing::getIncludeDirectives(std::share std::vector IncludeProcessing::doGetUnresolvedIncludeDirectives( std::set filePathsToProcess, - std::unordered_set& processedFilePaths, + std::unordered_set& processedFilePaths, const std::set& indexedPaths, const std::set& headerSearchDirectories ) @@ -214,7 +218,7 @@ std::vector IncludeProcessing::doGetUnresolvedIncludeDirective std::transform( filePathsToProcess.begin(), filePathsToProcess.end(), std::inserter(processedFilePaths, processedFilePaths.begin()), - [](const FilePath& p) { return p.getAbsolute().makeCanonical().str(); } + [](const FilePath& p) { return p.getAbsolute().makeCanonical().wstr(); } ); std::set filePathsToProcessForNextIteration; @@ -228,7 +232,7 @@ std::vector IncludeProcessing::doGetUnresolvedIncludeDirective { unresolvedIncludeDirectives.push_back(includeDirective); } - else if (processedFilePaths.find(resolvedIncludePath.str()) == processedFilePaths.end()) + else if (processedFilePaths.find(resolvedIncludePath.wstr()) == processedFilePaths.end()) { for (const FilePath& indexedPath : indexedPaths) { diff --git a/src/lib_cxx/utility/IncludeProcessing.h b/src/lib_cxx/utility/IncludeProcessing.h index c8379005..9bc1dff8 100644 --- a/src/lib_cxx/utility/IncludeProcessing.h +++ b/src/lib_cxx/utility/IncludeProcessing.h @@ -36,7 +36,7 @@ public: private: static std::vector doGetUnresolvedIncludeDirectives( std::set filePathsToProcess, - std::unordered_set& processedFilePaths, + std::unordered_set& processedFilePaths, const std::set& indexedPaths, const std::set& headerSearchDirectories ); diff --git a/src/lib_gui/utility/path_detector/cxx_header/utilityCxxHeaderDetection.cpp b/src/lib_gui/utility/path_detector/cxx_header/utilityCxxHeaderDetection.cpp index 21c7b80b..ad318caf 100644 --- a/src/lib_gui/utility/path_detector/cxx_header/utilityCxxHeaderDetection.cpp +++ b/src/lib_gui/utility/path_detector/cxx_header/utilityCxxHeaderDetection.cpp @@ -14,7 +14,7 @@ namespace utility std::string command = compilerName + " -x c++ -v -E /dev/null"; std::string clangOutput = utility::executeProcess(command.c_str()); std::string standardHeaders = - utility::substrBetween(clangOutput, "#include <...> search starts here:\n","\nEnd of search list"); + utility::substrBetween(clangOutput, "#include <...> search starts here:\n","\nEnd of search list"); std::vector paths; if (!standardHeaders.empty())