From ee85cf4518ef67f25adcbdaf62d54cc93e614648 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 5 Apr 2018 10:58:33 +0200 Subject: [PATCH] Clang: Store the symbol kind in the database It is cleaning up some other stuff too. Change-Id: I75274356fd35f2ee8c84aedf8839c67506ab2355 Reviewed-by: Ivan Donchevskii --- src/libs/clangsupport/clangsupport_global.h | 21 +++++++++++++ .../refactoringdatabaseinitializer.h | 2 ++ .../pchmanagerconnectionclient.cpp | 7 ++++- .../clangrefactoring/clangrefactoring.pro | 3 +- src/plugins/clangrefactoring/symbolquery.cpp | 30 ------------------- .../clangpchmanagerbackendmain.cpp | 13 ++++++-- .../source/clangrefactoringbackend-source.pri | 1 - .../source/storagesqlitestatementfactory.h | 7 +++-- .../source/symbolentry.h | 23 ++------------ .../source/symbolstorage.cpp | 30 ------------------- .../source/symbolstorage.h | 3 +- .../unit/unittest/mocksqlitewritestatement.h | 4 +-- .../refactoringdatabaseinitializer-test.cpp | 6 ++-- .../storagesqlitestatementfactory-test.cpp | 8 ++--- tests/unit/unittest/symbolquery-test.cpp | 2 +- tests/unit/unittest/symbolstorage-test.cpp | 2 +- 16 files changed, 60 insertions(+), 102 deletions(-) delete mode 100644 src/plugins/clangrefactoring/symbolquery.cpp delete mode 100644 src/tools/clangrefactoringbackend/source/symbolstorage.cpp diff --git a/src/libs/clangsupport/clangsupport_global.h b/src/libs/clangsupport/clangsupport_global.h index 202ca45b93f..d675d5fb11c 100644 --- a/src/libs/clangsupport/clangsupport_global.h +++ b/src/libs/clangsupport/clangsupport_global.h @@ -198,4 +198,25 @@ struct HighlightingTypes { MixinHighlightingTypes mixinHighlightingTypes; }; +enum class SymbolKind : uchar +{ + None = 0, + Enumeration, + Record, + Function, + Variable, + Macro +}; + +enum class SymbolTag : uchar +{ + None = 0, + Class, + Struct, + Union, + MsvcInterface +}; + +using SymbolTags = Utils::SizedArray; + } diff --git a/src/libs/clangsupport/refactoringdatabaseinitializer.h b/src/libs/clangsupport/refactoringdatabaseinitializer.h index 99e4afde8a4..1123c7c930d 100644 --- a/src/libs/clangsupport/refactoringdatabaseinitializer.h +++ b/src/libs/clangsupport/refactoringdatabaseinitializer.h @@ -63,7 +63,9 @@ public: table.addColumn("symbolId", Sqlite::ColumnType::Integer, Sqlite::Contraint::PrimaryKey); const Sqlite::Column &usrColumn = table.addColumn("usr", Sqlite::ColumnType::Text); table.addColumn("symbolName", Sqlite::ColumnType::Text); + const Sqlite::Column &symbolKindColumn = table.addColumn("symbolKind", Sqlite::ColumnType::Integer); table.addIndex({usrColumn}); + table.addIndex({symbolKindColumn}); table.initialize(database); } diff --git a/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp b/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp index 8528583201f..812445610e6 100644 --- a/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp +++ b/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp @@ -50,8 +50,13 @@ ClangPchManager::PchManagerConnectionClient::PchManagerConnectionClient( m_serverProxy(client, ioDevice()) { m_processCreator.setTemporaryDirectoryPattern("clangpchmanagerbackend-XXXXXX"); + + QDir pchsDirectory(Core::ICore::userResourcePath()); + pchsDirectory.mkdir("pchs"); + pchsDirectory.cd("pchs"); m_processCreator.setArguments({connectionName(), - Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}); + Core::ICore::userResourcePath() + "/symbol-experimental-v1.db", + pchsDirectory.absolutePath()}); stdErrPrefixer().setPrefix("PchManagerConnectionClient.stderr: "); stdOutPrefixer().setPrefix("PchManagerConnectionClient.stdout: "); diff --git a/src/plugins/clangrefactoring/clangrefactoring.pro b/src/plugins/clangrefactoring/clangrefactoring.pro index d72450fcb41..cad6bac9792 100644 --- a/src/plugins/clangrefactoring/clangrefactoring.pro +++ b/src/plugins/clangrefactoring/clangrefactoring.pro @@ -41,8 +41,7 @@ SOURCES += \ qtcreatorsearch.cpp \ qtcreatorsearchhandle.cpp \ qtcreatorsymbolsfindfilter.cpp \ - symbolsfindfilterconfigwidget.cpp \ - symbolquery.cpp + symbolsfindfilterconfigwidget.cpp FORMS += \ clangqueryprojectsfindfilter.ui diff --git a/src/plugins/clangrefactoring/symbolquery.cpp b/src/plugins/clangrefactoring/symbolquery.cpp deleted file mode 100644 index a5f946266f6..00000000000 --- a/src/plugins/clangrefactoring/symbolquery.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "symbolquery.h" - -namespace ClangRefactoring { - -} // namespace ClangRefactoring diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp index 27acd5b398f..81345dc1848 100644 --- a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp +++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp @@ -77,9 +77,14 @@ public: class ApplicationEnvironment : public ClangBackEnd::Environment { public: + ApplicationEnvironment(const QString &pchsPath) + : m_pchBuildDirectoryPath(pchsPath) + { + } + QString pchBuildDirectory() const override { - return temporaryDirectory.path(); + return m_pchBuildDirectoryPath; } QString clangCompilerPath() const override @@ -93,7 +98,7 @@ public: } private: - QTemporaryDir temporaryDirectory; + QString m_pchBuildDirectoryPath; }; QStringList processArguments(QCoreApplication &application) @@ -104,6 +109,7 @@ QStringList processArguments(QCoreApplication &application) parser.addVersionOption(); parser.addPositionalArgument(QStringLiteral("connection"), QStringLiteral("Connection")); parser.addPositionalArgument(QStringLiteral("databasepath"), QStringLiteral("Database path")); + parser.addPositionalArgument(QStringLiteral("pchspath"), QStringLiteral("PCHs path")); parser.process(application); @@ -128,12 +134,13 @@ int main(int argc, char *argv[]) const QStringList arguments = processArguments(application); const QString connectionName = arguments[0]; const QString databasePath = arguments[1]; + const QString pchsPath = arguments[2]; Sqlite::Database database{Utils::PathString{databasePath}, 100000ms}; ClangBackEnd::RefactoringDatabaseInitializer databaseInitializer{database}; ClangBackEnd::FilePathCaching filePathCache{database}; ClangPathWatcher includeWatcher(filePathCache); - ApplicationEnvironment environment; + ApplicationEnvironment environment{pchsPath}; PchGenerator pchGenerator(environment); PchCreator pchCreator(environment, filePathCache); pchCreator.setGenerator(&pchGenerator); diff --git a/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri b/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri index b5a8893d2d3..2a78fc0e113 100644 --- a/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri +++ b/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri @@ -39,7 +39,6 @@ SOURCES += \ $$PWD/collectmacrossourcefilecallbacks.cpp \ $$PWD/symbolscollector.cpp \ $$PWD/clangquerygatherer.cpp \ - $$PWD/symbolstorage.cpp \ $$PWD/symbolindexing.cpp \ $$PWD/indexdataconsumer.cpp diff --git a/src/tools/clangrefactoringbackend/source/storagesqlitestatementfactory.h b/src/tools/clangrefactoringbackend/source/storagesqlitestatementfactory.h index 56548f0b315..7cd05ee27bc 100644 --- a/src/tools/clangrefactoringbackend/source/storagesqlitestatementfactory.h +++ b/src/tools/clangrefactoringbackend/source/storagesqlitestatementfactory.h @@ -54,6 +54,7 @@ public: const Sqlite::Column &symbolIdColumn = table.addColumn("symbolId", Sqlite::ColumnType::Integer); const Sqlite::Column &usrColumn = table.addColumn("usr", Sqlite::ColumnType::Text); const Sqlite::Column &symbolNameColumn = table.addColumn("symbolName", Sqlite::ColumnType::Text); + table.addColumn("symbolKind", Sqlite::ColumnType::Integer); table.addIndex({usrColumn, symbolNameColumn}); table.addIndex({symbolIdColumn}); @@ -115,7 +116,7 @@ public: Sqlite::Table newUsedMacroTable{createNewUsedMacrosTable()}; Sqlite::Table newNewSourceDependenciesTable{createNewSourceDependenciesTable()}; WriteStatement insertSymbolsToNewSymbolsStatement{ - "INSERT INTO newSymbols(temporarySymbolId, usr, symbolName) VALUES(?,?,?)", + "INSERT INTO newSymbols(temporarySymbolId, usr, symbolName, symbolKind) VALUES(?,?,?,?)", database}; WriteStatement insertLocationsToNewLocationsStatement{ "INSERT OR IGNORE INTO newLocations(temporarySymbolId, line, column, sourceId) VALUES(?,?,?,?)", @@ -126,8 +127,8 @@ public: database }; WriteStatement addNewSymbolsToSymbolsStatement{ - "INSERT INTO symbols(usr, symbolName) " - "SELECT usr, symbolName FROM newSymbols WHERE NOT EXISTS " + "INSERT INTO symbols(usr, symbolName, symbolKind) " + "SELECT usr, symbolName, symbolKind FROM newSymbols WHERE NOT EXISTS " "(SELECT usr FROM symbols WHERE symbols.usr == newSymbols.usr)", database }; diff --git a/src/tools/clangrefactoringbackend/source/symbolentry.h b/src/tools/clangrefactoringbackend/source/symbolentry.h index 47e1cba7eac..cc9669c6820 100644 --- a/src/tools/clangrefactoringbackend/source/symbolentry.h +++ b/src/tools/clangrefactoringbackend/source/symbolentry.h @@ -27,6 +27,8 @@ #include +#include + #include #include @@ -38,27 +40,6 @@ namespace ClangBackEnd { using SymbolIndex = long long; -enum class SymbolKind : uchar -{ - None = 0, - Enumeration, - Record, - Function, - Variable, - Macro -}; - -enum class SymbolTag : uchar -{ - None = 0, - Class, - Struct, - Union, - MsvcInterface -}; - -using SymbolTags = Utils::SizedArray; - class SymbolEntry { public: diff --git a/src/tools/clangrefactoringbackend/source/symbolstorage.cpp b/src/tools/clangrefactoringbackend/source/symbolstorage.cpp deleted file mode 100644 index 793f06f882b..00000000000 --- a/src/tools/clangrefactoringbackend/source/symbolstorage.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "symbolstorage.h" - -namespace ClangBackEnd { - -} // namespace ClangBackEnd diff --git a/src/tools/clangrefactoringbackend/source/symbolstorage.h b/src/tools/clangrefactoringbackend/source/symbolstorage.h index efb45b04d49..9c307a8664a 100644 --- a/src/tools/clangrefactoringbackend/source/symbolstorage.h +++ b/src/tools/clangrefactoringbackend/source/symbolstorage.h @@ -201,7 +201,8 @@ public: for (const auto &symbolEntry : symbolEntries) { statement.write(symbolEntry.first, symbolEntry.second.usr, - symbolEntry.second.symbolName); + symbolEntry.second.symbolName, + static_cast(symbolEntry.second.symbolKind)); } } diff --git a/tests/unit/unittest/mocksqlitewritestatement.h b/tests/unit/unittest/mocksqlitewritestatement.h index 132fd9728e7..af6f5a58189 100644 --- a/tests/unit/unittest/mocksqlitewritestatement.h +++ b/tests/unit/unittest/mocksqlitewritestatement.h @@ -48,8 +48,8 @@ public: MOCK_METHOD2(bindValues, void (Utils::SmallStringView, Utils::SmallStringView)); - MOCK_METHOD3(write, - void (uint, Utils::SmallStringView, Utils::SmallStringView)); + MOCK_METHOD4(write, + void (uint, Utils::SmallStringView, Utils::SmallStringView, uint)); MOCK_METHOD4(write, void (uint, uint, uint, uint)); diff --git a/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp b/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp index a64b755b048..f225a0890e9 100644 --- a/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp +++ b/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp @@ -46,8 +46,9 @@ TEST_F(RefactoringDatabaseInitializer, AddSymbolsTable) { InSequence s; - EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS symbols(symbolId INTEGER PRIMARY KEY, usr TEXT, symbolName TEXT)"))); + EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS symbols(symbolId INTEGER PRIMARY KEY, usr TEXT, symbolName TEXT, symbolKind INTEGER)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_symbols_usr ON symbols(usr)"))); + EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_symbols_symbolKind ON symbols(symbolKind)"))); initializer.createSymbolsTable(); } @@ -147,8 +148,9 @@ TEST_F(RefactoringDatabaseInitializer, CreateInTheContructor) InSequence s; EXPECT_CALL(mockDatabase, immediateBegin()); - EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS symbols(symbolId INTEGER PRIMARY KEY, usr TEXT, symbolName TEXT)"))); + EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS symbols(symbolId INTEGER PRIMARY KEY, usr TEXT, symbolName TEXT, symbolKind INTEGER)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_symbols_usr ON symbols(usr)"))); + EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_symbols_symbolKind ON symbols(symbolKind)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS locations(symbolId INTEGER, line INTEGER, column INTEGER, sourceId INTEGER)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_locations_sourceId_line_column ON locations(sourceId, line, column)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS sources(sourceId INTEGER PRIMARY KEY, directoryId INTEGER, sourceName TEXT, sourceType INTEGER)"))); diff --git a/tests/unit/unittest/storagesqlitestatementfactory-test.cpp b/tests/unit/unittest/storagesqlitestatementfactory-test.cpp index 922a229d47b..6bf4acdafe9 100644 --- a/tests/unit/unittest/storagesqlitestatementfactory-test.cpp +++ b/tests/unit/unittest/storagesqlitestatementfactory-test.cpp @@ -48,7 +48,7 @@ TEST_F(StorageSqliteStatementFactory, AddNewSymbolsTable) { InSequence s; - EXPECT_CALL(mockDatabase, execute(Eq("CREATE TEMPORARY TABLE newSymbols(temporarySymbolId INTEGER PRIMARY KEY, symbolId INTEGER, usr TEXT, symbolName TEXT)"))); + EXPECT_CALL(mockDatabase, execute(Eq("CREATE TEMPORARY TABLE newSymbols(temporarySymbolId INTEGER PRIMARY KEY, symbolId INTEGER, usr TEXT, symbolName TEXT, symbolKind INTEGER)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_newSymbols_usr_symbolName ON newSymbols(usr, symbolName)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_newSymbols_symbolId ON newSymbols(symbolId)"))); @@ -90,7 +90,7 @@ TEST_F(StorageSqliteStatementFactory, AddTablesInConstructor) InSequence s; EXPECT_CALL(mockDatabase, immediateBegin()); - EXPECT_CALL(mockDatabase, execute(Eq("CREATE TEMPORARY TABLE newSymbols(temporarySymbolId INTEGER PRIMARY KEY, symbolId INTEGER, usr TEXT, symbolName TEXT)"))); + EXPECT_CALL(mockDatabase, execute(Eq("CREATE TEMPORARY TABLE newSymbols(temporarySymbolId INTEGER PRIMARY KEY, symbolId INTEGER, usr TEXT, symbolName TEXT, symbolKind INTEGER)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_newSymbols_usr_symbolName ON newSymbols(usr, symbolName)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_newSymbols_symbolId ON newSymbols(symbolId)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE TEMPORARY TABLE newLocations(temporarySymbolId INTEGER, symbolId INTEGER, sourceId INTEGER, line INTEGER, column INTEGER)"))); @@ -107,7 +107,7 @@ TEST_F(StorageSqliteStatementFactory, AddTablesInConstructor) TEST_F(StorageSqliteStatementFactory, InsertNewSymbolsStatement) { ASSERT_THAT(factory.insertSymbolsToNewSymbolsStatement.sqlStatement, - Eq("INSERT INTO newSymbols(temporarySymbolId, usr, symbolName) VALUES(?,?,?)")); + Eq("INSERT INTO newSymbols(temporarySymbolId, usr, symbolName, symbolKind) VALUES(?,?,?,?)")); } TEST_F(StorageSqliteStatementFactory, InsertNewLocationsToLocations) @@ -125,7 +125,7 @@ TEST_F(StorageSqliteStatementFactory, SelectNewSourceIdsStatement) TEST_F(StorageSqliteStatementFactory, AddNewSymbolsToSymbolsStatement) { ASSERT_THAT(factory.addNewSymbolsToSymbolsStatement.sqlStatement, - Eq("INSERT INTO symbols(usr, symbolName) SELECT usr, symbolName FROM newSymbols WHERE NOT EXISTS (SELECT usr FROM symbols WHERE symbols.usr == newSymbols.usr)")); + Eq("INSERT INTO symbols(usr, symbolName, symbolKind) SELECT usr, symbolName, symbolKind FROM newSymbols WHERE NOT EXISTS (SELECT usr FROM symbols WHERE symbols.usr == newSymbols.usr)")); } TEST_F(StorageSqliteStatementFactory, SyncNewSymbolsFromSymbolsStatement) diff --git a/tests/unit/unittest/symbolquery-test.cpp b/tests/unit/unittest/symbolquery-test.cpp index 59e64fb79a2..13463f256ee 100644 --- a/tests/unit/unittest/symbolquery-test.cpp +++ b/tests/unit/unittest/symbolquery-test.cpp @@ -59,7 +59,7 @@ protected: database.execute("INSERT INTO directories VALUES (1, \"/path/to\")"); database.execute("INSERT INTO locations VALUES (1, 2, 3, 1)"); database.execute("INSERT INTO locations VALUES (1, 4, 6, 2)"); - database.execute("INSERT INTO symbols VALUES (1, \"functionusr\", \"function\")"); + database.execute("INSERT INTO symbols VALUES (1, \"functionusr\", \"function\", 2)"); } protected: diff --git a/tests/unit/unittest/symbolstorage-test.cpp b/tests/unit/unittest/symbolstorage-test.cpp index 0bfdad322ec..779887f779f 100644 --- a/tests/unit/unittest/symbolstorage-test.cpp +++ b/tests/unit/unittest/symbolstorage-test.cpp @@ -161,7 +161,7 @@ TEST_F(SymbolStorage, AddSymbolsAndSourceLocationsCallsWrite) { InSequence sequence; - EXPECT_CALL(insertSymbolsToNewSymbolsStatement, write(An(), An(), _)).Times(2); + EXPECT_CALL(insertSymbolsToNewSymbolsStatement, write(An(), An(), An(), An())).Times(2); EXPECT_CALL(insertLocationsToNewLocationsStatement, write(TypedEq(1), TypedEq(42), TypedEq(23), TypedEq(3))); EXPECT_CALL(insertLocationsToNewLocationsStatement, write(TypedEq(2), TypedEq(7), TypedEq(11), TypedEq(4))); EXPECT_CALL(addNewSymbolsToSymbolsStatement, execute());