diff options
author | Marco Bubke <marco.bubke@qt.io> | 2016-11-30 15:29:36 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2016-12-07 11:39:11 +0000 |
commit | 15de02ea0c92948e1c51b5da11541c2d382b79ca (patch) | |
tree | d2e9b0c10aea7f06ed0d31a1402f0b93f979dd6b /src/tools/clangrefactoringbackend/source/refactoringserver.cpp | |
parent | 636eea99f498bdb6542610a160ce4e8fa9be0cfe (diff) | |
download | qt-creator-15de02ea0c92948e1c51b5da11541c2d382b79ca.tar.gz |
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>
Diffstat (limited to 'src/tools/clangrefactoringbackend/source/refactoringserver.cpp')
-rw-r--r-- | src/tools/clangrefactoringbackend/source/refactoringserver.cpp | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/tools/clangrefactoringbackend/source/refactoringserver.cpp b/src/tools/clangrefactoringbackend/source/refactoringserver.cpp index debc827968..f4e5372e9a 100644 --- a/src/tools/clangrefactoringbackend/source/refactoringserver.cpp +++ b/src/tools/clangrefactoringbackend/source/refactoringserver.cpp @@ -72,7 +72,9 @@ void RefactoringServer::requestSourceLocationsForRenamingMessage(RequestSourceLo void RefactoringServer::requestSourceRangesAndDiagnosticsForQueryMessage( RequestSourceRangesAndDiagnosticsForQueryMessage &&message) { - gatherSourceRangesAndDiagnosticsForQueryMessage(message.takeFileContainers(), message.takeQuery()); + gatherSourceRangesAndDiagnosticsForQueryMessage(message.takeSources(), + message.takeUnsavedContent(), + message.takeQuery()); } void RefactoringServer::cancel() @@ -93,16 +95,19 @@ void RefactoringServer::supersedePollEventLoop(std::function<void ()> &&pollEven namespace { SourceRangesAndDiagnosticsForQueryMessage createSourceRangesAndDiagnosticsForQueryMessage( - V2::FileContainer &&fileContainer, + V2::FileContainer &&source, + std::vector<V2::FileContainer> &&unsaved, Utils::SmallString &&query, const std::atomic_bool &cancelWork) { ClangQuery clangQuery(std::move(query)); if (!cancelWork) { - clangQuery.addFile(fileContainer.filePath().directory(), - fileContainer.filePath().name(), - fileContainer.takeUnsavedFileContent(), - fileContainer.takeCommandLineArguments()); + clangQuery.addFile(source.filePath().directory(), + source.filePath().name(), + source.takeUnsavedFileContent(), + source.takeCommandLineArguments()); + + clangQuery.addUnsavedFiles(std::move(unsaved)); clangQuery.findLocations(); } @@ -114,27 +119,30 @@ SourceRangesAndDiagnosticsForQueryMessage createSourceRangesAndDiagnosticsForQue } void RefactoringServer::gatherSourceRangesAndDiagnosticsForQueryMessage( - std::vector<V2::FileContainer> &&fileContainers, + std::vector<V2::FileContainer> &&sources, + std::vector<V2::FileContainer> &&unsaved, Utils::SmallString &&query) { std::vector<Future> futures; std::size_t freeProcessors = std::thread::hardware_concurrency(); - while (!fileContainers.empty() || !futures.empty()) { + while (!sources.empty() || !futures.empty()) { --freeProcessors; - if (!fileContainers.empty()) { + if (!sources.empty()) { Future &&future = std::async(std::launch::async, createSourceRangesAndDiagnosticsForQueryMessage, - std::move(fileContainers.back()), - query.clone(), std::ref(cancelWork)); - fileContainers.pop_back(); + std::move(sources.back()), + Utils::clone(unsaved), + query.clone(), + std::ref(cancelWork)); + sources.pop_back(); futures.emplace_back(std::move(future)); } - if (freeProcessors == 0 || fileContainers.empty()) + if (freeProcessors == 0 || sources.empty()) freeProcessors += waitForNewSourceRangesAndDiagnosticsForQueryMessage(futures); } } |