diff --git a/src/libs/clangsupport/refactoringdatabaseinitializer.h b/src/libs/clangsupport/refactoringdatabaseinitializer.h index 8ba3b435025..a59ac5358db 100644 --- a/src/libs/clangsupport/refactoringdatabaseinitializer.h +++ b/src/libs/clangsupport/refactoringdatabaseinitializer.h @@ -113,6 +113,7 @@ public: table.addColumn("projectPartId", Sqlite::ColumnType::Integer, Sqlite::Contraint::PrimaryKey); const Sqlite::Column &projectPartNameColumn = table.addColumn("projectPartName", Sqlite::ColumnType::Text); table.addColumn("compilerArguments", Sqlite::ColumnType::Text); + table.addColumn("macroNames", Sqlite::ColumnType::Text); table.addIndex({projectPartNameColumn}); table.initialize(database); diff --git a/src/tools/clangrefactoringbackend/source/storagesqlitestatementfactory.h b/src/tools/clangrefactoringbackend/source/storagesqlitestatementfactory.h index ec34a436353..fc31ec84a72 100644 --- a/src/tools/clangrefactoringbackend/source/storagesqlitestatementfactory.h +++ b/src/tools/clangrefactoringbackend/source/storagesqlitestatementfactory.h @@ -143,11 +143,11 @@ public: database }; WriteStatement insertProjectPartStatement{ - "INSERT OR IGNORE INTO projectParts(projectPartName, compilerArguments) VALUES (?,?)", + "INSERT OR IGNORE INTO projectParts(projectPartName, compilerArguments, macroNames) VALUES (?,?,?)", database }; WriteStatement updateProjectPartStatement{ - "UPDATE projectParts SET compilerArguments = ? WHERE projectPartName = ?", + "UPDATE projectParts SET compilerArguments = ?, macroNames = ? WHERE projectPartName = ?", database }; ReadStatement getProjectPartIdStatement{ diff --git a/src/tools/clangrefactoringbackend/source/symbolindexer.cpp b/src/tools/clangrefactoringbackend/source/symbolindexer.cpp index 1c177c5101e..acc2d4fe00b 100644 --- a/src/tools/clangrefactoringbackend/source/symbolindexer.cpp +++ b/src/tools/clangrefactoringbackend/source/symbolindexer.cpp @@ -64,7 +64,8 @@ void SymbolIndexer::updateProjectPart(V2::ProjectPartContainer &&projectPart, m_symbolsCollector.sourceLocations()); m_symbolStorage.insertOrUpdateProjectPart(projectPart.projectPartId(), - projectPart.arguments()); + projectPart.arguments(), + projectPart.macroNames()); m_symbolStorage.updateProjectPartSources(projectPart.projectPartId(), m_symbolsCollector.sourceFiles()); diff --git a/src/tools/clangrefactoringbackend/source/symbolstorage.h b/src/tools/clangrefactoringbackend/source/symbolstorage.h index 19f3637bce3..ed54e5c5f1e 100644 --- a/src/tools/clangrefactoringbackend/source/symbolstorage.h +++ b/src/tools/clangrefactoringbackend/source/symbolstorage.h @@ -66,18 +66,20 @@ public: } void insertOrUpdateProjectPart(Utils::SmallStringView projectPartName, - const Utils::SmallStringVector &commandLineArguments) override + const Utils::SmallStringVector &commandLineArguments, + const Utils::SmallStringVector ¯oNames) override { m_statementFactory.database.setLastInsertedRowId(-1); Utils::SmallString compilerArguementsAsJson = toJson(commandLineArguments); + Utils::SmallString macroNamesAsJson = toJson(macroNames); WriteStatement &insertStatement = m_statementFactory.insertProjectPartStatement; - insertStatement.write(projectPartName, compilerArguementsAsJson); + insertStatement.write(projectPartName, compilerArguementsAsJson, macroNamesAsJson); if (m_statementFactory.database.lastInsertedRowId() == -1) { WriteStatement &updateStatement = m_statementFactory.updateProjectPartStatement; - updateStatement.write(compilerArguementsAsJson, projectPartName); + updateStatement.write(compilerArguementsAsJson, macroNamesAsJson, projectPartName); } } diff --git a/src/tools/clangrefactoringbackend/source/symbolstorageinterface.h b/src/tools/clangrefactoringbackend/source/symbolstorageinterface.h index 38a76029fa7..870290d6ece 100644 --- a/src/tools/clangrefactoringbackend/source/symbolstorageinterface.h +++ b/src/tools/clangrefactoringbackend/source/symbolstorageinterface.h @@ -45,7 +45,8 @@ public: virtual void addSymbolsAndSourceLocations(const SymbolEntries &symbolEntries, const SourceLocationEntries &sourceLocations) = 0; virtual void insertOrUpdateProjectPart(Utils::SmallStringView projectPartName, - const Utils::SmallStringVector &commandLineArguments) = 0; + const Utils::SmallStringVector &commandLineArguments, + const Utils::SmallStringVector ¯oNames) = 0; virtual void updateProjectPartSources(Utils::SmallStringView projectPartName, const FilePathIds &sourceFilePathIds) = 0; virtual void insertOrUpdateUsedMacros(const UsedMacros &usedMacros) = 0; diff --git a/tests/unit/unittest/mocksqlitewritestatement.h b/tests/unit/unittest/mocksqlitewritestatement.h index 6a6b6d35af5..b7802ee237d 100644 --- a/tests/unit/unittest/mocksqlitewritestatement.h +++ b/tests/unit/unittest/mocksqlitewritestatement.h @@ -58,6 +58,9 @@ public: MOCK_METHOD2(write, void (Utils::SmallStringView, Utils::SmallStringView)); + MOCK_METHOD3(write, + void (Utils::SmallStringView, Utils::SmallStringView, Utils::SmallStringView)); + MOCK_METHOD1(write, void (Utils::SmallStringView)); diff --git a/tests/unit/unittest/mocksymbolstorage.h b/tests/unit/unittest/mocksymbolstorage.h index 8f2d865f203..4cb7bb918d6 100644 --- a/tests/unit/unittest/mocksymbolstorage.h +++ b/tests/unit/unittest/mocksymbolstorage.h @@ -37,9 +37,10 @@ public: MOCK_METHOD2(addSymbolsAndSourceLocations, void(const ClangBackEnd::SymbolEntries &symbolEentries, const ClangBackEnd::SourceLocationEntries &sourceLocations)); - MOCK_METHOD2(insertOrUpdateProjectPart, + MOCK_METHOD3(insertOrUpdateProjectPart, void(Utils::SmallStringView projectPartName, - const Utils::SmallStringVector &commandLineArgument)); + const Utils::SmallStringVector &commandLineArgument, + const Utils::SmallStringVector ¯oNames)); MOCK_METHOD2(updateProjectPartSources, void(Utils::SmallStringView projectPartName, const ClangBackEnd::FilePathIds &sourceFilePathIds)); diff --git a/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp b/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp index 6e83a23d4e1..589fc96b1db 100644 --- a/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp +++ b/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp @@ -86,7 +86,7 @@ TEST_F(RefactoringDatabaseInitializer, AddProjectPartsTable) { InSequence s; - EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS projectParts(projectPartId INTEGER PRIMARY KEY, projectPartName TEXT, compilerArguments TEXT)"))); + EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS projectParts(projectPartId INTEGER PRIMARY KEY, projectPartName TEXT, compilerArguments TEXT, macroNames TEXT)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectParts_projectPartName ON projectParts(projectPartName)"))); initializer.createProjectPartsTable(); @@ -127,7 +127,7 @@ TEST_F(RefactoringDatabaseInitializer, CreateInTheContructor) EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_sources_directoryId_sourceName ON sources(directoryId, sourceName)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS directories(directoryId INTEGER PRIMARY KEY, directoryPath TEXT)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_directories_directoryPath ON directories(directoryPath)"))); - EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS projectParts(projectPartId INTEGER PRIMARY KEY, projectPartName TEXT, compilerArguments TEXT)"))); + EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS projectParts(projectPartId INTEGER PRIMARY KEY, projectPartName TEXT, compilerArguments TEXT, macroNames TEXT)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectParts_projectPartName ON projectParts(projectPartName)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsSources(projectPartId INTEGER, sourceId INTEGER)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsSources_sourceId_projectPartId ON projectPartsSources(sourceId, projectPartId)"))); diff --git a/tests/unit/unittest/storagesqlitestatementfactory-test.cpp b/tests/unit/unittest/storagesqlitestatementfactory-test.cpp index 236291f9912..d0b832e00d6 100644 --- a/tests/unit/unittest/storagesqlitestatementfactory-test.cpp +++ b/tests/unit/unittest/storagesqlitestatementfactory-test.cpp @@ -157,13 +157,13 @@ TEST_F(StorageSqliteStatementFactory, DeleteNewLocationsTableStatement) TEST_F(StorageSqliteStatementFactory, InsertProjectPart) { ASSERT_THAT(factory.insertProjectPartStatement.sqlStatement, - Eq("INSERT OR IGNORE INTO projectParts(projectPartName, compilerArguments) VALUES (?,?)")); + Eq("INSERT OR IGNORE INTO projectParts(projectPartName, compilerArguments, macroNames) VALUES (?,?,?)")); } TEST_F(StorageSqliteStatementFactory, UpdateProjectPart) { ASSERT_THAT(factory.updateProjectPartStatement.sqlStatement, - Eq("UPDATE projectParts SET compilerArguments = ? WHERE projectPartName = ?")); + Eq("UPDATE projectParts SET compilerArguments = ?, macroNames = ? WHERE projectPartName = ?")); } TEST_F(StorageSqliteStatementFactory, GetProjectPartIdForProjectPartName) diff --git a/tests/unit/unittest/symbolindexer-test.cpp b/tests/unit/unittest/symbolindexer-test.cpp index 119ce862541..9e224d3497e 100644 --- a/tests/unit/unittest/symbolindexer-test.cpp +++ b/tests/unit/unittest/symbolindexer-test.cpp @@ -167,8 +167,12 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsAddSymbolsAndSourceLocationsInStora TEST_F(SymbolIndexer, UpdateProjectPartsCallsUpdateProjectPartsInStorage) { - EXPECT_CALL(mockStorage, insertOrUpdateProjectPart(Eq("project1"), ElementsAre("-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"))); - EXPECT_CALL(mockStorage, insertOrUpdateProjectPart(Eq("project2"), ElementsAre("-I", TESTDATA_DIR, "-x", "c++-header", "-Wno-pragma-once-outside-header"))); + EXPECT_CALL(mockStorage, insertOrUpdateProjectPart(Eq("project1"), + ElementsAre("-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"), + ElementsAre("DEFINE"))); + EXPECT_CALL(mockStorage, insertOrUpdateProjectPart(Eq("project2"), + ElementsAre("-I", TESTDATA_DIR, "-x", "c++-header", "-Wno-pragma-once-outside-header"), + ElementsAre("DEFINE"))); indexer.updateProjectParts({projectPart1, projectPart2}, Utils::clone(unsaved)); } @@ -199,7 +203,7 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsInOrder) EXPECT_CALL(mockCollector, collectSymbols()); EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin()); EXPECT_CALL(mockStorage, addSymbolsAndSourceLocations(symbolEntries, sourceLocations)); - EXPECT_CALL(mockStorage, insertOrUpdateProjectPart(_, _)); + EXPECT_CALL(mockStorage, insertOrUpdateProjectPart(_, _, _)); EXPECT_CALL(mockStorage, updateProjectPartSources(_, _)); EXPECT_CALL(mockStorage, insertOrUpdateUsedMacros(Eq(usedMacros))); EXPECT_CALL(mockSqliteTransactionBackend, commit()); diff --git a/tests/unit/unittest/symbolstorage-test.cpp b/tests/unit/unittest/symbolstorage-test.cpp index 21d5ae01485..87a3b211f14 100644 --- a/tests/unit/unittest/symbolstorage-test.cpp +++ b/tests/unit/unittest/symbolstorage-test.cpp @@ -148,7 +148,7 @@ TEST_F(SymbolStorage, AddSymbolsAndSourceLocationsCallsWrite) { InSequence sequence; - EXPECT_CALL(insertSymbolsToNewSymbolsStatement, write(_, _, _)).Times(2); + EXPECT_CALL(insertSymbolsToNewSymbolsStatement, write(An(), _, _)).Times(2); EXPECT_CALL(insertLocationsToNewLocationsStatement, write(1, 42, 23, 3)); EXPECT_CALL(insertLocationsToNewLocationsStatement, write(2, 7, 11, 4)); EXPECT_CALL(addNewSymbolsToSymbolsStatement, execute()); @@ -177,10 +177,13 @@ TEST_F(SymbolStorage, InsertProjectPart) ON_CALL(mockDatabase, lastInsertedRowId()).WillByDefault(Return(1)); EXPECT_CALL(mockDatabase, setLastInsertedRowId(-1)); - EXPECT_CALL(insertProjectPartStatement, write(TypedEq("project"), TypedEq("[\"foo\"]"))); + EXPECT_CALL(insertProjectPartStatement, + write(TypedEq("project"), + TypedEq("[\"foo\"]"), + TypedEq("[\"FOO\"]"))); EXPECT_CALL(mockDatabase, lastInsertedRowId()); - storage.insertOrUpdateProjectPart("project", {"foo"}); + storage.insertOrUpdateProjectPart("project", {"foo"}, {"FOO"}); } TEST_F(SymbolStorage, UpdateProjectPart) @@ -189,11 +192,17 @@ TEST_F(SymbolStorage, UpdateProjectPart) ON_CALL(mockDatabase, lastInsertedRowId()).WillByDefault(Return(-1)); EXPECT_CALL(mockDatabase, setLastInsertedRowId(-1)); - EXPECT_CALL(insertProjectPartStatement, write(TypedEq("project"), TypedEq("[\"foo\"]"))); + EXPECT_CALL(insertProjectPartStatement, + write(TypedEq("project"), + TypedEq("[\"foo\"]"), + TypedEq("[\"FOO\"]"))); EXPECT_CALL(mockDatabase, lastInsertedRowId()); - EXPECT_CALL(updateProjectPartStatement, write(TypedEq("[\"foo\"]"), TypedEq("project"))); + EXPECT_CALL(updateProjectPartStatement, + write(TypedEq("[\"foo\"]"), + TypedEq("[\"FOO\"]"), + TypedEq("project"))); - storage.insertOrUpdateProjectPart("project", {"foo"}); + storage.insertOrUpdateProjectPart("project", {"foo"}, {"FOO"}); } TEST_F(SymbolStorage, UpdateProjectPartSources)