Clang: Add refactoring support for unsaved content

We need the generated UI header but we don't have a build directory. So we
provide clang with in memory represations of the file.

Change-Id: Ie9db97bbea2222b0203a0457baa1f1fc7ad97213
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2016-11-30 15:29:36 +01:00
parent 636eea99f4
commit 15de02ea0c
13 changed files with 227 additions and 56 deletions

View File

@@ -31,7 +31,8 @@ namespace {
// use std::filesystem::path if it is supported by all compilers
std::string toNativePath(std::string &&path)
template <typename String>
String toNativePath(String &&path)
{
#ifdef _WIN32
std::replace(path.begin(), path.end(), '/', '\\');
@@ -75,15 +76,52 @@ void ClangTool::addFiles(const Utils::SmallStringVector &filePaths,
}
}
namespace {
Utils::SmallString toNativeFilePath(const FilePath &filePath)
{
Utils::SmallString filePathString = filePath.directory().clone();
filePathString.append("/");
filePathString.append(filePath.name());
return toNativePath(std::move(filePathString));
}
}
void ClangTool::addUnsavedFiles(std::vector<V2::FileContainer> &&unsavedFiles)
{
unsavedFileContents.reserve(unsavedFileContents.size() + unsavedFiles.size());
auto convertToUnsavedFileContent = [] (V2::FileContainer &unsavedFile) {
return UnsavedFileContent{toNativeFilePath(unsavedFile.filePath()),
unsavedFile.takeUnsavedFileContent()};
};
std::transform(unsavedFiles.begin(),
unsavedFiles.end(),
std::back_inserter(unsavedFileContents),
convertToUnsavedFileContent);
}
namespace {
llvm::StringRef toStringRef(const Utils::SmallString &string)
{
return llvm::StringRef(string.data(), string.size());
}
}
clang::tooling::ClangTool ClangTool::createTool() const
{
clang::tooling::ClangTool tool(compilationDatabase, sourceFilePaths);
for (auto &&fileContent : fileContents) {
for (const auto &fileContent : fileContents) {
if (!fileContent.content.empty())
tool.mapVirtualFile(fileContent.filePath, fileContent.content);
}
for (const auto &unsavedFileContent : unsavedFileContents)
tool.mapVirtualFile(toStringRef(unsavedFileContent.filePath),
toStringRef(unsavedFileContent.content));
return tool;
}