diff --git a/src/libs/clangsupport/projectpartcontainerv2.h b/src/libs/clangsupport/projectpartcontainerv2.h index 23be8e251bc..d9d03eb6335 100644 --- a/src/libs/clangsupport/projectpartcontainerv2.h +++ b/src/libs/clangsupport/projectpartcontainerv2.h @@ -40,10 +40,12 @@ public: ProjectPartContainer() = default; ProjectPartContainer(Utils::SmallString &&projectPartId, Utils::SmallStringVector &&arguments, + Utils::SmallStringVector &&defineNames, FilePathIds &&headerPathIds, FilePathIds &&sourcePathIds) : m_projectPartId(std::move(projectPartId)), m_arguments(std::move(arguments)), + m_defineNames(std::move(defineNames)), m_headerPathIds(std::move(headerPathIds)), m_sourcePathIds(std::move(sourcePathIds)) { @@ -64,6 +66,11 @@ public: return std::move(m_arguments); } + const Utils::SmallStringVector &defineNames() const + { + return m_defineNames; + } + const FilePathIds &sourcePathIds() const { return m_sourcePathIds; @@ -78,6 +85,7 @@ public: { out << container.m_projectPartId; out << container.m_arguments; + out << container.m_defineNames; out << container.m_headerPathIds; out << container.m_sourcePathIds; @@ -88,6 +96,7 @@ public: { in >> container.m_projectPartId; in >> container.m_arguments; + in >> container.m_defineNames; in >> container.m_headerPathIds; in >> container.m_sourcePathIds; @@ -98,14 +107,23 @@ public: { return first.m_projectPartId == second.m_projectPartId && first.m_arguments == second.m_arguments + && first.m_defineNames == second.m_defineNames && first.m_headerPathIds == second.m_headerPathIds && first.m_sourcePathIds == second.m_sourcePathIds; } friend bool operator<(const ProjectPartContainer &first, const ProjectPartContainer &second) { - return std::tie(first.m_projectPartId, first.m_arguments, first.m_headerPathIds, first.m_sourcePathIds) - < std::tie(second.m_projectPartId, second.m_arguments, second.m_headerPathIds, second.m_sourcePathIds); + return std::tie(first.m_projectPartId, + first.m_arguments, + first.m_defineNames, + first.m_headerPathIds, + first.m_sourcePathIds) + < std::tie(second.m_projectPartId, + second.m_arguments, + second.m_defineNames, + second.m_headerPathIds, + second.m_sourcePathIds); } ProjectPartContainer clone() const @@ -116,6 +134,7 @@ public: private: Utils::SmallString m_projectPartId; Utils::SmallStringVector m_arguments; + Utils::SmallStringVector m_defineNames; FilePathIds m_headerPathIds; FilePathIds m_sourcePathIds; }; diff --git a/src/plugins/clangpchmanager/projectupdater.cpp b/src/plugins/clangpchmanager/projectupdater.cpp index 205b35e24af..bc0cec98a1b 100644 --- a/src/plugins/clangpchmanager/projectupdater.cpp +++ b/src/plugins/clangpchmanager/projectupdater.cpp @@ -35,6 +35,8 @@ #include #include +#include + #include #include @@ -119,6 +121,14 @@ QStringList ProjectUpdater::compilerArguments(CppTools::ProjectPart *projectPart return builder.build(CppTools::ProjectFile::CXXHeader, CompilerOptionsBuilder::PchUsage::None); } +Utils::SmallStringVector ProjectUpdater::createDefineNames(CppTools::ProjectPart *projectPart) +{ + return Utils::transform(projectPart->projectMacros, + [] (const ProjectExplorer::Macro ¯o) { + return macro.key; + }); +} + ClangBackEnd::V2::ProjectPartContainer ProjectUpdater::toProjectPartContainer( CppTools::ProjectPart *projectPart) const { @@ -129,6 +139,7 @@ ClangBackEnd::V2::ProjectPartContainer ProjectUpdater::toProjectPartContainer( return ClangBackEnd::V2::ProjectPartContainer(projectPart->displayName, Utils::SmallStringVector(arguments), + createDefineNames(projectPart), std::move(headerAndSources.headers), std::move(headerAndSources.sources)); } diff --git a/src/plugins/clangpchmanager/projectupdater.h b/src/plugins/clangpchmanager/projectupdater.h index a86e8d19702..66de2fdb651 100644 --- a/src/plugins/clangpchmanager/projectupdater.h +++ b/src/plugins/clangpchmanager/projectupdater.h @@ -73,6 +73,7 @@ unittest_public: void addToHeaderAndSources(HeaderAndSources &headerAndSources, const CppTools::ProjectFile &projectFile) const; static QStringList compilerArguments(CppTools::ProjectPart *projectPart); + static Utils::SmallStringVector createDefineNames(CppTools::ProjectPart *projectPart); static Utils::PathStringVector createExcludedPaths( const ClangBackEnd::V2::FileContainers &generatedFiles); diff --git a/src/tools/clangrefactoringbackend/source/symbolindexer.h b/src/tools/clangrefactoringbackend/source/symbolindexer.h index f9e2f3fc3c0..14b67060335 100644 --- a/src/tools/clangrefactoringbackend/source/symbolindexer.h +++ b/src/tools/clangrefactoringbackend/source/symbolindexer.h @@ -46,7 +46,7 @@ public: void updateProjectParts(V2::ProjectPartContainers &&projectParts, V2::FileContainers &&generatedFiles); void updateProjectPart(V2::ProjectPartContainer &&projectPart, - const V2::FileContainers &generatedFiles); + const V2::FileContainers &generatedFiles); void pathsWithIdsChanged(const Utils::SmallStringVector &ids) override; void pathsChanged(const FilePathIds &filePathIds) override; diff --git a/tests/unit/unittest/pchcreator-test.cpp b/tests/unit/unittest/pchcreator-test.cpp index a89f649bd27..6fb9afe95d3 100644 --- a/tests/unit/unittest/pchcreator-test.cpp +++ b/tests/unit/unittest/pchcreator-test.cpp @@ -74,10 +74,12 @@ protected: FilePath generatedFilePath = TESTDATA_DIR "/includecollector_generated_file.h"; ProjectPartContainer projectPart1{"project1", {"-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"}, + {"DEFINE"}, {id(header1Path)}, {id(main1Path)}}; ProjectPartContainer projectPart2{"project2", {"-I", TESTDATA_DIR, "-x", "c++-header", "-Wno-pragma-once-outside-header"}, + {"DEFINE"}, {id(header2Path)}, {id(main2Path)}}; TestEnvironment environment; diff --git a/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp b/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp index 87eefb02bb5..7ff62c0d5de 100644 --- a/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp +++ b/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp @@ -94,6 +94,7 @@ TEST_F(PchManagerClientServerInProcess, SendUpdatePchProjectPartsMessage) { ProjectPartContainer projectPart2{"projectPartId", {"-x", "c++-header", "-Wno-pragma-once-outside-header"}, + {"DEFINE"}, {{1, 1}}, {{1, 2}}}; FileContainer fileContainer{{"/path/to/", "file"}, "content", {}}; diff --git a/tests/unit/unittest/pchmanagerserver-test.cpp b/tests/unit/unittest/pchmanagerserver-test.cpp index 07b7f68b878..89f3747af2c 100644 --- a/tests/unit/unittest/pchmanagerserver-test.cpp +++ b/tests/unit/unittest/pchmanagerserver-test.cpp @@ -70,10 +70,12 @@ protected: std::vector idPaths = {{projectPartId1, {{1, 1}, {1, 2}}}}; ProjectPartContainer projectPart1{projectPartId1.clone(), {"-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"}, + {"DEFINE"}, {id(header1Path)}, {id(main1Path)}}; ProjectPartContainer projectPart2{projectPartId2.clone(), {"-x", "c++-header", "-Wno-pragma-once-outside-header"}, + {"DEFINE"}, {id(header2Path)}, {id(main2Path)}}; std::vector projectParts{projectPart1, projectPart2}; diff --git a/tests/unit/unittest/projectparts-test.cpp b/tests/unit/unittest/projectparts-test.cpp index 000c3b41cc0..10944dd419c 100644 --- a/tests/unit/unittest/projectparts-test.cpp +++ b/tests/unit/unittest/projectparts-test.cpp @@ -49,14 +49,17 @@ protected: FilePathId thirdSource{1, 13}; ProjectPartContainer projectPartContainer1{"id", {"-DUNIX", "-O2"}, + {"UNIX"}, {firstHeader, secondHeader}, {firstSource, secondSource}}; ProjectPartContainer updatedProjectPartContainer1{"id", {"-DUNIX", "-O2"}, + {"UNIX"}, {firstHeader, secondHeader}, {firstSource, secondSource, thirdSource}}; ProjectPartContainer projectPartContainer2{"id2", {"-DUNIX", "-O2"}, + {"UNIX"}, {firstHeader, secondHeader}, {firstSource, secondSource}}; }; diff --git a/tests/unit/unittest/projectupdater-test.cpp b/tests/unit/unittest/projectupdater-test.cpp index 1664dc8fa81..9a8d06462ec 100644 --- a/tests/unit/unittest/projectupdater-test.cpp +++ b/tests/unit/unittest/projectupdater-test.cpp @@ -77,12 +77,14 @@ protected: projectPart.files.push_back(source1ProjectFile); projectPart.files.push_back(source2ProjectFile); projectPart.displayName = QString(projectPartId); + projectPart.projectMacros.push_back({"DEFINE"}); Utils::SmallStringVector arguments{ClangPchManager::ProjectUpdater::compilerArguments( &projectPart)}; expectedContainer = {projectPartId.clone(), arguments.clone(), + defineNames.clone(), {filePathId(headerPaths[1])}, {filePathIds(sourcePaths)}}; } @@ -99,6 +101,7 @@ protected: Utils::SmallString projectPartId2{"project2"}; Utils::PathStringVector headerPaths = {"/path/to/header1.h", "/path/to/header2.h"}; Utils::PathStringVector sourcePaths = {"/path/to/source1.cpp", "/path/to/source2.cpp"}; + Utils::SmallStringVector defineNames = {"DEFINE"}; CppTools::ProjectFile header1ProjectFile{QString(headerPaths[0]), CppTools::ProjectFile::CXXHeader}; CppTools::ProjectFile header2ProjectFile{QString(headerPaths[1]), CppTools::ProjectFile::CXXHeader}; CppTools::ProjectFile source1ProjectFile{QString(sourcePaths[0]), CppTools::ProjectFile::CXXSource}; diff --git a/tests/unit/unittest/refactoringclientserverinprocess-test.cpp b/tests/unit/unittest/refactoringclientserverinprocess-test.cpp index 65b6b4be634..ff0654c0bf7 100644 --- a/tests/unit/unittest/refactoringclientserverinprocess-test.cpp +++ b/tests/unit/unittest/refactoringclientserverinprocess-test.cpp @@ -178,6 +178,7 @@ TEST_F(RefactoringClientServerInProcess, SendUpdatePchProjectPartsMessage) { ProjectPartContainer projectPart2{"projectPartId", {"-x", "c++-header", "-Wno-pragma-once-outside-header"}, + {"DEFINE"}, {{1, 1}}, {{1, 2}}}; FileContainer fileContainer{{"/path/to/", "file"}, "content", {}}; diff --git a/tests/unit/unittest/refactoringserver-test.cpp b/tests/unit/unittest/refactoringserver-test.cpp index 089f027bbd9..dc6b1d81220 100644 --- a/tests/unit/unittest/refactoringserver-test.cpp +++ b/tests/unit/unittest/refactoringserver-test.cpp @@ -301,6 +301,7 @@ TEST_F(RefactoringServer, UpdatePchProjectPartsCallsSymbolIndexingUpdateProjectP { ProjectPartContainers projectParts{{{"projectPartId", {"-I", TESTDATA_DIR}, + {"DEFINE"}, {filePathId("header1.h")}, {filePathId("main.cpp")}}}}; FileContainers unsaved{{{TESTDATA_DIR, "query_simplefunction.h"}, diff --git a/tests/unit/unittest/symbolindexer-test.cpp b/tests/unit/unittest/symbolindexer-test.cpp index a58bf0f4704..61df6e6ecab 100644 --- a/tests/unit/unittest/symbolindexer-test.cpp +++ b/tests/unit/unittest/symbolindexer-test.cpp @@ -76,10 +76,12 @@ protected: ClangBackEnd::FilePathId generatedFilePathId{1, 21}; ProjectPartContainer projectPart1{"project1", {"-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"}, + {"DEFINE"}, {header1PathId}, {main1PathId}}; ProjectPartContainer projectPart2{"project2", {"-I", TESTDATA_DIR, "-x", "c++-header", "-Wno-pragma-once-outside-header"}, + {"DEFINE"}, {header2PathId}, {main2PathId}}; FileContainers unsaved{{{TESTDATA_DIR, "query_simplefunction.h"}, diff --git a/tests/unit/unittest/symbolindexing-test.cpp b/tests/unit/unittest/symbolindexing-test.cpp index 462e8542f7c..131f8547652 100644 --- a/tests/unit/unittest/symbolindexing-test.cpp +++ b/tests/unit/unittest/symbolindexing-test.cpp @@ -87,6 +87,7 @@ protected: PathString main1Path = TESTDATA_DIR "/symbolindexing_main1.cpp"; ProjectPartContainer projectPart1{"project1", {"cc", "-I", TESTDATA_DIR, "-std=c++1z"}, + {"DEFINE"}, {}, {filePathId(main1Path)}}; };