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:
+4
-2
@@ -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}
|
||||
|
||||
@@ -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 "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user