logic: switched to wstring in include processing

* this allows for non-ascii characters in detected include paths and in processed include directives.
This commit is contained in:
mlangkabel
2018-02-23 18:20:55 +01:00
parent 90efb11775
commit 0df32f239e
6 changed files with 40 additions and 30 deletions
+4 -2
View File
@@ -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}
-12
View File
@@ -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 "";
}
}
+17 -1
View File
@@ -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 <typename StringType>
StringType substrBetween(const StringType& str, const StringType& delimiter1, const StringType& delimiter2);
template <typename StringType>
bool isPrefix(const StringType& prefix, const StringType& text);
@@ -157,6 +158,21 @@ namespace utility
return ss.str();
}
template <typename StringType>
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 <typename StringType>
bool isPrefix(const StringType& prefix, const StringType& text)
{
+17 -13
View File
@@ -3,10 +3,12 @@
#include <set>
#include <unordered_set>
#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<IncludeDirective> IncludeProcessing::getUnresolvedIncludeDirectives(
const size_t desiredQuantileCount, std::function<void(float)> progress
)
{
std::unordered_set<std::string> processedFilePaths;
std::unordered_set<std::wstring> processedFilePaths;
std::set<IncludeDirective, IncludeDirectiveComparator> unresolvedIncludeDirectives;
std::vector<std::vector<FilePath>> quantiles = splitToQuantiles(sourceFilePaths, desiredQuantileCount);
@@ -96,7 +98,7 @@ std::set<FilePath> IncludeProcessing::getHeaderSearchDirectories(
}
std::set<FilePath> headerSearchDirectories;
std::unordered_set<std::string> processedFilePaths;
std::unordered_set<std::wstring> processedFilePaths;
std::vector<std::vector<FilePath>> quantiles = splitToQuantiles(sourceFilePaths, desiredQuantileCount);
for (size_t i = 0; i < quantiles.size(); i++)
@@ -110,7 +112,7 @@ std::set<FilePath> 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<FilePath> unprocessedFilePathsForNextIteration;
@@ -141,7 +143,7 @@ std::set<FilePath> 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<IncludeDirective> IncludeProcessing::getIncludeDirectives(std::share
{
std::vector<IncludeDirective> includeDirectives;
TextCodec codec(ApplicationSettings::getInstance()->getTextEncoding());
const std::vector<std::string> lines = textAccess->getAllLines();
for (size_t i = 0; i < lines.size(); i++)
{
const std::string lineTrimmedToHash = utility::trim(lines[i]);
if (utility::isPrefix<std::string>("#", lineTrimmedToHash))
const std::wstring line = codec.decode(lines[i]);
const std::wstring lineTrimmedToHash = utility::trim(line);
if (utility::isPrefix<std::wstring>(L"#", lineTrimmedToHash))
{
const std::string lineTrimmedToInclude = utility::trim(lineTrimmedToHash.substr(1));
if (utility::isPrefix<std::string>("include", lineTrimmedToInclude))
const std::wstring lineTrimmedToInclude = utility::trim(lineTrimmedToHash.substr(1));
if (utility::isPrefix<std::wstring>(L"include", lineTrimmedToInclude))
{
std::string includeString = utility::substrBetween(lineTrimmedToInclude, "<", ">");
std::wstring includeString = utility::substrBetween<std::wstring>(lineTrimmedToInclude, L"<", L">");
bool usesBrackets = true;
if (includeString.empty())
{
includeString = utility::substrBetween(lineTrimmedToInclude, "\"", "\"");
includeString = utility::substrBetween<std::wstring>(lineTrimmedToInclude, L"\"", L"\"");
usesBrackets = false;
}
@@ -202,7 +206,7 @@ std::vector<IncludeDirective> IncludeProcessing::getIncludeDirectives(std::share
std::vector<IncludeDirective> IncludeProcessing::doGetUnresolvedIncludeDirectives(
std::set<FilePath> filePathsToProcess,
std::unordered_set<std::string>& processedFilePaths,
std::unordered_set<std::wstring>& processedFilePaths,
const std::set<FilePath>& indexedPaths,
const std::set<FilePath>& headerSearchDirectories
)
@@ -214,7 +218,7 @@ std::vector<IncludeDirective> 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<FilePath> filePathsToProcessForNextIteration;
@@ -228,7 +232,7 @@ std::vector<IncludeDirective> 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)
{
+1 -1
View File
@@ -36,7 +36,7 @@ public:
private:
static std::vector<IncludeDirective> doGetUnresolvedIncludeDirectives(
std::set<FilePath> filePathsToProcess,
std::unordered_set<std::string>& processedFilePaths,
std::unordered_set<std::wstring>& processedFilePaths,
const std::set<FilePath>& indexedPaths,
const std::set<FilePath>& headerSearchDirectories
);
@@ -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<std::string>(clangOutput, "#include <...> search starts here:\n","\nEnd of search list");
std::vector<std::string> paths;
if (!standardHeaders.empty())