diff --git a/src/libs/clangbackendipc/filepath.h b/src/libs/clangbackendipc/filepath.h index bcfc9662aa8..3a7f8b3c368 100644 --- a/src/libs/clangbackendipc/filepath.h +++ b/src/libs/clangbackendipc/filepath.h @@ -102,8 +102,8 @@ public: friend bool operator==(const FilePath &first, const FilePath &second) { - return first.directory_ == second.directory_ - && first.name_ == second.name_; + return first.name_ == second.name_ + && first.directory_ == second.directory_; } FilePath clone() const diff --git a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp index c5678511aac..012de8cdc03 100644 --- a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp +++ b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp @@ -123,19 +123,43 @@ Utils::SmallStringVector createCommandLine(CppTools::ProjectPart *projectPart, return commandLine; } +bool unsavedContentContains(const ClangBackEnd::FilePath &sourceFilePath, + const std::vector &unsavedContent) +{ + auto compare = [&] (const ClangBackEnd::V2::FileContainer &unsavedEntry) { + return unsavedEntry.filePath() == sourceFilePath; + }; + + auto found = std::find_if(unsavedContent.begin(), unsavedContent.end(), compare); + + return found != unsavedContent.end(); +} + +void appendSource(std::vector &sources, + const CppTools::ProjectPart::Ptr &projectPart, + const CppTools::ProjectFile &projectFile, + const std::vector &unsavedContent) +{ + ClangBackEnd::FilePath sourceFilePath(projectFile.path); + + if (!unsavedContentContains(sourceFilePath, unsavedContent)) { + sources.emplace_back(ClangBackEnd::FilePath(projectFile.path), + "", + createCommandLine(projectPart.data(), + projectFile.path, + projectFile.kind)); + } +} + std::vector -createSources(const std::vector &projectParts) +createSources(const std::vector &projectParts, + const std::vector &unsavedContent) { std::vector sources; for (const CppTools::ProjectPart::Ptr &projectPart : projectParts) { - for (const CppTools::ProjectFile &projectFile : projectPart->files) { - sources.emplace_back(ClangBackEnd::FilePath(projectFile.path), - "", - createCommandLine(projectPart.data(), - projectFile.path, - projectFile.kind)); - } + for (const CppTools::ProjectFile &projectFile : projectPart->files) + appendSource(sources, projectPart, projectFile, unsavedContent); } return sources; @@ -147,7 +171,7 @@ ClangBackEnd::RequestSourceRangesAndDiagnosticsForQueryMessage ClangQueryProject { return ClangBackEnd::RequestSourceRangesAndDiagnosticsForQueryMessage( Utils::SmallString(queryText), - createSources(projectParts), + createSources(projectParts, unsavedContent), Utils::clone(unsavedContent)); } diff --git a/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp b/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp index 55b4fcdde6c..66654e038f6 100644 --- a/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp +++ b/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp @@ -166,6 +166,7 @@ std::vector createProjectParts() auto projectPart2 = CppTools::ProjectPart::Ptr(new CppTools::ProjectPart); projectPart1->files.append({"/path/to/file2.cpp", CppTools::ProjectFile::CXXHeader}); + projectPart1->files.append({"/path/to/unsaved.cpp", CppTools::ProjectFile::CXXSource}); return {projectPart1, projectPart2}; }