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

@@ -70,7 +70,7 @@ void ClangQueryProjectsFindFilter::findAll(const QString &queryText, Core::FindF
auto message = createMessage(queryText);
refactoringClient.setExpectedResultCount(message.fileContainers().size());
refactoringClient.setExpectedResultCount(message.sources().size());
server.requestSourceRangesAndDiagnosticsForQueryMessage(std::move(message));
}
@@ -100,6 +100,12 @@ SearchHandle *ClangQueryProjectsFindFilter::searchHandleForTestOnly() const
return searchHandle.get();
}
void ClangQueryProjectsFindFilter::setUnsavedContent(
std::vector<ClangBackEnd::V2::FileContainer> &&unsavedContent)
{
this->unsavedContent = std::move(unsavedContent);
}
namespace {
Utils::SmallStringVector createCommandLine(CppTools::ProjectPart *projectPart,
@@ -118,13 +124,13 @@ Utils::SmallStringVector createCommandLine(CppTools::ProjectPart *projectPart,
}
std::vector<ClangBackEnd::V2::FileContainer>
createFileContainers(const std::vector<CppTools::ProjectPart::Ptr> &projectParts)
createSources(const std::vector<CppTools::ProjectPart::Ptr> &projectParts)
{
std::vector<ClangBackEnd::V2::FileContainer> fileContainers;
std::vector<ClangBackEnd::V2::FileContainer> sources;
for (const CppTools::ProjectPart::Ptr &projectPart : projectParts) {
for (const CppTools::ProjectFile &projectFile : projectPart->files) {
fileContainers.emplace_back(ClangBackEnd::FilePath(projectFile.path),
sources.emplace_back(ClangBackEnd::FilePath(projectFile.path),
"",
createCommandLine(projectPart.data(),
projectFile.path,
@@ -132,15 +138,17 @@ createFileContainers(const std::vector<CppTools::ProjectPart::Ptr> &projectParts
}
}
return fileContainers;
return sources;
}
}
ClangBackEnd::RequestSourceRangesAndDiagnosticsForQueryMessage ClangQueryProjectsFindFilter::createMessage(const QString &queryText) const
{
return ClangBackEnd::RequestSourceRangesAndDiagnosticsForQueryMessage(
Utils::SmallString(queryText),
createFileContainers(projectParts));
createSources(projectParts),
Utils::clone(unsavedContent));
}

View File

@@ -31,6 +31,8 @@
#include <coreplugin/find/ifindfilter.h>
#include <filecontainerv2.h>
#include <utils/smallstringvector.h>
#include <memory>
@@ -65,11 +67,14 @@ public:
SearchHandle* searchHandleForTestOnly() const;
void setUnsavedContent(std::vector<ClangBackEnd::V2::FileContainer> &&unsavedContent);
private:
ClangBackEnd::RequestSourceRangesAndDiagnosticsForQueryMessage createMessage(
const QString &queryText) const;
private:
std::vector<ClangBackEnd::V2::FileContainer> unsavedContent;
std::unique_ptr<SearchHandle> searchHandle;
std::vector<CppTools::ProjectPart::Ptr> projectParts;
ClangBackEnd::RefactoringServerInterface &server;

View File

@@ -25,11 +25,14 @@
#include "qtcreatorclangqueryfindfilter.h"
#include <cpptools/abstracteditorsupport.h>
#include <cpptools/cppmodelmanager.h>
#include <cpptools/projectinfo.h>
#include <projectexplorer/session.h>
#include <utils/smallstring.h>
namespace ClangRefactoring {
QtCreatorClangQueryFindFilter::QtCreatorClangQueryFindFilter(ClangBackEnd::RefactoringServerInterface &server,
@@ -58,6 +61,26 @@ convertProjectParts(const QList<CppTools::ProjectPart::Ptr> &projectPartList)
return projectPartVector;
}
std::vector<ClangBackEnd::V2::FileContainer> createUnsavedContents()
{
auto abstractEditors = CppTools::CppModelManager::instance()->abstractEditorSupports();
std::vector<ClangBackEnd::V2::FileContainer> unsavedContents;
unsavedContents.reserve(abstractEditors.size());
auto toFileContainer = [] (const CppTools::AbstractEditorSupport *abstractEditor) {
return ClangBackEnd::V2::FileContainer(ClangBackEnd::FilePath(abstractEditor->fileName()),
Utils::SmallString::fromQByteArray(abstractEditor->contents()),
{});
};
std::transform(abstractEditors.begin(),
abstractEditors.end(),
std::back_inserter(unsavedContents),
toFileContainer);
return unsavedContents;
}
}
void QtCreatorClangQueryFindFilter::prepareFind()
@@ -67,6 +90,8 @@ void QtCreatorClangQueryFindFilter::prepareFind()
const CppTools::ProjectInfo projectInfo = CppTools::CppModelManager::instance()->projectInfo(currentProject);
setProjectParts(convertProjectParts(projectInfo.projectParts()));
setUnsavedContent(createUnsavedContents());
}
} // namespace ClangRefactoring