forked from qt-creator/qt-creator
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:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user