aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dist/changes-4.9.0.md2
-rw-r--r--doc/images/qtcreator-debugger-load-core-file.pngbin0 -> 15790 bytes
-rw-r--r--doc/images/qtcreator-fakevim-options.pngbin17887 -> 16179 bytes
-rw-r--r--doc/images/qtcreator-new-qt-quick-project-wizard.pngbin55197 -> 54669 bytes
-rw-r--r--doc/src/debugger/creator-only/creator-debugger.qdoc24
-rw-r--r--doc/src/editors/creator-coding-edit-mode.qdoc7
-rw-r--r--doc/src/editors/creator-only/creator-fakevim.qdoc82
-rw-r--r--doc/src/howto/creator-only/creator-autotest.qdoc3
-rw-r--r--doc/src/howto/creator-ui.qdoc (renamed from doc/src/howto/creator-only/creator-ui.qdoc)92
-rw-r--r--doc/src/overview/creator-acknowledgements.qdoc128
-rw-r--r--doc/src/projects/creator-only/creator-projects-creating.qdoc11
-rw-r--r--doc/src/python/creator-python-project.qdocinc97
-rw-r--r--doc/src/qtquick/qtquick-components.qdoc9
-rw-r--r--doc/src/qtquick/qtquick-designer.qdoc18
-rw-r--r--doc/src/vcs/creator-only/creator-vcs-perforce.qdoc20
-rw-r--r--doc/src/vcs/creator-only/creator-vcs-subversion.qdoc5
-rw-r--r--doc/src/vcs/creator-only/creator-vcs.qdoc7
-rw-r--r--doc/src/vcs/creator-vcs-git.qdoc6
-rw-r--r--share/qtcreator/debugger/gdbbridge.py25
-rw-r--r--share/qtcreator/debugger/qttypes.py4
-rw-r--r--share/qtcreator/templates/wizards/projects/qtquickapplication/empty/wizard.json11
-rw-r--r--share/qtcreator/templates/wizards/projects/qtquickapplication/scroll/wizard.json11
-rw-r--r--share/qtcreator/templates/wizards/projects/qtquickapplication/stack/wizard.json11
-rw-r--r--share/qtcreator/templates/wizards/projects/qtquickapplication/swipe/wizard.json11
-rw-r--r--share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json11
-rw-r--r--share/qtcreator/themes/design.creatortheme4
-rw-r--r--share/qtcreator/translations/qtcreator_de.ts8
-rw-r--r--src/libs/clangsupport/clangpathwatcher.h67
-rw-r--r--src/libs/clangsupport/clangpathwatcherinterface.h2
-rw-r--r--src/libs/clangsupport/clangpathwatchernotifier.h3
-rw-r--r--src/libs/clangsupport/clangsupport-lib.pri7
-rw-r--r--src/libs/clangsupport/clangsupportexceptions.h (renamed from src/tools/clangrefactoringbackend/source/projectpartartefactexception.h)19
-rw-r--r--src/libs/clangsupport/filepath.h2
-rw-r--r--src/libs/clangsupport/filepathid.h2
-rw-r--r--src/libs/clangsupport/idpaths.h5
-rw-r--r--src/libs/clangsupport/projectpartartefact.cpp (renamed from src/tools/clangrefactoringbackend/source/projectpartartefact.cpp)0
-rw-r--r--src/libs/clangsupport/projectpartartefact.h (renamed from src/tools/clangrefactoringbackend/source/projectpartartefact.h)35
-rw-r--r--src/libs/clangsupport/projectpartcontainer.cpp9
-rw-r--r--src/libs/clangsupport/projectpartcontainer.h56
-rw-r--r--src/libs/clangsupport/projectpartid.h (renamed from src/libs/clangsupport/removeprojectpartsmessage.cpp)53
-rw-r--r--src/libs/clangsupport/projectpartpch.cpp3
-rw-r--r--src/libs/clangsupport/projectpartpch.h29
-rw-r--r--src/libs/clangsupport/projectpartpchproviderinterface.h2
-rw-r--r--src/libs/clangsupport/projectpartsstorage.h336
-rw-r--r--src/libs/clangsupport/projectpartsstorageinterface.h73
-rw-r--r--src/libs/clangsupport/refactoringdatabaseinitializer.h34
-rw-r--r--src/libs/clangsupport/removeprojectpartsmessage.h11
-rw-r--r--src/libs/utils/outputformatter.cpp4
-rw-r--r--src/plugins/clangformat/clangformatbaseindenter.cpp5
-rw-r--r--src/plugins/clangformat/clangformatutils.cpp21
-rw-r--r--src/plugins/clangpchmanager/clangpchmanagerplugin.cpp5
-rw-r--r--src/plugins/clangpchmanager/pchmanagerclient.cpp15
-rw-r--r--src/plugins/clangpchmanager/pchmanagerclient.h11
-rw-r--r--src/plugins/clangpchmanager/pchmanagernotifierinterface.h9
-rw-r--r--src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp18
-rw-r--r--src/plugins/clangpchmanager/pchmanagerprojectupdater.h9
-rw-r--r--src/plugins/clangpchmanager/projectupdater.cpp46
-rw-r--r--src/plugins/clangpchmanager/projectupdater.h16
-rw-r--r--src/plugins/clangpchmanager/qtcreatorprojectupdater.h9
-rw-r--r--src/plugins/clangrefactoring/clangrefactoringplugin.cpp9
-rw-r--r--src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp14
-rw-r--r--src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h8
-rw-r--r--src/plugins/clangrefactoring/refactoringprojectupdater.cpp9
-rw-r--r--src/plugins/clangrefactoring/refactoringprojectupdater.h14
-rw-r--r--src/plugins/coreplugin/fancytabwidget.cpp2
-rw-r--r--src/plugins/debugger/debuggeritemmanager.cpp10
-rw-r--r--src/plugins/fakevim/fakevimactions.cpp2
-rw-r--r--src/plugins/git/gitclient.cpp2
-rw-r--r--src/plugins/pythoneditor/pythoneditorplugin.cpp31
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp3
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp9
-rw-r--r--src/plugins/qmldesigner/designercore/include/qmltimeline.h1
-rw-r--r--src/plugins/qmldesigner/designercore/include/rewriterview.h2
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/model/qmltimeline.cpp13
-rw-r--r--src/plugins/qmldesigner/designercore/model/rewriterview.cpp56
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp3
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp7
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp3
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp21
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp5
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h2
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp5
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h2
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp1
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp118
-rw-r--r--src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h2
-rw-r--r--src/plugins/qmldesigner/qmldesignerplugin.cpp8
-rw-r--r--src/plugins/qtsupport/baseqtversion.cpp6
-rw-r--r--src/plugins/vcsbase/vcsoutputwindow.cpp2
-rw-r--r--src/plugins/vcsbase/vcsoutputwindow.h2
-rw-r--r--src/tools/clangbackend/clangbackendmain.cpp21
-rw-r--r--src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp13
-rw-r--r--src/tools/clangpchmanagerbackend/source/builddependenciesprovider.cpp17
-rw-r--r--src/tools/clangpchmanagerbackend/source/builddependenciesprovider.h6
-rw-r--r--src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h49
-rw-r--r--src/tools/clangpchmanagerbackend/source/builddependenciesstorageinterface.h12
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp6
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchmanagerserver.h2
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtask.h13
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp6
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h4
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskgeneratorinterface.h2
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp8
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskqueue.h5
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtaskqueueinterface.h2
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp2
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtasksmerger.h2
-rw-r--r--src/tools/clangpchmanagerbackend/source/pchtasksmergerinterface.h2
-rw-r--r--src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h108
-rw-r--r--src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h13
-rw-r--r--src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp112
-rw-r--r--src/tools/clangpchmanagerbackend/source/projectpartsmanager.h13
-rw-r--r--src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h5
-rw-r--r--src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h32
-rw-r--r--src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri3
-rw-r--r--src/tools/clangrefactoringbackend/source/collectmacrospreprocessorcallbacks.h2
-rw-r--r--src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp2
-rw-r--r--src/tools/clangrefactoringbackend/source/symbolindexer.cpp55
-rw-r--r--src/tools/clangrefactoringbackend/source/symbolindexer.h9
-rw-r--r--src/tools/clangrefactoringbackend/source/symbolindexertask.h13
-rw-r--r--src/tools/clangrefactoringbackend/source/symbolindexing.h12
-rw-r--r--src/tools/clangrefactoringbackend/source/symbolstorage.h224
-rw-r--r--src/tools/clangrefactoringbackend/source/symbolstorageinterface.h24
-rw-r--r--tests/auto/debugger/tst_dumpers.cpp21
-rw-r--r--tests/unit/unittest/builddependenciesprovider-test.cpp47
-rw-r--r--tests/unit/unittest/builddependenciesstorage-test.cpp61
-rw-r--r--tests/unit/unittest/builddependencycollector-test.cpp4
-rw-r--r--tests/unit/unittest/clangpathwatcher-test.cpp20
-rw-r--r--tests/unit/unittest/commandlinebuilder-test.cpp52
-rw-r--r--tests/unit/unittest/filepathstorage-test.cpp14
-rw-r--r--tests/unit/unittest/filesystem-utilities.h8
-rw-r--r--tests/unit/unittest/gtest-creator-printing.cpp50
-rw-r--r--tests/unit/unittest/gtest-creator-printing.h4
-rw-r--r--tests/unit/unittest/mockbuilddependenciesstorage.h10
-rw-r--r--tests/unit/unittest/mockclangpathwatcher.h3
-rw-r--r--tests/unit/unittest/mockclangpathwatchernotifier.h3
-rw-r--r--tests/unit/unittest/mockpchmanagernotifier.h11
-rw-r--r--tests/unit/unittest/mockpchtaskgenerator.h3
-rw-r--r--tests/unit/unittest/mockpchtaskqueue.h2
-rw-r--r--tests/unit/unittest/mockpchtasksmerger.h2
-rw-r--r--tests/unit/unittest/mockprecompiledheaderstorage.h15
-rw-r--r--tests/unit/unittest/mockprojectpartsmanager.h (renamed from tests/unit/unittest/mockprojectparts.h)5
-rw-r--r--tests/unit/unittest/mockprojectpartsstorage.h60
-rw-r--r--tests/unit/unittest/mocksqlitereadstatement.cpp38
-rw-r--r--tests/unit/unittest/mocksqlitereadstatement.h55
-rw-r--r--tests/unit/unittest/mocksqlitewritestatement.h5
-rw-r--r--tests/unit/unittest/mocksymbolstorage.h13
-rw-r--r--tests/unit/unittest/pchcreator-test.cpp43
-rw-r--r--tests/unit/unittest/pchmanagerclient-test.cpp40
-rw-r--r--tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp28
-rw-r--r--tests/unit/unittest/pchmanagerserver-test.cpp14
-rw-r--r--tests/unit/unittest/pchtaskgenerator-test.cpp13
-rw-r--r--tests/unit/unittest/pchtaskqueue-test.cpp41
-rw-r--r--tests/unit/unittest/pchtasksmerger-test.cpp18
-rw-r--r--tests/unit/unittest/precompiledheaderstorage-test.cpp85
-rw-r--r--tests/unit/unittest/projectparts-test.cpp230
-rw-r--r--tests/unit/unittest/projectpartsmanager-test.cpp321
-rw-r--r--tests/unit/unittest/projectpartsstorage-test.cpp435
-rw-r--r--tests/unit/unittest/projectupdater-test.cpp60
-rw-r--r--tests/unit/unittest/refactoringclientserverinprocess-test.cpp29
-rw-r--r--tests/unit/unittest/refactoringcompilationdatabase-test.cpp30
-rw-r--r--tests/unit/unittest/refactoringdatabaseinitializer-test.cpp78
-rw-r--r--tests/unit/unittest/refactoringprojectupdater-test.cpp74
-rw-r--r--tests/unit/unittest/refactoringserver-test.cpp2
-rw-r--r--tests/unit/unittest/symbolindexer-test.cpp423
-rw-r--r--tests/unit/unittest/symbolindexing-test.cpp4
-rw-r--r--tests/unit/unittest/symbolstorage-test.cpp119
-rw-r--r--tests/unit/unittest/toolchainargumentscache-test.cpp60
-rw-r--r--tests/unit/unittest/unittest.pro6
170 files changed, 3430 insertions, 1925 deletions
diff --git a/dist/changes-4.9.0.md b/dist/changes-4.9.0.md
index f8ab948f9d..71db3a3479 100644
--- a/dist/changes-4.9.0.md
+++ b/dist/changes-4.9.0.md
@@ -157,7 +157,7 @@ Version Control Systems
* Improved handling of commit errors (QTCREATORBUG-15227)
* Perforce
* Disabled by default
- * Fixed issue with setting P4 environment variables (QTCREATORBUG-21573)
+ * Fixed issue with setting P4 environment variables (QTCREATORBUG-18771)
* Mercurial
* Added side-by-side diff viewer (QTCREATORBUG-21124)
diff --git a/doc/images/qtcreator-debugger-load-core-file.png b/doc/images/qtcreator-debugger-load-core-file.png
new file mode 100644
index 0000000000..b5b44f7a10
--- /dev/null
+++ b/doc/images/qtcreator-debugger-load-core-file.png
Binary files differ
diff --git a/doc/images/qtcreator-fakevim-options.png b/doc/images/qtcreator-fakevim-options.png
index 357ad24642..b5aba9b848 100644
--- a/doc/images/qtcreator-fakevim-options.png
+++ b/doc/images/qtcreator-fakevim-options.png
Binary files differ
diff --git a/doc/images/qtcreator-new-qt-quick-project-wizard.png b/doc/images/qtcreator-new-qt-quick-project-wizard.png
index 1f8dcabd2d..0d8290bbdf 100644
--- a/doc/images/qtcreator-new-qt-quick-project-wizard.png
+++ b/doc/images/qtcreator-new-qt-quick-project-wizard.png
Binary files differ
diff --git a/doc/src/debugger/creator-only/creator-debugger.qdoc b/doc/src/debugger/creator-only/creator-debugger.qdoc
index 0d085d7889..57e49a846b 100644
--- a/doc/src/debugger/creator-only/creator-debugger.qdoc
+++ b/doc/src/debugger/creator-only/creator-debugger.qdoc
@@ -275,8 +275,28 @@
ulimit -c unlimited
\endcode
- To launch the debugger in the core mode, select \uicontrol Debug >
- \uicontrol {Start Debugging} > \uicontrol {Load Core File}.
+ To launch the debugger in the core mode:
+
+ \list 1
+ \li Select \uicontrol Debug > \uicontrol {Start Debugging} >
+ \uicontrol {Load Core File}.
+ \image qtcreator-debugger-load-core-file.png
+ \li In the \uicontrol Kit field, select a build and run kit that was
+ used for building the binary for which the core file was created.
+ If the core file stems from a binary not built by \QC or a process
+ not initiated by \QC, select a kit that matches the setup used as
+ closely as possible, in respect to the specified device, tool chain,
+ debugger, and sysroot.
+ \li In the \uicontrol {Core file} field, specify the core file to
+ inspect.
+ \li In the \uicontrol {Executable of symbol file} field, specify
+ a file that contains debug information corresponding to the
+ core file. Typically, this is the executable file or a \c {.debug}
+ file if the debug information is stored separately from the
+ executable.
+ \li In the \uicontrol {Override start script} field, specify a
+ script file to run instead of the default start script.
+ \endlist
Also in this mode, using a properly configured project containing the
sources of the crashed program is not strictly necessary, but helpful.
diff --git a/doc/src/editors/creator-coding-edit-mode.qdoc b/doc/src/editors/creator-coding-edit-mode.qdoc
index 423954328f..eed6cef31f 100644
--- a/doc/src/editors/creator-coding-edit-mode.qdoc
+++ b/doc/src/editors/creator-coding-edit-mode.qdoc
@@ -261,11 +261,4 @@
correct paths for includes that are not resolved or that are resolved to the
wrong file, select \uicontrol {Project Parts} > \uicontrol {Header Paths}.
\endif
-
- \if defined(qtdesignstudio)
- \include creator-sidebar-views.qdocinc using sidebar views
- \include creator-sidebar-views.qdocinc projects view
- \include creator-sidebar-views.qdocinc file system view
- \include creator-sidebar-views.qdocinc outline view
- \endif
*/
diff --git a/doc/src/editors/creator-only/creator-fakevim.qdoc b/doc/src/editors/creator-only/creator-fakevim.qdoc
index a35bf4b1e2..09e7323e45 100644
--- a/doc/src/editors/creator-only/creator-fakevim.qdoc
+++ b/doc/src/editors/creator-only/creator-fakevim.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Creator documentation.
@@ -121,29 +121,99 @@
\section2 Options
- Use \c {:set ...} to set the following options:
+ Use \c {:set ...} to set the options listed in the following table:
- \list
+ \table
+ \header
+ \li Long Name
+ \li Short Name
+ \li Arguments
+ \row
\li \c autoindent
- \li \c clipboard
+ \li \c ai
+ \li
+ \row
\li \c backspace
+ \li \c bs
+ \li \c indent, \c eol, \c start
+ \row
+ \li \c blinkingcursor
+ \li \c bc
+ \li
+ \row
+ \li \c clipboard
+ \li \c cb
+ \li
+ \row
\li \c expandtab
+ \li \c et
+ \li
+ \row
\li \c hlsearch
+ \li \c hls
+ \li
+ \row
\li \c ignorecase
+ \li \c ic
+ \li
+ \row
\li \c incsearch
- \li \c indent
+ \li \c is
+ \li
+ \row
\li \c iskeyword
+ \li \c isk
+ \li A combination of the following characters: \c @, \c 48-57, \c _,
+ \c 192-255, \c a-z, \c A-Z
+ \row
+ \li \c relativenumber
+ \li \c rnu
+ \li
+ \row
\li \c scrolloff
+ \li \c so
+ \li
+ \row
\li \c shiftwidth
+ \li \c sw
+ \li
+ \row
\li \c showcmd
+ \li \c sc
+ \li
+ \row
\li \c smartcase
+ \li \c scs
+ \li
+ \row
\li \c smartindent
+ \li \c si
+ \li
+ \row
\li \c smarttab
+ \li \c sta
+ \li
+ \row
\li \c startofline
+ \li \c sol
+ \li
+ \row
\li \c tabstop
+ \li \c ts
+ \li
+ \row
\li \c tildeop
+ \li \c top
+ \li
+ \row
+ \li \c usecoresearch
+ \li \c ucs
+ \li
+ \row
\li \c wrapscan
- \endlist
+ \li \c ws
+ \li
+ \endtable
\section2 Vimrc Example
diff --git a/doc/src/howto/creator-only/creator-autotest.qdoc b/doc/src/howto/creator-only/creator-autotest.qdoc
index 6c05f13f8d..d5ece2aca0 100644
--- a/doc/src/howto/creator-only/creator-autotest.qdoc
+++ b/doc/src/howto/creator-only/creator-autotest.qdoc
@@ -399,7 +399,8 @@
To view only messages of a particular type, select
\inlineimage filtericon.png
(\uicontrol {Filter Test Results}), and then select the types of messages to
- show.
+ show. To show all messages, select \uicontrol {Check All Filters}. To
+ deselect all message types, select \uicontrol {Uncheck All Filters}.
By default, test result output is limited to 100,000 characters. The output
pane is automatically scrolled down when new results are added. To display
diff --git a/doc/src/howto/creator-only/creator-ui.qdoc b/doc/src/howto/creator-ui.qdoc
index 4ff1334ce3..be542702da 100644
--- a/doc/src/howto/creator-only/creator-ui.qdoc
+++ b/doc/src/howto/creator-ui.qdoc
@@ -31,9 +31,14 @@
/*!
\contentspage index.html
- \previouspage creator-overview.html
\page creator-quick-tour.html
+ \if defined(qtdesignstudio)
+ \previouspage qtbridge-ps-using.html
+ \nextpage creator-using-qt-quick-designer.html
+ \else
+ \previouspage creator-overview.html
\nextpage creator-configuring.html
+ \endif
\title User Interface
@@ -53,20 +58,32 @@
\endlist
+ \if defined(qtcreator)
\image qtcreator-breakdown.png
+ \else
+ \image studio-welcome-mode.png
+ \endif
You can use the mode selector (1) to change to another \QC mode.
+ \if defined(qtcreator)
You can use the kit selector (2) to select the
\l{glossary-buildandrun-kit}{kit} for running (3), debugging (4), or
building (5) the application. Output from these actions is displayed in the
output panes (7).
+ \else
+ You can use the kit selector (2) to select the \l{glossary-buildandrun-kit}
+ {kit} for running (3) or debugging (4) the application. Output from these
+ actions is displayed in the output panes (5).
+ \endif
- You can use the locator (6) to to browse through projects, files, classes,
+ You can use the locator (6) to browse through projects, files, classes,
functions, documentation, and file systems.
+ \if defined(qtcreator)
For a quick tour of the user interface that takes you to the locations of
these controls, select \uicontrol Help > \uicontrol {UI Tour}.
+ \endif
\section1 Modes
@@ -84,7 +101,11 @@
The following image displays an example application in \uicontrol Edit mode (1)
and \uicontrol Design mode (2).
+ \if defined(qtcreator)
\image qtcreator-qt-quick-editors.png "Edit mode and Design mode"
+ \else
+ \image studio-editors.png "Edit mode and Design mode"
+ \endif
You can use \QC in the following modes:
@@ -95,19 +116,29 @@
\li \uicontrol{\l{Coding}{Edit}} mode for editing project and source
files.
- \li \uicontrol{\l{Designing User Interfaces}{Design}} mode for designing and
- developing application user interfaces. This mode is available for
- UI files.
+ \if defined(qtcreator)
+ \li \uicontrol{\l{Designing User Interfaces}{Design}}
+ \else
+ \li \uicontrol{\l{Editing QML Files in Design Mode}{Design}}
+ \endif
+ mode for designing and developing application user interfaces.
+ This mode is available for UI files.
\li \uicontrol{\l{Debugging}{Debug}} mode for inspecting the state of your
application while debugging and for using code analysis tools
to detect memory leaks and profile C++ or QML code.
- \li \uicontrol{\l{Specifying Build Settings}{Projects}} mode for configuring
- project building and execution. This mode is available when a
- project is open.
+ \if defined(qtcreator)
+ \li \uicontrol{\l{Specifying Build Settings}{Projects}} mode
+ for configuring project building and execution.
+ \else
+ \li \uicontrol{\l{Selecting the Preview Tool}{Projects}} mode
+ for selecting the tool to use for live preview.
+ \endif
+ This mode is available when a project is open.
- \li \uicontrol{\l{Getting Help}{Help}} mode for viewing Qt documentation.
+ \li \uicontrol{\l{Using the Help Mode}{Help}} mode for viewing Qt
+ documentation.
\endlist
@@ -119,9 +150,11 @@
\include creator-sidebar-views.qdocinc projects view
\include creator-sidebar-views.qdocinc file system view
\include creator-sidebar-views.qdocinc outline view
+ \if defined(qtcreator)
\include creator-sidebar-views.qdocinc class view
\include creator-sidebar-views.qdocinc type hierarchy view
\include creator-sidebar-views.qdocinc include hierarchy view
+ \endif
\section1 Viewing Output
@@ -139,14 +172,16 @@
\li \uicontrol {QML Debugger Console}
- \li \uicontrol {To-Do Entries}
+ \li \uicontrol{General Messages}
\li \uicontrol{Version Control}
- \li \uicontrol{General Messages}
-
+ \if defined(qtcreator)
\li \uicontrol{Test Results}
+ \li \uicontrol {To-Do Entries}
+ \endif
+
\endlist
Output panes are available in all \l{Modes}{modes}. Click the name of an
@@ -159,10 +194,16 @@
up in the pane. In these panes, you can also use the zoom buttons to increase and
decrease the text size of the output.
- To open the \uicontrol{General Messages} and \l{Using Version Control Systems}
- {Version Control} panes, select
- \uicontrol {Window > Output Panes}. To display the \uicontrol {To-Do Entries} pane,
- enable the Todo plugin.
+ To open the \uicontrol{General Messages} and
+ \if defined(qtcreator)
+ \l{Using Version Control Systems}{Version Control}
+ \else
+ \l{Using Git}{Version Control}
+ \endif
+ panes, select \uicontrol {Window > Output Panes}.
+ \if defined(qtcreator)
+ To display the \uicontrol {To-Do Entries} pane, enable the Todo plugin.
+ \endif
For more information about the \uicontrol {QML Debugger Console} view, see
\l{Executing JavaScript Expressions}.
@@ -173,12 +214,19 @@
\list
+ \if defined(qtdesignstudio)
+ \li \uicontrol {Asset Importer Error} - Errors and warnings encountered
+ while importing assets from a design tool.
+ \endif
+
\li \uicontrol {Build System} - Errors and warnings encountered during a
build.
+ \if defined(qtcreator)
\li \uicontrol {Clang Code Model} -
\l {Parsing C++ Files with the Clang Code Model}
{Errors and warnings from the current editor}.
+ \endif
\li \uicontrol Compile - Selected output from the compiler. Open the
\uicontrol {Compile Output} pane for more detailed information.
@@ -186,8 +234,10 @@
\li \uicontrol{Debug Information} - Lists debug information packages that might
be missing.
+ \if defined(qtcreator)
\li \uicontrol Debugger - Errors encountered while running the
\l{Analyzing Code}{Valgrind code analysis tools}.
+ \endif
\li \uicontrol{Debugger Runtime} - Errors encountered when starting \QC. For
example, information about missing DLLs.
@@ -195,11 +245,13 @@
\li \uicontrol Deployment - Errors encountered between building an application
successfully and starting it on a \l{glossary-device}{device}.
+ \if defined(qtcreator)
\li \uicontrol {My Tasks} - Entries from a task list file (.tasks) generated
by \l{Showing Task List Files in Issues Pane}
{code scanning and analysis tools}.
\li \uicontrol Python - Runtime errors and exceptions of Python scripts.
+ \endif
\li \uicontrol QML and \uicontrol {QML Analysis} -
\l{JavaScript and QML Error Codes}
@@ -255,10 +307,12 @@
\image qtcreator-application-output.png
+ \if defined(qtcreator)
If you specify command line arguments in the run settings that are passed
to the application when running it, they are displayed as a part of the
application output. For more information, see
\l{Specifying Run Settings for Desktop Device Types}.
+ \endif
Select toolbar buttons to run applications, to attach the debugger to the
running application, and to stop running or debugging.
@@ -290,6 +344,7 @@
In the \uicontrol {Limit output to} field, you can specify the maximum
amount of build output lines to display in the pane.
+ \if defined(qtcreator)
\section2 To-Do Entries
The \uicontrol {To-Do Entries} pane lists the BUG, FIXME, NOTE, TODO, and
@@ -331,6 +386,7 @@
In addition, you can open task list files generated by code scanning and
analysis tools in the \uicontrol Issues pane. For more information, see
\l{Showing Task List Files in Issues Pane}.
+ \endif
\section1 Changing Languages
@@ -379,10 +435,12 @@
\l{Searching with the Locator}{navigation} shortcuts are available to help
speed up the process of developing your application.
+ \if defined(qtcreator)
\section1 Useful Features
For a list of useful \QC features described in other parts of the
documentation, see \l{Tips and Tricks}.
+ \endif
\section1 Platform Notes
@@ -413,6 +471,7 @@
\uicontrol Keyboard
\endtable
+ \if defined(qtcreator)
\section2 Location of Settings Files
\QC creates the following files and directories:
@@ -453,6 +512,7 @@
\c {%SystemDrive%\Users\%USERNAME%\AppData\Local\QtProject}.
\endlist
+ \endif
\section2 High DPI Scaling
diff --git a/doc/src/overview/creator-acknowledgements.qdoc b/doc/src/overview/creator-acknowledgements.qdoc
index 5f48dbefbf..43bac0ad4c 100644
--- a/doc/src/overview/creator-acknowledgements.qdoc
+++ b/doc/src/overview/creator-acknowledgements.qdoc
@@ -208,6 +208,134 @@
POSSIBILITY OF SUCH DAMAGE.
\endcode
+ \li \b{ANGLE Array Bounds Clamper for WebKit (Windows)}
+
+ Implements clamping of array indexing expressions during shader
+ translation.
+
+ Used on Windows to implement OpenGL ES on top of DirectX. Configure with
+ \c {-no-opengl}, or \c {-opengl desktop} to exclude.
+
+ The sources can be found in
+ \c qtbase/src/3rdparty/angle/src/third_party/compiler.
+
+ BSD 2-clause "Simplified" License.
+
+ \code
+ Copyright (C) 2012 Apple Inc. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, INC. OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \endcode
+
+ \li \b{ANGLE: Murmurhash (Windows)}
+
+ Used on Windows to implement OpenGL ES on top of DirectX. Configure
+ with \c {-no-opengl}, or \c {-opengl desktop} to exclude.
+
+ The sources can be found in
+ \c qtbase/src/3rdparty/angle/src/third_party/murmurhash.
+
+ \code
+ MurmurHash3 was written by Austin Appleby, and is placed in the public
+ domain. The author hereby disclaims copyright to this source code.
+ \endcode
+
+ Public Domain.
+
+ \li \b{ANGLE: Systeminfo (Windows)}
+
+ Used on Windows to implement OpenGL ES on top of DirectX. Configure
+ with \c {-no-opengl}, or \c {-opengl desktop} to exclude.
+
+ The sources can be found in
+ \c qtbase/src/3rdparty/angle/src/third_party/systeminfo.
+
+ BSD 2-clause "Simplified" License.
+
+ \code
+ Copyright (C) 2009 Apple Inc. All Rights Reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \endcode
+
+ \li \b{ANGLE: trace_event (Windows)}
+
+ Used on Windows to implement OpenGL ES on top of DirectX. Configure
+ with \c {-no-opengl}, or \c {-opengl desktop} to exclude.
+
+ The sources can be found in
+ \c qtbase/src/3rdparty/angle/src/third_party/trace_event.
+
+ BSD 3-clause "New" or "Revised" License.
+
+ \code
+ Copyright 2013 The Chromium Authors. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ \endcode
+
\li \b{SQLite, an embedded database. Version 3.8.10.2}\br\br
The author or authors of this code dedicate any and all copyright
diff --git a/doc/src/projects/creator-only/creator-projects-creating.qdoc b/doc/src/projects/creator-only/creator-projects-creating.qdoc
index 5fc91df1c1..ba7a3374a4 100644
--- a/doc/src/projects/creator-only/creator-projects-creating.qdoc
+++ b/doc/src/projects/creator-only/creator-projects-creating.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Creator documentation.
@@ -126,6 +126,13 @@
Use a single main.cpp file
+ \li Qt for Python Application - Empty or Window
+
+ Create a \l{https://doc.qt.io/qtforpython/index.html}
+ {Qt for Python} application that contains only the main
+ code for a QApplication or create one that contains an
+ empty window.
+
\endlist
\li Libraries
@@ -401,6 +408,8 @@
The above functions are also available in the context menu in the
\uicontrol Projects view.
+ \include creator-python-project.qdocinc python project wizards
+
\section2 Creating OpenGL Fragment and Vertex Shaders
Qt provides support for integration with OpenGL implementations on all
diff --git a/doc/src/python/creator-python-project.qdocinc b/doc/src/python/creator-python-project.qdocinc
new file mode 100644
index 0000000000..fdb58155a6
--- /dev/null
+++ b/doc/src/python/creator-python-project.qdocinc
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Creator documentation.
+**
+** 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 Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+**
+****************************************************************************/
+
+/*!
+//! [python project wizards]
+
+ \section2 Creating Qt for Python Applications
+
+ \l {https://doc.qt.io/qtforpython/index.html}{Qt for Python} enables you
+ to use Qt 5 API in Python applications. You can use the PySide2 module to
+ gain access to individual Qt modules, such as \l {Qt Core}, \l {Qt GUI},
+ and \l {Qt Widgets}.
+
+ The Qt for Python Application wizards generate a \c {.pyproject} file that
+ lists the files in the Python project and a \c {.py} file that contains
+ some boilerplate code.
+
+ The \c{.pyproject} files are JSON-based configuration files that replace
+ the previously used \c {.pyqtc} configuration files. You can still open and
+ use \c {.pyqtc} files, but we recommend that you choose \c{.pyproject} files
+ for new projects.
+
+ The Window wizard adds the following imports to the \c {main.py}
+ file to provide access to the QApplication and QMainWindow classes
+ in the Qt Widgets module:
+
+ \badcode
+ import sys
+ from PySide2.QtWidgets import QApplication, QMainWindow
+ \endcode
+
+ The Window wizard also adds a \c MainWindow class that inherits from
+ QMainWindow:
+
+ \badcode
+ class MainWindow(QMainWindow):
+ def __init__(self):
+ QMainWindow.__init__(self)
+ \endcode
+
+ Next, the Window wizard adds a main function, where it creates a
+ QApplication instance. As Qt can receive arguments from the command line,
+ you can pass any arguments to the QApplication object. Usually, you do not
+ need to pass any arguments, and you can use the following approach:
+
+ \badcode
+ if __name__ == "__main__":
+ app = QApplication([])
+ ...
+ \endcode
+
+ Next, the Window wizard instantiates the \c MainWindow class and shows it:
+
+ \badcode
+ window = MainWindow()
+ window.show()
+ ...
+ \endcode
+
+ Finally, the Window wizard calls the \c app.exec_() method to enter the Qt
+ main loop and start executing the Qt code:
+
+ \badcode
+ sys.exit(app.exec_())
+ \endcode
+
+ The Empty wizard adds similar code to the \c {main.py} file, but it does
+ not add any classes, so you need to add and instantiate them yourself.
+
+ For examples of creating Qt for Python applications, see
+ \l {https://doc.qt.io/qtforpython/tutorials/index.html}
+ {Qt for Python Examples and Tutorials}.
+
+//! [python project wizards]
+*/
diff --git a/doc/src/qtquick/qtquick-components.qdoc b/doc/src/qtquick/qtquick-components.qdoc
index 3b2185e95e..34ee756b43 100644
--- a/doc/src/qtquick/qtquick-components.qdoc
+++ b/doc/src/qtquick/qtquick-components.qdoc
@@ -32,7 +32,11 @@
/*!
\contentspage index.html
\page quick-components.html
+ \if defined(qtdesignstudio)
+ \previouspage studio-prototyping.html
+ \else
\previouspage creator-using-qt-quick-designer.html
+ \endif
\nextpage quick-buttons.html
\title Creating Components
@@ -420,6 +424,11 @@
can be selected.
\endlist
+ You can also use the
+ \l {https://doc-snapshots.qt.io/qt5-5.13/qml-qtquick-dialogs-dialog.html}
+ {Dialog} type in the Qt Quick Dialogs module to wrap arbitrary content into
+ a dialog window including a row of platform-tailored buttons.
+
\if defined(qtdesignstudio)
\include qtdesignstudio-visual-effects.qdocinc qml visual effects
\include qtdesignstudio-components.qdocinc creating studio components
diff --git a/doc/src/qtquick/qtquick-designer.qdoc b/doc/src/qtquick/qtquick-designer.qdoc
index 84ee8b1abc..a1f2b0455e 100644
--- a/doc/src/qtquick/qtquick-designer.qdoc
+++ b/doc/src/qtquick/qtquick-designer.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Creator documentation.
@@ -33,11 +33,12 @@
\contentspage index.html
\page creator-using-qt-quick-designer.html
\if defined(qtdesignstudio)
- \previouspage studio-prototyping.html
+ \previouspage creator-quick-tour.html
+ \nextpage {Tutorials}
\else
\previouspage creator-quick-ui-forms.html
- \endif
\nextpage quick-components.html
+ \endif
\title Editing QML Files in Design Mode
@@ -46,7 +47,11 @@
recommended that you use UI forms for components that you want to
edit in the Design mode.
+ \if defined(qtcreator)
\image qmldesigner-visual-editor.png "Visual editor"
+ \else
+ \image studio-design-mode.png "Design mode"
+ \endif
To manage your project in the Design mode:
@@ -97,11 +102,16 @@
\endlist
- \li \uicontrol {State} pane (6) displays the different states of the item.
+ \li \uicontrol {States} pane (6) displays the different states of the item.
QML states typically describe user interface configurations, such as
the UI controls, their properties and behavior and the available
actions. For more information, see \l{Adding States}.
+ \if defined(qtdesignstudio)
+ \li \uicontrol Timeline pane (7) provides a timeline and keyframe based
+ editor that enables you to animate the properties of UI components.
+ \endif
+
\endlist
\section1 Snapping to Parent and Sibling Items
diff --git a/doc/src/vcs/creator-only/creator-vcs-perforce.qdoc b/doc/src/vcs/creator-only/creator-vcs-perforce.qdoc
index 024a19a229..ea87f8686b 100644
--- a/doc/src/vcs/creator-only/creator-vcs-perforce.qdoc
+++ b/doc/src/vcs/creator-only/creator-vcs-perforce.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Creator documentation.
@@ -40,21 +40,11 @@
Perforce is a fast software configuration management system developed by
Perforce Software.
- \section1 Configuring Perforce
-
- When you start \QC, it looks for the executable specified
- in the \uicontrol{P4 command} field in \uicontrol{Tools > Options > Version
- Control > Perforce}. If the file is not found, the following error
- message is displayed in the \uicontrol {Version Control} output pane:
- \uicontrol {Perforce: Unable to determine the repository: "p4.exe"
- terminated with exit code 1}. If you use Perforce, check that the
- path to the executable is specified correctly in the \uicontrol{P4 command}
- field.
+ Since \QC 4.9, the Perforce plugin is disabled by default. To enable
+ it, select \uicontrol Help > \uicontrol {About Plugins} >
+ \uicontrol {Version Control} > \uicontrol Perforce, and then restart \QC.
- If you do not use Perforce, you can disable the Perforce plugin to
- get rid of the error message. Choose \uicontrol {Help > About Plugins} and
- deselect the \uicontrol Load check box for the \uicontrol Perforce plugin in
- the \uicontrol {Version Control} group.
+ \section1 Configuring Perforce
In the Perforce options, you can specify workspace details:
\uicontrol {P4 user}, \uicontrol {P4 client}, and \uicontrol {P4 port}. To
diff --git a/doc/src/vcs/creator-only/creator-vcs-subversion.qdoc b/doc/src/vcs/creator-only/creator-vcs-subversion.qdoc
index 9c3ed45b3e..900f5a3b6f 100644
--- a/doc/src/vcs/creator-only/creator-vcs-subversion.qdoc
+++ b/doc/src/vcs/creator-only/creator-vcs-subversion.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Creator documentation.
@@ -51,4 +51,7 @@
To show whitespace changes in annotation views, deselect the
\uicontrol {Ignore whitespace changes in annotation} check box.
+
+ You can use Git as a client for a Subversion server. For more information,
+ see \l{Using Git with Subversion}.
*/
diff --git a/doc/src/vcs/creator-only/creator-vcs.qdoc b/doc/src/vcs/creator-only/creator-vcs.qdoc
index 9a87e53f89..c7f3c0dc94 100644
--- a/doc/src/vcs/creator-only/creator-vcs.qdoc
+++ b/doc/src/vcs/creator-only/creator-vcs.qdoc
@@ -139,9 +139,10 @@
\image qtcreator-vcs-diff.png
- With Git and Subversion, the diff is displayed side-by-side in a \l{Comparing Files}
- {diff editor} by default. To use the inline diff view instead, select the
- \uicontrol {Switch to Text Diff Editor} (1) option from the toolbar. In the inline
+ With Git, Mercurial, and Subversion, the diff is displayed side-by-side in
+ a \l{Comparing Files}{diff editor} by default. To use the inline diff view
+ instead, select the \uicontrol {Switch to Text Diff Editor} (1) option from
+ the toolbar. In the inline
diff view, you can use context menu commands to apply, revert, stage, and
unstage hunks, as well as send them to a code pasting service.
diff --git a/doc/src/vcs/creator-vcs-git.qdoc b/doc/src/vcs/creator-vcs-git.qdoc
index 2c8b6bbf9c..34dde382be 100644
--- a/doc/src/vcs/creator-vcs-git.qdoc
+++ b/doc/src/vcs/creator-vcs-git.qdoc
@@ -224,6 +224,9 @@
branch is shown in bold and underlined in the list of branches in the
\uicontrol {Git Branches} sidebar view.
+ If you checked out a specific commit, the list of branches displays a
+ \e {Detached HEAD} entry.
+
For local and remote branches, the changes log can be shown by double
clicking on the branch name.
@@ -281,6 +284,9 @@
\row
\li \uicontrol Track
\li Set the current branch to track the selected one.
+ \row
+ \li \uicontrol Push
+ \li Push the committed changes to the selected remote branch.
\endtable
The following additional context-menu operations are available for
diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py
index 7819d6d5c8..b7aa8811bb 100644
--- a/share/qtcreator/debugger/gdbbridge.py
+++ b/share/qtcreator/debugger/gdbbridge.py
@@ -892,16 +892,33 @@ class Dumper(DumperBase):
def createSpecialBreakpoints(self, args):
self.specialBreakpoints = []
def newSpecial(spec):
+ # GDB < 8.1 does not have the 'qualified' parameter here,
+ # GDB >= 8.1 applies some generous pattern matching, hitting
+ # e.g. also Foo::abort() when asking for '::abort'
+ class Pre81SpecialBreakpoint(gdb.Breakpoint):
+ def __init__(self, spec):
+ super(Pre81SpecialBreakpoint, self).__init__(spec,
+ gdb.BP_BREAKPOINT, internal=True)
+ self.spec = spec
+
+ def stop(self):
+ print("Breakpoint on '%s' hit." % self.spec)
+ return True
+
class SpecialBreakpoint(gdb.Breakpoint):
def __init__(self, spec):
- super(SpecialBreakpoint, self).\
- __init__(spec, gdb.BP_BREAKPOINT, internal=True)
+ super(SpecialBreakpoint, self).__init__(spec,
+ gdb.BP_BREAKPOINT, internal=True, qualified=True)
self.spec = spec
def stop(self):
print("Breakpoint on '%s' hit." % self.spec)
return True
- return SpecialBreakpoint(spec)
+
+ try:
+ return SpecialBreakpoint(spec)
+ except:
+ return Pre81SpecialBreakpoint(spec)
# FIXME: ns is accessed too early. gdb.Breakpoint() has no
# 'rbreak' replacement, and breakpoints created with
@@ -1279,7 +1296,7 @@ class Dumper(DumperBase):
frame = gdb.newest_frame()
ns = self.qtNamespace()
needle = self.qtNamespace() + 'QV4::ExecutionEngine'
- pat = '%sqt_v4StackTrace(((%sQV4::ExecutionEngine *)0x%x)->currentContext)'
+ pat = '%sqt_v4StackTrace(((%sQV4::ExecutionEngine *)0x%x)->currentContext())'
done = False
while i < limit and frame and not done:
block = None
diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py
index 1a30debf3f..77cb2fa512 100644
--- a/share/qtcreator/debugger/qttypes.py
+++ b/share/qtcreator/debugger/qttypes.py
@@ -478,8 +478,8 @@ def qdump__QDir(d, value):
typ = d.lookupType(ns + 'QString')
d.putItem(d.createValue(privAddress + absoluteDirEntryOffset, typ))
with SubItem(d, 'entryInfoList'):
- typ = d.lookupType(ns + 'QList<' + ns + 'QFileInfo>')
- d.putItem(d.createValue(privAddress + fileInfosOffset, typ))
+ typ = d.lookupType(ns + 'QFileInfo')
+ qdumpHelper_QList(d, privAddress + fileInfosOffset, typ)
with SubItem(d, 'entryList'):
typ = d.lookupType(ns + 'QStringList')
d.putItem(d.createValue(privAddress + filesOffset, typ))
diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/empty/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickapplication/empty/wizard.json
index 4ced9e026b..d26bec5ec6 100644
--- a/share/qtcreator/templates/wizards/projects/qtquickapplication/empty/wizard.json
+++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/empty/wizard.json
@@ -80,10 +80,19 @@
"type": "ComboBox",
"data":
{
- "index": 3,
+ "index": 1,
"items":
[
{
+ "trKey": "Qt 5.13",
+ "value":
+ "({
+ 'QtQuickVersion': '2.13',
+ 'QtQuickWindowVersion': '2.13',
+ 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.4'
+ })"
+ },
+ {
"trKey": "Qt 5.12",
"value":
"({
diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/scroll/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickapplication/scroll/wizard.json
index 656f5d3596..b19188a3c8 100644
--- a/share/qtcreator/templates/wizards/projects/qtquickapplication/scroll/wizard.json
+++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/scroll/wizard.json
@@ -83,10 +83,19 @@
"visible": false,
"data":
{
- "index": 3,
+ "index": 1,
"items":
[
{
+ "trKey": "Qt 5.13",
+ "value":
+ "({
+ 'QtQuickVersion': '2.13',
+ 'QtQuickControlsVersion': '2.13',
+ 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.4'
+ })"
+ },
+ {
"trKey": "Qt 5.12",
"value":
"({
diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/stack/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickapplication/stack/wizard.json
index 99cf484850..0b0f8558ac 100644
--- a/share/qtcreator/templates/wizards/projects/qtquickapplication/stack/wizard.json
+++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/stack/wizard.json
@@ -82,10 +82,19 @@
"type": "ComboBox",
"data":
{
- "index": 3,
+ "index": 1,
"items":
[
{
+ "trKey": "Qt 5.13",
+ "value":
+ "({
+ 'QtQuickVersion': '2.13',
+ 'QtQuickControlsVersion': '2.13',
+ 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.4'
+ })"
+ },
+ {
"trKey": "Qt 5.12",
"value":
"({
diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/swipe/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickapplication/swipe/wizard.json
index f5918f35e0..a89e6cce26 100644
--- a/share/qtcreator/templates/wizards/projects/qtquickapplication/swipe/wizard.json
+++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/swipe/wizard.json
@@ -82,10 +82,19 @@
"type": "ComboBox",
"data":
{
- "index": 3,
+ "index": 1,
"items":
[
{
+ "trKey": "Qt 5.13",
+ "value":
+ "({
+ 'QtQuickVersion': '2.13',
+ 'QtQuickControlsVersion': '2.13',
+ 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.4'
+ })"
+ },
+ {
"trKey": "Qt 5.12",
"value":
"({
diff --git a/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json
index 89dbe871d6..7d059b8d4c 100644
--- a/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json
+++ b/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json
@@ -40,10 +40,19 @@
"type": "ComboBox",
"data":
{
- "index": 3,
+ "index": 1,
"items":
[
{
+ "trKey": "Qt 5.13",
+ "value":
+ "({
+ 'QtQuickVersion': '2.13',
+ 'QtQuickWindowVersion': '2.13',
+ 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.4'
+ })"
+ },
+ {
"trKey": "Qt 5.12",
"value":
"({
diff --git a/share/qtcreator/themes/design.creatortheme b/share/qtcreator/themes/design.creatortheme
index 3b11572903..ff2af332fe 100644
--- a/share/qtcreator/themes/design.creatortheme
+++ b/share/qtcreator/themes/design.creatortheme
@@ -137,11 +137,11 @@ IconsDebugColor=toolBarItem
IconsNavigationArrowsColor=ffebc322
IconsBuildHammerHandleColor=ffb06112
IconsBuildHammerHeadColor=ff828384
-IconsModeWelcomeActiveColor=ff80c342
+IconsModeWelcomeActiveColor=ff1f6c97
IconsModeEditActiveColor=ff99aaef
IconsModeDesignActiveColor=ffbb6000
IconsModeDebugActiveColor=ff99aaef
-IconsModeProjectActiveColor=ff80c342
+IconsModeProjectActiveColor=ff1f6c97
IconsModeAnalyzeActiveColor=ff43adee
IconsModeHelpActiveColor=fff4be04
IconsCodeModelKeywordColor=ff777777
diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts
index 9ae7851207..0000669c6f 100644
--- a/share/qtcreator/translations/qtcreator_de.ts
+++ b/share/qtcreator/translations/qtcreator_de.ts
@@ -2929,7 +2929,7 @@ markers in the source code editor.</source>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enables stepping backwards.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This feature is very slow and unstable on the GDB side. It exhibits unpredictable behavior when going backwards over system calls and is very likely to destroy your debugging session.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Rückwärts-Debuggen aktivieren.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Hinweis:&lt;/b&gt; Diese Funktionalität ist sehr langsam und instabil auf Seiten von GDB. Es kann unvorhergesehenes Verhalten auftreten, wenn man rückwärts über einen Systemaufruf springt, und die Debugger-Sitzung kann leicht zerstört werden.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Rückwärts-Debuggen aktivieren.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Hinweis:&lt;/b&gt; Diese Funktionalität ist sehr langsam und instabil innerhalb von GDB. Es kann unvorhergesehenes Verhalten auftreten, wenn man rückwärts über einen Systemaufruf springt, und die Debugger-Sitzung kann leicht zerstört werden.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>Debug all child processes</source>
@@ -6790,7 +6790,7 @@ Außer: %2
</message>
<message>
<source>Use jom instead of nmake</source>
- <translation>jom an Stelle von nmake verwenden</translation>
+ <translation>jom statt nmake verwenden</translation>
</message>
<message>
<source>Current directory</source>
@@ -23157,7 +23157,7 @@ Weitere Informationen finden Sie auf der Dokumentationsseite &quot;Checking Code
</message>
<message>
<source>Use %1 instead of &apos;var&apos; or &apos;variant&apos; to improve performance.</source>
- <translation>Zur Steigerung der Ausführungsgeschwindigkeit sollte %1 an Stelle von &apos;var&apos; oder &apos;variant&apos; verwendet werden.</translation>
+ <translation>Zur Steigerung der Ausführungsgeschwindigkeit sollte %1 statt &apos;var&apos; oder &apos;variant&apos; verwendet werden.</translation>
</message>
<message>
<source>This type (%1) is not supported in the Qt Quick Designer.</source>
@@ -33940,7 +33940,7 @@ Senden selbst auch Zeit benötigt.</translation>
</message>
<message>
<source>This feature is very slow and unstable on the GDB side. It exhibits unpredictable behavior when going backwards over system calls and is very likely to destroy your debugging session.</source>
- <translation>Diese Funktionalität ist sehr langsam und instabil auf Seiten von GDB. Es kann unvorhergesehenes Verhalten auftreten, wenn man rückwärts über einen Systemaufruf springt, und die Debugger-Sitzung kann leicht unbenutzbar werden.</translation>
+ <translation>Diese Funktionalität ist sehr langsam und instabil innerhalb von GDB. Es kann unvorhergesehenes Verhalten auftreten, wenn man rückwärts über einen Systemaufruf springt, und die Debugger-Sitzung kann leicht unbenutzbar werden.</translation>
</message>
<message>
<source>Reverse Direction</source>
diff --git a/src/libs/clangsupport/clangpathwatcher.h b/src/libs/clangsupport/clangpathwatcher.h
index 258c63e938..dab52996c2 100644
--- a/src/libs/clangsupport/clangpathwatcher.h
+++ b/src/libs/clangsupport/clangpathwatcher.h
@@ -38,7 +38,7 @@ namespace ClangBackEnd {
class WatcherEntry
{
public:
- int id;
+ ProjectPartId id;
FilePathId pathId;
friend bool operator==(WatcherEntry first, WatcherEntry second)
@@ -69,13 +69,6 @@ public:
using WatcherEntries = std::vector<WatcherEntry>;
-using IdCache = StringCache<Utils::SmallString,
- Utils::SmallStringView,
- int,
- NonLockingMutex,
- decltype(&Utils::compare),
- Utils::compare>;
-
template <typename FileSystemWatcher,
typename Timer>
class CLANGSUPPORT_GCCEXPORT ClangPathWatcher : public ClangPathWatcherInterface
@@ -109,9 +102,9 @@ public:
removeUnusedEntries(entriesAndIds.first, entriesAndIds.second);
}
- void removeIds(const Utils::SmallStringVector &ids) override
+ void removeIds(const ProjectPartIds &ids) override
{
- auto removedEntries = removeIdsFromWatchedEntries(convertToIdNumbers(ids));
+ auto removedEntries = removeIdsFromWatchedEntries(ids);
auto filteredPaths = filterNotWatchedPaths(removedEntries);
@@ -124,7 +117,6 @@ public:
m_notifier = notifier;
}
-unittest_public:
static std::vector<uint> idsFromIdPaths(const std::vector<IdPaths> &idPaths)
{
std::vector<uint> ids;
@@ -144,15 +136,6 @@ unittest_public:
return ids;
}
- std::vector<int> convertToIdNumbers(const Utils::SmallStringVector &ids)
- {
- std::vector<int> idNumbers = m_idCache.stringIds(ids);
-
- std::sort(idNumbers.begin(), idNumbers.end());
-
- return idNumbers;
- }
-
std::size_t sizeOfIdPaths(const std::vector<IdPaths> &idPaths)
{
auto sumSize = [] (std::size_t size, const IdPaths &idPath) {
@@ -162,20 +145,19 @@ unittest_public:
return std::accumulate(idPaths.begin(), idPaths.end(), std::size_t(0), sumSize);
}
-
- std::pair<WatcherEntries, std::vector<int>>
- convertIdPathsToWatcherEntriesAndIds(const std::vector<IdPaths> &idPaths)
+ std::pair<WatcherEntries, ProjectPartIds> convertIdPathsToWatcherEntriesAndIds(
+ const std::vector<IdPaths> &idPaths)
{
WatcherEntries entries;
entries.reserve(sizeOfIdPaths(idPaths));
- std::vector<int> ids;
+ ProjectPartIds ids;
ids.reserve(ids.size());
auto outputIterator = std::back_inserter(entries);
for (const IdPaths &idPath : idPaths)
{
- int id = m_idCache.stringId(idPath.id);
+ ProjectPartId id = idPath.id;
ids.push_back(id);
@@ -203,8 +185,7 @@ unittest_public:
m_fileSystemWatcher.addPaths(convertWatcherEntriesToQStringList(filteredPaths));
}
- void removeUnusedEntries(const WatcherEntries &entries,
- const std::vector<int> &ids)
+ void removeUnusedEntries(const WatcherEntries &entries, const ProjectPartIds &ids)
{
auto oldEntries = notAnymoreWatchedEntriesWithIds(entries, ids);
@@ -286,9 +267,8 @@ unittest_public:
return notAnymoreWatchedEntries;
}
- WatcherEntries notAnymoreWatchedEntriesWithIds(
- const WatcherEntries &newEntries,
- const std::vector<int> &ids) const
+ WatcherEntries notAnymoreWatchedEntriesWithIds(const WatcherEntries &newEntries,
+ const ProjectPartIds &ids) const
{
auto oldEntries = notAnymoreWatchedEntries(newEntries, std::less<WatcherEntry>());
@@ -345,16 +325,13 @@ unittest_public:
return m_watchedEntries;
}
- WatcherEntries removeIdsFromWatchedEntries(const std::vector<int> &ids)
+ WatcherEntries removeIdsFromWatchedEntries(const ProjectPartIds &ids)
{
-
- auto keep = [&] (WatcherEntry entry) {
+ auto keep = [&](WatcherEntry entry) {
return !std::binary_search(ids.begin(), ids.end(), entry.id);
};
- auto found = std::stable_partition(m_watchedEntries.begin(),
- m_watchedEntries.end(),
- keep);
+ auto found = std::stable_partition(m_watchedEntries.begin(), m_watchedEntries.end(), keep);
WatcherEntries removedEntries(found, m_watchedEntries.end());
@@ -410,22 +387,20 @@ unittest_public:
return watchedFilePathIds;
}
- Utils::SmallStringVector idsForWatcherEntries(const WatcherEntries &foundEntries)
+ ProjectPartIds idsForWatcherEntries(const WatcherEntries &foundEntries)
{
- Utils::SmallStringVector ids;
+ ProjectPartIds ids;
ids.reserve(foundEntries.size());
std::transform(foundEntries.begin(),
foundEntries.end(),
std::back_inserter(ids),
- [&] (WatcherEntry entry) {
- return Utils::SmallString(m_idCache.string(entry.id));
- });
+ [&](WatcherEntry entry) { return entry.id; });
return ids;
}
- Utils::SmallStringVector uniqueIds(Utils::SmallStringVector &&ids)
+ ProjectPartIds uniqueIds(ProjectPartIds &&ids)
{
std::sort(ids.begin(), ids.end());
auto newEnd = std::unique(ids.begin(), ids.end());
@@ -439,7 +414,7 @@ unittest_public:
if (m_notifier) {
WatcherEntries foundEntries = watchedEntriesForPaths(std::move(filePathIds));
- Utils::SmallStringVector changedIds = idsForWatcherEntries(foundEntries);
+ ProjectPartIds changedIds = idsForWatcherEntries(foundEntries);
m_notifier->pathsWithIdsChanged(uniqueIds(std::move(changedIds)));
m_notifier->pathsChanged(watchedPaths(filePathIds));
@@ -451,13 +426,7 @@ unittest_public:
return m_pathCache;
}
- IdCache &idCache()
- {
- return m_idCache;
- }
-
private:
- IdCache m_idCache;
WatcherEntries m_watchedEntries;
ChangedFilePathCompressor<Timer> m_changedFilePathCompressor;
FileSystemWatcher m_fileSystemWatcher;
diff --git a/src/libs/clangsupport/clangpathwatcherinterface.h b/src/libs/clangsupport/clangpathwatcherinterface.h
index 2a290561cd..1b478fd19a 100644
--- a/src/libs/clangsupport/clangpathwatcherinterface.h
+++ b/src/libs/clangsupport/clangpathwatcherinterface.h
@@ -41,7 +41,7 @@ public:
ClangPathWatcherInterface &operator=(const ClangPathWatcherInterface &) = delete;
virtual void updateIdPaths(const std::vector<IdPaths> &idPaths) = 0;
- virtual void removeIds(const Utils::SmallStringVector &ids) = 0;
+ virtual void removeIds(const ProjectPartIds &ids) = 0;
virtual void setNotifier(ClangPathWatcherNotifier *notifier) = 0;
diff --git a/src/libs/clangsupport/clangpathwatchernotifier.h b/src/libs/clangsupport/clangpathwatchernotifier.h
index 188f11a8c2..393525dbf2 100644
--- a/src/libs/clangsupport/clangpathwatchernotifier.h
+++ b/src/libs/clangsupport/clangpathwatchernotifier.h
@@ -28,6 +28,7 @@
#include "clangsupport_global.h"
#include <filepathid.h>
+#include <projectpartid.h>
#include <utils/smallstringvector.h>
@@ -40,7 +41,7 @@ public:
ClangPathWatcherNotifier(const ClangPathWatcherNotifier &) = delete;
ClangPathWatcherNotifier &operator=(const ClangPathWatcherNotifier &) = delete;
- virtual void pathsWithIdsChanged(const Utils::SmallStringVector &ids) = 0;
+ virtual void pathsWithIdsChanged(const ProjectPartIds &ids) = 0;
virtual void pathsChanged(const FilePathIds &filePathIds) = 0;
protected:
diff --git a/src/libs/clangsupport/clangsupport-lib.pri b/src/libs/clangsupport/clangsupport-lib.pri
index 7ab8e47ac7..0668382803 100644
--- a/src/libs/clangsupport/clangsupport-lib.pri
+++ b/src/libs/clangsupport/clangsupport-lib.pri
@@ -52,7 +52,6 @@ SOURCES += \
$$PWD/refactoringserverproxy.cpp \
$$PWD/referencesmessage.cpp \
$$PWD/unsavedfilesupdatedmessage.cpp \
- $$PWD/removeprojectpartsmessage.cpp \
$$PWD/requestannotationsmessage.cpp \
$$PWD/requestfollowsymbolmessage.cpp \
$$PWD/requestreferencesmessage.cpp \
@@ -87,6 +86,7 @@ SOURCES += \
$$PWD/updategeneratedfilesmessage.cpp \
$$PWD/removegeneratedfilesmessage.cpp \
$$PWD/generatedfiles.cpp \
+ $$PWD/projectpartartefact.cpp \
$$PWD/projectpartcontainer.cpp
HEADERS += \
@@ -107,8 +107,12 @@ HEADERS += \
$$PWD/clangrefactoringmessages.h \
$$PWD/clangrefactoringservermessages.h \
$$PWD/alivemessage.h \
+ $$PWD/clangsupportexceptions.h \
$$PWD/completionsmessage.h \
$$PWD/executeinloop.h \
+ $$PWD/projectpartid.h \
+ $$PWD/projectpartsstorage.h \
+ $$PWD/projectpartsstorageinterface.h \
$$PWD/requestcompletionsmessage.h \
$$PWD/echomessage.h \
$$PWD/endmessage.h \
@@ -208,6 +212,7 @@ HEADERS += \
$$PWD/progresscounter.h \
$$PWD/includesearchpath.h \
$$PWD/commandlinebuilder.h \
+ $$PWD/projectpartartefact.h \
$$PWD/projectpartcontainer.h
contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
diff --git a/src/tools/clangrefactoringbackend/source/projectpartartefactexception.h b/src/libs/clangsupport/clangsupportexceptions.h
index 22f1b3ed94..05e48bea50 100644
--- a/src/tools/clangrefactoringbackend/source/projectpartartefactexception.h
+++ b/src/libs/clangsupport/clangsupportexceptions.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
@@ -23,6 +23,8 @@
**
****************************************************************************/
+#pragma once
+
#include <sqliteexception.h>
namespace ClangBackEnd {
@@ -30,11 +32,16 @@ namespace ClangBackEnd {
class ProjectPartArtefactParseError : public Sqlite::Exception
{
public:
- ProjectPartArtefactParseError(const char *whatErrorHasHappen,
- Utils::SmallString &&errorMessage)
+ ProjectPartArtefactParseError(const char *whatErrorHasHappen, Utils::SmallString &&errorMessage)
: Exception(whatErrorHasHappen, std::move(errorMessage))
- {
- }
+ {}
};
-}
+class ProjectPartDoesNotExists : public Sqlite::Exception
+{
+public:
+ ProjectPartDoesNotExists(const char *whatErrorHasHappen, Utils::SmallString &&errorMessage)
+ : Exception(whatErrorHasHappen, std::move(errorMessage))
+ {}
+};
+} // namespace ClangBackEnd
diff --git a/src/libs/clangsupport/filepath.h b/src/libs/clangsupport/filepath.h
index 7207684194..b016b7de4f 100644
--- a/src/libs/clangsupport/filepath.h
+++ b/src/libs/clangsupport/filepath.h
@@ -95,6 +95,8 @@ public:
m_slashIndex(std::ptrdiff_t(directory.size()))
{}
+ bool isValid() const { return size() > 0 && m_slashIndex >= 0; }
+
Utils::SmallStringView directory() const noexcept
{
return mid(0, std::size_t(std::max(std::ptrdiff_t(0), m_slashIndex)));
diff --git a/src/libs/clangsupport/filepathid.h b/src/libs/clangsupport/filepathid.h
index 88426d93fc..4feb06a531 100644
--- a/src/libs/clangsupport/filepathid.h
+++ b/src/libs/clangsupport/filepathid.h
@@ -40,6 +40,8 @@ class FilePathId
public:
constexpr FilePathId() = default;
+ FilePathId(const char *) = delete;
+
FilePathId(int filePathId)
: filePathId(filePathId)
{}
diff --git a/src/libs/clangsupport/idpaths.h b/src/libs/clangsupport/idpaths.h
index 9fa06bdd4d..d67a73e83e 100644
--- a/src/libs/clangsupport/idpaths.h
+++ b/src/libs/clangsupport/idpaths.h
@@ -25,8 +25,7 @@
#pragma once
-#include <utils/smallstring.h>
-
+#include "projectpartid.h"
#include "filepathid.h"
namespace ClangBackEnd {
@@ -34,7 +33,7 @@ namespace ClangBackEnd {
class IdPaths
{
public:
- Utils::SmallString id;
+ ProjectPartId id;
FilePathIds filePathIds;
friend bool operator==(const IdPaths &first, const IdPaths &second)
diff --git a/src/tools/clangrefactoringbackend/source/projectpartartefact.cpp b/src/libs/clangsupport/projectpartartefact.cpp
index 7623f38796..7623f38796 100644
--- a/src/tools/clangrefactoringbackend/source/projectpartartefact.cpp
+++ b/src/libs/clangsupport/projectpartartefact.cpp
diff --git a/src/tools/clangrefactoringbackend/source/projectpartartefact.h b/src/libs/clangsupport/projectpartartefact.h
index 505326c375..ac8c44a891 100644
--- a/src/tools/clangrefactoringbackend/source/projectpartartefact.h
+++ b/src/libs/clangsupport/projectpartartefact.h
@@ -25,7 +25,9 @@
#pragma once
-#include "projectpartartefactexception.h"
+#include "clangsupport_global.h"
+#include "clangsupportexceptions.h"
+#include "projectpartid.h"
#include <utils/cpplanguage_details.h>
#include <utils/smallstringvector.h>
@@ -38,9 +40,28 @@ QT_FORWARD_DECLARE_STRUCT(QJsonParseError)
namespace ClangBackEnd {
-class ProjectPartArtefact
+class CLANGSUPPORT_EXPORT ProjectPartArtefact
{
public:
+ ProjectPartArtefact() = default;
+ ProjectPartArtefact(ProjectPartId projectPartId,
+ Utils::SmallStringVector &&toolChainArguments,
+ CompilerMacros &&compilerMacros,
+ IncludeSearchPaths &&systemIncludeSearchPaths,
+ IncludeSearchPaths &&projectIncludeSearchPaths,
+ Utils::Language language,
+ Utils::LanguageVersion languageVersion,
+ Utils::LanguageExtension languageExtension)
+ : projectPartId(projectPartId)
+ , toolChainArguments(std::move(toolChainArguments))
+ , compilerMacros(std::move(compilerMacros))
+ , systemIncludeSearchPaths(std::move(systemIncludeSearchPaths))
+ , projectIncludeSearchPaths(std::move(projectIncludeSearchPaths))
+ , language(language)
+ , languageVersion(languageVersion)
+ , languageExtension(languageExtension)
+ {}
+
ProjectPartArtefact(Utils::SmallStringView compilerArgumentsText,
Utils::SmallStringView compilerMacrosText,
Utils::SmallStringView systemIncludeSearchPathsText,
@@ -49,11 +70,11 @@ public:
int language,
int languageVersion,
int languageExtension)
- : toolChainArguments(toStringVector(compilerArgumentsText))
+ : projectPartId(projectPartId)
+ , toolChainArguments(toStringVector(compilerArgumentsText))
, compilerMacros(toCompilerMacros(compilerMacrosText))
, systemIncludeSearchPaths(toIncludeSearchPaths(systemIncludeSearchPathsText))
, projectIncludeSearchPaths(toIncludeSearchPaths(projectIncludeSearchPathsText))
- , projectPartId(projectPartId)
, language(static_cast<Utils::Language>(language))
, languageVersion(static_cast<Utils::LanguageVersion>(languageVersion))
, languageExtension(static_cast<Utils::LanguageExtension>(languageExtension))
@@ -67,11 +88,11 @@ public:
Utils::Language language,
Utils::LanguageVersion languageVersion,
Utils::LanguageExtension languageExtension)
- : toolChainArguments(toStringVector(compilerArgumentsText))
+ : projectPartId(projectPartId)
+ , toolChainArguments(toStringVector(compilerArgumentsText))
, compilerMacros(toCompilerMacros(compilerMacrosText))
, systemIncludeSearchPaths(toIncludeSearchPaths(systemIncludeSearchPathsText))
, projectIncludeSearchPaths(toIncludeSearchPaths(projectIncludeSearchPathsText))
- , projectPartId(projectPartId)
, language(language)
, languageVersion(languageVersion)
, languageExtension(languageExtension)
@@ -87,11 +108,11 @@ public:
friend bool operator==(const ProjectPartArtefact &first, const ProjectPartArtefact &second);
public:
+ ProjectPartId projectPartId;
Utils::SmallStringVector toolChainArguments;
CompilerMacros compilerMacros;
IncludeSearchPaths systemIncludeSearchPaths;
IncludeSearchPaths projectIncludeSearchPaths;
- int projectPartId = -1;
Utils::Language language = Utils::Language::Cxx;
Utils::LanguageVersion languageVersion = Utils::LanguageVersion::CXX98;
Utils::LanguageExtension languageExtension = Utils::LanguageExtension::None;
diff --git a/src/libs/clangsupport/projectpartcontainer.cpp b/src/libs/clangsupport/projectpartcontainer.cpp
index a51e927db5..680b414dc7 100644
--- a/src/libs/clangsupport/projectpartcontainer.cpp
+++ b/src/libs/clangsupport/projectpartcontainer.cpp
@@ -29,12 +29,9 @@ namespace ClangBackEnd {
QDebug operator<<(QDebug debug, const ProjectPartContainer &container)
{
- debug.nospace() << "ProjectPartContainer("
- << container.projectPartId << ","
- << container.toolChainArguments << ", "
- << container.headerPathIds << ", "
- << container.sourcePathIds
- << ")";
+ debug.nospace() << "ProjectPartContainer(" << container.projectPartId.projectPathId << ","
+ << container.toolChainArguments << ", " << container.headerPathIds << ", "
+ << container.sourcePathIds << ")";
return debug;
}
diff --git a/src/libs/clangsupport/projectpartcontainer.h b/src/libs/clangsupport/projectpartcontainer.h
index 0606591137..f1c64bd237 100644
--- a/src/libs/clangsupport/projectpartcontainer.h
+++ b/src/libs/clangsupport/projectpartcontainer.h
@@ -30,19 +30,21 @@
#include "compilermacro.h"
#include "filepathid.h"
#include "includesearchpath.h"
+#include "projectpartartefact.h"
+#include "projectpartid.h"
#include <utils/cpplanguage_details.h>
#include <utils/smallstringio.h>
namespace ClangBackEnd {
-class ProjectPartContainer
+class ProjectPartContainer : public ProjectPartArtefact
{
using uchar = unsigned char;
public:
ProjectPartContainer() = default;
- ProjectPartContainer(Utils::SmallString &&projectPartId,
- Utils::SmallStringVector &&arguments,
+ ProjectPartContainer(ProjectPartId projectPartId,
+ Utils::SmallStringVector &&toolChainArguments,
CompilerMacros &&compilerMacros,
IncludeSearchPaths &&systemIncludeSearchPaths,
IncludeSearchPaths &&projectIncludeSearchPaths,
@@ -51,18 +53,36 @@ public:
Utils::Language language,
Utils::LanguageVersion languageVersion,
Utils::LanguageExtension languageExtension)
- : projectPartId(std::move(projectPartId))
- , toolChainArguments(std::move(arguments))
- , compilerMacros(std::move(compilerMacros))
- , systemIncludeSearchPaths(std::move(systemIncludeSearchPaths))
- , projectIncludeSearchPaths(std::move(projectIncludeSearchPaths))
+ : ProjectPartArtefact(projectPartId,
+ std::move(toolChainArguments),
+ std::move(compilerMacros),
+ std::move(systemIncludeSearchPaths),
+ std::move(projectIncludeSearchPaths),
+ language,
+ languageVersion,
+ languageExtension)
, headerPathIds(std::move(headerPathIds))
, sourcePathIds(std::move(sourcePathIds))
- , language(language)
- , languageVersion(languageVersion)
- , languageExtension(languageExtension)
- {
- }
+
+ {}
+
+ ProjectPartContainer(Utils::SmallStringView compilerArgumentsText,
+ Utils::SmallStringView compilerMacrosText,
+ Utils::SmallStringView systemIncludeSearchPathsText,
+ Utils::SmallStringView projectIncludeSearchPathsText,
+ int projectPartId,
+ int language,
+ int languageVersion,
+ int languageExtension)
+ : ProjectPartArtefact(compilerArgumentsText,
+ compilerMacrosText,
+ systemIncludeSearchPathsText,
+ projectIncludeSearchPathsText,
+ projectPartId,
+ language,
+ languageVersion,
+ languageExtension)
+ {}
friend QDataStream &operator<<(QDataStream &out, const ProjectPartContainer &container)
{
@@ -146,20 +166,14 @@ public:
}
public:
- Utils::SmallString projectPartId;
- Utils::SmallStringVector toolChainArguments;
- CompilerMacros compilerMacros;
- IncludeSearchPaths systemIncludeSearchPaths;
- IncludeSearchPaths projectIncludeSearchPaths;
FilePathIds headerPathIds;
FilePathIds sourcePathIds;
- Utils::Language language = Utils::Language::Cxx;
- Utils::LanguageVersion languageVersion = Utils::LanguageVersion::CXX98;
- Utils::LanguageExtension languageExtension = Utils::LanguageExtension::None;
bool updateIsDeferred = false;
};
+using ProjectPartContainerReference = std::reference_wrapper<ProjectPartContainer>;
using ProjectPartContainers = std::vector<ProjectPartContainer>;
+using ProjectPartContainerReferences = std::vector<ProjectPartContainerReference>;
CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const ProjectPartContainer &container);
diff --git a/src/libs/clangsupport/removeprojectpartsmessage.cpp b/src/libs/clangsupport/projectpartid.h
index d76d67cc40..c372682baf 100644
--- a/src/libs/clangsupport/removeprojectpartsmessage.cpp
+++ b/src/libs/clangsupport/projectpartid.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
@@ -23,16 +23,55 @@
**
****************************************************************************/
-#include "removeprojectpartsmessage.h"
+#pragma once
+
+#include <QDataStream>
namespace ClangBackEnd {
-CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RemoveProjectPartsMessage &message)
+class ProjectPartId
{
- debug.nospace() << "RemoveProjectPartsMessage("
- << message.projectsPartIds << ")";
+public:
+ constexpr ProjectPartId() = default;
+
+ ProjectPartId(const char *) = delete;
+
+ ProjectPartId(int projectPathId)
+ : projectPathId(projectPathId)
+ {}
+
+ bool isValid() const { return projectPathId >= 0; }
+
+ friend bool operator==(ProjectPartId first, ProjectPartId second)
+ {
+ return first.isValid() && first.projectPathId == second.projectPathId;
+ }
+
+ friend bool operator!=(ProjectPartId first, ProjectPartId second) { return !(first == second); }
+
+ friend bool operator<(ProjectPartId first, ProjectPartId second)
+ {
+ return first.projectPathId < second.projectPathId;
+ }
+
+ friend QDataStream &operator<<(QDataStream &out, const ProjectPartId &projectPathId)
+ {
+ out << projectPathId.projectPathId;
+
+ return out;
+ }
+
+ friend QDataStream &operator>>(QDataStream &in, ProjectPartId &projectPathId)
+ {
+ in >> projectPathId.projectPathId;
+
+ return in;
+ }
+
+public:
+ int projectPathId = -1;
+};
- return debug;
-}
+using ProjectPartIds = std::vector<ProjectPartId>;
} // namespace ClangBackEnd
diff --git a/src/libs/clangsupport/projectpartpch.cpp b/src/libs/clangsupport/projectpartpch.cpp
index 35ab29c799..aac672441c 100644
--- a/src/libs/clangsupport/projectpartpch.cpp
+++ b/src/libs/clangsupport/projectpartpch.cpp
@@ -29,8 +29,7 @@ namespace ClangBackEnd {
QDebug operator<<(QDebug debug, const ProjectPartPch &projectPartPch)
{
- debug.nospace() << "FileContainer("
- << projectPartPch.projectPartId << ", "
+ debug.nospace() << "FileContainer(" << projectPartPch.projectPartId.projectPathId << ", "
<< projectPartPch.pchPath << ")";
return debug;
diff --git a/src/libs/clangsupport/projectpartpch.h b/src/libs/clangsupport/projectpartpch.h
index a413915b76..c471b46b16 100644
--- a/src/libs/clangsupport/projectpartpch.h
+++ b/src/libs/clangsupport/projectpartpch.h
@@ -27,8 +27,8 @@
#include "clangsupport_global.h"
-#include <utils/smallstringio.h>
#include <filepath.h>
+#include <projectpartid.h>
namespace ClangBackEnd {
@@ -36,24 +36,28 @@ class ProjectPartPch
{
public:
ProjectPartPch() = default;
- ProjectPartPch(Utils::SmallString &&projectPartId,
- FilePath &&pchPath,
- long long lastModified)
- : projectPartId(std::move(projectPartId)),
- pchPath(std::move(pchPath)),
- lastModified(lastModified)
+ ProjectPartPch(ProjectPartId projectPartId, FilePath &&pchPath, long long lastModified)
+ : projectPartId(projectPartId)
+ , pchPath(std::move(pchPath))
+ , lastModified(lastModified)
{}
- ProjectPartPch(Utils::SmallStringView pchPath,
- long long lastModified)
- : pchPath(FilePathView(pchPath)),
- lastModified(lastModified)
+ ProjectPartPch(int projectPartId, Utils::SmallStringView pchPath, long long lastModified)
+ : projectPartId(projectPartId)
+ , pchPath(FilePathView(pchPath))
+ , lastModified(lastModified)
{}
+ bool isValid() const
+ {
+ return projectPartId.isValid() && pchPath.isValid() && lastModified >= 0;
+ }
+
friend QDataStream &operator<<(QDataStream &out, const ProjectPartPch &container)
{
out << container.projectPartId;
out << container.pchPath;
+ out << container.lastModified;
return out;
}
@@ -62,6 +66,7 @@ public:
{
in >> container.projectPartId;
in >> container.pchPath;
+ in >> container.lastModified;
return in;
}
@@ -79,7 +84,7 @@ public:
}
public:
- Utils::SmallString projectPartId;
+ ProjectPartId projectPartId;
FilePath pchPath;
long long lastModified = -1;
};
diff --git a/src/libs/clangsupport/projectpartpchproviderinterface.h b/src/libs/clangsupport/projectpartpchproviderinterface.h
index 0b74bd6083..282e541cfd 100644
--- a/src/libs/clangsupport/projectpartpchproviderinterface.h
+++ b/src/libs/clangsupport/projectpartpchproviderinterface.h
@@ -39,7 +39,7 @@ public:
ProjectPartPchProviderInterface &operator=(const ProjectPartPchProviderInterface &) = delete;
virtual Utils::optional<ClangBackEnd::ProjectPartPch> projectPartPch(
- Utils::SmallStringView projectPartId) const = 0;
+ ClangBackEnd::ProjectPartId projectPartId) const = 0;
virtual const ClangBackEnd::ProjectPartPchs &projectPartPchs() const = 0;
diff --git a/src/libs/clangsupport/projectpartsstorage.h b/src/libs/clangsupport/projectpartsstorage.h
new file mode 100644
index 0000000000..c91291bca2
--- /dev/null
+++ b/src/libs/clangsupport/projectpartsstorage.h
@@ -0,0 +1,336 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 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.
+**
+****************************************************************************/
+
+#pragma once
+
+#include "clangsupportexceptions.h"
+#include "projectpartsstorageinterface.h"
+
+#include <sqliteexception.h>
+#include <sqlitetransaction.h>
+
+namespace ClangBackEnd {
+
+template<typename Database = Sqlite::Database>
+class ProjectPartsStorage final : public ProjectPartsStorageInterface
+{
+ using ReadStatement = typename Database::ReadStatement;
+ using WriteStatement = typename Database::WriteStatement;
+
+public:
+ ProjectPartsStorage(Database &database)
+ : transaction(database)
+ , database(database)
+ {
+ transaction.commit();
+ }
+
+ ProjectPartContainers fetchProjectParts() const override
+ {
+ try {
+ Sqlite::DeferredTransaction transaction{database};
+
+ auto values = fetchProjectPartsStatement.template values<ProjectPartContainer, 8>(4096);
+
+ transaction.commit();
+
+ return values;
+ } catch (const Sqlite::StatementIsBusy &) {
+ return fetchProjectParts();
+ }
+ }
+
+ FilePathIds fetchHeaders(ProjectPartId projectPartId) const
+ {
+ return fetchProjectPartsHeadersByIdStatement
+ .template values<FilePathId>(1024, projectPartId.projectPathId);
+ }
+
+ FilePathIds fetchSources(ProjectPartId projectPartId) const
+ {
+ return fetchProjectPartsSourcesByIdStatement
+ .template values<FilePathId>(1024, projectPartId.projectPathId);
+ }
+
+ ProjectPartContainers fetchProjectParts(const ProjectPartIds &projectPartIds) const override
+ {
+ try {
+ ProjectPartContainers projectParts;
+ projectParts.reserve(projectPartIds.size());
+
+ Sqlite::DeferredTransaction transaction{database};
+
+ for (ProjectPartId projectPartId : projectPartIds) {
+ auto value = fetchProjectPartByIdStatement.template value<ProjectPartContainer, 8>(
+ projectPartId.projectPathId);
+ if (value) {
+ value->headerPathIds = fetchHeaders(projectPartId);
+ value->sourcePathIds = fetchSources(projectPartId);
+ projectParts.push_back(*std::move(value));
+ }
+ }
+
+ transaction.commit();
+
+ return projectParts;
+ } catch (const Sqlite::StatementIsBusy &) {
+ return fetchProjectParts(projectPartIds);
+ }
+ }
+
+ ProjectPartId fetchProjectPartId(Utils::SmallStringView projectPartName) const override
+ {
+ try {
+ Sqlite::DeferredTransaction transaction{database};
+
+ ProjectPartId projectPartId;
+ auto optionalProjectPartId = fetchProjectPartIdStatement.template value<ProjectPartId>(
+ projectPartName);
+
+ if (optionalProjectPartId) {
+ projectPartId = *optionalProjectPartId;
+ } else {
+ insertProjectPartNameStatement.write(projectPartName);
+
+ projectPartId = static_cast<int>(database.lastInsertedRowId());
+ }
+
+ transaction.commit();
+
+ return projectPartId;
+ } catch (const Sqlite::StatementIsBusy &) {
+ return fetchProjectPartId(projectPartName);
+ }
+ }
+
+ Utils::PathString fetchProjectPartName(ProjectPartId projectPartId) const
+ {
+ try {
+ Sqlite::DeferredTransaction transaction{database};
+
+ auto optionalProjectPartName = fetchProjectPartNameStatement.template value<Utils::PathString>(
+ projectPartId.projectPathId);
+
+ transaction.commit();
+
+ if (optionalProjectPartName)
+ return *std::move(optionalProjectPartName);
+ } catch (const Sqlite::StatementIsBusy &) {
+ return fetchProjectPartName(projectPartId);
+ }
+
+ throwProjectPartDoesNotExists(projectPartId);
+ }
+
+ void insertHeaders(ProjectPartId projectPartId, const FilePathIds &headerPathIds)
+ {
+ deleteProjectPartsHeadersByIdStatement.write(projectPartId.projectPathId);
+ for (FilePathId headerPathId : headerPathIds) {
+ insertProjectPartsHeadersStatement.write(projectPartId.projectPathId,
+ headerPathId.filePathId);
+ }
+ }
+
+ void insertSources(ProjectPartId projectPartId, const FilePathIds &sourcePathIds)
+ {
+ deleteProjectPartsSourcesByIdStatement.write(projectPartId.projectPathId);
+ for (FilePathId sourcePathId : sourcePathIds) {
+ insertProjectPartsSourcesStatement.write(projectPartId.projectPathId,
+ sourcePathId.filePathId);
+ }
+ }
+
+ void updateProjectPart(ProjectPartId projectPartId,
+ const Utils::SmallStringVector &toolChainArguments,
+ const CompilerMacros &compilerMacros,
+ const IncludeSearchPaths &systemIncludeSearchPaths,
+ const IncludeSearchPaths &projectIncludeSearchPaths,
+ Utils::Language language,
+ Utils::LanguageVersion languageVersion,
+ Utils::LanguageExtension languageExtension) override
+ {
+ Utils::SmallString toolChainArgumentsAsJson = toJson(toolChainArguments);
+ Utils::SmallString compilerMacrosAsJson = toJson(compilerMacros);
+ Utils::SmallString systemIncludeSearchPathsAsJason = toJson(systemIncludeSearchPaths);
+ Utils::SmallString projectIncludeSearchPathsAsJason = toJson(projectIncludeSearchPaths);
+
+ updateProjectPartStatement.write(projectPartId.projectPathId,
+ toolChainArgumentsAsJson,
+ compilerMacrosAsJson,
+ systemIncludeSearchPathsAsJason,
+ projectIncludeSearchPathsAsJason,
+ static_cast<int>(language),
+ static_cast<int>(languageVersion),
+ static_cast<int>(languageExtension));
+ }
+
+ void updateProjectPart(const ProjectPartContainer &projectPart)
+ {
+ Utils::SmallString toolChainArgumentsAsJson = toJson(projectPart.toolChainArguments);
+ Utils::SmallString compilerMacrosAsJson = toJson(projectPart.compilerMacros);
+ Utils::SmallString systemIncludeSearchPathsAsJason = toJson(
+ projectPart.systemIncludeSearchPaths);
+ Utils::SmallString projectIncludeSearchPathsAsJason = toJson(
+ projectPart.projectIncludeSearchPaths);
+
+ updateProjectPartStatement.write(projectPart.projectPartId.projectPathId,
+ toolChainArgumentsAsJson,
+ compilerMacrosAsJson,
+ systemIncludeSearchPathsAsJason,
+ projectIncludeSearchPathsAsJason,
+ static_cast<int>(projectPart.language),
+ static_cast<int>(projectPart.languageVersion),
+ static_cast<int>(projectPart.languageExtension));
+
+ insertHeaders(projectPart.projectPartId, projectPart.headerPathIds);
+ insertSources(projectPart.projectPartId, projectPart.sourcePathIds);
+ }
+
+ void updateProjectParts(const ProjectPartContainers &projectParts) override
+ {
+ try {
+ Sqlite::ImmediateTransaction transaction{database};
+
+ for (const ProjectPartContainer &projectPart : projectParts)
+ updateProjectPart(projectPart);
+
+ transaction.commit();
+ } catch (const Sqlite::StatementIsBusy &) {
+ updateProjectParts(projectParts);
+ }
+ }
+
+ Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(FilePathId sourceId) const override
+ {
+ ReadStatement &statement = getProjectPartArtefactsBySourceId;
+
+ return statement.template value<ProjectPartArtefact, 8>(sourceId.filePathId);
+ }
+
+ Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(ProjectPartId projectPartId) const override
+ {
+ ReadStatement &statement = getProjectPartArtefactsByProjectPartId;
+
+ return statement.template value<ProjectPartArtefact, 8>(projectPartId.projectPathId);
+ }
+
+ Sqlite::TransactionInterface &transactionBackend() override { return database; }
+
+ static Utils::SmallString toJson(const Utils::SmallStringVector &strings)
+ {
+ QJsonDocument document;
+ QJsonArray array;
+
+ std::transform(strings.begin(),
+ strings.end(),
+ std::back_inserter(array),
+ [](const auto &string) { return QJsonValue(string.data()); });
+
+ document.setArray(array);
+
+ return document.toJson(QJsonDocument::Compact);
+ }
+
+ static Utils::SmallString toJson(const CompilerMacros &compilerMacros)
+ {
+ QJsonDocument document;
+ QJsonArray array;
+
+ for (const CompilerMacro &macro : compilerMacros)
+ array.push_back(QJsonArray{{QString(macro.key), QString(macro.value), macro.index}});
+
+ document.setArray(array);
+
+ return document.toJson(QJsonDocument::Compact);
+ }
+
+ static Utils::SmallString toJson(const IncludeSearchPaths &includeSearchPaths)
+ {
+ QJsonDocument document;
+ QJsonArray array;
+
+ for (const IncludeSearchPath &path : includeSearchPaths)
+ array.push_back(QJsonArray{{path.path.data(), path.index, int(path.type)}});
+
+ document.setArray(array);
+
+ return document.toJson(QJsonDocument::Compact);
+ }
+
+ [[noreturn]] void throwProjectPartDoesNotExists(ProjectPartId projectPartId) const
+ {
+ throw ProjectPartDoesNotExists("Try to fetch non existing project part id: ",
+ Utils::SmallString::number(projectPartId.projectPathId));
+ }
+
+public:
+ Sqlite::ImmediateNonThrowingDestructorTransaction transaction;
+ Database &database;
+ mutable ReadStatement fetchProjectPartIdStatement{
+ "SELECT projectPartId FROM projectParts WHERE projectPartName = ?", database};
+ mutable WriteStatement insertProjectPartNameStatement{
+ "INSERT INTO projectParts(projectPartName) VALUES (?)", database};
+ mutable ReadStatement fetchProjectPartNameStatement{
+ "SELECT projectPartName FROM projectParts WHERE projectPartId = ?", database};
+ mutable ReadStatement fetchProjectPartsStatement{
+ "SELECT toolChainArguments, compilerMacros, systemIncludeSearchPaths, "
+ "projectIncludeSearchPaths, projectPartId, language, languageVersion, languageExtension "
+ "FROM projectParts",
+ database};
+ mutable ReadStatement fetchProjectPartByIdStatement{
+ "SELECT toolChainArguments, compilerMacros, systemIncludeSearchPaths, "
+ "projectIncludeSearchPaths, projectPartId, language, languageVersion, languageExtension "
+ "FROM projectParts WHERE projectPartId = ?",
+ database};
+ WriteStatement updateProjectPartStatement{
+ "UPDATE projectParts SET toolChainArguments=?002, compilerMacros=?003, "
+ "systemIncludeSearchPaths=?004, projectIncludeSearchPaths=?005, language=?006, "
+ "languageVersion=?007, languageExtension=?008 WHERE projectPartId = ?001",
+ database};
+ mutable ReadStatement getProjectPartArtefactsBySourceId{
+ "SELECT toolChainArguments, compilerMacros, systemIncludeSearchPaths, "
+ "projectIncludeSearchPaths, projectPartId, language, languageVersion, languageExtension "
+ "FROM projectParts WHERE projectPartId = (SELECT "
+ "projectPartId FROM projectPartsFiles WHERE sourceId = ?)",
+ database};
+ mutable ReadStatement getProjectPartArtefactsByProjectPartId{
+ "SELECT toolChainArguments, compilerMacros, systemIncludeSearchPaths, "
+ "projectIncludeSearchPaths, projectPartId, language, languageVersion, languageExtension "
+ "FROM projectParts WHERE projectPartId = ?",
+ database};
+ WriteStatement deleteProjectPartsHeadersByIdStatement{
+ "DELETE FROM projectPartsHeaders WHERE projectPartId = ?", database};
+ WriteStatement deleteProjectPartsSourcesByIdStatement{
+ "DELETE FROM projectPartsSources WHERE projectPartId = ?", database};
+ WriteStatement insertProjectPartsHeadersStatement{
+ "INSERT INTO projectPartsHeaders(projectPartId, sourceId) VALUES (?,?)", database};
+ WriteStatement insertProjectPartsSourcesStatement{
+ "INSERT INTO projectPartsSources(projectPartId, sourceId) VALUES (?,?)", database};
+ mutable ReadStatement fetchProjectPartsHeadersByIdStatement{
+ "SELECT sourceId FROM projectPartsHeaders WHERE projectPartId = ?", database};
+ mutable ReadStatement fetchProjectPartsSourcesByIdStatement{
+ "SELECT sourceId FROM projectPartsSources WHERE projectPartId = ?", database};
+};
+} // namespace ClangBackEnd
diff --git a/src/libs/clangsupport/projectpartsstorageinterface.h b/src/libs/clangsupport/projectpartsstorageinterface.h
new file mode 100644
index 0000000000..1127f70b1f
--- /dev/null
+++ b/src/libs/clangsupport/projectpartsstorageinterface.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 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.
+**
+****************************************************************************/
+
+#pragma once
+
+#include <projectpartcontainer.h>
+
+#include <sqlitetransaction.h>
+#include <utils/optional.h>
+#include <utils/smallstringview.h>
+
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
+
+namespace ClangBackEnd {
+
+class ProjectPartsStorageInterface
+{
+public:
+ ProjectPartsStorageInterface() = default;
+ ProjectPartsStorageInterface(const ProjectPartsStorageInterface &) = delete;
+ ProjectPartsStorageInterface &operator=(const ProjectPartsStorageInterface &) = delete;
+
+ virtual ProjectPartContainers fetchProjectParts() const = 0;
+ virtual ProjectPartContainers fetchProjectParts(const ProjectPartIds &projectPartIds) const = 0;
+ virtual ProjectPartId fetchProjectPartId(Utils::SmallStringView projectPartName) const = 0;
+ virtual Utils::PathString fetchProjectPartName(ProjectPartId projectPartId) const = 0;
+ virtual void updateProjectPart(ProjectPartId projectPartId,
+ const Utils::SmallStringVector &commandLineArguments,
+ const CompilerMacros &compilerMacros,
+ const ClangBackEnd::IncludeSearchPaths &systemIncludeSearchPaths,
+ const ClangBackEnd::IncludeSearchPaths &projectIncludeSearchPaths,
+ Utils::Language language,
+ Utils::LanguageVersion languageVersion,
+ Utils::LanguageExtension languageExtension)
+ = 0;
+
+ virtual void updateProjectParts(const ProjectPartContainers &projectParts) = 0;
+
+ virtual Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(FilePathId sourceId) const = 0;
+ virtual Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(
+ ProjectPartId projectPartId) const = 0;
+
+ virtual Sqlite::TransactionInterface &transactionBackend() = 0;
+
+protected:
+ ~ProjectPartsStorageInterface() = default;
+};
+
+} // namespace ClangBackEnd
diff --git a/src/libs/clangsupport/refactoringdatabaseinitializer.h b/src/libs/clangsupport/refactoringdatabaseinitializer.h
index f6d64a81d3..efca925413 100644
--- a/src/libs/clangsupport/refactoringdatabaseinitializer.h
+++ b/src/libs/clangsupport/refactoringdatabaseinitializer.h
@@ -47,11 +47,13 @@ public:
createSourcesTable();
createDirectoriesTable();
createProjectPartsTable();
- createProjectPartsSourcesTable();
+ createProjectPartsFilesTable();
createUsedMacrosTable();
createFileStatusesTable();
createSourceDependenciesTable();
createPrecompiledHeadersTable();
+ createProjectPartsHeadersTable();
+ createProjectPartsSourcesTable();
transaction.commit();
@@ -135,11 +137,11 @@ public:
table.initialize(database);
}
- void createProjectPartsSourcesTable()
+ void createProjectPartsFilesTable()
{
Sqlite::Table table;
table.setUseIfNotExists(true);
- table.setName("projectPartsSources");
+ table.setName("projectPartsFiles");
const Sqlite::Column &projectPartIdColumn = table.addColumn("projectPartId", Sqlite::ColumnType::Integer);
const Sqlite::Column &sourceIdColumn = table.addColumn("sourceId", Sqlite::ColumnType::Integer);
table.addColumn("sourceType", Sqlite::ColumnType::Integer);
@@ -203,6 +205,32 @@ public:
table.initialize(database);
}
+ void createProjectPartsHeadersTable()
+ {
+ Sqlite::Table table;
+ table.setUseIfNotExists(true);
+ table.setName("projectPartsHeaders");
+ const Sqlite::Column &projectPartIdColumn = table.addColumn("projectPartId",
+ Sqlite::ColumnType::Integer);
+ table.addColumn("sourceId", Sqlite::ColumnType::Integer);
+ table.addIndex({projectPartIdColumn});
+
+ table.initialize(database);
+ }
+
+ void createProjectPartsSourcesTable()
+ {
+ Sqlite::Table table;
+ table.setUseIfNotExists(true);
+ table.setName("projectPartsSources");
+ const Sqlite::Column &projectPartIdColumn = table.addColumn("projectPartId",
+ Sqlite::ColumnType::Integer);
+ table.addColumn("sourceId", Sqlite::ColumnType::Integer);
+ table.addIndex({projectPartIdColumn});
+
+ table.initialize(database);
+ }
+
public:
DatabaseType &database;
};
diff --git a/src/libs/clangsupport/removeprojectpartsmessage.h b/src/libs/clangsupport/removeprojectpartsmessage.h
index 0aea092fea..ef80b52178 100644
--- a/src/libs/clangsupport/removeprojectpartsmessage.h
+++ b/src/libs/clangsupport/removeprojectpartsmessage.h
@@ -33,14 +33,11 @@ class RemoveProjectPartsMessage
{
public:
RemoveProjectPartsMessage() = default;
- RemoveProjectPartsMessage(Utils::SmallStringVector &&projectsPartIds)
+ RemoveProjectPartsMessage(ProjectPartIds &&projectsPartIds)
: projectsPartIds(std::move(projectsPartIds))
{}
- Utils::SmallStringVector takeProjectsPartIds()
- {
- return std::move(projectsPartIds);
- }
+ ProjectPartIds takeProjectsPartIds() { return std::move(projectsPartIds); }
friend QDataStream &operator<<(QDataStream &out, const RemoveProjectPartsMessage &message)
{
@@ -68,11 +65,9 @@ public:
}
public:
- Utils::SmallStringVector projectsPartIds;
+ ProjectPartIds projectsPartIds;
};
-CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RemoveProjectPartsMessage &message);
-
DECLARE_MESSAGE(RemoveProjectPartsMessage)
} // namespace ClangBackEnd
diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp
index 328c0f405c..7926422da6 100644
--- a/src/libs/utils/outputformatter.cpp
+++ b/src/libs/utils/outputformatter.cpp
@@ -41,7 +41,6 @@ public:
QTextCharFormat formats[NumberOfFormats];
QTextCursor cursor;
AnsiEscapeCodeHandler escapeCodeHandler;
- OutputFormat lastFormat = NumberOfFormats;
bool boldFontEnabled = true;
};
@@ -72,9 +71,8 @@ void OutputFormatter::setPlainTextEdit(QPlainTextEdit *plainText)
void OutputFormatter::appendMessage(const QString &text, OutputFormat format)
{
- if (!d->cursor.atEnd() && format != d->lastFormat)
+ if (!d->cursor.atEnd() && text.startsWith('\n'))
d->cursor.movePosition(QTextCursor::End);
- d->lastFormat = format;
appendMessage(text, d->formats[format]);
}
diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp
index dcb5edaeb1..2e039c5ec1 100644
--- a/src/plugins/clangformat/clangformatbaseindenter.cpp
+++ b/src/plugins/clangformat/clangformatbaseindenter.cpp
@@ -188,8 +188,6 @@ QByteArray dummyTextForContext(CharacterContext context, bool closingBraceBlock)
}
switch (context) {
- case CharacterContext::Unknown:
- QTC_ASSERT(false, return "";);
case CharacterContext::AfterComma:
return "a,";
case CharacterContext::NewStatement:
@@ -197,6 +195,9 @@ QByteArray dummyTextForContext(CharacterContext context, bool closingBraceBlock)
case CharacterContext::Continuation:
case CharacterContext::LastAfterComma:
return "& a &";
+ case CharacterContext::Unknown:
+ default:
+ QTC_ASSERT(false, return "";);
}
}
diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp
index 74c4165a34..61e9386282 100644
--- a/src/plugins/clangformat/clangformatutils.cpp
+++ b/src/plugins/clangformat/clangformatutils.cpp
@@ -143,27 +143,6 @@ static clang::format::FormatStyle qtcStyle()
return style;
}
-static void applyTabSettings(clang::format::FormatStyle &style, const TabSettings &settings)
-{
- style.IndentWidth = static_cast<unsigned>(settings.m_indentSize);
- style.TabWidth = static_cast<unsigned>(settings.m_tabSize);
-
- if (settings.m_tabPolicy == TabSettings::TabsOnlyTabPolicy)
- style.UseTab = FormatStyle::UT_Always;
- else if (settings.m_tabPolicy == TabSettings::SpacesOnlyTabPolicy)
- style.UseTab = FormatStyle::UT_Never;
- else
- style.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
-
- if (settings.m_continuationAlignBehavior == TabSettings::NoContinuationAlign) {
- style.ContinuationIndentWidth = 0;
- style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
- } else {
- style.ContinuationIndentWidth = style.IndentWidth;
- style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
- }
-}
-
static bool useGlobalOverriddenSettings()
{
return ClangFormatSettings::instance().overrideDefaultFile();
diff --git a/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp b/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp
index 7d564399b6..cf5aae1bde 100644
--- a/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp
+++ b/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp
@@ -31,6 +31,7 @@
#include "qtcreatorprojectupdater.h"
#include <filepathcaching.h>
+#include <projectpartsstorage.h>
#include <refactoringdatabaseinitializer.h>
#include <sqlitedatabase.h>
@@ -79,11 +80,13 @@ public:
"Creating Dependencies");
Core::ProgressManager::addTask(promise.future(), title, "dependency creation", nullptr);
}};
+ ClangBackEnd::ProjectPartsStorage<Sqlite::Database> projectPartsStorage{database};
PchManagerClient pchManagerClient{pchCreationProgressManager, dependencyCreationProgressManager};
PchManagerConnectionClient connectionClient{&pchManagerClient};
QtCreatorProjectUpdater<PchManagerProjectUpdater> projectUpdate{connectionClient.serverProxy(),
pchManagerClient,
- filePathCache};
+ filePathCache,
+ projectPartsStorage};
};
std::unique_ptr<ClangPchManagerPluginData> ClangPchManagerPlugin::d;
diff --git a/src/plugins/clangpchmanager/pchmanagerclient.cpp b/src/plugins/clangpchmanager/pchmanagerclient.cpp
index 4b0b5430d7..c26b871f50 100644
--- a/src/plugins/clangpchmanager/pchmanagerclient.cpp
+++ b/src/plugins/clangpchmanager/pchmanagerclient.cpp
@@ -44,10 +44,9 @@ void PchManagerClient::alive()
void PchManagerClient::precompiledHeadersUpdated(ClangBackEnd::PrecompiledHeadersUpdatedMessage &&message)
{
for (ClangBackEnd::ProjectPartPch &projectPartPch : message.takeProjectPartPchs()) {
- const QString projectPartId{projectPartPch.projectPartId};
const QString pchPath{projectPartPch.pchPath};
addProjectPartPch(std::move(projectPartPch));
- precompiledHeaderUpdated(projectPartId, pchPath, projectPartPch.lastModified);
+ precompiledHeaderUpdated(projectPartPch.projectPartId, pchPath, projectPartPch.lastModified);
}
}
@@ -65,11 +64,10 @@ void PchManagerClient::progress(ClangBackEnd::ProgressMessage &&message)
}
}
-void PchManagerClient::precompiledHeaderRemoved(const QString &projectPartId)
+void PchManagerClient::precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId)
{
for (auto notifier : m_notifiers) {
- Utils::SmallString id(projectPartId);
- removeProjectPartPch(id);
+ removeProjectPartPch(projectPartId);
notifier->precompiledHeaderRemoved(projectPartId);
}
}
@@ -79,7 +77,8 @@ void PchManagerClient::setConnectionClient(PchManagerConnectionClient *connectio
m_connectionClient = connectionClient;
}
-Utils::optional<ClangBackEnd::ProjectPartPch> PchManagerClient::projectPartPch(Utils::SmallStringView projectPartId) const
+Utils::optional<ClangBackEnd::ProjectPartPch> PchManagerClient::projectPartPch(
+ ClangBackEnd::ProjectPartId projectPartId) const
{
auto found = std::lower_bound(m_projectPartPchs.cbegin(),
m_projectPartPchs.cend(),
@@ -110,7 +109,7 @@ void PchManagerClient::detach(PchManagerNotifierInterface *notifierToBeDeleted)
m_notifiers.erase(newEnd, m_notifiers.end());
}
-void PchManagerClient::removeProjectPartPch(Utils::SmallStringView projectPartId)
+void PchManagerClient::removeProjectPartPch(ClangBackEnd::ProjectPartId projectPartId)
{
auto found = std::lower_bound(m_projectPartPchs.begin(),
m_projectPartPchs.end(),
@@ -145,7 +144,7 @@ const std::vector<PchManagerNotifierInterface *> &PchManagerClient::notifiers()
return m_notifiers;
}
-void PchManagerClient::precompiledHeaderUpdated(const QString &projectPartId,
+void PchManagerClient::precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId,
const QString &pchFilePath,
long long lastModified)
{
diff --git a/src/plugins/clangpchmanager/pchmanagerclient.h b/src/plugins/clangpchmanager/pchmanagerclient.h
index ccbd03299a..308370356e 100644
--- a/src/plugins/clangpchmanager/pchmanagerclient.h
+++ b/src/plugins/clangpchmanager/pchmanagerclient.h
@@ -52,21 +52,20 @@ public:
void precompiledHeadersUpdated(ClangBackEnd::PrecompiledHeadersUpdatedMessage &&message) override;
void progress(ClangBackEnd::ProgressMessage &&message) override;
- void precompiledHeaderRemoved(const QString &projectPartId);
+ void precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId);
void setConnectionClient(PchManagerConnectionClient *connectionClient);
Utils::optional<ClangBackEnd::ProjectPartPch> projectPartPch(
- Utils::SmallStringView projectPartId) const override;
+ ClangBackEnd::ProjectPartId projectPartId) const override;
const ClangBackEnd::ProjectPartPchs &projectPartPchs() const override
{
return m_projectPartPchs;
}
-unittest_public:
- const std::vector<PchManagerNotifierInterface*> &notifiers() const;
- void precompiledHeaderUpdated(const QString &projectPartId,
+ unittest_public : const std::vector<PchManagerNotifierInterface *> &notifiers() const;
+ void precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId,
const QString &pchFilePath,
long long lastModified);
@@ -74,7 +73,7 @@ unittest_public:
void detach(PchManagerNotifierInterface *notifier);
void addProjectPartPch(ClangBackEnd::ProjectPartPch &&projectPartPch);
- void removeProjectPartPch(Utils::SmallStringView projectPartId);
+ void removeProjectPartPch(ClangBackEnd::ProjectPartId projectPartId);
private:
ClangBackEnd::ProjectPartPchs m_projectPartPchs;
diff --git a/src/plugins/clangpchmanager/pchmanagernotifierinterface.h b/src/plugins/clangpchmanager/pchmanagernotifierinterface.h
index 9f9b5d56cf..04461186d6 100644
--- a/src/plugins/clangpchmanager/pchmanagernotifierinterface.h
+++ b/src/plugins/clangpchmanager/pchmanagernotifierinterface.h
@@ -27,6 +27,8 @@
#include "clangpchmanager_global.h"
+#include <projectpartid.h>
+
QT_FORWARD_DECLARE_CLASS(QString)
namespace ClangPchManager {
@@ -40,10 +42,11 @@ public:
PchManagerNotifierInterface(const PchManagerNotifierInterface &) = delete;
PchManagerNotifierInterface &operator=(const PchManagerNotifierInterface &) = delete;
- virtual void precompiledHeaderUpdated(const QString &projectPartId,
+ virtual void precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId,
const QString &pchFilePath,
- long long lastModified) = 0;
- virtual void precompiledHeaderRemoved(const QString &projectPartId) = 0;
+ long long lastModified)
+ = 0;
+ virtual void precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId) = 0;
PchManagerClient &m_pchManagerClient;
diff --git a/src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp b/src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp
index f7b925049a..38af78719e 100644
--- a/src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp
+++ b/src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp
@@ -29,20 +29,22 @@
namespace ClangPchManager {
-PchManagerProjectUpdater::PchManagerProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
- PchManagerClient &client,
- ClangBackEnd::FilePathCachingInterface &filePathCache)
- : ProjectUpdater(server, filePathCache),
- m_client(client)
+void PchManagerProjectUpdater::removeProjectParts(const ClangBackEnd::ProjectPartIds &projectPartIds)
{
+ ProjectUpdater::removeProjectParts(projectPartIds);
+
+ for (ClangBackEnd::ProjectPartId projectPartId : projectPartIds)
+ m_client.precompiledHeaderRemoved(projectPartId);
}
-void PchManagerProjectUpdater::removeProjectParts(const QStringList &projectPartIds)
+void PchManagerProjectUpdater::removeProjectParts(const QStringList &projectPartNames)
{
+ ClangBackEnd::ProjectPartIds projectPartIds = toProjectPartIds(projectPartNames);
+
ProjectUpdater::removeProjectParts(projectPartIds);
- for (const QString &projectPartiId : projectPartIds)
- m_client.precompiledHeaderRemoved(projectPartiId);
+ for (ClangBackEnd::ProjectPartId projectPartId : projectPartIds)
+ m_client.precompiledHeaderRemoved(projectPartId);
}
} // namespace ClangPchManager
diff --git a/src/plugins/clangpchmanager/pchmanagerprojectupdater.h b/src/plugins/clangpchmanager/pchmanagerprojectupdater.h
index 470e12fe4a..fd1b98eab4 100644
--- a/src/plugins/clangpchmanager/pchmanagerprojectupdater.h
+++ b/src/plugins/clangpchmanager/pchmanagerprojectupdater.h
@@ -34,9 +34,14 @@ class PchManagerProjectUpdater : public ProjectUpdater
public:
PchManagerProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
PchManagerClient &client,
- ClangBackEnd::FilePathCachingInterface &filePathCache);
+ ClangBackEnd::FilePathCachingInterface &filePathCache,
+ ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage)
+ : ProjectUpdater(server, filePathCache, projectPartsStorage)
+ , m_client(client)
+ {}
- void removeProjectParts(const QStringList &projectPartIds);
+ void removeProjectParts(const ClangBackEnd::ProjectPartIds &projectPartIds);
+ void removeProjectParts(const QStringList &projectPartNames);
private:
PchManagerClient &m_client;
diff --git a/src/plugins/clangpchmanager/projectupdater.cpp b/src/plugins/clangpchmanager/projectupdater.cpp
index 4e5cf95017..fc8db5bc07 100644
--- a/src/plugins/clangpchmanager/projectupdater.cpp
+++ b/src/plugins/clangpchmanager/projectupdater.cpp
@@ -61,13 +61,6 @@ public:
ClangBackEnd::FilePathIds sources;
};
-ProjectUpdater::ProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
- ClangBackEnd::FilePathCachingInterface &filePathCache)
- : m_server(server),
- m_filePathCache(filePathCache)
-{
-}
-
void ProjectUpdater::updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts,
Utils::SmallStringVector &&toolChainArguments)
{
@@ -75,9 +68,9 @@ void ProjectUpdater::updateProjectParts(const std::vector<CppTools::ProjectPart
toProjectPartContainers(projectParts), std::move(toolChainArguments)});
}
-void ProjectUpdater::removeProjectParts(const QStringList &projectPartIds)
+void ProjectUpdater::removeProjectParts(ClangBackEnd::ProjectPartIds projectPartIds)
{
- Utils::SmallStringVector sortedIds(projectPartIds);
+ auto sortedIds{projectPartIds};
std::sort(sortedIds.begin(), sortedIds.end());
m_server.removeProjectParts(ClangBackEnd::RemoveProjectPartsMessage{std::move(sortedIds)});
@@ -278,7 +271,12 @@ ClangBackEnd::ProjectPartContainer ProjectUpdater::toProjectPartContainer(
auto includeSearchPaths = createIncludeSearchPaths(*projectPart);
- return ClangBackEnd::ProjectPartContainer(projectPart->id(),
+ const QByteArray projectPartName = projectPart->id().toUtf8();
+
+ ClangBackEnd::ProjectPartId projectPartId = m_projectPartsStorage.fetchProjectPartId(
+ projectPartName);
+
+ return ClangBackEnd::ProjectPartContainer(projectPartId,
Utils::SmallStringVector(arguments),
createCompilerMacros(projectPart->projectMacros),
std::move(includeSearchPaths.system),
@@ -296,9 +294,6 @@ ClangBackEnd::ProjectPartContainers ProjectUpdater::toProjectPartContainers(
{
using namespace std::placeholders;
- std::vector<ClangBackEnd::ProjectPartContainer> projectPartContainers;
- projectPartContainers.reserve(projectParts.size());
-
projectParts.erase(std::remove_if(projectParts.begin(),
projectParts.end(),
[](const CppTools::ProjectPart *projectPart) {
@@ -306,6 +301,9 @@ ClangBackEnd::ProjectPartContainers ProjectUpdater::toProjectPartContainers(
}),
projectParts.end());
+ std::vector<ClangBackEnd::ProjectPartContainer> projectPartContainers;
+ projectPartContainers.reserve(projectParts.size());
+
std::transform(projectParts.begin(),
projectParts.end(),
std::back_inserter(projectPartContainers),
@@ -336,4 +334,26 @@ ClangBackEnd::FilePaths ProjectUpdater::createExcludedPaths(
return excludedPaths;
}
+QString ProjectUpdater::fetchProjectPartName(ClangBackEnd::ProjectPartId projectPartId) const
+{
+ return m_projectPartsStorage.fetchProjectPartName(projectPartId).toQString();
+}
+
+ClangBackEnd::ProjectPartIds ProjectUpdater::toProjectPartIds(
+ const QStringList &projectPartNames) const
+{
+ ClangBackEnd::ProjectPartIds projectPartIds;
+ projectPartIds.reserve(projectPartIds.size());
+
+ std::transform(projectPartNames.begin(),
+ projectPartNames.end(),
+ std::back_inserter(projectPartIds),
+ [&](const QString &projectPartName) {
+ return m_projectPartsStorage.fetchProjectPartId(
+ Utils::SmallString{projectPartName});
+ });
+
+ return projectPartIds;
+}
+
} // namespace ClangPchManager
diff --git a/src/plugins/clangpchmanager/projectupdater.h b/src/plugins/clangpchmanager/projectupdater.h
index 896a02def0..044b86f637 100644
--- a/src/plugins/clangpchmanager/projectupdater.h
+++ b/src/plugins/clangpchmanager/projectupdater.h
@@ -33,6 +33,7 @@
#include <generatedfiles.h>
#include <includesearchpath.h>
#include <projectpartcontainer.h>
+#include <projectpartsstorageinterface.h>
#include <projectexplorer/headerpath.h>
@@ -69,11 +70,16 @@ public:
};
ProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
- ClangBackEnd::FilePathCachingInterface &filePathCache);
+ ClangBackEnd::FilePathCachingInterface &filePathCache,
+ ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage)
+ : m_server(server)
+ , m_filePathCache(filePathCache)
+ , m_projectPartsStorage(projectPartsStorage)
+ {}
void updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts,
Utils::SmallStringVector &&toolChainArguments);
- void removeProjectParts(const QStringList &projectPartIds);
+ void removeProjectParts(ClangBackEnd::ProjectPartIds projectPartIds);
void updateGeneratedFiles(ClangBackEnd::V2::FileContainers &&generatedFiles);
void removeGeneratedFiles(ClangBackEnd::FilePaths &&filePaths);
@@ -88,6 +94,7 @@ public:
CppTools::ProjectPart *projectPart) const;
ClangBackEnd::ProjectPartContainers toProjectPartContainers(
std::vector<CppTools::ProjectPart *> projectParts) const;
+
void addToHeaderAndSources(HeaderAndSources &headerAndSources,
const CppTools::ProjectFile &projectFile) const;
static QStringList toolChainArguments(CppTools::ProjectPart *projectPart);
@@ -98,11 +105,16 @@ public:
static ClangBackEnd::FilePaths createExcludedPaths(
const ClangBackEnd::V2::FileContainers &generatedFiles);
+ QString fetchProjectPartName(ClangBackEnd::ProjectPartId projectPartId) const;
+
+ ClangBackEnd::ProjectPartIds toProjectPartIds(const QStringList &projectPartNames) const;
+
private:
ClangBackEnd::GeneratedFiles m_generatedFiles;
ClangBackEnd::FilePaths m_excludedPaths;
ClangBackEnd::ProjectManagementServerInterface &m_server;
ClangBackEnd::FilePathCachingInterface &m_filePathCache;
+ ClangBackEnd::ProjectPartsStorageInterface &m_projectPartsStorage;
};
} // namespace ClangPchManager
diff --git a/src/plugins/clangpchmanager/qtcreatorprojectupdater.h b/src/plugins/clangpchmanager/qtcreatorprojectupdater.h
index 4d66a2f8c3..a53bbc678a 100644
--- a/src/plugins/clangpchmanager/qtcreatorprojectupdater.h
+++ b/src/plugins/clangpchmanager/qtcreatorprojectupdater.h
@@ -55,11 +55,12 @@ class QtCreatorProjectUpdater : public ProjectUpdaterType,
public ProjectExplorer::ExtraCompilerFactoryObserver
{
public:
- template <typename ClientType>
+ template<typename ClientType>
QtCreatorProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
ClientType &client,
- ClangBackEnd::FilePathCachingInterface &filePathCache)
- : ProjectUpdaterType(server, client, filePathCache)
+ ClangBackEnd::FilePathCachingInterface &filePathCache,
+ ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage)
+ : ProjectUpdaterType(server, client, filePathCache, projectPartsStorage)
{
connectToCppModelManager();
}
@@ -78,7 +79,7 @@ public:
}
void projectPartsRemoved(const QStringList &projectPartIds)
- {
+ {
ProjectUpdaterType::removeProjectParts(projectPartIds);
}
diff --git a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp
index ea765bed5f..059eff4c78 100644
--- a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp
+++ b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp
@@ -36,6 +36,7 @@
#include <clangpchmanager/clangpchmanagerplugin.h>
#include <clangpchmanager/progressmanager.h>
#include <clangsupport/refactoringdatabaseinitializer.h>
+#include <projectpartsstorage.h>
#include <cpptools/cppmodelmanager.h>
@@ -61,6 +62,8 @@ namespace ClangRefactoring {
namespace {
+using ClangPchManager::ClangPchManagerPlugin;
+
QString backendProcessPath()
{
return Core::ICore::libexecPath()
@@ -91,14 +94,16 @@ public:
ClangBackEnd::RefactoringConnectionClient connectionClient{&refactoringClient};
QuerySqliteReadStatementFactory statementFactory{database};
SymbolQuery<QuerySqliteReadStatementFactory> symbolQuery{statementFactory};
+ ClangBackEnd::ProjectPartsStorage<Sqlite::Database> projectPartsStorage{database};
RefactoringEngine engine{connectionClient.serverProxy(), refactoringClient, filePathCache, symbolQuery};
QtCreatorSearch qtCreatorSearch;
QtCreatorClangQueryFindFilter qtCreatorfindFilter{connectionClient.serverProxy(),
qtCreatorSearch,
refactoringClient};
QtCreatorRefactoringProjectUpdater projectUpdate{connectionClient.serverProxy(),
- ClangPchManager::ClangPchManagerPlugin::pchManagerClient(),
- filePathCache};
+ ClangPchManagerPlugin::pchManagerClient(),
+ filePathCache,
+ projectPartsStorage};
};
ClangRefactoringPlugin::ClangRefactoringPlugin()
diff --git a/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp b/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp
index f3ca992620..dea3ccfeec 100644
--- a/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp
+++ b/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp
@@ -60,10 +60,16 @@ std::vector<ClangBackEnd::V2::FileContainer> createGeneratedFiles()
}
}
-QtCreatorRefactoringProjectUpdater::QtCreatorRefactoringProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
- ClangPchManager::PchManagerClient &pchManagerClient,
- ClangBackEnd::FilePathCachingInterface &filePathCache)
- : RefactoringProjectUpdater(server, pchManagerClient, *cppModelManager(), filePathCache)
+QtCreatorRefactoringProjectUpdater::QtCreatorRefactoringProjectUpdater(
+ ClangBackEnd::ProjectManagementServerInterface &server,
+ ClangPchManager::PchManagerClient &pchManagerClient,
+ ClangBackEnd::FilePathCachingInterface &filePathCache,
+ ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage)
+ : RefactoringProjectUpdater(server,
+ pchManagerClient,
+ *cppModelManager(),
+ filePathCache,
+ projectPartsStorage)
{
connectToCppModelManager();
}
diff --git a/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h b/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h
index 118c15b50c..85d635a3af 100644
--- a/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h
+++ b/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h
@@ -32,9 +32,11 @@ namespace ClangRefactoring {
class QtCreatorRefactoringProjectUpdater final : public RefactoringProjectUpdater
{
public:
- QtCreatorRefactoringProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
- ClangPchManager::PchManagerClient &pchManagerClient,
- ClangBackEnd::FilePathCachingInterface &filePathCache);
+ QtCreatorRefactoringProjectUpdater(
+ ClangBackEnd::ProjectManagementServerInterface &server,
+ ClangPchManager::PchManagerClient &pchManagerClient,
+ ClangBackEnd::FilePathCachingInterface &filePathCache,
+ ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage);
private:
void abstractEditorUpdated(const QString &filePath, const QByteArray &contents);
diff --git a/src/plugins/clangrefactoring/refactoringprojectupdater.cpp b/src/plugins/clangrefactoring/refactoringprojectupdater.cpp
index 99b028e522..8cfd5b942a 100644
--- a/src/plugins/clangrefactoring/refactoringprojectupdater.cpp
+++ b/src/plugins/clangrefactoring/refactoringprojectupdater.cpp
@@ -26,19 +26,22 @@
#include "refactoringprojectupdater.h"
#include <cpptools/cppmodelmanager.h>
+#include <projectpartsstorageinterface.h>
namespace ClangRefactoring {
-void RefactoringProjectUpdater::precompiledHeaderUpdated(const QString &projectPartId,
+void RefactoringProjectUpdater::precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId,
const QString &,
long long)
{
- auto projectPart = m_cppModelManager.projectPartForId(projectPartId);
+ const QString projectPartName = fetchProjectPartName(projectPartId);
+
+ auto projectPart = m_cppModelManager.projectPartForId(projectPartName);
if (projectPart)
updateProjectParts({projectPart.data()}, {});
}
-void RefactoringProjectUpdater::precompiledHeaderRemoved(const QString &projectPartId)
+void RefactoringProjectUpdater::precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId)
{
removeProjectParts({projectPartId});
}
diff --git a/src/plugins/clangrefactoring/refactoringprojectupdater.h b/src/plugins/clangrefactoring/refactoringprojectupdater.h
index 8e2652cf23..a9559ef94e 100644
--- a/src/plugins/clangrefactoring/refactoringprojectupdater.h
+++ b/src/plugins/clangrefactoring/refactoringprojectupdater.h
@@ -39,18 +39,18 @@ public:
RefactoringProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
ClangPchManager::PchManagerClient &pchManagerClient,
CppTools::CppModelManagerInterface &cppModelManager,
- ClangBackEnd::FilePathCachingInterface &filePathCache)
- : ClangPchManager::ProjectUpdater(server, filePathCache),
- ClangPchManager::PchManagerNotifierInterface(pchManagerClient),
- m_cppModelManager(cppModelManager)
+ ClangBackEnd::FilePathCachingInterface &filePathCache,
+ ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage)
+ : ClangPchManager::ProjectUpdater(server, filePathCache, projectPartsStorage)
+ , ClangPchManager::PchManagerNotifierInterface(pchManagerClient)
+ , m_cppModelManager(cppModelManager)
{
-
}
- void precompiledHeaderUpdated(const QString &projectPartId,
+ void precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId,
const QString &pchFilePath,
long long lastModified) override;
- void precompiledHeaderRemoved(const QString &projectPartId) override;
+ void precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId) override;
private:
CppTools::CppModelManagerInterface &m_cppModelManager;
diff --git a/src/plugins/coreplugin/fancytabwidget.cpp b/src/plugins/coreplugin/fancytabwidget.cpp
index 8ce0cfb199..e46a7e70aa 100644
--- a/src/plugins/coreplugin/fancytabwidget.cpp
+++ b/src/plugins/coreplugin/fancytabwidget.cpp
@@ -598,7 +598,7 @@ void FancyTabWidget::addCornerWidget(QWidget *widget)
int FancyTabWidget::currentIndex() const
{
- return m_tabBar->currentIndex();
+ return m_modesStack->currentIndex();
}
QStatusBar *FancyTabWidget::statusBar() const
diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp
index 4a7fb5d4a3..f2b3869f9b 100644
--- a/src/plugins/debugger/debuggeritemmanager.cpp
+++ b/src/plugins/debugger/debuggeritemmanager.cpp
@@ -700,7 +700,7 @@ void DebuggerItemManagerPrivate::autoDetectCdbDebuggers()
void DebuggerItemManagerPrivate::autoDetectGdbOrLldbDebuggers()
{
const QStringList filters = {"gdb-i686-pc-mingw32", "gdb-i686-pc-mingw32.exe", "gdb",
- "gdb.exe", "lldb", "lldb.exe", "lldb-*"};
+ "gdb.exe", "lldb", "lldb.exe", "lldb-[1-9]*"};
// DebuggerItem result;
// result.setAutoDetected(true);
@@ -746,14 +746,8 @@ void DebuggerItemManagerPrivate::autoDetectGdbOrLldbDebuggers()
dir.setFilter(QDir::Files | QDir::Executable);
foreach (const Utils::FileName &base, path) {
dir.setPath(base.toFileInfo().absoluteFilePath());
- foreach (const QString &entry, dir.entryList()) {
- if (entry.startsWith("lldb-platform-")
- || entry.startsWith("lldb-gdbserver-")
- || entry.startsWith("lldb-mi-")) {
- continue;
- }
+ foreach (const QString &entry, dir.entryList())
suspects.append(FileName::fromString(dir.absoluteFilePath(entry)));
- }
}
foreach (const FileName &command, suspects) {
diff --git a/src/plugins/fakevim/fakevimactions.cpp b/src/plugins/fakevim/fakevimactions.cpp
index fbb7556eef..007d9fcf5a 100644
--- a/src/plugins/fakevim/fakevimactions.cpp
+++ b/src/plugins/fakevim/fakevimactions.cpp
@@ -108,7 +108,7 @@ FakeVimSettings::FakeVimSettings()
createAction(ConfigTildeOp, false, "TildeOp", "top");
createAction(ConfigShowCmd, true, "ShowCmd", "sc");
createAction(ConfigRelativeNumber, false, "RelativeNumber", "rnu");
- createAction(ConfigBlinkingCursor, false, "BlinkingCursor", "cb");
+ createAction(ConfigBlinkingCursor, false, "BlinkingCursor", "bc");
createAction(ConfigScrollOff, 0, "ScrollOff", "so");
createAction(ConfigBackspace, QString("indent,eol,start"), "ConfigBackspace", "bs");
createAction(ConfigIsKeyword, QString("@,48-57,_,192-255,a-z,A-Z"), "IsKeyword", "isk");
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 8dac609897..550a8489e4 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1208,7 +1208,7 @@ void GitClient::reset(const QString &workingDirectory, const QString &argument,
if (!commit.isEmpty())
arguments << commit;
- unsigned flags = 0;
+ unsigned flags = VcsCommand::ShowSuccessMessage;
if (argument == "--hard") {
if (gitStatus(workingDirectory, StatusMode(NoUntracked | NoSubmodules)) != StatusUnchanged) {
if (QMessageBox::question(
diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp
index a486fb837e..f801f4cfe8 100644
--- a/src/plugins/pythoneditor/pythoneditorplugin.cpp
+++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp
@@ -334,7 +334,7 @@ static QStringList readLines(const Utils::FileName &projectFile)
QTextStream stream(&file);
while (true) {
- QString line = stream.readLine();
+ const QString line = stream.readLine();
if (line.isNull())
break;
if (visited.contains(line))
@@ -382,8 +382,8 @@ static QStringList readLinesJson(const Utils::FileName &projectFile,
const QJsonObject obj = doc.object();
if (obj.contains("files")) {
- QJsonValue files = obj.value("files");
- QJsonArray files_array = files.toArray();
+ const QJsonValue files = obj.value("files");
+ const QJsonArray files_array = files.toArray();
QSet<QString> visited;
for (const auto &file : files_array)
visited.insert(file.toString());
@@ -396,7 +396,7 @@ static QStringList readLinesJson(const Utils::FileName &projectFile,
bool PythonProject::saveRawFileList(const QStringList &rawFileList)
{
- bool result = saveRawList(rawFileList, projectFilePath().toString());
+ const bool result = saveRawList(rawFileList, projectFilePath().toString());
// refresh(PythonProject::Files);
return result;
}
@@ -463,7 +463,7 @@ bool PythonProject::addFiles(const QStringList &filePaths)
{
QStringList newList = m_rawFileList;
- QDir baseDir(projectDirectory().toString());
+ const QDir baseDir(projectDirectory().toString());
for (const QString &filePath : filePaths)
newList.append(baseDir.relativeFilePath(filePath));
@@ -475,7 +475,7 @@ bool PythonProject::removeFiles(const QStringList &filePaths)
QStringList newList = m_rawFileList;
for (const QString &filePath : filePaths) {
- QHash<QString, QString>::iterator i = m_rawListEntries.find(filePath);
+ const QHash<QString, QString>::iterator i = m_rawListEntries.find(filePath);
if (i != m_rawListEntries.end())
newList.removeOne(i.value());
}
@@ -486,7 +486,7 @@ bool PythonProject::removeFiles(const QStringList &filePaths)
bool PythonProject::setFiles(const QStringList &filePaths)
{
QStringList newList;
- QDir baseDir(projectDirectory().toString());
+ const QDir baseDir(projectDirectory().toString());
for (const QString &filePath : filePaths)
newList.append(baseDir.relativeFilePath(filePath));
@@ -497,11 +497,11 @@ bool PythonProject::renameFile(const QString &filePath, const QString &newFilePa
{
QStringList newList = m_rawFileList;
- QHash<QString, QString>::iterator i = m_rawListEntries.find(filePath);
+ const QHash<QString, QString>::iterator i = m_rawListEntries.find(filePath);
if (i != m_rawListEntries.end()) {
- int index = newList.indexOf(i.value());
+ const int index = newList.indexOf(i.value());
if (index != -1) {
- QDir baseDir(projectDirectory().toString());
+ const QDir baseDir(projectDirectory().toString());
newList.replace(index, baseDir.relativeFilePath(newFilePath));
}
}
@@ -550,12 +550,13 @@ void PythonProject::refresh(Target *target)
emitParsingStarted();
parseProject();
- QDir baseDir(projectDirectory().toString());
+ const QDir baseDir(projectDirectory().toString());
BuildTargetInfoList appTargets;
auto newRoot = std::make_unique<PythonProjectNode>(this);
- for (const QString &f : m_files) {
+ for (const QString &f : qAsConst(m_files)) {
const QString displayName = baseDir.relativeFilePath(f);
- FileType fileType = f.endsWith(".pyproject") || f.endsWith(".pyqtc") ? FileType::Project : FileType::Source;
+ const FileType fileType = f.endsWith(".pyproject") || f.endsWith(".pyqtc") ? FileType::Project
+ : FileType::Source;
newRoot->addNestedNode(std::make_unique<PythonFileNode>(FileName::fromString(f),
displayName, fileType));
if (fileType == FileType::Source) {
@@ -659,8 +660,8 @@ QHash<QString, QStringList> sortFilesIntoPaths(const QString &base, const QSet<Q
const QDir baseDir(base);
for (const QString &absoluteFileName : files) {
- QFileInfo fileInfo(absoluteFileName);
- FileName absoluteFilePath = FileName::fromString(fileInfo.path());
+ const QFileInfo fileInfo(absoluteFileName);
+ const FileName absoluteFilePath = FileName::fromString(fileInfo.path());
QString relativeFilePath;
if (absoluteFilePath.isChildOf(baseDir)) {
diff --git a/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp
index 4a9147ae4e..62f7f315ce 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp
@@ -117,6 +117,9 @@ QString filterMetaIcons(const QString &fileName)
QModelIndex CustomFileSystemModel::setRootPath(const QString &newPath)
{
+ if (m_fileSystemModel->rootPath() == newPath)
+ return QAbstractListModel::index(0, 0);
+
beginResetModel();
m_fileSystemModel->setRootPath(newPath);
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
index d4dea983c0..8dd1c0727e 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
@@ -431,11 +431,18 @@ void ItemLibraryWidget::addResources()
filters.prepend(tr("All Files (%1)").arg(map.values().join(" ")));
+ static QString lastDir;
+ const QString currentDir = lastDir.isEmpty() ? document->fileName().parentDir().toString() : lastDir;
+
const auto fileNames = QFileDialog::getOpenFileNames(this,
tr("Add Resources"),
- document->fileName().parentDir().toString(),
+ currentDir,
filters.join(";;"));
+
+ if (!fileNames.isEmpty())
+ lastDir = QFileInfo(fileNames.first()).absolutePath();
+
QMultiMap<QString, QString> partitionedFileNames;
for (const QString &fileName : fileNames) {
diff --git a/src/plugins/qmldesigner/designercore/include/qmltimeline.h b/src/plugins/qmldesigner/designercore/include/qmltimeline.h
index c04fd454c0..59342bcb04 100644
--- a/src/plugins/qmldesigner/designercore/include/qmltimeline.h
+++ b/src/plugins/qmldesigner/designercore/include/qmltimeline.h
@@ -72,6 +72,7 @@ public:
void resetGroupRecording() const;
bool hasKeyframeGroup(const ModelNode &node, const PropertyName &propertyName) const;
+ bool hasKeyframeGroupForTarget(const ModelNode &node) const;
private:
void addKeyframeGroupIfNotExists(const ModelNode &node, const PropertyName &propertyName);
diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h
index 6a69764dbe..a1513128d7 100644
--- a/src/plugins/qmldesigner/designercore/include/rewriterview.h
+++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h
@@ -187,7 +187,7 @@ protected: // functions
void notifyErrorsAndWarnings(const QList<DocumentMessage> &errors);
private: //variables
- ModelNode nodeAtTextCursorPositionRekursive(const ModelNode &root, int cursorPosition) const;
+ ModelNode nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const;
void setupCanonicalHashes() const;
TextModifier *m_textModifier = nullptr;
diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
index 7c5ee2f7aa..4251dd96c3 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp
@@ -45,7 +45,7 @@ public:
int majorVersion{-1};
int minorVersion{-1};
QString libraryEntryIconPath;
- QIcon typeIcon;
+ QIcon typeIcon = QIcon(":/ItemLibrary/images/item-default-icon.png");
QList<PropertyContainer> properties;
QString qml;
QString qmlSource;
diff --git a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp
index e484848261..a687853604 100644
--- a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp
@@ -280,6 +280,19 @@ bool QmlTimeline::hasKeyframeGroup(const ModelNode &node, const PropertyName &pr
return false;
}
+bool QmlTimeline::hasKeyframeGroupForTarget(const ModelNode &node) const
+{
+ if (!isValid())
+ return false;
+
+ for (const QmlTimelineKeyframeGroup &frames : allKeyframeGroups()) {
+ if (frames.target().isValid() && frames.target() == node)
+ return true;
+ }
+
+ return false;
+}
+
QList<QmlTimelineKeyframeGroup> QmlTimeline::allKeyframeGroups() const
{
QList<QmlTimelineKeyframeGroup> returnList;
diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
index 2b22844bb9..bbd5fad60a 100644
--- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
@@ -390,7 +390,7 @@ void RewriterView::deactivateTextMofifierChangeSignals()
textModifier()->deactivateChangeSignals();
}
-void RewriterView::auxiliaryDataChanged(const ModelNode &, const PropertyName &name, const QVariant &)
+void RewriterView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &)
{
if (m_restoringAuxData)
return;
@@ -401,6 +401,11 @@ void RewriterView::auxiliaryDataChanged(const ModelNode &, const PropertyName &n
if (name.endsWith("@Internal"))
return;
+ if (node.isRootNode()) {
+ if (name == "width" || name == "height" || name == "autoSize")
+ return;
+ }
+
m_textModifier->textDocument()->setModified(true);
}
@@ -686,39 +691,36 @@ static bool isInNodeDefinition(int nodeTextOffset, int nodeTextLength, int curso
return (nodeTextOffset <= cursorPosition) && (nodeTextOffset + nodeTextLength > cursorPosition);
}
-ModelNode RewriterView::nodeAtTextCursorPositionRekursive(const ModelNode &root, int cursorPosition) const
+ModelNode RewriterView::nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const
{
- ModelNode node = root;
-
- int lastOffset = -1;
-
- bool sorted = true;
+ using myPair = std::pair<ModelNode,int>;
+ std::vector<myPair> data;
- if (!root.nodeProperties().isEmpty())
- sorted = false;
+ for (const ModelNode &node : allModelNodes()) {
+ int offset = nodeOffset(node);
+ if (offset > 0)
+ data.emplace_back(std::make_pair(node, offset));
+ }
- foreach (const ModelNode &currentNode, node.directSubModelNodes()) {
- const int offset = nodeOffset(currentNode);
+ std::sort(data.begin(), data.end(), [](myPair a, myPair b) {
+ return a.second < b.second;
+ });
- if (offset < cursorPosition && offset > lastOffset) {
- node = nodeAtTextCursorPositionRekursive(currentNode, cursorPosition);
- lastOffset = offset;
- } else {
- if (sorted)
- break;
- }
- }
+ ModelNode lastNode = root;
- const int nodeTextLength = nodeLength(node);
- const int nodeTextOffset = nodeOffset(node);
+ for (const myPair &pair : data) {
+ ModelNode node = pair.first;
- if (nodeTextLength < 0)
- return ModelNode();
+ const int nodeTextLength = nodeLength(node);
+ const int nodeTextOffset = nodeOffset(node);
- if (isInNodeDefinition(nodeTextOffset, nodeTextLength, cursorPosition))
- return node;
+ if (isInNodeDefinition(nodeTextOffset, nodeTextLength, cursorPosition))
+ lastNode = node;
+ else if (nodeTextOffset > cursorPosition)
+ break;
+ }
- return root;
+ return lastNode;
}
void RewriterView::setupCanonicalHashes() const
@@ -749,7 +751,7 @@ void RewriterView::setupCanonicalHashes() const
ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const
{
- return nodeAtTextCursorPositionRekursive(rootModelNode(), cursorPosition);
+ return nodeAtTextCursorPositionHelper(rootModelNode(), cursorPosition);
}
bool RewriterView::renameId(const QString& oldId, const QString& newId)
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
index c5e9b284f1..c86336d550 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
@@ -76,7 +76,8 @@ bool isSupportedAttachedProperties(const QString &propertyName)
QStringList supportedVersionsList()
{
static const QStringList list = {
- "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12"
+ "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9",
+ "2.10", "2.11", "2.12", "2.13"
};
return list;
}
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp
index 7fc378f2ea..09cd8ee453 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp
@@ -73,8 +73,15 @@ TimelineAnimationForm::TimelineAnimationForm(QWidget *parent)
connect(ui->idLineEdit, &QLineEdit::editingFinished, [this]() {
QTC_ASSERT(m_timeline.isValid(), return );
+ static QString lastString;
+
const QString newId = ui->idLineEdit->text();
+ if (lastString == newId)
+ return;
+
+ lastString = newId;
+
if (newId == animation().id())
return;
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp
index f2e6761821..682a14f1c7 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp
@@ -56,6 +56,9 @@ FloatControl::FloatControl()
setValue(0.0);
setButtonSymbols(QAbstractSpinBox::NoButtons);
setFrame(false);
+#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
+ setStepType(QAbstractSpinBox::AdaptiveDecimalStepType);
+#endif
setMinimum(std::numeric_limits<float>::lowest());
setMaximum(std::numeric_limits<float>::max());
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp
index 4f52ecd562..3c1c3950dd 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp
@@ -52,7 +52,17 @@ TimelineForm::TimelineForm(QWidget *parent)
connect(ui->expressionBindingLineEdit, &QLineEdit::editingFinished, [this]() {
QTC_ASSERT(m_timeline.isValid(), return );
- if (ui->expressionBindingLineEdit->text().isEmpty()) {
+
+ static QString lastString;
+
+ const QString bindingText = ui->expressionBindingLineEdit->text();
+
+ if (bindingText == lastString)
+ return;
+
+ lastString = bindingText;
+
+ if (bindingText.isEmpty()) {
ui->animation->setChecked(true);
try {
m_timeline.modelNode().removeProperty("currentFrame");
@@ -67,7 +77,7 @@ TimelineForm::TimelineForm(QWidget *parent)
try {
m_timeline.modelNode()
.bindingProperty("currentFrame")
- .setExpression(ui->expressionBindingLineEdit->text());
+ .setExpression(bindingText);
} catch (const Exception &e) {
e.showException();
}
@@ -76,8 +86,15 @@ TimelineForm::TimelineForm(QWidget *parent)
connect(ui->idLineEdit, &QLineEdit::editingFinished, [this]() {
QTC_ASSERT(m_timeline.isValid(), return );
+ static QString lastString;
+
const QString newId = ui->idLineEdit->text();
+ if (newId == lastString)
+ return;
+
+ lastString = newId;
+
if (newId == m_timeline.modelNode().id())
return;
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp
index c84923f7c2..af0f26d249 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp
@@ -154,4 +154,9 @@ int TimelineGraphicsLayout::maximumScrollValue() const
return std::round(qMax(maxr, 0.0));
}
+void TimelineGraphicsLayout::activate()
+{
+ m_layout->activate();
+}
+
} // End namespace QmlDesigner.
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h
index 192682f646..d5b7c4debc 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h
@@ -72,6 +72,8 @@ public:
int maximumScrollValue() const;
+ void activate();
+
private:
QGraphicsLinearLayout *m_layout = nullptr;
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp
index 8ef0448207..eb09492397 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp
@@ -698,6 +698,11 @@ void TimelineGraphicsScene::deleteKeyframes(const QList<ModelNode> &frames)
}
}
+void TimelineGraphicsScene::activateLayout()
+{
+ m_layout->activate();
+}
+
void TimelineGraphicsScene::emitScrollOffsetChanged()
{
for (QGraphicsItem *item : items())
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h
index 670ed06feb..b8f93595c4 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h
@@ -137,6 +137,8 @@ public:
void deleteKeyframeGroup(const ModelNode &group);
void deleteKeyframes(const QList<ModelNode> &frames);
+ void activateLayout();
+
signals:
void statusBarMessageChanged(const QString &message);
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp
index f4cab3aa05..7cb9760a51 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp
@@ -443,6 +443,7 @@ void TimelineSectionItem::invalidateHeight()
setPreferredHeight(height);
setMinimumHeight(height);
setMaximumHeight(height);
+ timelineScene()->activateLayout();
}
void TimelineSectionItem::invalidateProperties()
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp
index c66264ffbc..653ed27ba7 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp
@@ -26,6 +26,8 @@
#include "timelineview.h"
#include "easingcurve.h"
+#include "timelineactions.h"
+#include "timelineconstants.h"
#include "timelinecontext.h"
#include "timelinewidget.h"
@@ -33,18 +35,22 @@
#include "timelinesettingsdialog.h"
#include "timelinetoolbar.h"
+#include <bindingproperty.h>
#include <exception.h>
+#include <modelnodecontextmenu_helper.h>
#include <nodeabstractproperty.h>
#include <nodelistproperty.h>
#include <nodemetainfo.h>
#include <rewritertransaction.h>
#include <variantproperty.h>
#include <qmldesignericons.h>
+#include <qmldesignerplugin.h>
#include <qmlitemnode.h>
#include <qmlobjectnode.h>
#include <qmlstate.h>
#include <qmltimeline.h>
#include <qmltimelinekeyframegroup.h>
+#include <viewmanager.h>
#include <coreplugin/icore.h>
@@ -55,6 +61,8 @@
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
+#include <QTimer>
+
namespace QmlDesigner {
TimelineView::TimelineView(QObject *parent)
@@ -97,6 +105,21 @@ void TimelineView::nodeAboutToBeRemoved(const ModelNode &removedNode)
m_timelineWidget->graphicsScene()->clearTimeline();
if (lastId != currentId)
m_timelineWidget->setTimelineId(currentId);
+ } else if (removedNode.parentProperty().isValid()
+ && QmlTimeline::isValidQmlTimeline(removedNode.parentProperty().parentModelNode())) {
+ if (removedNode.hasBindingProperty("target")) {
+ const ModelNode target = removedNode.bindingProperty("target").resolveToModelNode();
+ if (target.isValid()) {
+ QmlTimeline timeline(removedNode.parentProperty().parentModelNode());
+ if (timeline.hasKeyframeGroupForTarget(target))
+ QTimer::singleShot(0, [this, target, timeline]() {
+ if (timeline.hasKeyframeGroupForTarget(target))
+ m_timelineWidget->graphicsScene()->invalidateSectionForTarget(target);
+ else
+ m_timelineWidget->graphicsScene()->invalidateScene();
+ });
+ }
+ }
}
}
}
@@ -110,9 +133,6 @@ void TimelineView::nodeRemoved(const ModelNode & /*removedNode*/,
parentProperty.parentModelNode())) {
QmlTimelineKeyframeGroup frames(parentProperty.parentModelNode());
m_timelineWidget->graphicsScene()->invalidateSectionForTarget(frames.target());
- } else if (parentProperty.isValid()
- && QmlTimeline::isValidQmlTimeline(parentProperty.parentModelNode())) {
- m_timelineWidget->graphicsScene()->invalidateScene();
}
}
@@ -471,6 +491,98 @@ QmlModelState TimelineView::stateForTimeline(const QmlTimeline &timeline)
return QmlModelState();
}
+void TimelineView::registerActions()
+{
+ auto &actionManager = QmlDesignerPlugin::instance()->viewManager().designerActionManager();
+
+ SelectionContextPredicate timelineEnabled = [this](const SelectionContext &context) {
+ return context.singleNodeIsSelected()
+ && widget()->graphicsScene()->currentTimeline().isValid();
+ };
+
+ SelectionContextPredicate timelineHasKeyframes =
+ [this](const SelectionContext &context) {
+ auto timeline = widget()->graphicsScene()->currentTimeline();
+ return !timeline.keyframeGroupsForTarget(context.currentSingleSelectedNode()).isEmpty();
+ };
+
+ SelectionContextPredicate timelineHasClipboard = [](const SelectionContext &context) {
+ return !context.fastUpdate() && TimelineActions::clipboardContainsKeyframes();
+ };
+
+ SelectionContextOperation deleteKeyframes = [this](const SelectionContext &context) {
+ auto mutator = widget()->graphicsScene()->currentTimeline();
+ if (mutator.isValid())
+ TimelineActions::deleteAllKeyframesForTarget(context.currentSingleSelectedNode(),
+ mutator);
+ };
+
+ SelectionContextOperation insertKeyframes = [this](const SelectionContext &context) {
+ auto mutator = widget()->graphicsScene()->currentTimeline();
+ if (mutator.isValid())
+ TimelineActions::insertAllKeyframesForTarget(context.currentSingleSelectedNode(),
+ mutator);
+ };
+
+ SelectionContextOperation copyKeyframes = [this](const SelectionContext &context) {
+ auto mutator = widget()->graphicsScene()->currentTimeline();
+ if (mutator.isValid())
+ TimelineActions::copyAllKeyframesForTarget(context.currentSingleSelectedNode(), mutator);
+ };
+
+ SelectionContextOperation pasteKeyframes = [this](const SelectionContext &context) {
+ auto mutator = widget()->graphicsScene()->currentTimeline();
+ if (mutator.isValid())
+ TimelineActions::pasteKeyframesToTarget(context.currentSingleSelectedNode(), mutator);
+ };
+
+ actionManager.addDesignerAction(new ActionGroup(TimelineConstants::timelineCategoryDisplayName,
+ TimelineConstants::timelineCategory,
+ TimelineConstants::priorityTimelineCategory,
+ timelineEnabled,
+ &SelectionContextFunctors::always));
+
+ actionManager.addDesignerAction(
+ new ModelNodeContextMenuAction("commandId timeline delete",
+ TimelineConstants::timelineDeleteKeyframesDisplayName,
+ {},
+ TimelineConstants::timelineCategory,
+ QKeySequence(),
+ 160,
+ deleteKeyframes,
+ timelineHasKeyframes));
+
+ actionManager.addDesignerAction(
+ new ModelNodeContextMenuAction("commandId timeline insert",
+ TimelineConstants::timelineInsertKeyframesDisplayName,
+ {},
+ TimelineConstants::timelineCategory,
+ QKeySequence(),
+ 140,
+ insertKeyframes,
+ timelineHasKeyframes));
+
+ actionManager.addDesignerAction(
+ new ModelNodeContextMenuAction("commandId timeline copy",
+ TimelineConstants::timelineCopyKeyframesDisplayName,
+ {},
+ TimelineConstants::timelineCategory,
+ QKeySequence(),
+ 120,
+ copyKeyframes,
+ timelineHasKeyframes));
+
+ actionManager.addDesignerAction(
+ new ModelNodeContextMenuAction("commandId timeline paste",
+ TimelineConstants::timelinePasteKeyframesDisplayName,
+ {},
+ TimelineConstants::timelineCategory,
+ QKeySequence(),
+ 100,
+ pasteKeyframes,
+ timelineHasClipboard));
+}
+
TimelineWidget *TimelineView::createWidget()
{
if (!m_timelineWidget)
diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h
index 14a49185a4..057ff3047b 100644
--- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h
+++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h
@@ -88,6 +88,8 @@ public:
QmlTimeline timelineForState(const ModelNode &state) const;
QmlModelState stateForTimeline(const QmlTimeline &timeline);
+ void registerActions();
+
private:
TimelineWidget *createWidget();
TimelineWidget *m_timelineWidget = nullptr;
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp
index 84b95cccc3..42fd9fbefa 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.cpp
+++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp
@@ -194,8 +194,12 @@ bool QmlDesignerPlugin::delayedInitialize()
d->settings.fromSettings(Core::ICore::settings());
d->viewManager.registerViewTakingOwnership(new QmlDesigner::Internal::ConnectionView);
- if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool())
- d->viewManager.registerViewTakingOwnership(new QmlDesigner::TimelineView);
+ if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()) {
+ auto timelineView = new QmlDesigner::TimelineView;
+ d->viewManager.registerViewTakingOwnership(timelineView);
+ timelineView->registerActions();
+ }
+
d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::SourceTool);
d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::ColorTool);
d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::TextTool);
diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp
index 0995256d5f..c52be65ad5 100644
--- a/src/plugins/qtsupport/baseqtversion.cpp
+++ b/src/plugins/qtsupport/baseqtversion.cpp
@@ -343,6 +343,12 @@ QSet<Id> BaseQtVersion::availableFeatures() const
if (qtVersion().matches(5, 12))
return features;
+ features.unite(versionedIds(Constants::FEATURE_QT_QUICK_PREFIX, 2, 13));
+ features.unite(versionedIds(Constants::FEATURE_QT_QUICK_CONTROLS_2_PREFIX, 2, 13));
+
+ if (qtVersion().matches(5, 13))
+ return features;
+
return features;
}
diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp
index fd98b62bba..a4fc9cbdd4 100644
--- a/src/plugins/vcsbase/vcsoutputwindow.cpp
+++ b/src/plugins/vcsbase/vcsoutputwindow.cpp
@@ -243,6 +243,8 @@ void OutputWindowPlainTextEdit::appendLinesWithStyle(const QString &s,
void OutputWindowPlainTextEdit::setFormat(VcsOutputWindow::MessageStyle style)
{
+ m_formatter->setBoldFontEnabled(style == VcsOutputWindow::Command);
+
switch (style) {
case VcsOutputWindow::Warning:
m_format = LogMessageFormat;
diff --git a/src/plugins/vcsbase/vcsoutputwindow.h b/src/plugins/vcsbase/vcsoutputwindow.h
index f705dedf4d..f87a5309c5 100644
--- a/src/plugins/vcsbase/vcsoutputwindow.h
+++ b/src/plugins/vcsbase/vcsoutputwindow.h
@@ -74,7 +74,7 @@ public:
None,
Error, // Red error text
Warning, // Dark yellow warning text
- Command, // A bold command with timetamp "10:00 " + "Executing: vcs -diff"
+ Command, // A bold command with timestamp "10:00 " + "Executing: vcs -diff"
Message, // A blue message text (e.g. "command has finished successfully")
};
diff --git a/src/tools/clangbackend/clangbackendmain.cpp b/src/tools/clangbackend/clangbackendmain.cpp
index 5cbac3ce60..1e95db3ef3 100644
--- a/src/tools/clangbackend/clangbackendmain.cpp
+++ b/src/tools/clangbackend/clangbackendmain.cpp
@@ -57,8 +57,25 @@ QString processArguments(QCoreApplication &application)
}
#ifdef Q_OS_WIN
-static void messageOutput(QtMsgType type, const QMessageLogContext &, const QString &msg)
+struct MessageHandler {
+ MessageHandler(QtMessageHandler handler)
+ {
+ defaultHandler = qInstallMessageHandler(handler);
+ }
+
+ ~MessageHandler()
+ {
+ qInstallMessageHandler(defaultHandler);
+ }
+
+ static QtMessageHandler defaultHandler;
+};
+
+QtMessageHandler MessageHandler::defaultHandler = nullptr;
+
+static void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
+ MessageHandler::defaultHandler(type, context, msg);
std::wcout << msg.toStdWString() << std::endl;
if (type == QtFatalMsg)
abort();
@@ -68,7 +85,7 @@ static void messageOutput(QtMsgType type, const QMessageLogContext &, const QStr
int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN
- qInstallMessageHandler(messageOutput);
+ MessageHandler messageHandler(&messageOutput);
#endif
QCoreApplication::setOrganizationName(QStringLiteral("QtProject"));
QCoreApplication::setOrganizationDomain(QStringLiteral("qt-project.org"));
diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp
index 3237aab2fb..b2a58b0d66 100644
--- a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp
+++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp
@@ -30,11 +30,12 @@
#include <connectionserver.h>
#include <environment.h>
#include <executeinloop.h>
+#include <filepathcaching.h>
#include <generatedfiles.h>
#include <modifiedtimechecker.h>
#include <pchcreator.h>
-#include <pchmanagerserver.h>
#include <pchmanagerclientproxy.h>
+#include <pchmanagerserver.h>
#include <pchtaskgenerator.h>
#include <pchtaskqueue.h>
#include <pchtasksmerger.h>
@@ -42,7 +43,7 @@
#include <processormanager.h>
#include <progresscounter.h>
#include <projectpartsmanager.h>
-#include <filepathcaching.h>
+#include <projectpartsstorage.h>
#include <refactoringdatabaseinitializer.h>
#include <sqlitedatabase.h>
#include <taskscheduler.h>
@@ -63,14 +64,15 @@ using namespace std::chrono_literals;
using ClangBackEnd::ClangPathWatcher;
using ClangBackEnd::ConnectionServer;
+using ClangBackEnd::FilePathCache;
+using ClangBackEnd::FilePathView;
using ClangBackEnd::GeneratedFiles;
using ClangBackEnd::PchCreator;
using ClangBackEnd::PchManagerClientProxy;
using ClangBackEnd::PchManagerServer;
using ClangBackEnd::PrecompiledHeaderStorage;
using ClangBackEnd::ProjectPartsManager;
-using ClangBackEnd::FilePathCache;
-using ClangBackEnd::FilePathView;
+using ClangBackEnd::ProjectPartsStorage;
using ClangBackEnd::TimeStamp;
class PchManagerApplication final : public QCoreApplication
@@ -179,7 +181,8 @@ struct Data // because we have a cycle dependency
ClangBackEnd::FilePathCaching filePathCache{database};
ClangPathWatcher<QFileSystemWatcher, QTimer> includeWatcher{filePathCache};
ApplicationEnvironment environment;
- ProjectPartsManager projectParts;
+ ProjectPartsStorage<> projectPartsStorage{database};
+ ProjectPartsManager projectParts{projectPartsStorage};
GeneratedFiles generatedFiles;
PchCreatorManager pchCreatorManager{generatedFiles,
environment,
diff --git a/src/tools/clangpchmanagerbackend/source/builddependenciesprovider.cpp b/src/tools/clangpchmanagerbackend/source/builddependenciesprovider.cpp
index a2a7a813ac..bf00f39098 100644
--- a/src/tools/clangpchmanagerbackend/source/builddependenciesprovider.cpp
+++ b/src/tools/clangpchmanagerbackend/source/builddependenciesprovider.cpp
@@ -101,19 +101,15 @@ UsedMacros BuildDependenciesProvider::createUsedMacrosFromStorage(const SourceEn
return usedMacros;
}
-std::pair<SourceEntries, int>
-BuildDependenciesProvider::createSourceEntriesFromStorage(
- const FilePathIds &sourcePathIds,
- Utils::SmallStringView projectPartName) const {
+std::pair<SourceEntries, ProjectPartId> BuildDependenciesProvider::createSourceEntriesFromStorage(
+ const FilePathIds &sourcePathIds, ProjectPartId projectPartId) const
+{
SourceEntries includes;
Sqlite::DeferredTransaction transaction(m_transactionBackend);
- int projectPartId = m_storage.fetchProjectPartId(projectPartName);
-
for (FilePathId sourcePathId : sourcePathIds) {
- SourceEntries entries =
- m_storage.fetchDependSources(sourcePathId, projectPartId);
+ SourceEntries entries = m_storage.fetchDependSources(sourcePathId, projectPartId);
SourceEntries mergedEntries = setUnion<SourceEntries>(includes, entries);
includes = std::move(mergedEntries);
@@ -124,8 +120,9 @@ BuildDependenciesProvider::createSourceEntriesFromStorage(
return {includes, projectPartId};
}
-void BuildDependenciesProvider::storeBuildDependency(
- const BuildDependency &buildDependency, int projectPartId) {
+void BuildDependenciesProvider::storeBuildDependency(const BuildDependency &buildDependency,
+ ProjectPartId projectPartId)
+{
Sqlite::ImmediateTransaction transaction(m_transactionBackend);
m_storage.insertOrUpdateSources(buildDependency.sources, projectPartId);
m_storage.insertOrUpdateFileStatuses(buildDependency.fileStatuses);
diff --git a/src/tools/clangpchmanagerbackend/source/builddependenciesprovider.h b/src/tools/clangpchmanagerbackend/source/builddependenciesprovider.h
index 2eb5210518..9700b83aa3 100644
--- a/src/tools/clangpchmanagerbackend/source/builddependenciesprovider.h
+++ b/src/tools/clangpchmanagerbackend/source/builddependenciesprovider.h
@@ -55,9 +55,9 @@ public:
private:
BuildDependency createBuildDependencyFromStorage(SourceEntries &&includes) const;
UsedMacros createUsedMacrosFromStorage(const SourceEntries &includes) const;
- std::pair<SourceEntries, int> createSourceEntriesFromStorage(
- const FilePathIds &sourcePathIds, Utils::SmallStringView projectPartName) const;
- void storeBuildDependency(const BuildDependency &buildDependency, int projectPartId);
+ std::pair<SourceEntries, ProjectPartId> createSourceEntriesFromStorage(
+ const FilePathIds &sourcePathIds, ProjectPartId projectPartId) const;
+ void storeBuildDependency(const BuildDependency &buildDependency, ProjectPartId projectPartId);
private:
BuildDependenciesStorageInterface &m_storage;
diff --git a/src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h b/src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h
index 3e6d00da3f..e7269dd0f9 100644
--- a/src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h
+++ b/src/tools/clangpchmanagerbackend/source/builddependenciesstorage.h
@@ -53,17 +53,16 @@ public:
transaction.commit();
}
- void insertOrUpdateSources(const SourceEntries &sourceEntries, int projectPartId) override
+ void insertOrUpdateSources(const SourceEntries &sourceEntries, ProjectPartId projectPartId) override
{
- deleteAllProjectPartsSourcesWithProjectPartNameStatement.write(
- projectPartId);
+ deleteAllProjectPartsFilesWithProjectPartNameStatement.write(projectPartId.projectPathId);
for (const SourceEntry &entry : sourceEntries) {
- insertOrUpdateProjectPartsSourcesStatement.write(
- entry.sourceId.filePathId,
- projectPartId,
- static_cast<uchar>(entry.sourceType),
- static_cast<uchar>(entry.hasMissingIncludes));
+ insertOrUpdateProjectPartsFilesStatement.write(entry.sourceId.filePathId,
+ projectPartId.projectPathId,
+ static_cast<uchar>(entry.sourceType),
+ static_cast<uchar>(
+ entry.hasMissingIncludes));
}
}
@@ -108,22 +107,22 @@ public:
deleteNewSourceDependenciesStatement.execute();
}
- int fetchProjectPartId(Utils::SmallStringView projectPartName) override
+ ProjectPartId fetchProjectPartId(Utils::SmallStringView projectPartName) override
{
- auto projectPartId = fetchProjectPartIdStatement.template value<int>(projectPartName);
+ auto projectPartId = fetchProjectPartIdStatement.template value<ProjectPartId>(projectPartName);
if (projectPartId)
- return projectPartId.value();
+ return *projectPartId;
insertProjectPartNameStatement.write(projectPartName);
return static_cast<int>(database.lastInsertedRowId());
}
- SourceEntries fetchDependSources(FilePathId sourceId, int projectPartId) const override
+ SourceEntries fetchDependSources(FilePathId sourceId, ProjectPartId projectPartId) const override
{
- return fetchSourceDependenciesStatement.template values<SourceEntry, 4>(
- 300, sourceId.filePathId, projectPartId);
+ return fetchSourceDependenciesStatement
+ .template values<SourceEntry, 4>(300, sourceId.filePathId, projectPartId.projectPathId);
}
UsedMacros fetchUsedMacros(FilePathId sourceId) const override
@@ -131,13 +130,11 @@ public:
return fetchUsedMacrosStatement.template values<UsedMacro, 2>(128, sourceId.filePathId);
}
- void updatePchCreationTimeStamp(
- long long pchCreationTimeStamp,
- Utils::SmallStringView projectPartName) override {
+ void updatePchCreationTimeStamp(long long pchCreationTimeStamp, ProjectPartId projectPartId) override
+ {
Sqlite::ImmediateTransaction transaction{database};
- updatePchCreationTimeStampStatement.write(pchCreationTimeStamp,
- projectPartName);
+ updatePchCreationTimeStampStatement.write(pchCreationTimeStamp, projectPartId.projectPathId);
transaction.commit();
}
@@ -243,8 +240,8 @@ public:
"DELETE FROM newSourceDependencies",
database
};
- WriteStatement insertOrUpdateProjectPartsSourcesStatement{
- "INSERT INTO projectPartsSources(sourceId, projectPartId, "
+ WriteStatement insertOrUpdateProjectPartsFilesStatement{
+ "INSERT INTO projectPartsFiles(sourceId, projectPartId, "
"sourceType, hasMissingIncludes) VALUES (?001, ?002, ?003, ?004) ON "
"CONFLICT(sourceId, projectPartId) DO UPDATE SET sourceType = ?003, "
"hasMissingIncludes = ?004",
@@ -255,7 +252,7 @@ public:
"collectedDependencies WHERE sourceDependencies.sourceId == "
"collectedDependencies.sourceId) SELECT sourceId, "
"pchCreationTimeStamp, sourceType, hasMissingIncludes FROM "
- "collectedDependencies NATURAL JOIN projectPartsSources WHERE "
+ "collectedDependencies NATURAL JOIN projectPartsFiles WHERE "
"projectPartId = ? ORDER BY sourceId",
database};
mutable ReadStatement fetchProjectPartIdStatement{
@@ -269,11 +266,9 @@ public:
database
};
WriteStatement updatePchCreationTimeStampStatement{
- "UPDATE projectPartsSources SET pchCreationTimeStamp = ?001 WHERE "
- "projectPartId = (SELECT "
- "projectPartId FROM projectParts WHERE projectPartName = ?002)",
+ "UPDATE projectPartsFiles SET pchCreationTimeStamp = ?001 WHERE projectPartId = ?002",
database};
- WriteStatement deleteAllProjectPartsSourcesWithProjectPartNameStatement{
- "DELETE FROM projectPartsSources WHERE projectPartId = ?", database};
+ WriteStatement deleteAllProjectPartsFilesWithProjectPartNameStatement{
+ "DELETE FROM projectPartsFiles WHERE projectPartId = ?", database};
};
}
diff --git a/src/tools/clangpchmanagerbackend/source/builddependenciesstorageinterface.h b/src/tools/clangpchmanagerbackend/source/builddependenciesstorageinterface.h
index 4edc47fce1..a56e88b1f2 100644
--- a/src/tools/clangpchmanagerbackend/source/builddependenciesstorageinterface.h
+++ b/src/tools/clangpchmanagerbackend/source/builddependenciesstorageinterface.h
@@ -30,6 +30,7 @@
#include <builddependency.h>
#include <filepathid.h>
#include <filestatus.h>
+#include <projectpartid.h>
#include <sourcedependency.h>
#include <usedmacro.h>
@@ -44,20 +45,17 @@ public:
BuildDependenciesStorageInterface(const BuildDependenciesStorageInterface &) = delete;
BuildDependenciesStorageInterface &operator=(const BuildDependenciesStorageInterface &) = delete;
- virtual void insertOrUpdateSources(const SourceEntries &sourceIds,
- int projectPartId) = 0;
+ virtual void insertOrUpdateSources(const SourceEntries &sourceIds, ProjectPartId projectPartId) = 0;
virtual void insertOrUpdateUsedMacros(const UsedMacros &usedMacros) = 0;
virtual void
insertOrUpdateFileStatuses(const FileStatuses &fileStatuses) = 0;
virtual void insertOrUpdateSourceDependencies(const SourceDependencies &sourceDependencies) = 0;
virtual long long fetchLowestLastModifiedTime(FilePathId sourceId) const = 0;
virtual SourceEntries fetchDependSources(FilePathId sourceId,
- int projectPartId) const = 0;
+ ProjectPartId projectPartId) const = 0;
virtual UsedMacros fetchUsedMacros(FilePathId sourceId) const = 0;
- virtual int fetchProjectPartId(Utils::SmallStringView projectPartName) = 0;
- virtual void updatePchCreationTimeStamp(long long pchCreationTimeStamp,
- Utils::SmallStringView projectPartName)
- = 0;
+ virtual ProjectPartId fetchProjectPartId(Utils::SmallStringView projectPartName) = 0;
+ virtual void updatePchCreationTimeStamp(long long pchCreationTimeStamp, ProjectPartId projectPartId) = 0;
protected:
~BuildDependenciesStorageInterface() = default;
diff --git a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp
index 89ad912640..c1c12121aa 100644
--- a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp
+++ b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp
@@ -83,9 +83,9 @@ void PchManagerServer::removeProjectParts(RemoveProjectPartsMessage &&message)
}
namespace {
-Utils::SmallStringVector projectPartIds(const ProjectPartContainers &projectParts)
+ProjectPartIds projectPartIds(const ProjectPartContainers &projectParts)
{
- Utils::SmallStringVector ids;
+ ProjectPartIds ids;
ids.reserve(projectParts.size());
std::transform(projectParts.cbegin(),
@@ -118,7 +118,7 @@ void PchManagerServer::removeGeneratedFiles(RemoveGeneratedFilesMessage &&messag
m_generatedFiles.remove(message.takeGeneratedFiles());
}
-void PchManagerServer::pathsWithIdsChanged(const Utils::SmallStringVector &ids)
+void PchManagerServer::pathsWithIdsChanged(const ProjectPartIds &ids)
{
ArgumentsEntries entries = m_toolChainsArgumentsCache.arguments(ids);
diff --git a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.h b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.h
index 9cf8aa8321..cc9daa7aa4 100644
--- a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.h
+++ b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.h
@@ -57,7 +57,7 @@ public:
void updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) override;
void removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) override;
- void pathsWithIdsChanged(const Utils::SmallStringVector &ids) override;
+ void pathsWithIdsChanged(const ProjectPartIds &ids) override;
void pathsChanged(const FilePathIds &filePathIds) override;
void setPchCreationProgress(int progress, int total);
diff --git a/src/tools/clangpchmanagerbackend/source/pchtask.h b/src/tools/clangpchmanagerbackend/source/pchtask.h
index 528d6e63f1..7d8879fcbd 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtask.h
+++ b/src/tools/clangpchmanagerbackend/source/pchtask.h
@@ -30,6 +30,7 @@
#include <compilermacro.h>
#include <filepath.h>
#include <includesearchpath.h>
+#include <projectpartid.h>
#include <utils/smallstringvector.h>
#include <utils/cpplanguage_details.h>
@@ -39,11 +40,11 @@ namespace ClangBackEnd {
class PchTask
{
public:
- PchTask(Utils::SmallString &&projectPartId,
+ PchTask(ProjectPartId projectPartId,
FilePathIds &&includes,
FilePathIds &&sources,
CompilerMacros &&compilerMacros,
- Utils::SmallStringVector &&usedMacros,
+ Utils::SmallStringVector &&usedMacros, // TODO remove
Utils::SmallStringVector toolChainArguments,
IncludeSearchPaths systemIncludeSearchPaths,
IncludeSearchPaths projectIncludeSearchPaths,
@@ -62,11 +63,11 @@ public:
, languageExtension(languageExtension)
{}
- PchTask(Utils::SmallStringVector &&projectPartIds,
+ PchTask(ProjectPartIds &&projectPartIds,
FilePathIds &&includes,
FilePathIds &&sources,
CompilerMacros &&compilerMacros,
- Utils::SmallStringVector &&usedMacros,
+ Utils::SmallStringVector &&usedMacros, // TODO remove
Utils::SmallStringVector toolChainArguments,
IncludeSearchPaths systemIncludeSearchPaths,
IncludeSearchPaths projectIncludeSearchPaths,
@@ -98,11 +99,11 @@ public:
&& first.languageExtension == second.languageExtension;
}
- Utils::SmallStringView projectPartId() const { return projectPartIds.front(); }
+ ProjectPartId projectPartId() const { return projectPartIds.front(); }
public:
FilePath systemPchPath;
- Utils::SmallStringVector projectPartIds;
+ ProjectPartIds projectPartIds;
FilePathIds includes;
FilePathIds sources;
CompilerMacros compilerMacros;
diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp b/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp
index a44fc91b16..c0a42eae39 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp
+++ b/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.cpp
@@ -49,7 +49,7 @@ void PchTaskGenerator::addProjectParts(ProjectPartContainers &&projectParts,
buildDependency.usedMacros,
projectPart.compilerMacros};
- pchTaskSets.emplace_back(PchTask{projectPart.projectPartId.clone(),
+ pchTaskSets.emplace_back(PchTask{projectPart.projectPartId,
std::move(filter.topSystemIncludes),
{},
std::move(filter.systemCompilerMacros),
@@ -60,7 +60,7 @@ void PchTaskGenerator::addProjectParts(ProjectPartContainers &&projectParts,
projectPart.language,
projectPart.languageVersion,
projectPart.languageExtension},
- PchTask{std::move(projectPart.projectPartId),
+ PchTask{projectPart.projectPartId,
std::move(filter.topProjectIncludes),
std::move(filter.sources),
std::move(filter.projectCompilerMacros),
@@ -77,7 +77,7 @@ void PchTaskGenerator::addProjectParts(ProjectPartContainers &&projectParts,
m_pchTasksMergerInterface.mergeTasks(std::move(pchTaskSets), std::move(toolChainArguments));
}
-void PchTaskGenerator::removeProjectParts(const Utils::SmallStringVector &projectsPartIds)
+void PchTaskGenerator::removeProjectParts(const ProjectPartIds &projectsPartIds)
{
m_pchTasksMergerInterface.removePchTasks(projectsPartIds);
}
diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h b/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h
index 38376ce2a2..dc7d201cde 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h
+++ b/src/tools/clangpchmanagerbackend/source/pchtaskgenerator.h
@@ -50,8 +50,8 @@ public:
{}
void addProjectParts(ProjectPartContainers &&projectParts,
- Utils::SmallStringVector &&toolChainArguments);
- void removeProjectParts(const Utils::SmallStringVector &projectsPartIds);
+ Utils::SmallStringVector &&toolChainArguments) override;
+ void removeProjectParts(const ProjectPartIds &projectsPartIds) override;
private:
BuildDependenciesProviderInterface &m_buildDependenciesProvider;
diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskgeneratorinterface.h b/src/tools/clangpchmanagerbackend/source/pchtaskgeneratorinterface.h
index 4546284265..abb25d2ef1 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtaskgeneratorinterface.h
+++ b/src/tools/clangpchmanagerbackend/source/pchtaskgeneratorinterface.h
@@ -35,7 +35,7 @@ public:
virtual void addProjectParts(ProjectPartContainers &&projectParts,
Utils::SmallStringVector &&toolChainArguments)
= 0;
- virtual void removeProjectParts(const Utils::SmallStringVector &projectsPartIds) = 0;
+ virtual void removeProjectParts(const ProjectPartIds &projectsPartIds) = 0;
protected:
~PchTaskGeneratorInterface() = default;
diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp
index 6c1a09fd3e..2abe3fa394 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp
+++ b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.cpp
@@ -54,18 +54,18 @@ void PchTaskQueue::addPchTasks(PchTasks &&newPchTasks, PchTasks &destination)
m_progressCounter.addTotal(int(destination.size() - oldSize));
}
-void PchTaskQueue::removePchTasksByProjectPartId(const Utils::SmallStringVector &projectsPartIds,
+void PchTaskQueue::removePchTasksByProjectPartId(const ProjectPartIds &projectsPartIds,
PchTasks &destination)
{
class CompareDifference
{
public:
- bool operator()(const PchTask &first, const Utils::SmallString &second)
+ bool operator()(const PchTask &first, ProjectPartId second)
{
return first.projectPartId() < second;
}
- bool operator()(const Utils::SmallString &first, const PchTask &second)
+ bool operator()(ProjectPartId first, const PchTask &second)
{
return first < second.projectPartId();
}
@@ -97,7 +97,7 @@ void PchTaskQueue::addProjectPchTasks(PchTasks &&pchTasks)
addPchTasks(std::move(pchTasks), m_projectPchTasks);
}
-void PchTaskQueue::removePchTasks(const Utils::SmallStringVector &projectsPartIds)
+void PchTaskQueue::removePchTasks(const ProjectPartIds &projectsPartIds)
{
removePchTasksByProjectPartId(projectsPartIds, m_projectPchTasks);
}
diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.h b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.h
index 5d00419817..2d6d76ee58 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtaskqueue.h
+++ b/src/tools/clangpchmanagerbackend/source/pchtaskqueue.h
@@ -56,7 +56,7 @@ public:
void addSystemPchTasks(PchTasks &&pchTasks) override;
void addProjectPchTasks(PchTasks &&pchTasks) override;
- void removePchTasks(const Utils::SmallStringVector &projectsPartIds) override;
+ void removePchTasks(const ProjectPartIds &projectsPartIds) override;
void processEntries() override;
@@ -68,8 +68,7 @@ public:
private:
void addPchTasks(PchTasks &&pchTasks, PchTasks &destination);
- void removePchTasksByProjectPartId(const Utils::SmallStringVector &projectsPartIds,
- PchTasks &destination);
+ void removePchTasksByProjectPartId(const ProjectPartIds &projectsPartIds, PchTasks &destination);
void processProjectPchTasks();
void processSystemPchTasks();
diff --git a/src/tools/clangpchmanagerbackend/source/pchtaskqueueinterface.h b/src/tools/clangpchmanagerbackend/source/pchtaskqueueinterface.h
index 45e1db8f9d..31c709d1a9 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtaskqueueinterface.h
+++ b/src/tools/clangpchmanagerbackend/source/pchtaskqueueinterface.h
@@ -35,7 +35,7 @@ class PchTaskQueueInterface : public QueueInterface
public:
virtual void addSystemPchTasks(PchTasks &&pchTasks) = 0;
virtual void addProjectPchTasks(PchTasks &&pchTasks) = 0;
- virtual void removePchTasks(const Utils::SmallStringVector &projectsPartIds) = 0;
+ virtual void removePchTasks(const ProjectPartIds &projectsPartIds) = 0;
protected:
~PchTaskQueueInterface() = default;
diff --git a/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp b/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp
index 65d1a3e9fe..7e850b8947 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp
+++ b/src/tools/clangpchmanagerbackend/source/pchtasksmerger.cpp
@@ -37,7 +37,7 @@ void PchTasksMerger::mergeTasks(PchTaskSets &&taskSets,
m_pchTaskQueue.processEntries();
}
-void PchTasksMerger::removePchTasks(const Utils::SmallStringVector &projectPartIds)
+void PchTasksMerger::removePchTasks(const ProjectPartIds &projectPartIds)
{
m_pchTaskQueue.removePchTasks(projectPartIds);
}
diff --git a/src/tools/clangpchmanagerbackend/source/pchtasksmerger.h b/src/tools/clangpchmanagerbackend/source/pchtasksmerger.h
index 26df2022b4..5481a50dff 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtasksmerger.h
+++ b/src/tools/clangpchmanagerbackend/source/pchtasksmerger.h
@@ -40,7 +40,7 @@ public:
{}
void mergeTasks(PchTaskSets &&taskSets, Utils::SmallStringVector &&toolChainArguments) override;
- void removePchTasks(const Utils::SmallStringVector &projectPartIds) override;
+ void removePchTasks(const ProjectPartIds &projectPartIds) override;
static CompilerMacros mergeMacros(const CompilerMacros &firstCompilerMacros,
const CompilerMacros &secondCompilerMacros);
diff --git a/src/tools/clangpchmanagerbackend/source/pchtasksmergerinterface.h b/src/tools/clangpchmanagerbackend/source/pchtasksmergerinterface.h
index a691766b49..69f1e0470a 100644
--- a/src/tools/clangpchmanagerbackend/source/pchtasksmergerinterface.h
+++ b/src/tools/clangpchmanagerbackend/source/pchtasksmergerinterface.h
@@ -32,7 +32,7 @@ class PchTasksMergerInterface
{
public:
virtual void mergeTasks(PchTaskSets &&taskSets, Utils::SmallStringVector &&toolChainArguments) = 0;
- virtual void removePchTasks(const Utils::SmallStringVector &projectPartIds) = 0;
+ virtual void removePchTasks(const ProjectPartIds &projectPartIds) = 0;
protected:
~PchTasksMergerInterface() = default;
diff --git a/src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h b/src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h
index 7d1069b998..e1b2f8aa2e 100644
--- a/src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h
+++ b/src/tools/clangpchmanagerbackend/source/precompiledheaderstorage.h
@@ -41,129 +41,125 @@ class PrecompiledHeaderStorage final : public PrecompiledHeaderStorageInterface
using WriteStatement = typename Database::WriteStatement;
public:
PrecompiledHeaderStorage(Database &database)
- : m_transaction(database),
- m_database(database)
+ : transaction(database)
+ , database(database)
{
- m_transaction.commit();
+ transaction.commit();
}
- void insertProjectPrecompiledHeader(Utils::SmallStringView projectPartName,
+ void insertProjectPrecompiledHeader(ProjectPartId projectPartId,
Utils::SmallStringView pchPath,
long long pchBuildTime) override
{
try {
- Sqlite::ImmediateTransaction transaction{m_database};
+ Sqlite::ImmediateTransaction transaction{database};
- m_insertProjectPartStatement.write(projectPartName);
- m_insertProjectPrecompiledHeaderStatement.write(projectPartName, pchPath, pchBuildTime);
+ insertProjectPrecompiledHeaderStatement.write(projectPartId.projectPathId,
+ pchPath,
+ pchBuildTime);
transaction.commit();
- } catch (const Sqlite::StatementIsBusy) {
- insertProjectPrecompiledHeader(projectPartName, pchPath, pchBuildTime);
+ } catch (const Sqlite::StatementIsBusy &) {
+ insertProjectPrecompiledHeader(projectPartId, pchPath, pchBuildTime);
}
}
- void deleteProjectPrecompiledHeader(Utils::SmallStringView projectPartName) override
+ void deleteProjectPrecompiledHeader(ProjectPartId projectPartId) override
{
try {
- Sqlite::ImmediateTransaction transaction{m_database};
+ Sqlite::ImmediateTransaction transaction{database};
- m_deleteProjectPrecompiledHeaderStatement.write(projectPartName);
+ deleteProjectPrecompiledHeaderStatement.write(projectPartId.projectPathId);
transaction.commit();
} catch (const Sqlite::StatementIsBusy) {
- deleteProjectPrecompiledHeader(projectPartName);
+ deleteProjectPrecompiledHeader(projectPartId);
}
}
- void insertSystemPrecompiledHeaders(const Utils::SmallStringVector &projectPartNames,
+ void insertSystemPrecompiledHeaders(const ProjectPartIds &projectPartIds,
Utils::SmallStringView pchPath,
long long pchBuildTime) override
{
try {
- Sqlite::ImmediateTransaction transaction{m_database};
+ Sqlite::ImmediateTransaction transaction{database};
- for (Utils::SmallStringView projectPartName : projectPartNames) {
- m_insertProjectPartStatement.write(projectPartName);
- m_insertSystemPrecompiledHeaderStatement.write(projectPartName, pchPath, pchBuildTime);
+ for (ProjectPartId projectPartId : projectPartIds) {
+ insertSystemPrecompiledHeaderStatement.write(projectPartId.projectPathId,
+ pchPath,
+ pchBuildTime);
}
transaction.commit();
} catch (const Sqlite::StatementIsBusy) {
- insertSystemPrecompiledHeaders(projectPartNames, pchPath, pchBuildTime);
+ insertSystemPrecompiledHeaders(projectPartIds, pchPath, pchBuildTime);
}
}
- void deleteSystemPrecompiledHeaders(const Utils::SmallStringVector &projectPartNames) override
+ void deleteSystemPrecompiledHeaders(const ProjectPartIds &projectPartIds) override
{
try {
- Sqlite::ImmediateTransaction transaction{m_database};
+ Sqlite::ImmediateTransaction transaction{database};
- for (Utils::SmallStringView projectPartName : projectPartNames)
- m_deleteSystemPrecompiledHeaderStatement.write(projectPartName);
+ for (ProjectPartId projectPartId : projectPartIds)
+ deleteSystemPrecompiledHeaderStatement.write(projectPartId.projectPathId);
transaction.commit();
} catch (const Sqlite::StatementIsBusy) {
- deleteSystemPrecompiledHeaders(projectPartNames);
+ deleteSystemPrecompiledHeaders(projectPartIds);
}
}
- FilePath fetchSystemPrecompiledHeaderPath(Utils::SmallStringView projectPartName) override
+ FilePath fetchSystemPrecompiledHeaderPath(ProjectPartId projectPartId) override
{
try {
- Sqlite::DeferredTransaction transaction{m_database};
+ Sqlite::DeferredTransaction transaction{database};
- auto value = m_fetchSystemPrecompiledHeaderPathStatement.template value<FilePath>(
- projectPartName);
+ auto value = fetchSystemPrecompiledHeaderPathStatement.template value<FilePath>(
+ projectPartId.projectPathId);
if (value)
- return value.value();
+ return *value;
transaction.commit();
} catch (const Sqlite::StatementIsBusy) {
- return fetchSystemPrecompiledHeaderPath(projectPartName);
+ return fetchSystemPrecompiledHeaderPath(projectPartId);
}
return FilePath("");
}
- Utils::optional<ProjectPartPch> fetchPrecompiledHeader(int projectPartId) const
+ Utils::optional<ProjectPartPch> fetchPrecompiledHeader(ProjectPartId projectPartId) const
{
- return m_getPrecompiledHeader.template value<ProjectPartPch, 2>(projectPartId);
+ return getPrecompiledHeader.template value<ProjectPartPch, 3>(projectPartId.projectPathId);
}
public:
- Sqlite::ImmediateNonThrowingDestructorTransaction m_transaction;
- Database &m_database;
- WriteStatement m_insertProjectPrecompiledHeaderStatement{
+ Sqlite::ImmediateNonThrowingDestructorTransaction transaction;
+ Database &database;
+ WriteStatement insertProjectPrecompiledHeaderStatement{
"INSERT INTO precompiledHeaders(projectPartId, projectPchPath, projectPchBuildTime) "
"VALUES((SELECT projectPartId FROM projectParts WHERE projectPartName = ?001),?002,?003) "
"ON CONFLICT (projectPartId) DO UPDATE SET projectPchPath=?002,projectPchBuildTime=?003",
- m_database};
- WriteStatement m_insertSystemPrecompiledHeaderStatement{
+ database};
+ WriteStatement insertSystemPrecompiledHeaderStatement{
"INSERT INTO precompiledHeaders(projectPartId, systemPchPath, systemPchBuildTime) "
- "VALUES((SELECT projectPartId FROM projectParts WHERE projectPartName = ?001),?002,?003) "
+ "VALUES(?001,?002,?003) "
"ON CONFLICT (projectPartId) DO UPDATE SET systemPchPath=?002,systemPchBuildTime=?003",
- m_database};
- WriteStatement m_insertProjectPartStatement{
- "INSERT OR IGNORE INTO projectParts(projectPartName) VALUES (?)", m_database};
- WriteStatement m_deleteProjectPrecompiledHeaderStatement{
+ database};
+ WriteStatement deleteProjectPrecompiledHeaderStatement{
"UPDATE OR IGNORE precompiledHeaders SET projectPchPath=NULL,projectPchBuildTime=NULL "
- "WHERE projectPartId = (SELECT projectPartId FROM "
- "projectParts WHERE projectPartName = ?)",
- m_database};
- WriteStatement m_deleteSystemPrecompiledHeaderStatement{
+ "WHERE projectPartId = ?",
+ database};
+ WriteStatement deleteSystemPrecompiledHeaderStatement{
"UPDATE OR IGNORE precompiledHeaders SET systemPchPath=NULL,systemPchBuildTime=NULL "
- "WHERE projectPartId = (SELECT projectPartId FROM "
- "projectParts WHERE projectPartName = ?)",
- m_database};
- ReadStatement m_fetchSystemPrecompiledHeaderPathStatement{
- "SELECT systemPchPath FROM precompiledHeaders WHERE projectPartId = (SELECT projectPartId "
- "FROM projectParts WHERE projectPartName = ?)",
- m_database};
- mutable ReadStatement m_getPrecompiledHeader{
- "SELECT ifnull(nullif(projectPchPath, ''), systemPchPath), "
+ "WHERE projectPartId = ?",
+ database};
+ ReadStatement fetchSystemPrecompiledHeaderPathStatement{
+ "SELECT systemPchPath FROM precompiledHeaders WHERE projectPartId = ?", database};
+ mutable ReadStatement getPrecompiledHeader{
+ "SELECT projectPartId, ifnull(nullif(projectPchPath, ''), systemPchPath), "
"projectPchBuildTime FROM precompiledHeaders WHERE projectPartId = ?",
- m_database};
+ database};
};
}
diff --git a/src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h b/src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h
index 06833be4a2..e2a2b4a3b6 100644
--- a/src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h
+++ b/src/tools/clangpchmanagerbackend/source/precompiledheaderstorageinterface.h
@@ -28,6 +28,7 @@
#include "projectpartpch.h"
#include <filepath.h>
+#include <projectpartid.h>
#include <utils/smallstringvector.h>
#include <utils/optional.h>
@@ -42,18 +43,18 @@ public:
PrecompiledHeaderStorageInterface(const PrecompiledHeaderStorageInterface &) = delete;
PrecompiledHeaderStorageInterface &operator=(const PrecompiledHeaderStorageInterface &) = delete;
- virtual void insertProjectPrecompiledHeader(Utils::SmallStringView projectPartName,
+ virtual void insertProjectPrecompiledHeader(ProjectPartId projectPartId,
Utils::SmallStringView pchPath,
long long pchBuildTime)
= 0;
- virtual void deleteProjectPrecompiledHeader(Utils::SmallStringView projectPartName) = 0;
- virtual void insertSystemPrecompiledHeaders(const Utils::SmallStringVector &projectPartNames,
+ virtual void deleteProjectPrecompiledHeader(ProjectPartId projectPartName) = 0;
+ virtual void insertSystemPrecompiledHeaders(const ProjectPartIds &projectPartIds,
Utils::SmallStringView pchPath,
long long pchBuildTime)
= 0;
- virtual void deleteSystemPrecompiledHeaders(const Utils::SmallStringVector &projectPartNames) = 0;
- virtual FilePath fetchSystemPrecompiledHeaderPath(Utils::SmallStringView projectPartName) = 0;
- virtual Utils::optional<ProjectPartPch> fetchPrecompiledHeader(int projectPartId) const = 0;
+ virtual void deleteSystemPrecompiledHeaders(const ProjectPartIds &projectPartIds) = 0;
+ virtual FilePath fetchSystemPrecompiledHeaderPath(ProjectPartId projectPartId) = 0;
+ virtual Utils::optional<ProjectPartPch> fetchPrecompiledHeader(ProjectPartId projectPartId) const = 0;
protected:
~PrecompiledHeaderStorageInterface() = default;
diff --git a/src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp b/src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp
index 8333ed9674..ada99f44cd 100644
--- a/src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp
+++ b/src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp
@@ -32,44 +32,115 @@
namespace ClangBackEnd {
inline namespace Pch {
+ProjectPartIds toProjectPartIds(const ProjectPartContainers &projectsParts)
+{
+ ProjectPartIds ids;
+ ids.reserve(projectsParts.size());
+ std::transform(projectsParts.begin(),
+ projectsParts.end(),
+ std::back_inserter(ids),
+ [](const auto &projectPart) { return projectPart.projectPartId; });
+
+ return ids;
+}
ProjectPartContainers ProjectPartsManager::update(ProjectPartContainers &&projectsParts)
{
- auto updatedProjectPartContainers = newProjectParts(std::move(projectsParts));
+ auto updatedProjectParts = filterNewProjectParts(std::move(projectsParts), m_projectParts);
- mergeProjectParts(updatedProjectPartContainers);
+ if (updatedProjectParts.empty())
+ return {};
- return updatedProjectPartContainers;
+ auto persistentProjectParts = m_projectPartsStorage.fetchProjectParts(
+ toProjectPartIds(updatedProjectParts));
+
+ if (persistentProjectParts.size() > 0) {
+ mergeProjectParts(persistentProjectParts);
+
+ updatedProjectParts = filterNewProjectParts(std::move(updatedProjectParts),
+ persistentProjectParts);
+
+ if (updatedProjectParts.empty())
+ return {};
+ }
+
+ m_projectPartsStorage.updateProjectParts(updatedProjectParts);
+
+ mergeProjectParts(updatedProjectParts);
+
+ return updatedProjectParts;
}
-void ProjectPartsManager::remove(const Utils::SmallStringVector &ids)
+void ProjectPartsManager::remove(const ProjectPartIds &projectPartIds)
{
- auto shouldRemove = [&] (const ProjectPartContainer &projectPart) {
- return std::find(ids.begin(), ids.end(), projectPart.projectPartId) != ids.end();
+ ProjectPartContainers projectPartsWithoutIds;
+
+ struct Compare
+ {
+ bool operator()(ProjectPartId first, const ProjectPartContainer &second)
+ {
+ return first < second.projectPartId;
+ }
+
+ bool operator()(ProjectPartId first, const ProjectPartId &second) { return first < second; }
+
+ bool operator()(const ProjectPartContainer &first, const ProjectPartContainer &second)
+ {
+ return first.projectPartId < second.projectPartId;
+ }
+
+ bool operator()(const ProjectPartContainer &first, ProjectPartId second)
+ {
+ return first.projectPartId < second;
+ }
};
- auto newEnd = std::remove_if(m_projectParts.begin(), m_projectParts.end(), shouldRemove);
- m_projectParts.erase(newEnd, m_projectParts.end());
+ std::set_difference(std::make_move_iterator(m_projectParts.begin()),
+ std::make_move_iterator(m_projectParts.end()),
+ projectPartIds.begin(),
+ projectPartIds.end(),
+ std::back_inserter(projectPartsWithoutIds),
+ Compare{});
+
+ m_projectParts = std::move(projectPartsWithoutIds);
}
-ProjectPartContainers ProjectPartsManager::projects(const Utils::SmallStringVector &projectPartIds) const
+ProjectPartContainers ProjectPartsManager::projects(const ProjectPartIds &projectPartIds) const
{
ProjectPartContainers projectPartsWithIds;
- std::copy_if(m_projectParts.begin(),
- m_projectParts.end(),
- std::back_inserter(projectPartsWithIds),
- [&] (const ProjectPartContainer &projectPart) {
- return std::binary_search(projectPartIds.begin(), projectPartIds.end(), projectPart.projectPartId);
- });
+ struct Compare
+ {
+ bool operator()(ProjectPartId first, const ProjectPartContainer &second)
+ {
+ return first < second.projectPartId;
+ }
+
+ bool operator()(ProjectPartId first, const ProjectPartId &second) { return first < second; }
+
+ bool operator()(const ProjectPartContainer &first, const ProjectPartContainer &second)
+ {
+ return first.projectPartId < second.projectPartId;
+ }
+
+ bool operator()(const ProjectPartContainer &first, ProjectPartId second)
+ {
+ return first.projectPartId < second;
+ }
+ };
+
+ std::set_intersection(m_projectParts.begin(),
+ m_projectParts.end(),
+ projectPartIds.begin(),
+ projectPartIds.end(),
+ std::back_inserter(projectPartsWithIds),
+ Compare{});
return projectPartsWithIds;
}
void ProjectPartsManager::updateDeferred(const ProjectPartContainers &deferredProjectsParts)
{
- using ProjectPartContainerReferences = std::vector<std::reference_wrapper<ProjectPartContainer>>;
-
ProjectPartContainerReferences deferredProjectPartPointers;
deferredProjectPartPointers.reserve(deferredProjectsParts.size());
@@ -102,15 +173,16 @@ ProjectPartContainers ProjectPartsManager::deferredUpdates()
return deferredProjectParts;
}
-ProjectPartContainers ProjectPartsManager::newProjectParts(ProjectPartContainers &&projectsParts) const
+ProjectPartContainers ProjectPartsManager::filterNewProjectParts(
+ ProjectPartContainers &&projectsParts, const ProjectPartContainers &oldProjectParts)
{
ProjectPartContainers updatedProjectPartContainers;
updatedProjectPartContainers.reserve(projectsParts.size());
std::set_difference(std::make_move_iterator(projectsParts.begin()),
std::make_move_iterator(projectsParts.end()),
- m_projectParts.begin(),
- m_projectParts.end(),
+ oldProjectParts.begin(),
+ oldProjectParts.end(),
std::back_inserter(updatedProjectPartContainers));
return updatedProjectPartContainers;
diff --git a/src/tools/clangpchmanagerbackend/source/projectpartsmanager.h b/src/tools/clangpchmanagerbackend/source/projectpartsmanager.h
index 2b3c43ebc8..6583db25c6 100644
--- a/src/tools/clangpchmanagerbackend/source/projectpartsmanager.h
+++ b/src/tools/clangpchmanagerbackend/source/projectpartsmanager.h
@@ -28,6 +28,7 @@
#include "clangpchmanagerbackend_global.h"
#include <projectpartsmanagerinterface.h>
+#include <projectpartsstorageinterface.h>
#include <utils/smallstringvector.h>
@@ -37,18 +38,24 @@ inline namespace Pch {
class ProjectPartsManager final : public ProjectPartsManagerInterface
{
public:
+ ProjectPartsManager(ProjectPartsStorageInterface &projectPartsStorage)
+ : m_projectPartsStorage(projectPartsStorage)
+ {}
+
ProjectPartContainers update(ProjectPartContainers &&projectsParts) override;
- void remove(const Utils::SmallStringVector &projectPartIds) override;
- ProjectPartContainers projects(const Utils::SmallStringVector &projectPartIds) const override;
+ void remove(const ProjectPartIds &projectPartIds) override;
+ ProjectPartContainers projects(const ProjectPartIds &projectPartIds) const override;
void updateDeferred(const ProjectPartContainers &projectsParts) override;
ProjectPartContainers deferredUpdates() override;
- ProjectPartContainers newProjectParts(ProjectPartContainers &&projectsParts) const;
+ static ProjectPartContainers filterNewProjectParts(ProjectPartContainers &&newProjectsParts,
+ const ProjectPartContainers &oldProjectParts);
void mergeProjectParts(const ProjectPartContainers &projectsParts);
const ProjectPartContainers &projectParts() const;
private:
ProjectPartContainers m_projectParts;
+ ProjectPartsStorageInterface &m_projectPartsStorage;
};
} // namespace Pch
diff --git a/src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h b/src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h
index f99674ddda..ee80173f8a 100644
--- a/src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h
+++ b/src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h
@@ -37,10 +37,11 @@ public:
ProjectPartsManagerInterface &operator=(const ProjectPartsManagerInterface &) = delete;
virtual ProjectPartContainers update(ProjectPartContainers &&projectsParts) = 0;
- virtual void remove(const Utils::SmallStringVector &projectPartIds) = 0;
- virtual ProjectPartContainers projects(const Utils::SmallStringVector &projectPartIds) const = 0;
+ virtual void remove(const ProjectPartIds &projectPartIds) = 0;
+ virtual ProjectPartContainers projects(const ProjectPartIds &projectPartIds) const = 0;
virtual void updateDeferred(const ProjectPartContainers &projectsParts) = 0;
virtual ProjectPartContainers deferredUpdates() = 0;
+
protected:
~ProjectPartsManagerInterface() = default;
};
diff --git a/src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h b/src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h
index 4921b29a21..ed5ab3b1fd 100644
--- a/src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h
+++ b/src/tools/clangpchmanagerbackend/source/toolchainargumentscache.h
@@ -33,19 +33,19 @@ namespace ClangBackEnd {
struct ArgumentsEntry
{
- ArgumentsEntry(Utils::SmallStringVector &&ids, const Utils::SmallStringVector &arguments)
+ ArgumentsEntry(ProjectPartIds &&ids, const Utils::SmallStringVector &arguments)
: ids(std::move(ids))
, arguments(arguments)
{}
- ArgumentsEntry(const Utils::SmallStringVector &ids, const Utils::SmallStringVector &arguments)
+ ArgumentsEntry(ProjectPartIds &ids, const Utils::SmallStringVector &arguments)
: ids(ids)
, arguments(arguments)
{}
- void mergeIds(Utils::SmallStringVector &&newIds)
+ void mergeIds(ProjectPartIds &&newIds)
{
- Utils::SmallStringVector mergedIds;
+ ProjectPartIds mergedIds;
mergedIds.reserve(ids.size() + newIds.size());
std::set_union(std::make_move_iterator(ids.begin()),
@@ -54,12 +54,12 @@ struct ArgumentsEntry
std::make_move_iterator(newIds.end()),
std::back_inserter(mergedIds));
- ids = mergedIds;
+ ids = std::move(mergedIds);
}
- void removeIds(const Utils::SmallStringVector &idsToBeRemoved)
+ void removeIds(const ProjectPartIds &idsToBeRemoved)
{
- Utils::SmallStringVector idsWithout;
+ ProjectPartIds idsWithout;
idsWithout.reserve(ids.size());
std::set_difference(std::make_move_iterator(ids.begin()),
std::make_move_iterator(ids.end()),
@@ -67,10 +67,10 @@ struct ArgumentsEntry
idsToBeRemoved.end(),
std::back_inserter(idsWithout));
- ids = idsWithout;
+ ids = std::move(idsWithout);
}
- Utils::SmallStringVector ids;
+ ProjectPartIds ids;
Utils::SmallStringVector arguments;
};
@@ -118,11 +118,11 @@ public:
removeEmptyEntries();
}
- void remove(const Utils::SmallStringVector &idsToBeRemoved)
+ void remove(const ProjectPartIds &idsToBeRemoved)
{
ArgumentsEntries entries;
for (ArgumentsEntry &entry : m_argumentEntries) {
- Utils::SmallStringVector usedIds;
+ ProjectPartIds usedIds;
std::set_difference(entry.ids.begin(),
entry.ids.end(),
idsToBeRemoved.begin(),
@@ -135,11 +135,11 @@ public:
removeEmptyEntries();
}
- ArgumentsEntries arguments(const Utils::SmallStringVector &ids) const
+ ArgumentsEntries arguments(const ProjectPartIds &ids) const
{
ArgumentsEntries entries;
for (const ArgumentsEntry &entry : m_argumentEntries) {
- Utils::SmallStringVector usedIds;
+ ProjectPartIds usedIds;
std::set_intersection(entry.ids.begin(),
entry.ids.end(),
ids.begin(),
@@ -159,9 +159,9 @@ public:
}
private:
- static Utils::SmallStringVector createIds(const ProjectPartContainers &projectParts)
+ static ProjectPartIds createIds(const ProjectPartContainers &projectParts)
{
- Utils::SmallStringVector ids;
+ ProjectPartIds ids;
ids.reserve(projectParts.size());
for (const auto &projectPart : projectParts)
ids.emplace_back(projectPart.projectPartId);
@@ -181,7 +181,7 @@ private:
}
private:
- std::vector<ArgumentsEntry> m_argumentEntries;
+ ArgumentsEntries m_argumentEntries;
};
}
diff --git a/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri b/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri
index fb1671aaf7..fcac51f226 100644
--- a/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri
+++ b/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri
@@ -17,8 +17,6 @@ HEADERS += \
$$PWD/usedmacro.h \
$$PWD/sourcedependency.h \
$$PWD/filestatus.h \
- $$PWD/projectpartartefactexception.h \
- $$PWD/projectpartartefact.h \
$$PWD/filestatuscache.h \
$$PWD/indexdataconsumer.h \
$$PWD/sourcesmanager.h \
@@ -68,5 +66,4 @@ HEADERS += \
SOURCES += \
$$PWD/sourcerangefilter.cpp \
$$PWD/symbolindexer.cpp \
- $$PWD/projectpartartefact.cpp \
$$PWD/filestatuscache.cpp
diff --git a/src/tools/clangrefactoringbackend/source/collectmacrospreprocessorcallbacks.h b/src/tools/clangrefactoringbackend/source/collectmacrospreprocessorcallbacks.h
index 689e291098..1d16b0f5e1 100644
--- a/src/tools/clangrefactoringbackend/source/collectmacrospreprocessorcallbacks.h
+++ b/src/tools/clangrefactoringbackend/source/collectmacrospreprocessorcallbacks.h
@@ -209,7 +209,7 @@ public:
if (usr) {
m_symbolEntries.emplace(std::piecewise_construct,
std::forward_as_tuple(globalId),
- std::forward_as_tuple(std::move(usr.value()),
+ std::forward_as_tuple(std::move(*usr),
macroName,
SymbolKind::Macro));
}
diff --git a/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp b/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp
index 35cc0df219..86e5fb597c 100644
--- a/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp
+++ b/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp
@@ -149,7 +149,7 @@ bool IndexDataConsumer::handleDeclOccurence(
auto kindAndTags = symbolKindAndTags(declaration);
m_symbolEntries.emplace(std::piecewise_construct,
std::forward_as_tuple(globalId),
- std::forward_as_tuple(std::move(usr.value()),
+ std::forward_as_tuple(std::move(*usr),
symbolName(namedDeclaration),
kindAndTags.first,
kindAndTags.second));
diff --git a/src/tools/clangrefactoringbackend/source/symbolindexer.cpp b/src/tools/clangrefactoringbackend/source/symbolindexer.cpp
index aee8344fc9..e0315c6626 100644
--- a/src/tools/clangrefactoringbackend/source/symbolindexer.cpp
+++ b/src/tools/clangrefactoringbackend/source/symbolindexer.cpp
@@ -65,7 +65,8 @@ SymbolIndexer::SymbolIndexer(SymbolIndexerTaskQueueInterface &symbolIndexerTaskQ
ClangPathWatcherInterface &pathWatcher,
FilePathCachingInterface &filePathCache,
FileStatusCache &fileStatusCache,
- Sqlite::TransactionInterface &transactionInterface)
+ Sqlite::TransactionInterface &transactionInterface,
+ ProjectPartsStorageInterface &projectPartsStorage)
: m_symbolIndexerTaskQueue(symbolIndexerTaskQueue)
, m_symbolStorage(symbolStorage)
, m_buildDependencyStorage(buildDependenciesStorage)
@@ -74,6 +75,7 @@ SymbolIndexer::SymbolIndexer(SymbolIndexerTaskQueueInterface &symbolIndexerTaskQ
, m_filePathCache(filePathCache)
, m_fileStatusCache(fileStatusCache)
, m_transactionInterface(transactionInterface)
+ , m_projectPartsStorage(projectPartsStorage)
{
pathWatcher.setNotifier(this);
}
@@ -86,26 +88,13 @@ void SymbolIndexer::updateProjectParts(ProjectPartContainers &&projectParts)
void SymbolIndexer::updateProjectPart(ProjectPartContainer &&projectPart)
{
- Sqlite::ImmediateTransaction transaction{m_transactionInterface};
- const auto optionalArtefact = m_symbolStorage.fetchProjectPartArtefact(projectPart.projectPartId);
- int projectPartId = m_symbolStorage.insertOrUpdateProjectPart(
- projectPart.projectPartId,
- projectPart.toolChainArguments,
- projectPart.compilerMacros,
- projectPart.systemIncludeSearchPaths,
- projectPart.projectIncludeSearchPaths,
- projectPart.language,
- projectPart.languageVersion,
- projectPart.languageExtension);
- if (optionalArtefact)
- projectPartId = optionalArtefact->projectPartId;
+ Sqlite::DeferredTransaction transaction{m_transactionInterface};
+
+ ProjectPartId projectPartId = projectPart.projectPartId;
const Utils::optional<ProjectPartPch> optionalProjectPartPch
= m_precompiledHeaderStorage.fetchPrecompiledHeader(projectPartId);
- FilePathIds sourcePathIds = updatableFilePathIds(projectPart, optionalArtefact);
transaction.commit();
- if (sourcePathIds.empty())
- return;
using Builder = CommandLineBuilder<ProjectPartContainer, Utils::SmallStringVector>;
Builder commandLineBuilder{projectPart,
@@ -113,9 +102,8 @@ void SymbolIndexer::updateProjectPart(ProjectPartContainer &&projectPart)
InputFileType::Source,
{},
{},
- optionalProjectPartPch
- ? FilePathView{optionalProjectPartPch.value().pchPath}
- : FilePathView{}};
+ optionalProjectPartPch ? FilePathView{optionalProjectPartPch->pchPath}
+ : FilePathView{}};
std::vector<SymbolIndexerTask> symbolIndexerTask;
symbolIndexerTask.reserve(projectPart.sourcePathIds.size());
@@ -132,14 +120,6 @@ void SymbolIndexer::updateProjectPart(ProjectPartContainer &&projectPart)
m_symbolStorage.addSymbolsAndSourceLocations(symbolsCollector.symbols(),
symbolsCollector.sourceLocations());
-
- m_buildDependencyStorage.insertOrUpdateUsedMacros(symbolsCollector.usedMacros());
-
- m_buildDependencyStorage.insertOrUpdateFileStatuses(symbolsCollector.fileStatuses());
-
- m_buildDependencyStorage.insertOrUpdateSourceDependencies(
- symbolsCollector.sourceDependencies());
-
transaction.commit();
}
};
@@ -151,9 +131,7 @@ void SymbolIndexer::updateProjectPart(ProjectPartContainer &&projectPart)
m_symbolIndexerTaskQueue.processEntries();
}
-void SymbolIndexer::pathsWithIdsChanged(const Utils::SmallStringVector &)
-{
-}
+void SymbolIndexer::pathsWithIdsChanged(const ProjectPartIds &) {}
void SymbolIndexer::pathsChanged(const FilePathIds &filePathIds)
{
@@ -173,8 +151,8 @@ void SymbolIndexer::updateChangedPath(FilePathId filePathId,
m_fileStatusCache.update(filePathId);
Sqlite::DeferredTransaction transaction{m_transactionInterface};
- const Utils::optional<ProjectPartArtefact> optionalArtefact = m_symbolStorage.fetchProjectPartArtefact(
- filePathId);
+ const Utils::optional<ProjectPartArtefact>
+ optionalArtefact = m_projectPartsStorage.fetchProjectPartArtefact(filePathId);
if (!optionalArtefact)
return;
@@ -182,9 +160,9 @@ void SymbolIndexer::updateChangedPath(FilePathId filePathId,
= m_precompiledHeaderStorage.fetchPrecompiledHeader(optionalArtefact->projectPartId);
transaction.commit();
- const ProjectPartArtefact &artefact = optionalArtefact.value();
+ const ProjectPartArtefact &artefact = *optionalArtefact;
- auto pchPath = optionalProjectPartPch ? optionalProjectPartPch.value().pchPath : FilePath{};
+ auto pchPath = optionalProjectPartPch ? optionalProjectPartPch->pchPath : FilePath{};
CommandLineBuilder<ProjectPartArtefact, Utils::SmallStringVector>
builder{artefact, artefact.toolChainArguments, InputFileType::Source, {}, {}, pchPath};
@@ -201,13 +179,6 @@ void SymbolIndexer::updateChangedPath(FilePathId filePathId,
m_symbolStorage.addSymbolsAndSourceLocations(symbolsCollector.symbols(),
symbolsCollector.sourceLocations());
- m_buildDependencyStorage.insertOrUpdateUsedMacros(symbolsCollector.usedMacros());
-
- m_buildDependencyStorage.insertOrUpdateFileStatuses(symbolsCollector.fileStatuses());
-
- m_buildDependencyStorage.insertOrUpdateSourceDependencies(
- symbolsCollector.sourceDependencies());
-
transaction.commit();
}
};
diff --git a/src/tools/clangrefactoringbackend/source/symbolindexer.h b/src/tools/clangrefactoringbackend/source/symbolindexer.h
index 33c691e4dd..c398c0f2bf 100644
--- a/src/tools/clangrefactoringbackend/source/symbolindexer.h
+++ b/src/tools/clangrefactoringbackend/source/symbolindexer.h
@@ -31,9 +31,10 @@
#include "builddependenciesstorageinterface.h"
#include "clangpathwatcher.h"
+#include <filecontainerv2.h>
#include <precompiledheaderstorageinterface.h>
#include <projectpartcontainer.h>
-#include <filecontainerv2.h>
+#include <projectpartsstorageinterface.h>
namespace ClangBackEnd {
@@ -49,12 +50,13 @@ public:
ClangPathWatcherInterface &pathWatcher,
FilePathCachingInterface &filePathCache,
FileStatusCache &fileStatusCache,
- Sqlite::TransactionInterface &transactionInterface);
+ Sqlite::TransactionInterface &transactionInterface,
+ ProjectPartsStorageInterface &projectPartsStorage);
void updateProjectParts(ProjectPartContainers &&projectParts);
void updateProjectPart(ProjectPartContainer &&projectPart);
- void pathsWithIdsChanged(const Utils::SmallStringVector &ids) override;
+ void pathsWithIdsChanged(const ProjectPartIds &ids) override;
void pathsChanged(const FilePathIds &filePathIds) override;
void updateChangedPath(FilePathId filePath,
std::vector<SymbolIndexerTask> &symbolIndexerTask);
@@ -78,6 +80,7 @@ private:
FilePathCachingInterface &m_filePathCache;
FileStatusCache &m_fileStatusCache;
Sqlite::TransactionInterface &m_transactionInterface;
+ ProjectPartsStorageInterface &m_projectPartsStorage;
};
} // namespace ClangBackEnd
diff --git a/src/tools/clangrefactoringbackend/source/symbolindexertask.h b/src/tools/clangrefactoringbackend/source/symbolindexertask.h
index de3303815d..1695642522 100644
--- a/src/tools/clangrefactoringbackend/source/symbolindexertask.h
+++ b/src/tools/clangrefactoringbackend/source/symbolindexertask.h
@@ -26,6 +26,7 @@
#pragma once
#include <filepathid.h>
+#include <projectpartid.h>
#include <functional>
@@ -43,12 +44,10 @@ class SymbolIndexerTask
public:
using Callable = std::function<void(SymbolsCollectorInterface &symbolsCollector)>;
- SymbolIndexerTask(FilePathId filePathId,
- int projectPartId,
- Callable &&callable)
- : callable(std::move(callable)),
- filePathId(filePathId),
- projectPartId(projectPartId)
+ SymbolIndexerTask(FilePathId filePathId, ProjectPartId projectPartId, Callable &&callable)
+ : callable(std::move(callable))
+ , filePathId(filePathId)
+ , projectPartId(projectPartId)
{
}
@@ -78,7 +77,7 @@ public:
public:
Callable callable;
FilePathId filePathId;
- int projectPartId;
+ ProjectPartId projectPartId;
};
} // namespace ClangBackEnd
diff --git a/src/tools/clangrefactoringbackend/source/symbolindexing.h b/src/tools/clangrefactoringbackend/source/symbolindexing.h
index 5b8b2221f0..c942059bad 100644
--- a/src/tools/clangrefactoringbackend/source/symbolindexing.h
+++ b/src/tools/clangrefactoringbackend/source/symbolindexing.h
@@ -36,6 +36,7 @@
#include <builddependenciesstorage.h>
#include <precompiledheaderstorage.h>
+#include <projectpartsstorage.h>
#include <refactoringdatabaseinitializer.h>
#include <filepathcachingfwd.h>
@@ -84,7 +85,8 @@ public:
ProgressCounter::SetProgressCallback &&setProgressCallback)
: m_filePathCache(filePathCache)
, m_buildDependencyStorage(database)
- , m_recompiledHeaderStorage(database)
+ , m_precompiledHeaderStorage(database)
+ , m_projectPartsStorage(database)
, m_symbolStorage(database)
, m_collectorManger(generatedFiles, database)
, m_progressCounter(std::move(setProgressCallback))
@@ -121,7 +123,8 @@ private:
using SymbolIndexerTaskScheduler = TaskScheduler<SymbolsCollectorManager, SymbolIndexerTask::Callable>;
FilePathCachingInterface &m_filePathCache;
BuildDependenciesStorage m_buildDependencyStorage;
- PrecompiledHeaderStorage<Sqlite::Database> m_recompiledHeaderStorage;
+ PrecompiledHeaderStorage<Sqlite::Database> m_precompiledHeaderStorage;
+ ProjectPartsStorage<Sqlite::Database> m_projectPartsStorage;
SymbolStorage m_symbolStorage;
ClangPathWatcher<QFileSystemWatcher, QTimer> m_sourceWatcher{m_filePathCache};
FileStatusCache m_fileStatusCache{m_filePathCache};
@@ -130,11 +133,12 @@ private:
SymbolIndexer m_indexer{m_indexerQueue,
m_symbolStorage,
m_buildDependencyStorage,
- m_recompiledHeaderStorage,
+ m_precompiledHeaderStorage,
m_sourceWatcher,
m_filePathCache,
m_fileStatusCache,
- m_symbolStorage.m_database};
+ m_symbolStorage.database,
+ m_projectPartsStorage};
SymbolIndexerTaskQueue m_indexerQueue{m_indexerScheduler, m_progressCounter};
SymbolIndexerTaskScheduler m_indexerScheduler;
};
diff --git a/src/tools/clangrefactoringbackend/source/symbolstorage.h b/src/tools/clangrefactoringbackend/source/symbolstorage.h
index 798fa26dd0..9dffe48c96 100644
--- a/src/tools/clangrefactoringbackend/source/symbolstorage.h
+++ b/src/tools/clangrefactoringbackend/source/symbolstorage.h
@@ -50,10 +50,10 @@ class SymbolStorage final : public SymbolStorageInterface
public:
SymbolStorage(Database &database)
- : m_transaction(database),
- m_database(database)
+ : transaction(database)
+ , database(database)
{
- m_transaction.commit();
+ transaction.commit();
}
void addSymbolsAndSourceLocations(const SymbolEntries &symbolEntries,
@@ -70,91 +70,9 @@ public:
deleteNewLocationsTable();
}
- int insertOrUpdateProjectPart(Utils::SmallStringView projectPartName,
- const Utils::SmallStringVector &toolChainArguments,
- const CompilerMacros &compilerMacros,
- const IncludeSearchPaths &systemIncludeSearchPaths,
- const IncludeSearchPaths &projectIncludeSearchPaths,
- Utils::Language language,
- Utils::LanguageVersion languageVersion,
- Utils::LanguageExtension languageExtension) override
- {
- Utils::SmallString toolChainArgumentsAsJson = toJson(toolChainArguments);
- Utils::SmallString compilerMacrosAsJson = toJson(compilerMacros);
- Utils::SmallString systemIncludeSearchPathsAsJason = toJson(systemIncludeSearchPaths);
- Utils::SmallString projectIncludeSearchPathsAsJason = toJson(projectIncludeSearchPaths);
-
- m_insertOrUpdateProjectPartStatement.write(projectPartName,
- toolChainArgumentsAsJson,
- compilerMacrosAsJson,
- systemIncludeSearchPathsAsJason,
- projectIncludeSearchPathsAsJason,
- static_cast<int>(language),
- static_cast<int>(languageVersion),
- static_cast<int>(languageExtension));
-
- auto projectPartId = m_getProjectPartIdStatement.template value<int>(projectPartName);
-
- return projectPartId.value();
- }
-
- Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(FilePathId sourceId) const override
- {
- ReadStatement &statement = m_getProjectPartArtefactsBySourceId;
-
- return statement.template value<ProjectPartArtefact, 8>(sourceId.filePathId);
- }
-
- Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(Utils::SmallStringView projectPartName) const override
- {
- ReadStatement &statement = m_getProjectPartArtefactsByProjectPartName;
-
- return statement.template value<ProjectPartArtefact, 8>(projectPartName);
- }
-
- static Utils::SmallString toJson(const Utils::SmallStringVector &strings)
- {
- QJsonDocument document;
- QJsonArray array;
-
- std::transform(strings.begin(), strings.end(), std::back_inserter(array), [] (const auto &string) {
- return QJsonValue(string.data());
- });
-
- document.setArray(array);
-
- return document.toJson(QJsonDocument::Compact);
- }
-
- static Utils::SmallString toJson(const CompilerMacros &compilerMacros)
- {
- QJsonDocument document;
- QJsonArray array;
-
- for (const CompilerMacro &macro : compilerMacros)
- array.push_back(QJsonArray{{QString(macro.key), QString(macro.value), macro.index}});
-
- document.setArray(array);
-
- return document.toJson(QJsonDocument::Compact);
- }
-
- static Utils::SmallString toJson(const IncludeSearchPaths &includeSearchPaths)
- {
- QJsonDocument document;
- QJsonArray array;
-
- for (const IncludeSearchPath &path : includeSearchPaths)
- array.push_back(QJsonArray{{path.path.data(), path.index, int(path.type)}});
-
- document.setArray(array);
-
- return document.toJson(QJsonDocument::Compact);
- }
-
void fillTemporarySymbolsTable(const SymbolEntries &symbolEntries)
{
- WriteStatement &statement = m_insertSymbolsToNewSymbolsStatement;
+ WriteStatement &statement = insertSymbolsToNewSymbolsStatement;
for (const auto &symbolEntry : symbolEntries) {
statement.write(symbolEntry.first,
@@ -166,7 +84,7 @@ public:
void fillTemporaryLocationsTable(const SourceLocationEntries &sourceLocations)
{
- WriteStatement &statement = m_insertLocationsToNewLocationsStatement;
+ WriteStatement &statement = insertLocationsToNewLocationsStatement;
for (const auto &locationEntry : sourceLocations) {
statement.write(locationEntry.symbolId,
@@ -177,40 +95,22 @@ public:
}
}
- void addNewSymbolsToSymbols()
- {
- m_addNewSymbolsToSymbolsStatement.execute();
- }
+ void addNewSymbolsToSymbols() { addNewSymbolsToSymbolsStatement.execute(); }
- void syncNewSymbolsFromSymbols()
- {
- m_syncNewSymbolsFromSymbolsStatement.execute();
- }
+ void syncNewSymbolsFromSymbols() { syncNewSymbolsFromSymbolsStatement.execute(); }
- void syncSymbolsIntoNewLocations()
- {
- m_syncSymbolsIntoNewLocationsStatement.execute();
- }
+ void syncSymbolsIntoNewLocations() { syncSymbolsIntoNewLocationsStatement.execute(); }
void deleteAllLocationsFromUpdatedFiles()
{
- m_deleteAllLocationsFromUpdatedFilesStatement.execute();
+ deleteAllLocationsFromUpdatedFilesStatement.execute();
}
- void insertNewLocationsInLocations()
- {
- m_insertNewLocationsInLocationsStatement.execute();
- }
+ void insertNewLocationsInLocations() { insertNewLocationsInLocationsStatement.execute(); }
- void deleteNewSymbolsTable()
- {
- m_deleteNewSymbolsTableStatement.execute();
- }
+ void deleteNewSymbolsTable() { deleteNewSymbolsTableStatement.execute(); }
- void deleteNewLocationsTable()
- {
- m_deleteNewLocationsTableStatement.execute();
- }
+ void deleteNewLocationsTable() { deleteNewLocationsTableStatement.execute(); }
SourceLocationEntries sourceLocations() const
{
@@ -230,7 +130,7 @@ public:
table.addIndex({usrColumn, symbolNameColumn});
table.addIndex({symbolIdColumn});
- table.initialize(m_database);
+ table.initialize(database);
return table;
}
@@ -248,85 +148,49 @@ public:
table.addColumn("locationKind", Sqlite::ColumnType::Integer);
table.addUniqueIndex({sourceIdColumn, lineColumn, columnColumn});
- table.initialize(m_database);
+ table.initialize(database);
return table;
}
public:
- Sqlite::ImmediateNonThrowingDestructorTransaction m_transaction;
- Database &m_database;
+ Sqlite::ImmediateNonThrowingDestructorTransaction transaction;
+ Database &database;
Sqlite::Table newSymbolsTablet{createNewSymbolsTable()};
Sqlite::Table newLocationsTable{createNewLocationsTable()};
- WriteStatement m_insertSymbolsToNewSymbolsStatement{
+ WriteStatement insertSymbolsToNewSymbolsStatement{
"INSERT INTO newSymbols(temporarySymbolId, usr, symbolName, symbolKind) VALUES(?,?,?,?)",
- m_database};
- WriteStatement m_insertLocationsToNewLocationsStatement{
- "INSERT OR IGNORE INTO newLocations(temporarySymbolId, line, column, sourceId, locationKind) VALUES(?,?,?,?,?)",
- m_database
- };
- ReadStatement m_selectNewSourceIdsStatement{
- "SELECT DISTINCT sourceId FROM newLocations WHERE NOT EXISTS (SELECT sourceId FROM sources WHERE newLocations.sourceId == sources.sourceId)",
- m_database
- };
- WriteStatement m_addNewSymbolsToSymbolsStatement{
+ database};
+ WriteStatement insertLocationsToNewLocationsStatement{
+ "INSERT OR IGNORE INTO newLocations(temporarySymbolId, line, column, sourceId, "
+ "locationKind) VALUES(?,?,?,?,?)",
+ database};
+ ReadStatement selectNewSourceIdsStatement{
+ "SELECT DISTINCT sourceId FROM newLocations WHERE NOT EXISTS (SELECT sourceId FROM sources "
+ "WHERE newLocations.sourceId == sources.sourceId)",
+ database};
+ WriteStatement addNewSymbolsToSymbolsStatement{
"INSERT INTO symbols(usr, symbolName, symbolKind) "
"SELECT usr, symbolName, symbolKind FROM newSymbols WHERE NOT EXISTS "
"(SELECT usr FROM symbols WHERE symbols.usr == newSymbols.usr)",
- m_database
- };
- WriteStatement m_syncNewSymbolsFromSymbolsStatement{
- "UPDATE newSymbols SET symbolId = (SELECT symbolId FROM symbols WHERE newSymbols.usr = symbols.usr)",
- m_database
- };
- WriteStatement m_syncSymbolsIntoNewLocationsStatement{
- "UPDATE newLocations SET symbolId = (SELECT symbolId FROM newSymbols WHERE newSymbols.temporarySymbolId = newLocations.temporarySymbolId)",
- m_database
- };
- WriteStatement m_deleteAllLocationsFromUpdatedFilesStatement{
+ database};
+ WriteStatement syncNewSymbolsFromSymbolsStatement{
+ "UPDATE newSymbols SET symbolId = (SELECT symbolId FROM symbols WHERE newSymbols.usr = "
+ "symbols.usr)",
+ database};
+ WriteStatement syncSymbolsIntoNewLocationsStatement{
+ "UPDATE newLocations SET symbolId = (SELECT symbolId FROM newSymbols WHERE "
+ "newSymbols.temporarySymbolId = newLocations.temporarySymbolId)",
+ database};
+ WriteStatement deleteAllLocationsFromUpdatedFilesStatement{
"DELETE FROM locations WHERE sourceId IN (SELECT DISTINCT sourceId FROM newLocations)",
- m_database
- };
- WriteStatement m_insertNewLocationsInLocationsStatement{
- "INSERT INTO locations(symbolId, line, column, sourceId, locationKind) SELECT symbolId, line, column, sourceId, locationKind FROM newLocations",
- m_database
- };
- WriteStatement m_deleteNewSymbolsTableStatement{
- "DELETE FROM newSymbols",
- m_database
- };
- WriteStatement m_deleteNewLocationsTableStatement{
- "DELETE FROM newLocations",
- m_database
- };
- WriteStatement m_insertOrUpdateProjectPartStatement{
- "INSERT INTO projectParts(projectPartName, toolChainArguments, compilerMacros, "
- "systemIncludeSearchPaths, projectIncludeSearchPaths, language, languageVersion, "
- "languageExtension) VALUES (?001,?002,?003,?004,?005,?006,?007,?008) ON "
- "CONFLICT(projectPartName) DO UPDATE SET toolChainArguments=?002, compilerMacros=?003, "
- "systemIncludeSearchPaths=?004, projectIncludeSearchPaths=?005, language=?006, "
- "languageVersion=?007, languageExtension=?008",
- m_database};
- mutable ReadStatement m_getProjectPartIdStatement{
- "SELECT projectPartId FROM projectParts WHERE projectPartName = ?",
- m_database
- };
-
- mutable ReadStatement m_getCompileArgumentsForFileIdStatement{
- "SELECT toolChainArguments FROM projectParts WHERE projectPartId = (SELECT projectPartId "
- "FROM projectPartsSources WHERE sourceId = ?)",
- m_database};
- mutable ReadStatement m_getProjectPartArtefactsBySourceId{
- "SELECT toolChainArguments, compilerMacros, systemIncludeSearchPaths, "
- "projectIncludeSearchPaths, projectPartId, language, languageVersion, languageExtension "
- "FROM projectParts WHERE projectPartId = (SELECT "
- "projectPartId FROM projectPartsSources WHERE sourceId = ?)",
- m_database};
- mutable ReadStatement m_getProjectPartArtefactsByProjectPartName{
- "SELECT toolChainArguments, compilerMacros, systemIncludeSearchPaths, "
- "projectIncludeSearchPaths, projectPartId, language, languageVersion, languageExtension "
- "FROM projectParts WHERE projectPartName = ?",
- m_database};
+ database};
+ WriteStatement insertNewLocationsInLocationsStatement{
+ "INSERT INTO locations(symbolId, line, column, sourceId, locationKind) SELECT symbolId, "
+ "line, column, sourceId, locationKind FROM newLocations",
+ database};
+ WriteStatement deleteNewSymbolsTableStatement{"DELETE FROM newSymbols", database};
+ WriteStatement deleteNewLocationsTableStatement{"DELETE FROM newLocations", database};
};
} // namespace ClangBackEnd
diff --git a/src/tools/clangrefactoringbackend/source/symbolstorageinterface.h b/src/tools/clangrefactoringbackend/source/symbolstorageinterface.h
index 210f66f7da..1d04c4d168 100644
--- a/src/tools/clangrefactoringbackend/source/symbolstorageinterface.h
+++ b/src/tools/clangrefactoringbackend/source/symbolstorageinterface.h
@@ -25,19 +25,13 @@
#pragma once
-#include "filestatus.h"
-#include "projectpartentry.h"
-#include "projectpartartefact.h"
#include "sourcelocationentry.h"
-#include "sourcedependency.h"
#include "symbolentry.h"
-#include "usedmacro.h"
-
-#include <includesearchpath.h>
+#include <compilermacro.h>
#include <sqlitetransaction.h>
-#include <compilermacro.h>
+#include <utils/cpplanguage_details.h>
namespace ClangBackEnd {
@@ -51,20 +45,6 @@ public:
virtual void addSymbolsAndSourceLocations(const SymbolEntries &symbolEntries,
const SourceLocationEntries &sourceLocations)
= 0;
- virtual int insertOrUpdateProjectPart(
- Utils::SmallStringView projectPartName,
- const Utils::SmallStringVector &commandLineArguments,
- const CompilerMacros &compilerMacros,
- const ClangBackEnd::IncludeSearchPaths &systemIncludeSearchPaths,
- const ClangBackEnd::IncludeSearchPaths &projectIncludeSearchPaths,
- Utils::Language language,
- Utils::LanguageVersion languageVersion,
- Utils::LanguageExtension languageExtension)
- = 0;
- virtual Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(
- FilePathId sourceId) const = 0;
- virtual Utils::optional<ProjectPartArtefact> fetchProjectPartArtefact(
- Utils::SmallStringView projectPartName) const = 0;
protected:
~SymbolStorageInterface() = default;
diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp
index 91d1918de6..fac13979db 100644
--- a/tests/auto/debugger/tst_dumpers.cpp
+++ b/tests/auto/debugger/tst_dumpers.cpp
@@ -2043,23 +2043,30 @@ void tst_Dumpers::dumper_data()
// Value5("Tue Jan 1 13:15:32 1980 GMT"), "@QDateTime") % Optional();
#ifdef Q_OS_WIN
- QString tempDir = "\"C:/Program Files\"";
+ QString tempDir = "C:/Program Files";
#else
- QString tempDir = "\"/tmp\"";
+ QString tempDir = "/tmp";
#endif
+ auto quoted = [](const QString &str) { return QString('"' + str + '"'); };
+
QTest::newRow("QDir")
<< Data("#include <QDir>\n",
- "QDir dir(" + tempDir + ");\n"
+ "QDir dir(" + quoted(tempDir) + ");\n"
"QString s = dir.absolutePath();\n"
- "QFileInfoList fi = dir.entryInfoList();\n"
+ "QFileInfoList fil = dir.entryInfoList();\n"
+ "QFileInfo fi = fil.first();\n"
"unused(&dir, &s, &fi);\n")
+ CoreProfile()
+ QtVersion(0x50300)
- + Check("dir", tempDir, "@QDir")
- // + Check("dir.canonicalPath", tempDir, "@QString")
- + Check("dir.absolutePath", tempDir, "@QString") % Optional();
+ + Check("dir", quoted(tempDir), "@QDir")
+ // + Check("dir.canonicalPath", quoted(tempDir), "@QString")
+ + Check("dir.absolutePath", quoted(tempDir), "@QString") % Optional()
+ + Check("dir.entryInfoList.0", "[0]", quoted(tempDir + "/."), "@QFileInfo")
+ + Check("dir.entryInfoList.1", "[1]", quoted(tempDir + "/.."), "@QFileInfo")
+ + Check("dir.entryList.0", "[0]", "\".\"", "@QString")
+ + Check("dir.entryList.1", "[1]", "\"..\"", "@QString");
QTest::newRow("QFileInfo")
diff --git a/tests/unit/unittest/builddependenciesprovider-test.cpp b/tests/unit/unittest/builddependenciesprovider-test.cpp
index b69965cc56..772a435a58 100644
--- a/tests/unit/unittest/builddependenciesprovider-test.cpp
+++ b/tests/unit/unittest/builddependenciesprovider-test.cpp
@@ -34,12 +34,13 @@
namespace {
-using ClangBackEnd::BuildDependency;
using ClangBackEnd::BuildDependencies;
+using ClangBackEnd::BuildDependency;
using ClangBackEnd::FilePathId;
using ClangBackEnd::FilePathIds;
-using ClangBackEnd::SourceEntry;
+using ClangBackEnd::ProjectPartId;
using ClangBackEnd::SourceEntries;
+using ClangBackEnd::SourceEntry;
using ClangBackEnd::SourceType;
using ClangBackEnd::UsedMacro;
using ClangBackEnd::UsedMacros;
@@ -64,7 +65,7 @@ protected:
mockBuildDependenciesGenerator,
mockSqliteTransactionBackend};
ClangBackEnd::ProjectPartContainer projectPart1{
- "ProjectPart1",
+ 1,
{"--yi"},
{{"YI", "1", 1}},
{{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
@@ -75,7 +76,7 @@ protected:
Utils::LanguageVersion::C11,
Utils::LanguageExtension::All};
ClangBackEnd::ProjectPartContainer projectPart2{
- "ProjectPart2",
+ 2,
{"--er"},
{{"ER", "2", 1}},
{{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
@@ -114,10 +115,7 @@ TEST_F(BuildDependenciesProvider, CreateCallsFetchDependSourcesFromStorageIfTime
InSequence s;
EXPECT_CALL(mockSqliteTransactionBackend, deferredBegin());
- EXPECT_CALL(mockBuildDependenciesStorage,
- fetchProjectPartId(TypedEq<Utils::SmallStringView>("ProjectPart1")))
- .WillOnce(Return(11));
- EXPECT_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, 11))
+ EXPECT_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, {1}))
.WillRepeatedly(Return(firstSources));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
EXPECT_CALL(mockModifiedTimeChecker, isUpToDate(firstSources)).WillRepeatedly(Return(true));
@@ -132,13 +130,10 @@ TEST_F(BuildDependenciesProvider, CreateCallsFetchDependSourcesFromStorageIfTime
TEST_F(BuildDependenciesProvider, FetchDependSourcesFromStorage)
{
- ON_CALL(mockBuildDependenciesStorage,
- fetchProjectPartId(TypedEq<Utils::SmallStringView>("ProjectPart2")))
- .WillByDefault(Return(11));
- ON_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, 11)).WillByDefault(Return(firstSources));
- ON_CALL(mockBuildDependenciesStorage, fetchDependSources({3}, 11)).WillByDefault(Return(secondSources));
- ON_CALL(mockBuildDependenciesStorage, fetchDependSources({4}, 11)).WillByDefault(Return(thirdSources));
-
+ ON_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, {2})).WillByDefault(Return(firstSources));
+ ON_CALL(mockBuildDependenciesStorage, fetchDependSources({3}, {2}))
+ .WillByDefault(Return(secondSources));
+ ON_CALL(mockBuildDependenciesStorage, fetchDependSources({4}, {2})).WillByDefault(Return(thirdSources));
ON_CALL(mockModifiedTimeChecker, isUpToDate(_)).WillByDefault(Return(true));
auto buildDependency = provider.create(projectPart2);
@@ -157,17 +152,14 @@ TEST_F(BuildDependenciesProvider, CreateCallsFetchDependSourcesFromGeneratorIfTi
InSequence s;
EXPECT_CALL(mockSqliteTransactionBackend, deferredBegin());
- EXPECT_CALL(mockBuildDependenciesStorage,
- fetchProjectPartId(TypedEq<Utils::SmallStringView>("ProjectPart1")))
- .WillOnce(Return(11));
- EXPECT_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, TypedEq<int>(11)))
+ EXPECT_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, TypedEq<ProjectPartId>(1)))
.WillRepeatedly(Return(firstSources));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
EXPECT_CALL(mockModifiedTimeChecker, isUpToDate(firstSources)).WillRepeatedly(Return(false));
EXPECT_CALL(mockBuildDependenciesGenerator, create(projectPart1))
.WillOnce(Return(buildDependency));
EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin());
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSources(Eq(secondSources), 11));
+ EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSources(Eq(secondSources), {1}));
EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(Eq(fileStatuses)));
EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(Eq(sourceDependencies)));
EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(Eq(secondUsedMacros)));
@@ -178,10 +170,7 @@ TEST_F(BuildDependenciesProvider, CreateCallsFetchDependSourcesFromGeneratorIfTi
TEST_F(BuildDependenciesProvider, FetchDependSourcesFromGenerator)
{
- ON_CALL(mockBuildDependenciesStorage,
- fetchProjectPartId(TypedEq<Utils::SmallStringView>("ProjectPart1")))
- .WillByDefault(Return(11));
- ON_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, 11)).WillByDefault(Return(firstSources));
+ ON_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, {1})).WillByDefault(Return(firstSources));
ON_CALL(mockModifiedTimeChecker, isUpToDate(_)).WillByDefault(Return(false));
ON_CALL(mockBuildDependenciesGenerator, create(projectPart1)).WillByDefault(Return(buildDependency));
@@ -195,10 +184,7 @@ TEST_F(BuildDependenciesProvider, CreateCallsFetchUsedMacrosFromStorageIfTimeSta
InSequence s;
EXPECT_CALL(mockSqliteTransactionBackend, deferredBegin());
- EXPECT_CALL(mockBuildDependenciesStorage,
- fetchProjectPartId(TypedEq<Utils::SmallStringView>("ProjectPart1")))
- .WillOnce(Return(11));
- EXPECT_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, 11))
+ EXPECT_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, {1}))
.WillRepeatedly(Return(firstSources));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
EXPECT_CALL(mockModifiedTimeChecker, isUpToDate(firstSources)).WillRepeatedly(Return(true));
@@ -213,10 +199,7 @@ TEST_F(BuildDependenciesProvider, CreateCallsFetchUsedMacrosFromStorageIfTimeSta
TEST_F(BuildDependenciesProvider, FetchUsedMacrosFromStorageIfDependSourcesAreUpToDate)
{
- ON_CALL(mockBuildDependenciesStorage,
- fetchProjectPartId(TypedEq<Utils::SmallStringView>("ProjectPart1")))
- .WillByDefault(Return(11));
- ON_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, 11)).WillByDefault(Return(firstSources));
+ ON_CALL(mockBuildDependenciesStorage, fetchDependSources({2}, {1})).WillByDefault(Return(firstSources));
ON_CALL(mockModifiedTimeChecker, isUpToDate(firstSources)).WillByDefault(Return(true));
ON_CALL(mockBuildDependenciesStorage, fetchUsedMacros({1})).WillByDefault(Return(firstUsedMacros));
ON_CALL(mockBuildDependenciesStorage, fetchUsedMacros({2})).WillByDefault(Return(secondUsedMacros));
diff --git a/tests/unit/unittest/builddependenciesstorage-test.cpp b/tests/unit/unittest/builddependenciesstorage-test.cpp
index 30db7ea408..aa82370485 100644
--- a/tests/unit/unittest/builddependenciesstorage-test.cpp
+++ b/tests/unit/unittest/builddependenciesstorage-test.cpp
@@ -35,14 +35,15 @@
namespace {
-using Utils::PathString;
-using ClangBackEnd::FilePathId;
using ClangBackEnd::FilePathCachingInterface;
+using ClangBackEnd::FilePathId;
+using ClangBackEnd::ProjectPartId;
using ClangBackEnd::SourceEntries;
using ClangBackEnd::SourceType;
using ClangBackEnd::UsedMacro;
using Sqlite::Database;
using Sqlite::Table;
+using Utils::PathString;
using Storage = ClangBackEnd::BuildDependenciesStorage<MockSqliteDatabase>;
@@ -61,14 +62,14 @@ protected:
MockSqliteWriteStatement &deleteOutdatedSourceDependenciesStatement = storage.deleteOutdatedSourceDependenciesStatement;
MockSqliteWriteStatement &deleteNewSourceDependenciesStatement = storage.deleteNewSourceDependenciesStatement;
MockSqliteReadStatement &getLowestLastModifiedTimeOfDependencies = storage.getLowestLastModifiedTimeOfDependencies;
- MockSqliteWriteStatement &insertOrUpdateProjectPartsSourcesStatement = storage.insertOrUpdateProjectPartsSourcesStatement;
+ MockSqliteWriteStatement &insertOrUpdateProjectPartsFilesStatement = storage.insertOrUpdateProjectPartsFilesStatement;
MockSqliteReadStatement &fetchSourceDependenciesStatement = storage.fetchSourceDependenciesStatement;
MockSqliteReadStatement &fetchProjectPartIdStatement = storage.fetchProjectPartIdStatement;
MockSqliteReadStatement &fetchUsedMacrosStatement = storage.fetchUsedMacrosStatement;
MockSqliteWriteStatement &insertProjectPartNameStatement = storage.insertProjectPartNameStatement;
MockSqliteWriteStatement &updatePchCreationTimeStampStatement = storage.updatePchCreationTimeStampStatement;
- MockSqliteWriteStatement &deleteAllProjectPartsSourcesWithProjectPartNameStatement
- = storage.deleteAllProjectPartsSourcesWithProjectPartNameStatement;
+ MockSqliteWriteStatement &deleteAllProjectPartsFilesWithProjectPartNameStatement
+ = storage.deleteAllProjectPartsFilesWithProjectPartNameStatement;
};
TEST_F(BuildDependenciesStorage, ConvertStringsToJson)
@@ -177,10 +178,10 @@ TEST_F(BuildDependenciesStorage, UpdateSources)
SourceEntries entries{{1, SourceType::TopProjectInclude, 10, ClangBackEnd::HasMissingIncludes::Yes},
{2, SourceType::TopSystemInclude, 20}};
- EXPECT_CALL(deleteAllProjectPartsSourcesWithProjectPartNameStatement, write(TypedEq<int>(22)));
- EXPECT_CALL(insertOrUpdateProjectPartsSourcesStatement,
+ EXPECT_CALL(deleteAllProjectPartsFilesWithProjectPartNameStatement, write(TypedEq<int>(22)));
+ EXPECT_CALL(insertOrUpdateProjectPartsFilesStatement,
write(TypedEq<int>(1), TypedEq<int>(22), TypedEq<uchar>(0), TypedEq<uchar>(1)));
- EXPECT_CALL(insertOrUpdateProjectPartsSourcesStatement,
+ EXPECT_CALL(insertOrUpdateProjectPartsFilesStatement,
write(TypedEq<int>(2), TypedEq<int>(22), TypedEq<uchar>(1), TypedEq<uchar>(0)));
storage.insertOrUpdateSources(entries, 22);
@@ -191,50 +192,10 @@ TEST_F(BuildDependenciesStorage, UpdatePchCreationTimeStamp)
InSequence s;
EXPECT_CALL(mockDatabase, immediateBegin());
- EXPECT_CALL(updatePchCreationTimeStampStatement,
- write(TypedEq<long long>(101), TypedEq<Utils::SmallStringView>("project1")));
+ EXPECT_CALL(updatePchCreationTimeStampStatement, write(TypedEq<long long>(101), TypedEq<int>(1)));
EXPECT_CALL(mockDatabase, commit());
- storage.updatePchCreationTimeStamp(101, "project1");
-}
-
-TEST_F(BuildDependenciesStorage, CallsFetchProjectIdWithNonExistingProjectPartName)
-{
- EXPECT_CALL(fetchProjectPartIdStatement,
- valueReturnInt32(TypedEq<Utils::SmallStringView>("test")));
- EXPECT_CALL(insertProjectPartNameStatement, write(TypedEq<Utils::SmallStringView>("test")));
-
- storage.fetchProjectPartId("test");
-}
-
-TEST_F(BuildDependenciesStorage, CallsFetchProjectIdWithExistingProjectPart)
-{
- EXPECT_CALL(fetchProjectPartIdStatement, valueReturnInt32(TypedEq<Utils::SmallStringView>("test")))
- .WillOnce(Return(Utils::optional<int>{20}));
- EXPECT_CALL(insertProjectPartNameStatement, write(TypedEq<Utils::SmallStringView>("test"))).Times(0);
-
- storage.fetchProjectPartId("test");
-}
-
-TEST_F(BuildDependenciesStorage, FetchProjectIdWithNonExistingProjectPartName)
-{
- ON_CALL(fetchProjectPartIdStatement, valueReturnInt32(TypedEq<Utils::SmallStringView>("test")))
- .WillByDefault(Return(Utils::optional<int>{}));
- ON_CALL(mockDatabase, lastInsertedRowId()).WillByDefault(Return(21));
-
- int id = storage.fetchProjectPartId("test");
-
- ASSERT_THAT(id, 21);
-}
-
-TEST_F(BuildDependenciesStorage, FetchProjectIdWithExistingProjectPartName)
-{
- ON_CALL(fetchProjectPartIdStatement, valueReturnInt32(TypedEq<Utils::SmallStringView>("test")))
- .WillByDefault(Return(Utils::optional<int>{20}));
-
- int id = storage.fetchProjectPartId("test");
-
- ASSERT_THAT(id, 20);
+ storage.updatePchCreationTimeStamp(101, 1);
}
TEST_F(BuildDependenciesStorage, CallsFetchDependSources)
diff --git a/tests/unit/unittest/builddependencycollector-test.cpp b/tests/unit/unittest/builddependencycollector-test.cpp
index 5850666232..6c2153fe0c 100644
--- a/tests/unit/unittest/builddependencycollector-test.cpp
+++ b/tests/unit/unittest/builddependencycollector-test.cpp
@@ -734,7 +734,7 @@ TEST_F(BuildDependencyCollector, Create)
generatedFiles.update(
{{TESTDATA_DIR "/builddependencycollector/project/generated_file.h", "#pragma once"}});
ClangBackEnd::ProjectPartContainer projectPart{
- "project1",
+ 1,
{},
{},
{{TESTDATA_DIR "/builddependencycollector/system", 1, IncludeSearchPathType::System}},
@@ -885,7 +885,7 @@ TEST_F(BuildDependencyCollector, Clear)
using ClangBackEnd::IncludeSearchPathType;
ClangBackEnd::BuildDependencyCollector collector{filePathCache, generatedFiles, environment};
ClangBackEnd::ProjectPartContainer projectPart{
- "project1",
+ 1,
{},
{},
{{TESTDATA_DIR "/builddependencycollector/system", 1, IncludeSearchPathType::System}},
diff --git a/tests/unit/unittest/clangpathwatcher-test.cpp b/tests/unit/unittest/clangpathwatcher-test.cpp
index 058ae8e96a..00fe91dc49 100644
--- a/tests/unit/unittest/clangpathwatcher-test.cpp
+++ b/tests/unit/unittest/clangpathwatcher-test.cpp
@@ -43,12 +43,14 @@ using testing::SizeIs;
using testing::NiceMock;
using Watcher = ClangBackEnd::ClangPathWatcher<NiceMock<MockQFileSytemWatcher>, NiceMock<MockTimer>>;
-using ClangBackEnd::WatcherEntry;
-using ClangBackEnd::WatcherEntries;
using ClangBackEnd::FilePath;
-using ClangBackEnd::FilePathView;
using ClangBackEnd::FilePathId;
using ClangBackEnd::FilePathIds;
+using ClangBackEnd::FilePathView;
+using ClangBackEnd::ProjectPartId;
+using ClangBackEnd::ProjectPartIds;
+using ClangBackEnd::WatcherEntries;
+using ClangBackEnd::WatcherEntry;
class ClangPathWatcher : public testing::Test
{
@@ -66,15 +68,15 @@ protected:
NiceMock<MockClangPathWatcherNotifier> notifier;
Watcher watcher{filePathCache, &notifier};
NiceMock<MockQFileSytemWatcher> &mockQFileSytemWatcher = watcher.fileSystemWatcher();
- Utils::SmallString id1{"id4"};
- Utils::SmallString id2{"id2"};
- Utils::SmallString id3{"id3"};
+ ProjectPartId id1{2};
+ ProjectPartId id2{3};
+ ProjectPartId id3{4};
FilePathView path1{"/path/path1"};
FilePathView path2{"/path/path2"};
QString path1QString = QString(path1.toStringView());
QString path2QString = QString(path2.toStringView());
FilePathIds pathIds = {1, 2};
- std::vector<int> ids{watcher.idCache().stringIds({id1, id2, id3})};
+ ClangBackEnd::ProjectPartIds ids{id1, id2, id3};
WatcherEntry watcherEntry1{ids[0], pathIds[0]};
WatcherEntry watcherEntry2{ids[1], pathIds[0]};
WatcherEntry watcherEntry3{ids[0], pathIds[1]};
@@ -324,7 +326,7 @@ TEST_F(ClangPathWatcher, NotifyFileChange)
{
watcher.addEntries(sorted({watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4, watcherEntry5}));
- EXPECT_CALL(notifier, pathsWithIdsChanged(ElementsAre(id2, id1)));
+ EXPECT_CALL(notifier, pathsWithIdsChanged(ElementsAre(id1, id2)));
mockQFileSytemWatcher.fileChanged(path1QString);
}
@@ -333,7 +335,7 @@ TEST_F(ClangPathWatcher, TwoNotifyFileChanges)
{
watcher.addEntries(sorted({watcherEntry1, watcherEntry2, watcherEntry3, watcherEntry4, watcherEntry5}));
- EXPECT_CALL(notifier, pathsWithIdsChanged(ElementsAre(id2, id3, id1)));
+ EXPECT_CALL(notifier, pathsWithIdsChanged(ElementsAre(id1, id2, id3)));
mockQFileSytemWatcher.fileChanged(path2QString);
mockQFileSytemWatcher.fileChanged(path1QString);
diff --git a/tests/unit/unittest/commandlinebuilder-test.cpp b/tests/unit/unittest/commandlinebuilder-test.cpp
index 328b832b9c..8979cebca8 100644
--- a/tests/unit/unittest/commandlinebuilder-test.cpp
+++ b/tests/unit/unittest/commandlinebuilder-test.cpp
@@ -54,8 +54,8 @@ public:
}
public:
- ClangBackEnd::PchTask emptyProjectInfo{"empty", {}, {}, {}, {}, {}, {}, {}};
- ClangBackEnd::PchTask cppProjectInfo{"project1", {}, {}, {}, {}, {}, {}, {}};
+ ClangBackEnd::PchTask emptyProjectInfo{0, {}, {}, {}, {}, {}, {}, {}};
+ ClangBackEnd::PchTask cppProjectInfo{1, {}, {}, {}, {}, {}, {}, {}};
};
template <>
@@ -68,7 +68,7 @@ public:
}
public:
- ClangBackEnd::ProjectPartContainer emptyProjectInfo{"empty",
+ ClangBackEnd::ProjectPartContainer emptyProjectInfo{0,
{},
{},
{},
@@ -78,7 +78,7 @@ public:
Utils::Language::Cxx,
Utils::LanguageVersion::CXX98,
Utils::LanguageExtension::None};
- ClangBackEnd::ProjectPartContainer cppProjectInfo{"project1",
+ ClangBackEnd::ProjectPartContainer cppProjectInfo{1,
{},
{},
{},
@@ -145,7 +145,7 @@ TYPED_TEST(CommandLineBuilder, CHeader)
"c-header",
"-std=c11",
"-nostdinc",
- toNativePath("/source/file.c").path()));
+ toNativePath("/source/file.c")));
}
TYPED_TEST(CommandLineBuilder, CSource)
@@ -163,7 +163,7 @@ TYPED_TEST(CommandLineBuilder, CSource)
"c",
"-std=c11",
"-nostdinc",
- toNativePath("/source/file.c").path()));
+ toNativePath("/source/file.c")));
}
TYPED_TEST(CommandLineBuilder, ObjectiveCHeader)
@@ -182,7 +182,7 @@ TYPED_TEST(CommandLineBuilder, ObjectiveCHeader)
"objective-c-header",
"-std=c11",
"-nostdinc",
- toNativePath("/source/file.c").path()));
+ toNativePath("/source/file.c")));
}
TYPED_TEST(CommandLineBuilder, ObjectiveCSource)
@@ -201,7 +201,7 @@ TYPED_TEST(CommandLineBuilder, ObjectiveCSource)
"objective-c",
"-std=c11",
"-nostdinc",
- toNativePath("/source/file.c").path()));
+ toNativePath("/source/file.c")));
}
TYPED_TEST(CommandLineBuilder, CppHeader)
@@ -220,7 +220,7 @@ TYPED_TEST(CommandLineBuilder, CppHeader)
"-std=c++98",
"-nostdinc",
"-nostdinc++",
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/source/file.cpp")));
}
TYPED_TEST(CommandLineBuilder, CppSource)
@@ -239,7 +239,7 @@ TYPED_TEST(CommandLineBuilder, CppSource)
"-std=c++98",
"-nostdinc",
"-nostdinc++",
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/source/file.cpp")));
}
TYPED_TEST(CommandLineBuilder, ObjectiveCppHeader)
@@ -259,7 +259,7 @@ TYPED_TEST(CommandLineBuilder, ObjectiveCppHeader)
"-std=c++98",
"-nostdinc",
"-nostdinc++",
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/source/file.cpp")));
}
TYPED_TEST(CommandLineBuilder, ObjectiveCppSource)
@@ -279,7 +279,7 @@ TYPED_TEST(CommandLineBuilder, ObjectiveCppSource)
"-std=c++98",
"-nostdinc",
"-nostdinc++",
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/source/file.cpp")));
}
TYPED_TEST(CommandLineBuilder, Cpp98)
@@ -514,18 +514,18 @@ TYPED_TEST(CommandLineBuilder, IncludesOrder)
"-nostdinc",
"-nostdinc++",
"-I",
- toNativePath("/include/foo").path(),
+ toNativePath("/include/foo"),
"-I",
- toNativePath("/include/bar").path(),
+ toNativePath("/include/bar"),
"-F",
- toNativePath("/system/foo").path(),
+ toNativePath("/system/foo"),
"-isystem",
- toNativePath("/system/bar").path(),
+ toNativePath("/system/bar"),
"-isystem",
- toNativePath("/builtin/foo").path(),
+ toNativePath("/builtin/foo"),
"-isystem",
- toNativePath("/builtin/bar").path(),
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/builtin/bar"),
+ toNativePath("/source/file.cpp")));
}
TYPED_TEST(CommandLineBuilder, EmptySourceFile)
@@ -556,7 +556,7 @@ TYPED_TEST(CommandLineBuilder, SourceFile)
"-std=c++98",
"-nostdinc",
"-nostdinc++",
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/source/file.cpp")));
}
@@ -573,7 +573,7 @@ TYPED_TEST(CommandLineBuilder, EmptyOutputFile)
"-std=c++98",
"-nostdinc",
"-nostdinc++",
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/source/file.cpp")));
}
TYPED_TEST(CommandLineBuilder, OutputFile)
@@ -594,8 +594,8 @@ TYPED_TEST(CommandLineBuilder, OutputFile)
"-nostdinc",
"-nostdinc++",
"-o",
- toNativePath("/output/file.o").path(),
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/output/file.o"),
+ toNativePath("/source/file.cpp")));
}
TYPED_TEST(CommandLineBuilder, IncludePchPath)
@@ -619,10 +619,10 @@ TYPED_TEST(CommandLineBuilder, IncludePchPath)
"-Xclang",
"-include-pch",
"-Xclang",
- toNativePath("/pch/file.pch").path(),
+ toNativePath("/pch/file.pch"),
"-o",
- toNativePath("/output/file.o").path(),
- toNativePath("/source/file.cpp").path()));
+ toNativePath("/output/file.o"),
+ toNativePath("/source/file.cpp")));
}
TYPED_TEST(CommandLineBuilder, CompilerMacros)
diff --git a/tests/unit/unittest/filepathstorage-test.cpp b/tests/unit/unittest/filepathstorage-test.cpp
index c08c84e913..37f325daf0 100644
--- a/tests/unit/unittest/filepathstorage-test.cpp
+++ b/tests/unit/unittest/filepathstorage-test.cpp
@@ -288,7 +288,7 @@ TEST_F(FilePathStorage, CallSelectAndWriteForFetchingSourceIdForUnknownEntry)
storage.fetchSourceId(5, "unknownfile.h");
}
-TEST_F(FilePathStorage, RestartFetchDirectoryIDIfTheDatabaseIsBusyInBeginBecauseTheTableAlreadyChanged)
+TEST_F(FilePathStorage, RestartFetchDirectoryIDIfTheStatementIsBusyInBeginBecauseTheTableAlreadyChanged)
{
InSequence s;
@@ -303,7 +303,8 @@ TEST_F(FilePathStorage, RestartFetchDirectoryIDIfTheDatabaseIsBusyInBeginBecause
storage.fetchDirectoryId("/other/unknow/path");
}
-TEST_F(FilePathStorage, CallSelectAndWriteForFetchingDirectoryIdTwoTimesIfTheDatabaseIsBusyInWriteBecauseTheTableAlreadyChanged)
+TEST_F(FilePathStorage,
+ CallSelectAndWriteForFetchingDirectoryIdTwoTimesIfTheStatementIsBusyInWriteBecauseTheTableAlreadyChanged)
{
InSequence s;
@@ -340,7 +341,7 @@ TEST_F(FilePathStorage, CallSelectAndWriteForFetchingDirectoryIdTwoTimesIfTheInd
storage.fetchDirectoryId("/other/unknow/path");
}
-TEST_F(FilePathStorage, RestartFetchSourceIdIfTheDatabaseIsBusyInBeginBecauseTheTableAlreadyChanged)
+TEST_F(FilePathStorage, RestartFetchSourceIdIfTheStatementIsBusyInBeginBecauseTheTableAlreadyChanged)
{
InSequence s;
@@ -356,7 +357,8 @@ TEST_F(FilePathStorage, RestartFetchSourceIdIfTheDatabaseIsBusyInBeginBecauseThe
storage.fetchSourceId(5, "otherunknownfile.h");
}
-TEST_F(FilePathStorage, CallSelectAndWriteForFetchingSourceTwoTimesIfTheDatabaseIsBusyInWriteBecauseTheTableAlreadyChanged)
+TEST_F(FilePathStorage,
+ CallSelectAndWriteForFetchingSourceTwoTimesIfTheStatementIsBusyInWriteBecauseTheTableAlreadyChanged)
{
InSequence s;
@@ -475,7 +477,7 @@ TEST_F(FilePathStorage, ThrowAsFetchingSourceNameForNonExistingId)
ASSERT_THROW(storage.fetchSourceNameAndDirectoryId(12), ClangBackEnd::SourceNameIdDoesNotExists);
}
-TEST_F(FilePathStorage, RestartFetchSourceNameIfTheDatabaseIsBusyInBegin)
+TEST_F(FilePathStorage, RestartFetchSourceNameIfTheStatementIsBusyInBegin)
{
InSequence s;
@@ -492,7 +494,7 @@ TEST_F(FilePathStorage, RestartFetchSourceNameIfTheDatabaseIsBusyInBegin)
storage.fetchSourceNameAndDirectoryId(42);
}
-TEST_F(FilePathStorage, RestartFetchDirectoryPathIfTheDatabaseIsBusyInBegin)
+TEST_F(FilePathStorage, RestartFetchDirectoryPathIfTheStatementIsBusyInBegin)
{
InSequence s;
diff --git a/tests/unit/unittest/filesystem-utilities.h b/tests/unit/unittest/filesystem-utilities.h
index 9a4fd8e2db..fa75f06ad1 100644
--- a/tests/unit/unittest/filesystem-utilities.h
+++ b/tests/unit/unittest/filesystem-utilities.h
@@ -37,16 +37,16 @@ ClangBackEnd::NativeFilePath toNativePath(const char (&text)[Size])
return ClangBackEnd::NativeFilePath{path};
}
-inline ClangBackEnd::NativeFilePath toNativePath(const QString &text)
+inline Utils::PathString toNativePath(const QString &text)
{
ClangBackEnd::FilePath path{text};
- return ClangBackEnd::NativeFilePath{path};
+ return ClangBackEnd::NativeFilePath{path}.path();
}
-inline ClangBackEnd::NativeFilePath toNativePath(Utils::SmallStringView text)
+inline Utils::PathString toNativePath(Utils::SmallStringView text)
{
ClangBackEnd::FilePath path{text};
- return ClangBackEnd::NativeFilePath{path};
+ return ClangBackEnd::NativeFilePath{path}.path();
}
diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/unittest/gtest-creator-printing.cpp
index 2befb52417..3cb7e45def 100644
--- a/tests/unit/unittest/gtest-creator-printing.cpp
+++ b/tests/unit/unittest/gtest-creator-printing.cpp
@@ -48,6 +48,7 @@
#include <pchtask.h>
#include <precompiledheadersupdatedmessage.h>
#include <projectpartartefact.h>
+#include <projectpartid.h>
#include <sourcedependency.h>
#include <sourcelocationentry.h>
#include <sourcelocationscontainer.h>
@@ -1022,10 +1023,10 @@ std::ostream &operator<<(std::ostream &out, const SourceDependency &sourceDepend
std::ostream &operator<<(std::ostream &out, const ProjectPartArtefact &projectPartArtefact)
{
- return out << "("
- << projectPartArtefact.toolChainArguments << ", "
- << projectPartArtefact.compilerMacros
- <<")";
+ return out << "(" << projectPartArtefact.projectPartId << ", "
+ << projectPartArtefact.toolChainArguments << ", " << projectPartArtefact.compilerMacros
+ << ", " << projectPartArtefact.language << ", " << projectPartArtefact.languageVersion
+ << ", " << projectPartArtefact.languageExtension << ")";
}
std::ostream &operator<<(std::ostream &out, const CompilerMacro &compilerMacro)
@@ -1134,10 +1135,14 @@ std::ostream &operator<<(std::ostream &out, const SymbolIndexerTask &task)
const char* progressTypeToString(ClangBackEnd::ProgressType type)
{
switch (type) {
- case ProgressType::Invalid: return "Invalid";
- case ProgressType::PrecompiledHeader: return "PrecompiledHeader";
- case ProgressType::Indexing: return "Indexing";
- case ProgressType::DependencyCreation: return "DependencyCreation";
+ case ProgressType::Invalid:
+ return "Invalid";
+ case ProgressType::PrecompiledHeader:
+ return "PrecompiledHeader";
+ case ProgressType::Indexing:
+ return "Indexing";
+ case ProgressType::DependencyCreation:
+ return "Indexing";
}
return nullptr;
@@ -1184,18 +1189,18 @@ const char *typeToString(SourceType sourceType)
using ClangBackEnd::SymbolTag;
switch (sourceType) {
- case SourceType::TopProjectInclude:
- return "TopProjectInclude";
- case SourceType::TopSystemInclude:
- return "TopSystemInclude";
- case SourceType::SystemInclude:
- return "SystemInclude";
- case SourceType::ProjectInclude:
- return "ProjectInclude";
- case SourceType::UserInclude:
- return "UserInclude";
- case SourceType::Source:
- return "Source";
+ case SourceType::TopProjectInclude:
+ return "TopProjectInclude";
+ case SourceType::TopSystemInclude:
+ return "TopSystemInclude";
+ case SourceType::SystemInclude:
+ return "SystemInclude";
+ case SourceType::ProjectInclude:
+ return "ProjectInclude";
+ case SourceType::UserInclude:
+ return "UserInclude";
+ case SourceType::Source:
+ return "Source";
}
return "";
@@ -1265,6 +1270,11 @@ std::ostream &operator<<(std::ostream &out, const ProjectPartContainer &containe
return out;
}
+std::ostream &operator<<(std::ostream &out, const ProjectPartId &projectPathId)
+{
+ return out << projectPathId.projectPathId;
+}
+
void PrintTo(const FilePath &filePath, ::std::ostream *os)
{
*os << filePath;
diff --git a/tests/unit/unittest/gtest-creator-printing.h b/tests/unit/unittest/gtest-creator-printing.h
index 75eae281ae..9e2c5632f5 100644
--- a/tests/unit/unittest/gtest-creator-printing.h
+++ b/tests/unit/unittest/gtest-creator-printing.h
@@ -91,7 +91,7 @@ template <typename Type>
std::ostream &operator<<(std::ostream &out, const Utils::optional<Type> &optional)
{
if (optional)
- return out << "optional" << optional.value();
+ return out << "optional " << optional.value();
else
return out << "empty optional()";
}
@@ -196,6 +196,7 @@ class IncludeSearchPath;
enum class IncludeSearchPathType : unsigned char;
struct ArgumentsEntry;
class ProjectPartContainer;
+class ProjectPartId;
std::ostream &operator<<(std::ostream &out, const SourceLocationEntry &entry);
std::ostream &operator<<(std::ostream &out, const IdPaths &idPaths);
@@ -285,6 +286,7 @@ std::ostream &operator<<(std::ostream &out, const IncludeSearchPathType &pathTyp
std::ostream &operator<<(std::ostream &out, const IncludeSearchPath &path);
std::ostream &operator<<(std::ostream &out, const ArgumentsEntry &entry);
std::ostream &operator<<(std::ostream &out, const ProjectPartContainer &container);
+std::ostream &operator<<(std::ostream &out, const ProjectPartId &projectPathId);
void PrintTo(const FilePath &filePath, ::std::ostream *os);
void PrintTo(const FilePathView &filePathView, ::std::ostream *os);
diff --git a/tests/unit/unittest/mockbuilddependenciesstorage.h b/tests/unit/unittest/mockbuilddependenciesstorage.h
index 739c13cf8d..46c201de55 100644
--- a/tests/unit/unittest/mockbuilddependenciesstorage.h
+++ b/tests/unit/unittest/mockbuilddependenciesstorage.h
@@ -33,7 +33,8 @@ class MockBuildDependenciesStorage : public ClangBackEnd::BuildDependenciesStora
{
public:
MOCK_METHOD2(insertOrUpdateSources,
- void(const ClangBackEnd::SourceEntries &sources, int projectPartId));
+ void(const ClangBackEnd::SourceEntries &sources,
+ ClangBackEnd::ProjectPartId projectPartId));
MOCK_METHOD1(insertOrUpdateUsedMacros,
void (const ClangBackEnd::UsedMacros &usedMacros));
MOCK_METHOD1(insertOrUpdateFileStatuses, void(const ClangBackEnd::FileStatuses &fileStatuses));
@@ -43,11 +44,12 @@ public:
long long (ClangBackEnd::FilePathId sourceId));
MOCK_CONST_METHOD2(fetchDependSources,
ClangBackEnd::SourceEntries(ClangBackEnd::FilePathId sourceId,
- int projectPartId));
+ ClangBackEnd::ProjectPartId projectPartId));
MOCK_CONST_METHOD1(fetchUsedMacros,
ClangBackEnd::UsedMacros (ClangBackEnd::FilePathId sourceId));
- MOCK_METHOD1(fetchProjectPartId, int(Utils::SmallStringView projectPartName));
+ MOCK_METHOD1(fetchProjectPartId,
+ ClangBackEnd::ProjectPartId(Utils::SmallStringView projectPartName));
MOCK_METHOD2(updatePchCreationTimeStamp,
- void(long long pchCreationTimeStamp, Utils::SmallStringView projectPartName));
+ void(long long pchCreationTimeStamp, ClangBackEnd::ProjectPartId projectPartId));
};
diff --git a/tests/unit/unittest/mockclangpathwatcher.h b/tests/unit/unittest/mockclangpathwatcher.h
index 9539b1b652..80f077f475 100644
--- a/tests/unit/unittest/mockclangpathwatcher.h
+++ b/tests/unit/unittest/mockclangpathwatcher.h
@@ -34,8 +34,7 @@ class MockClangPathWatcher : public ClangBackEnd::ClangPathWatcherInterface
public:
MOCK_METHOD1(updateIdPaths,
void (const std::vector<ClangBackEnd::IdPaths> &idPaths));
- MOCK_METHOD1(removeIds,
- void (const Utils::SmallStringVector &ids));
+ MOCK_METHOD1(removeIds, void(const ClangBackEnd::ProjectPartIds &ids));
MOCK_METHOD1(setNotifier,
void (ClangBackEnd::ClangPathWatcherNotifier *notifier));
diff --git a/tests/unit/unittest/mockclangpathwatchernotifier.h b/tests/unit/unittest/mockclangpathwatchernotifier.h
index c704ca5704..c89f37adaf 100644
--- a/tests/unit/unittest/mockclangpathwatchernotifier.h
+++ b/tests/unit/unittest/mockclangpathwatchernotifier.h
@@ -32,8 +32,7 @@
class MockClangPathWatcherNotifier : public ClangBackEnd::ClangPathWatcherNotifier
{
public:
- MOCK_METHOD1(pathsWithIdsChanged,
- void (const Utils::SmallStringVector &ids));
+ MOCK_METHOD1(pathsWithIdsChanged, void(const ClangBackEnd::ProjectPartIds &ids));
MOCK_METHOD1(pathsChanged,
void (const ClangBackEnd::FilePathIds &filePathIds));
diff --git a/tests/unit/unittest/mockpchmanagernotifier.h b/tests/unit/unittest/mockpchmanagernotifier.h
index 985dc3c144..600b37bd2e 100644
--- a/tests/unit/unittest/mockpchmanagernotifier.h
+++ b/tests/unit/unittest/mockpchmanagernotifier.h
@@ -32,12 +32,13 @@
class MockPchManagerNotifier : public ClangPchManager::PchManagerNotifierInterface
{
public:
- MockPchManagerNotifier(const ClangPchManager::PchManagerClient &pchManagerClient)
- : ClangPchManager::PchManagerNotifierInterface(const_cast<ClangPchManager::PchManagerClient&>(pchManagerClient))
+ MockPchManagerNotifier(ClangPchManager::PchManagerClient &pchManagerClient)
+ : ClangPchManager::PchManagerNotifierInterface(pchManagerClient)
{}
MOCK_METHOD3(precompiledHeaderUpdated,
- void (const QString &projectPartId, const QString &pchFilePath, long long lastModified));
- MOCK_METHOD1(precompiledHeaderRemoved,
- void (const QString &projectPartId));
+ void(ClangBackEnd::ProjectPartId projectPartId,
+ const QString &pchFilePath,
+ long long lastModified));
+ MOCK_METHOD1(precompiledHeaderRemoved, void(ClangBackEnd::ProjectPartId projectPartId));
};
diff --git a/tests/unit/unittest/mockpchtaskgenerator.h b/tests/unit/unittest/mockpchtaskgenerator.h
index 4934d7a9a6..d2573f0c35 100644
--- a/tests/unit/unittest/mockpchtaskgenerator.h
+++ b/tests/unit/unittest/mockpchtaskgenerator.h
@@ -35,8 +35,7 @@ public:
MOCK_METHOD2(addProjectParts,
void(const ClangBackEnd::ProjectPartContainers &projectParts,
const Utils::SmallStringVector &toolChainArguments));
- MOCK_METHOD1(removeProjectParts,
- void (const Utils::SmallStringVector &projectsPartIds));
+ MOCK_METHOD1(removeProjectParts, void(const ClangBackEnd::ProjectPartIds &projectsPartIds));
void addProjectParts(ClangBackEnd::ProjectPartContainers &&projectParts,
Utils::SmallStringVector &&toolChainArguments) override
diff --git a/tests/unit/unittest/mockpchtaskqueue.h b/tests/unit/unittest/mockpchtaskqueue.h
index 6ba08b6b7a..3eccba4e0c 100644
--- a/tests/unit/unittest/mockpchtaskqueue.h
+++ b/tests/unit/unittest/mockpchtaskqueue.h
@@ -34,7 +34,7 @@ class MockPchTaskQueue : public ClangBackEnd::PchTaskQueueInterface
public:
MOCK_METHOD1(addSystemPchTasks, void(const ClangBackEnd::PchTasks &pchTasks));
MOCK_METHOD1(addProjectPchTasks, void(const ClangBackEnd::PchTasks &pchTasks));
- MOCK_METHOD1(removePchTasks, void(const Utils::SmallStringVector &projectsPartIds));
+ MOCK_METHOD1(removePchTasks, void(const ClangBackEnd::ProjectPartIds &projectsPartIds));
MOCK_METHOD0(processEntries, void ());
void addSystemPchTasks(ClangBackEnd::PchTasks &&pchTasks) override
diff --git a/tests/unit/unittest/mockpchtasksmerger.h b/tests/unit/unittest/mockpchtasksmerger.h
index 39e73f9f55..0e6cbe1d4e 100644
--- a/tests/unit/unittest/mockpchtasksmerger.h
+++ b/tests/unit/unittest/mockpchtasksmerger.h
@@ -36,7 +36,7 @@ public:
void(const ClangBackEnd::PchTaskSets &pchTaskSets,
const Utils::SmallStringVector &toolChainArguments));
- MOCK_METHOD1(removePchTasks, void(const Utils::SmallStringVector &projectPartIds));
+ MOCK_METHOD1(removePchTasks, void(const ClangBackEnd::ProjectPartIds &projectPartIds));
void mergeTasks(ClangBackEnd::PchTaskSets &&pchTaskSets,
Utils::SmallStringVector &&toolChainArguments) override
diff --git a/tests/unit/unittest/mockprecompiledheaderstorage.h b/tests/unit/unittest/mockprecompiledheaderstorage.h
index 72eefcc1d1..31c38affda 100644
--- a/tests/unit/unittest/mockprecompiledheaderstorage.h
+++ b/tests/unit/unittest/mockprecompiledheaderstorage.h
@@ -33,18 +33,19 @@ class MockPrecompiledHeaderStorage : public ClangBackEnd::PrecompiledHeaderStora
{
public:
MOCK_METHOD3(insertProjectPrecompiledHeader,
- void(Utils::SmallStringView projectPartName,
+ void(ClangBackEnd::ProjectPartId projectPartId,
Utils::SmallStringView pchPath,
long long pchBuildTime));
- MOCK_METHOD1(deleteProjectPrecompiledHeader, void(Utils::SmallStringView projectPartName));
+ MOCK_METHOD1(deleteProjectPrecompiledHeader, void(ClangBackEnd::ProjectPartId projectPartId));
MOCK_METHOD3(insertSystemPrecompiledHeaders,
- void(const Utils::SmallStringVector &projectPartNames,
+ void(const ClangBackEnd::ProjectPartIds &projectPartIds,
Utils::SmallStringView pchPath,
long long pchBuildTime));
MOCK_METHOD1(deleteSystemPrecompiledHeaders,
- void(const Utils::SmallStringVector &projectPartNames));
+ void(const ClangBackEnd::ProjectPartIds &projectPartIds));
MOCK_METHOD1(fetchSystemPrecompiledHeaderPath,
- ClangBackEnd::FilePath(Utils::SmallStringView projectPartName));
- MOCK_CONST_METHOD1(fetchPrecompiledHeader,
- Utils::optional<ClangBackEnd::ProjectPartPch>(int projectPartId));
+ ClangBackEnd::FilePath(ClangBackEnd::ProjectPartId projectPartId));
+ MOCK_CONST_METHOD1(
+ fetchPrecompiledHeader,
+ Utils::optional<ClangBackEnd::ProjectPartPch>(ClangBackEnd::ProjectPartId projectPartId));
};
diff --git a/tests/unit/unittest/mockprojectparts.h b/tests/unit/unittest/mockprojectpartsmanager.h
index 15ec023846..b2cab59060 100644
--- a/tests/unit/unittest/mockprojectparts.h
+++ b/tests/unit/unittest/mockprojectpartsmanager.h
@@ -35,9 +35,10 @@ public:
MOCK_METHOD1(update,
ClangBackEnd::ProjectPartContainers(
const ClangBackEnd::ProjectPartContainers &projectsParts));
- MOCK_METHOD1(remove, void(const Utils::SmallStringVector &projectPartIds));
+ MOCK_METHOD1(remove, void(const ClangBackEnd::ProjectPartIds &projectPartIds));
MOCK_CONST_METHOD1(
- projects, ClangBackEnd::ProjectPartContainers(const Utils::SmallStringVector &projectPartIds));
+ projects,
+ ClangBackEnd::ProjectPartContainers(const ClangBackEnd::ProjectPartIds &projectPartIds));
MOCK_METHOD1(updateDeferred, void(const ClangBackEnd::ProjectPartContainers &projectsParts));
MOCK_METHOD0(deferredUpdates, ClangBackEnd::ProjectPartContainers());
diff --git a/tests/unit/unittest/mockprojectpartsstorage.h b/tests/unit/unittest/mockprojectpartsstorage.h
new file mode 100644
index 0000000000..114a7fab0e
--- /dev/null
+++ b/tests/unit/unittest/mockprojectpartsstorage.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 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.
+**
+****************************************************************************/
+
+#pragma once
+
+#include "googletest.h"
+
+#include <projectpartsstorageinterface.h>
+
+class MockProjectPartsStorage : public ClangBackEnd::ProjectPartsStorageInterface
+{
+public:
+ MOCK_CONST_METHOD0(fetchProjectParts, ClangBackEnd::ProjectPartContainers());
+ MOCK_CONST_METHOD1(
+ fetchProjectParts,
+ ClangBackEnd::ProjectPartContainers(const ClangBackEnd::ProjectPartIds &projectPartIds));
+ MOCK_CONST_METHOD1(fetchProjectPartId,
+ ClangBackEnd::ProjectPartId(Utils::SmallStringView projectPartName));
+ MOCK_CONST_METHOD1(fetchProjectPartName,
+ Utils::PathString(ClangBackEnd::ProjectPartId projectPartId));
+ MOCK_METHOD8(updateProjectPart,
+ void(ClangBackEnd::ProjectPartId projectPartId,
+ const Utils::SmallStringVector &commandLineArgument,
+ const ClangBackEnd::CompilerMacros &compilerMacros,
+ const ClangBackEnd::IncludeSearchPaths &systemIncludeSearchPaths,
+ const ClangBackEnd::IncludeSearchPaths &projectIncludeSearchPaths,
+ Utils::Language language,
+ Utils::LanguageVersion languageVersion,
+ Utils::LanguageExtension languageExtension));
+ MOCK_METHOD1(updateProjectParts, void(const ClangBackEnd::ProjectPartContainers &projectParts));
+ MOCK_CONST_METHOD1(
+ fetchProjectPartArtefact,
+ Utils::optional<ClangBackEnd::ProjectPartArtefact>(ClangBackEnd::FilePathId sourceId));
+ MOCK_CONST_METHOD1(fetchProjectPartArtefact,
+ Utils::optional<ClangBackEnd::ProjectPartArtefact>(
+ ClangBackEnd::ProjectPartId projectPartId));
+ MOCK_METHOD0(transactionBackend, Sqlite::TransactionInterface &());
+};
diff --git a/tests/unit/unittest/mocksqlitereadstatement.cpp b/tests/unit/unittest/mocksqlitereadstatement.cpp
index 04d2a07c14..c12d40b9ea 100644
--- a/tests/unit/unittest/mocksqlitereadstatement.cpp
+++ b/tests/unit/unittest/mocksqlitereadstatement.cpp
@@ -90,6 +90,13 @@ MockSqliteReadStatement::values<ClangBackEnd::UsedMacro, 2>(
return valuesReturnUsedMacros(reserveSize, sourceId);
}
+template<>
+FilePathIds MockSqliteReadStatement::values<ClangBackEnd::FilePathId>(std::size_t reserveSize,
+ const int &projectPartId)
+{
+ return valuesReturnFilePathIds(reserveSize, projectPartId);
+}
+
template <>
std::vector<Sources::Directory> MockSqliteReadStatement::values<Sources::Directory, 2>(std::size_t reserveSize)
{
@@ -116,6 +123,13 @@ MockSqliteReadStatement::value<int>(const Utils::PathString &text)
return valueReturnInt32(text);
}
+template<>
+Utils::optional<ClangBackEnd::ProjectPartId> MockSqliteReadStatement::value<ClangBackEnd::ProjectPartId>(
+ const Utils::SmallStringView &text)
+{
+ return valueReturnProjectPartId(text);
+}
+
template <>
Utils::optional<int>
MockSqliteReadStatement::value<int>(const int &directoryId, const Utils::SmallStringView &text)
@@ -144,9 +158,9 @@ MockSqliteReadStatement::value<Utils::PathString>(const Utils::SmallStringView &
return valueReturnPathString(path);
}
-template <>
-Utils::optional<ClangBackEnd::FilePath>
-MockSqliteReadStatement::value<ClangBackEnd::FilePath>(const Utils::SmallStringView &path)
+template<>
+Utils::optional<ClangBackEnd::FilePath> MockSqliteReadStatement::value<ClangBackEnd::FilePath>(
+ const int &path)
{
return valueReturnFilePath(path);
}
@@ -165,9 +179,23 @@ MockSqliteReadStatement::value<ClangBackEnd::ProjectPartArtefact, 8>(const Utils
return valueReturnProjectPartArtefact(projectPartName);
}
-template <>
+template<>
+Utils::optional<ClangBackEnd::ProjectPartContainer>
+MockSqliteReadStatement::value<ClangBackEnd::ProjectPartContainer, 8>(const int &id)
+{
+ return valueReturnProjectPartContainer(id);
+}
+
+template<>
+ClangBackEnd::ProjectPartContainers MockSqliteReadStatement::values<ClangBackEnd::ProjectPartContainer,
+ 8>(std::size_t reserveSize)
+{
+ return valuesReturnProjectPartContainers(reserveSize);
+}
+
+template<>
Utils::optional<ClangBackEnd::ProjectPartPch>
-MockSqliteReadStatement::value<ClangBackEnd::ProjectPartPch, 2>(const int &projectPartId)
+MockSqliteReadStatement::value<ClangBackEnd::ProjectPartPch, 3>(const int &projectPartId)
{
return valueReturnProjectPartPch(projectPartId);
}
diff --git a/tests/unit/unittest/mocksqlitereadstatement.h b/tests/unit/unittest/mocksqlitereadstatement.h
index 5c6fbdef77..e3ab740b6e 100644
--- a/tests/unit/unittest/mocksqlitereadstatement.h
+++ b/tests/unit/unittest/mocksqlitereadstatement.h
@@ -30,12 +30,13 @@
#include <sourcelocations.h>
#include <filepathstoragesources.h>
-#include <stringcachefwd.h>
#include <projectpartartefact.h>
+#include <projectpartcontainer.h>
#include <projectpartpch.h>
#include <sourceentry.h>
-#include <usedmacro.h>
+#include <stringcachefwd.h>
#include <symbol.h>
+#include <usedmacro.h>
#include <cpptools/usages.h>
@@ -46,11 +47,12 @@
#include <tuple>
#include <vector>
-using std::int64_t;
-using ClangBackEnd::SourceEntry;
+using ClangBackEnd::FilePathIds;
using ClangBackEnd::SourceEntries;
+using ClangBackEnd::SourceEntry;
using ClangRefactoring::SourceLocation;
using ClangRefactoring::SourceLocations;
+using std::int64_t;
namespace Sources = ClangBackEnd::Sources;
using ClangRefactoring::Symbol;
using ClangRefactoring::Symbols;
@@ -81,11 +83,11 @@ public:
MOCK_METHOD3(valuesReturnSourceEntries,
SourceEntries(std::size_t, int, int));
- MOCK_METHOD2(valuesReturnUsedMacros,
- UsedMacros (std::size_t, int));
+ MOCK_METHOD2(valuesReturnUsedMacros, UsedMacros(std::size_t, int));
+
+ MOCK_METHOD2(valuesReturnFilePathIds, FilePathIds(std::size_t, int));
- MOCK_METHOD1(valueReturnInt32,
- Utils::optional<int>(Utils::SmallStringView));
+ MOCK_METHOD1(valueReturnInt32, Utils::optional<int>(Utils::SmallStringView));
MOCK_METHOD2(valueReturnInt32,
Utils::optional<int>(int, Utils::SmallStringView));
@@ -99,8 +101,7 @@ public:
MOCK_METHOD1(valueReturnPathString,
Utils::optional<Utils::PathString>(Utils::SmallStringView));
- MOCK_METHOD1(valueReturnFilePath,
- Utils::optional<ClangBackEnd::FilePath>(Utils::SmallStringView));
+ MOCK_METHOD1(valueReturnFilePath, Utils::optional<ClangBackEnd::FilePath>(int));
MOCK_METHOD1(valueReturnSmallString,
Utils::optional<Utils::SmallString>(int));
@@ -113,7 +114,10 @@ public:
MOCK_METHOD1(valueReturnProjectPartArtefact,
Utils::optional<ClangBackEnd::ProjectPartArtefact>(Utils::SmallStringView));
-
+ MOCK_METHOD1(valuesReturnProjectPartArtefacts, ClangBackEnd::ProjectPartArtefacts(std::size_t));
+ MOCK_METHOD1(valueReturnProjectPartContainer,
+ Utils::optional<ClangBackEnd::ProjectPartContainer>(int));
+ MOCK_METHOD1(valuesReturnProjectPartContainers, ClangBackEnd::ProjectPartContainers(std::size_t));
MOCK_METHOD1(valueReturnProjectPartPch,
Utils::optional<ClangBackEnd::ProjectPartPch>(int));
@@ -129,6 +133,9 @@ public:
MOCK_METHOD2(valueReturnSourceLocation,
SourceLocation(long long, int));
+ MOCK_METHOD1(valueReturnProjectPartId,
+ Utils::optional<ClangBackEnd::ProjectPartId>(Utils::SmallStringView));
+
template <typename ResultType,
int ResultTypeCount = 1,
typename... QueryType>
@@ -201,6 +208,10 @@ MockSqliteReadStatement::values<ClangBackEnd::UsedMacro, 2>(
std::size_t reserveSize,
const int &sourceId);
+template<>
+FilePathIds MockSqliteReadStatement::values<ClangBackEnd::FilePathId>(std::size_t reserveSize,
+ const int &projectPartId);
+
template <>
std::vector<Sources::Directory> MockSqliteReadStatement::values<Sources::Directory, 2>(std::size_t reserveSize);
@@ -215,9 +226,13 @@ template <>
Utils::optional<int>
MockSqliteReadStatement::value<int>(const Utils::PathString&);
-template <>
-Utils::optional<ClangBackEnd::FilePath>
-MockSqliteReadStatement::value<ClangBackEnd::FilePath>(const Utils::SmallStringView&);
+template<>
+Utils::optional<ClangBackEnd::ProjectPartId> MockSqliteReadStatement::value<ClangBackEnd::ProjectPartId>(
+ const Utils::SmallStringView &);
+
+template<>
+Utils::optional<ClangBackEnd::FilePath> MockSqliteReadStatement::value<ClangBackEnd::FilePath>(
+ const int &);
template <>
Utils::optional<int>
@@ -243,9 +258,17 @@ template <>
Utils::optional<ClangBackEnd::ProjectPartArtefact>
MockSqliteReadStatement::value<ClangBackEnd::ProjectPartArtefact, 8>(const int&);
-template <>
+template<>
+Utils::optional<ClangBackEnd::ProjectPartContainer>
+MockSqliteReadStatement::value<ClangBackEnd::ProjectPartContainer, 8>(const int &);
+
+template<>
+ClangBackEnd::ProjectPartContainers MockSqliteReadStatement::values<ClangBackEnd::ProjectPartContainer,
+ 8>(std::size_t reserveSize);
+
+template<>
Utils::optional<ClangBackEnd::ProjectPartPch>
-MockSqliteReadStatement::value<ClangBackEnd::ProjectPartPch, 2>(const int&);
+MockSqliteReadStatement::value<ClangBackEnd::ProjectPartPch, 3>(const int &);
template <>
Utils::optional<Utils::SmallString>
diff --git a/tests/unit/unittest/mocksqlitewritestatement.h b/tests/unit/unittest/mocksqlitewritestatement.h
index 4b369845aa..5644fd9bb8 100644
--- a/tests/unit/unittest/mocksqlitewritestatement.h
+++ b/tests/unit/unittest/mocksqlitewritestatement.h
@@ -65,8 +65,7 @@ public:
MOCK_METHOD2(write, void(Utils::SmallStringView, Utils::SmallStringView));
- MOCK_METHOD3(write,
- void (Utils::SmallStringView, Utils::SmallStringView, long long));
+ MOCK_METHOD3(write, void(int, Utils::SmallStringView, long long));
MOCK_METHOD3(write,
void (Utils::SmallStringView, Utils::SmallStringView, Utils::SmallStringView));
@@ -78,7 +77,7 @@ public:
Utils::SmallStringView));
MOCK_METHOD8(write,
- void(Utils::SmallStringView,
+ void(int,
Utils::SmallStringView,
Utils::SmallStringView,
Utils::SmallStringView,
diff --git a/tests/unit/unittest/mocksymbolstorage.h b/tests/unit/unittest/mocksymbolstorage.h
index c4b55fcfe4..a174389735 100644
--- a/tests/unit/unittest/mocksymbolstorage.h
+++ b/tests/unit/unittest/mocksymbolstorage.h
@@ -37,17 +37,4 @@ public:
MOCK_METHOD2(addSymbolsAndSourceLocations,
void(const ClangBackEnd::SymbolEntries &symbolEentries,
const ClangBackEnd::SourceLocationEntries &sourceLocations));
- MOCK_METHOD8(insertOrUpdateProjectPart,
- int(Utils::SmallStringView projectPartName,
- const Utils::SmallStringVector &commandLineArgument,
- const ClangBackEnd::CompilerMacros &compilerMacros,
- const ClangBackEnd::IncludeSearchPaths &systemIncludeSearchPaths,
- const ClangBackEnd::IncludeSearchPaths &projectIncludeSearchPaths,
- Utils::Language language,
- Utils::LanguageVersion languageVersion,
- Utils::LanguageExtension languageExtension));
- MOCK_CONST_METHOD1(fetchProjectPartArtefact,
- Utils::optional<ClangBackEnd::ProjectPartArtefact> (ClangBackEnd::FilePathId sourceId));
- MOCK_CONST_METHOD1(fetchProjectPartArtefact,
- Utils::optional<ClangBackEnd::ProjectPartArtefact> (Utils::SmallStringView projectPartName));
};
diff --git a/tests/unit/unittest/pchcreator-test.cpp b/tests/unit/unittest/pchcreator-test.cpp
index 3dbafc8aa0..b057795a3a 100644
--- a/tests/unit/unittest/pchcreator-test.cpp
+++ b/tests/unit/unittest/pchcreator-test.cpp
@@ -105,7 +105,7 @@ protected:
mockClangPathWatcher,
mockBuildDependenciesStorage};
PchTask pchTask1{
- "project1",
+ 1,
{id(TESTDATA_DIR "/builddependencycollector/project/header2.h"),
id(TESTDATA_DIR "/builddependencycollector/external/external1.h"),
id(TESTDATA_DIR "/builddependencycollector/external/external2.h")},
@@ -149,11 +149,11 @@ TEST_F(PchCreator, CreateProjectPartClangCompilerArguments)
"-nostdinc",
"-nostdinc++",
"-I",
- toNativePath(TESTDATA_DIR "/builddependencycollector/project").path(),
+ toNativePath(TESTDATA_DIR "/builddependencycollector/project"),
"-isystem",
- toNativePath(TESTDATA_DIR "/builddependencycollector/external").path(),
+ toNativePath(TESTDATA_DIR "/builddependencycollector/external"),
"-isystem",
- toNativePath(TESTDATA_DIR "/builddependencycollector/system").path(),
+ toNativePath(TESTDATA_DIR "/builddependencycollector/system"),
"-o",
"project.pch"));
}
@@ -174,11 +174,11 @@ TEST_F(PchCreator, CreateProjectPartClangCompilerArgumentsWithSystemPch)
"-nostdinc",
"-nostdinc++",
"-I",
- toNativePath(TESTDATA_DIR "/builddependencycollector/project").path(),
+ toNativePath(TESTDATA_DIR "/builddependencycollector/project"),
"-isystem",
- toNativePath(TESTDATA_DIR "/builddependencycollector/external").path(),
+ toNativePath(TESTDATA_DIR "/builddependencycollector/external"),
"-isystem",
- toNativePath(TESTDATA_DIR "/builddependencycollector/system").path(),
+ toNativePath(TESTDATA_DIR "/builddependencycollector/system"),
"-Xclang",
"-include-pch",
"-Xclang",
@@ -205,7 +205,7 @@ TEST_F(PchCreatorVerySlowTest, SourcesAreWatchedAfterSucess)
EXPECT_CALL(mockClangPathWatcher,
updateIdPaths(ElementsAre(AllOf(
- Field(&ClangBackEnd::IdPaths::id, "project1"),
+ Field(&ClangBackEnd::IdPaths::id, 1),
Field(&ClangBackEnd::IdPaths::filePathIds,
UnorderedElementsAre(
id(TESTDATA_DIR "/builddependencycollector/project/header2.h"),
@@ -224,7 +224,7 @@ TEST_F(PchCreatorVerySlowTest, SourcesAreNotWatchedAfterFail)
EXPECT_CALL(mockClangPathWatcher,
updateIdPaths(
- ElementsAre(AllOf(Field(&ClangBackEnd::IdPaths::id, "project1"),
+ ElementsAre(AllOf(Field(&ClangBackEnd::IdPaths::id, 1),
Field(&ClangBackEnd::IdPaths::filePathIds, IsEmpty())))));
creator.doInMainThreadAfterFinished();
@@ -234,7 +234,7 @@ TEST_F(PchCreatorVerySlowTest, PchCreationTimeStampsAreUpdated)
{
creator.generatePch(std::move(pchTask1));
- EXPECT_CALL(mockBuildDependenciesStorage, updatePchCreationTimeStamp(_, Eq("project1")));
+ EXPECT_CALL(mockBuildDependenciesStorage, updatePchCreationTimeStamp(_, Eq(1)));
creator.doInMainThreadAfterFinished();
}
@@ -244,7 +244,7 @@ TEST_F(PchCreatorVerySlowTest, ProjectPartPchForCreatesPchForPchTask)
creator.generatePch(std::move(pchTask1));
ASSERT_THAT(creator.projectPartPch(),
- AllOf(Field(&ProjectPartPch::projectPartId, Eq("project1")),
+ AllOf(Field(&ProjectPartPch::projectPartId, Eq(1)),
Field(&ProjectPartPch::pchPath, Not(IsEmpty())),
Field(&ProjectPartPch::lastModified, Not(Eq(-1)))));
}
@@ -255,7 +255,7 @@ TEST_F(PchCreatorVerySlowTest, ProjectPartPchCleared)
creator.clear();
- ASSERT_THAT(creator.projectPartPch(), ClangBackEnd::ProjectPartPch{});
+ ASSERT_FALSE(creator.projectPartPch().isValid());
}
TEST_F(PchCreatorVerySlowTest, SourcesCleared)
@@ -278,19 +278,20 @@ TEST_F(PchCreatorVerySlowTest, ClangToolCleared)
TEST_F(PchCreatorVerySlowTest, FaultyProjectPartPchForCreatesFaultyPchForPchTask)
{
- PchTask faultyPchTask{"faultyProjectPart",
- {id(TESTDATA_DIR "/builddependencycollector/project/faulty.cpp")},
- {},
- {{"DEFINE", "1", 1}},
- {},
- {},
- {{TESTDATA_DIR "/builddependencycollector/external", 1, IncludeSearchPathType::System}},
- {{TESTDATA_DIR "/builddependencycollector/project", 1, IncludeSearchPathType::User}}};
+ PchTask faultyPchTask{
+ 0,
+ {id(TESTDATA_DIR "/builddependencycollector/project/faulty.cpp")},
+ {},
+ {{"DEFINE", "1", 1}},
+ {},
+ {},
+ {{TESTDATA_DIR "/builddependencycollector/external", 1, IncludeSearchPathType::System}},
+ {{TESTDATA_DIR "/builddependencycollector/project", 1, IncludeSearchPathType::User}}};
creator.generatePch(std::move(faultyPchTask));
ASSERT_THAT(creator.projectPartPch(),
- AllOf(Field(&ProjectPartPch::projectPartId, Eq("faultyProjectPart")),
+ AllOf(Field(&ProjectPartPch::projectPartId, Eq(0)),
Field(&ProjectPartPch::pchPath, IsEmpty()),
Field(&ProjectPartPch::lastModified, Gt(0))));
}
diff --git a/tests/unit/unittest/pchmanagerclient-test.cpp b/tests/unit/unittest/pchmanagerclient-test.cpp
index bd482d73c1..6c74143e4d 100644
--- a/tests/unit/unittest/pchmanagerclient-test.cpp
+++ b/tests/unit/unittest/pchmanagerclient-test.cpp
@@ -29,6 +29,7 @@
#include "mockpchmanagerserver.h"
#include "mockprecompiledheaderstorage.h"
#include "mockprogressmanager.h"
+#include "mockprojectpartsstorage.h"
#include <pchmanagerclient.h>
#include <pchmanagerprojectupdater.h>
@@ -46,10 +47,6 @@ namespace {
using ClangBackEnd::PrecompiledHeadersUpdatedMessage;
-using testing::_;
-using testing::Contains;
-using testing::Not;
-
class PchManagerClient : public ::testing::Test
{
protected:
@@ -58,17 +55,21 @@ protected:
ClangPchManager::PchManagerClient client{mockPchCreationProgressManager,
mockDependencyCreationProgressManager};
NiceMock<MockPchManagerServer> mockPchManagerServer;
+ NiceMock<MockProjectPartsStorage> mockProjectPartsStorage;
NiceMock<MockPchManagerNotifier> mockPchManagerNotifier{client};
Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database};
ClangBackEnd::FilePathCaching filePathCache{database};
- ClangPchManager::PchManagerProjectUpdater projectUpdater{mockPchManagerServer, client, filePathCache};
- Utils::SmallString projectPartId{"projectPartId"};
+ ClangPchManager::PchManagerProjectUpdater projectUpdater{mockPchManagerServer,
+ client,
+ filePathCache,
+ mockProjectPartsStorage};
+ ClangBackEnd::ProjectPartId projectPartId{1};
ClangBackEnd::FilePath pchFilePath{"/path/to/pch"};
- PrecompiledHeadersUpdatedMessage message{{{projectPartId.clone(), pchFilePath.clone(), 1}}};
- Utils::SmallString projectPartId2{"projectPartId2"};
+ PrecompiledHeadersUpdatedMessage message{{{projectPartId, pchFilePath.clone(), 1}}};
+ ClangBackEnd::ProjectPartId projectPartId2{2};
ClangBackEnd::FilePath pchFilePath2{"/path/to/pch2"};
- PrecompiledHeadersUpdatedMessage message2{{{projectPartId2.clone(), pchFilePath2.clone(), 1}}};
+ PrecompiledHeadersUpdatedMessage message2{{{projectPartId2, pchFilePath2.clone(), 1}}};
};
TEST_F(PchManagerClient, NotifierAttached)
@@ -92,23 +93,22 @@ TEST_F(PchManagerClient, NotifierDetached)
TEST_F(PchManagerClient, Update)
{
- EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderUpdated(projectPartId.toQString(), pchFilePath.toQString(), Eq(1)));
+ EXPECT_CALL(mockPchManagerNotifier,
+ precompiledHeaderUpdated(projectPartId, pchFilePath.toQString(), Eq(1)));
client.precompiledHeadersUpdated(message.clone());
}
TEST_F(PchManagerClient, Remove)
{
- EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderRemoved(projectPartId.toQString()))
- .Times(2);
+ EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderRemoved(projectPartId)).Times(2);
- projectUpdater.removeProjectParts({QString(projectPartId.clone()),
- QString(projectPartId.clone())});
+ projectUpdater.removeProjectParts({projectPartId, projectPartId});
}
TEST_F(PchManagerClient, GetNoProjectPartPchForWrongProjectPartId)
{
- auto optional = client.projectPartPch("foo");
+ auto optional = client.projectPartPch(23);
ASSERT_FALSE(optional);
}
@@ -126,7 +126,7 @@ TEST_F(PchManagerClient, ProjectPartPchRemoved)
{
client.precompiledHeadersUpdated(std::move(message));
- client.precompiledHeaderRemoved(QString(projectPartId));
+ client.precompiledHeaderRemoved(projectPartId);
ASSERT_FALSE(client.projectPartPch(projectPartId));
}
@@ -145,19 +145,17 @@ TEST_F(PchManagerClient, ProjectPartPchForProjectPartIdLastModified)
{
client.precompiledHeadersUpdated(std::move(message));
- ASSERT_THAT(client.projectPartPch(projectPartId).value().lastModified,
- 1);
+ ASSERT_THAT(client.projectPartPch(projectPartId)->lastModified, 1);
}
TEST_F(PchManagerClient, ProjectPartPchForProjectPartIdIsUpdated)
{
client.precompiledHeadersUpdated(message.clone());
- PrecompiledHeadersUpdatedMessage updateMessage{{{projectPartId.clone(), pchFilePath.clone(), 42}}};
+ PrecompiledHeadersUpdatedMessage updateMessage{{{projectPartId, pchFilePath.clone(), 42}}};
client.precompiledHeadersUpdated(updateMessage.clone());
- ASSERT_THAT(client.projectPartPch(projectPartId).value().lastModified,
- 42);
+ ASSERT_THAT(client.projectPartPch(projectPartId)->lastModified, 42);
}
TEST_F(PchManagerClient, SetPchCreationProgress)
diff --git a/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp b/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp
index a16b3981e4..e55b71f860 100644
--- a/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp
+++ b/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp
@@ -97,18 +97,17 @@ TEST_F(PchManagerClientServerInProcess, SendAliveMessage)
TEST_F(PchManagerClientServerInProcess, SendUpdateProjectPartsMessage)
{
- ProjectPartContainer projectPart2{
- "projectPartId",
- {"-x", "c++-header", "-Wno-pragma-once-outside-header"},
- {{"DEFINE", "1", 1}},
- {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
- {{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User}},
- {{1, 1}},
- {{1, 2}},
- Utils::Language::C,
- Utils::LanguageVersion::C11,
- Utils::LanguageExtension::All};
- UpdateProjectPartsMessage message{{projectPart2}, {"-m32"}};
+ ProjectPartContainer projectPart{1,
+ {"-x", "c++-header", "-Wno-pragma-once-outside-header"},
+ {{"DEFINE", "1", 1}},
+ {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
+ {{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User}},
+ {{1, 1}},
+ {{1, 2}},
+ Utils::Language::C,
+ Utils::LanguageVersion::C11,
+ Utils::LanguageExtension::All};
+ UpdateProjectPartsMessage message{{projectPart}, {"-m32"}};
EXPECT_CALL(mockPchManagerServer, updateProjectParts(message));
@@ -129,7 +128,7 @@ TEST_F(PchManagerClientServerInProcess, SendUpdateGeneratedFilesMessage)
TEST_F(PchManagerClientServerInProcess, SendRemoveProjectPartsMessage)
{
- RemoveProjectPartsMessage message{{"projectPartId1", "projectPartId2"}};
+ RemoveProjectPartsMessage message{{1, 2}};
EXPECT_CALL(mockPchManagerServer, removeProjectParts(message));
@@ -149,8 +148,7 @@ TEST_F(PchManagerClientServerInProcess, SendRemoveGeneratedFilesMessage)
TEST_F(PchManagerClientServerInProcess, SendPrecompiledHeaderUpdatedMessage)
{
- PrecompiledHeadersUpdatedMessage message{{{"projectPartId", "/path/to/pch", 1}}};
-
+ PrecompiledHeadersUpdatedMessage message{{{1, "/path/to/pch", 1}}};
EXPECT_CALL(mockPchManagerClient, precompiledHeadersUpdated(message));
diff --git a/tests/unit/unittest/pchmanagerserver-test.cpp b/tests/unit/unittest/pchmanagerserver-test.cpp
index 370667edc8..502b51bc8c 100644
--- a/tests/unit/unittest/pchmanagerserver-test.cpp
+++ b/tests/unit/unittest/pchmanagerserver-test.cpp
@@ -28,7 +28,7 @@
#include "mockclangpathwatcher.h"
#include "mockpchmanagerclient.h"
#include "mockpchtaskgenerator.h"
-#include "mockprojectparts.h"
+#include "mockprojectpartsmanager.h"
#include "mockgeneratedfiles.h"
#include <filepathcaching.h>
@@ -77,15 +77,15 @@ protected:
mockProjectPartsManager,
mockGeneratedFiles};
NiceMock<MockPchManagerClient> mockPchManagerClient;
- SmallString projectPartId1 = "project1";
- SmallString projectPartId2 = "project2";
+ ClangBackEnd::ProjectPartId projectPartId1{1};
+ ClangBackEnd::ProjectPartId projectPartId2{2};
PathString main1Path = TESTDATA_DIR "/BuildDependencyCollector_main3.cpp";
PathString main2Path = TESTDATA_DIR "/BuildDependencyCollector_main2.cpp";
PathString header1Path = TESTDATA_DIR "/BuildDependencyCollector_header1.h";
PathString header2Path = TESTDATA_DIR "/BuildDependencyCollector_header2.h";
ClangBackEnd::IdPaths idPath{projectPartId1, {1, 2}};
ProjectPartContainer projectPart1{
- projectPartId1.clone(),
+ projectPartId1,
{"-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"},
{{"DEFINE", "1", 1}},
{{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
@@ -96,7 +96,7 @@ protected:
Utils::LanguageVersion::C11,
Utils::LanguageExtension::All};
ProjectPartContainer projectPart2{
- projectPartId2.clone(),
+ projectPartId2,
{"-x", "c++-header", "-Wno-pragma-once-outside-header"},
{{"DEFINE", "1", 1}},
{{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
@@ -111,8 +111,8 @@ protected:
FileContainer generatedFile{{"/path/to/", "file"}, "content", {}};
ClangBackEnd::UpdateProjectPartsMessage updateProjectPartsMessage{
Utils::clone(projectParts), {"toolChainArgument"}};
- ClangBackEnd::RemoveProjectPartsMessage removeProjectPartsMessage{{projectPart1.projectPartId.clone(),
- projectPart2.projectPartId.clone()}};
+ ClangBackEnd::RemoveProjectPartsMessage removeProjectPartsMessage{
+ {projectPart1.projectPartId, projectPart2.projectPartId}};
};
TEST_F(PchManagerServer, FilterProjectPartsAndSendThemToQueue)
diff --git a/tests/unit/unittest/pchtaskgenerator-test.cpp b/tests/unit/unittest/pchtaskgenerator-test.cpp
index a6946f7ccf..8f5f0754af 100644
--- a/tests/unit/unittest/pchtaskgenerator-test.cpp
+++ b/tests/unit/unittest/pchtaskgenerator-test.cpp
@@ -41,6 +41,7 @@ using ClangBackEnd::IncludeSearchPath;
using ClangBackEnd::IncludeSearchPathType;
using ClangBackEnd::PchTask;
using ClangBackEnd::PchTaskSet;
+using ClangBackEnd::ProjectPartId;
using ClangBackEnd::SourceEntries;
using ClangBackEnd::SourceType;
using ClangBackEnd::UsedMacro;
@@ -57,7 +58,7 @@ protected:
mockPchTaskMerger,
progressCounter};
ClangBackEnd::ProjectPartContainer projectPart1{
- "ProjectPart1",
+ 1,
{"--yi"},
{{"YI", "1", 1},
{"QI", "7", 1},
@@ -97,7 +98,7 @@ TEST_F(PchTaskGenerator, AddProjectParts)
mergeTasks(
ElementsAre(AllOf(
Field(&PchTaskSet::system,
- AllOf(Field(&PchTask::projectPartIds, ElementsAre("ProjectPart1")),
+ AllOf(Field(&PchTask::projectPartIds, ElementsAre(ProjectPartId{1})),
Field(&PchTask::includes, ElementsAre(5)),
Field(&PchTask::sources, IsEmpty()),
Field(&PchTask::compilerMacros,
@@ -114,7 +115,7 @@ TEST_F(PchTaskGenerator, AddProjectParts)
Field(&PchTask::languageExtension, Eq(Utils::LanguageExtension::All)))),
AllOf(Field(
&PchTaskSet::project,
- AllOf(Field(&PchTask::projectPartIds, ElementsAre("ProjectPart1")),
+ AllOf(Field(&PchTask::projectPartIds, ElementsAre(ProjectPartId{1})),
Field(&PchTask::includes, ElementsAre(3)),
Field(&PchTask::sources, ElementsAre(1, 2, 3, 4, 5)),
Field(&PchTask::compilerMacros,
@@ -153,11 +154,9 @@ TEST_F(PchTaskGenerator, RemoveProjectParts)
{
ON_CALL(mockBuildDependenciesProvider, create(_)).WillByDefault(Return(buildDependency));
- EXPECT_CALL(
- mockPchTaskMerger,
- removePchTasks(ElementsAre("project1", "project2")));
+ EXPECT_CALL(mockPchTaskMerger, removePchTasks(ElementsAre(ProjectPartId{1}, ProjectPartId{2})));
- generator.removeProjectParts({"project1", "project2"});
+ generator.removeProjectParts({1, 2});
}
}
diff --git a/tests/unit/unittest/pchtaskqueue-test.cpp b/tests/unit/unittest/pchtaskqueue-test.cpp
index 61892811c5..3e0bba1bc8 100644
--- a/tests/unit/unittest/pchtaskqueue-test.cpp
+++ b/tests/unit/unittest/pchtaskqueue-test.cpp
@@ -61,7 +61,7 @@ protected:
IncludeSearchPaths projectIncludeSearchPaths{
{"/project/includes", 1, IncludeSearchPathType::User},
{"/other/project/includes", 2, IncludeSearchPathType::User}};
- PchTask systemTask1{"ProjectPart1",
+ PchTask systemTask1{1,
{1, 2},
{1, 2},
{{"YI", "1", 1}, {"SAN", "3", 3}},
@@ -69,7 +69,7 @@ protected:
{"--yi"},
systemIncludeSearchPaths,
projectIncludeSearchPaths};
- PchTask systemTask2{"ProjectPart2",
+ PchTask systemTask2{2,
{1, 2},
{1, 2},
{{"YI", "1", 1}, {"SAN", "3", 3}},
@@ -77,7 +77,7 @@ protected:
{"--yi"},
systemIncludeSearchPaths,
projectIncludeSearchPaths};
- PchTask systemTask2b{"ProjectPart2",
+ PchTask systemTask2b{2,
{3, 4},
{3, 4},
{{"YI", "1", 1}, {"SAN", "3", 3}},
@@ -85,7 +85,7 @@ protected:
{"--yi"},
systemIncludeSearchPaths,
projectIncludeSearchPaths};
- PchTask systemTask3{"ProjectPart3",
+ PchTask systemTask3{3,
{1, 2},
{1, 2},
{{"YI", "1", 1}, {"SAN", "3", 3}},
@@ -93,7 +93,7 @@ protected:
{"--yi"},
systemIncludeSearchPaths,
projectIncludeSearchPaths};
- PchTask projectTask1{"ProjectPart1",
+ PchTask projectTask1{1,
{11, 12},
{11, 12},
{{"SE", "4", 4}, {"WU", "5", 5}},
@@ -101,7 +101,7 @@ protected:
{"--yi"},
systemIncludeSearchPaths,
projectIncludeSearchPaths};
- PchTask projectTask2{"ProjectPart2",
+ PchTask projectTask2{2,
{11, 12},
{11, 12},
{{"SE", "4", 4}, {"WU", "5", 5}},
@@ -109,7 +109,7 @@ protected:
{"--yi"},
systemIncludeSearchPaths,
projectIncludeSearchPaths};
- PchTask projectTask2b{"ProjectPart2",
+ PchTask projectTask2b{2,
{21, 22},
{11, 12},
{{"SE", "4", 4}, {"WU", "5", 5}},
@@ -117,7 +117,7 @@ protected:
{"--yi"},
systemIncludeSearchPaths,
projectIncludeSearchPaths};
- PchTask projectTask3{"ProjectPart3",
+ PchTask projectTask3{3,
{21, 22},
{21, 22},
{{"SE", "4", 4}, {"WU", "5", 5}},
@@ -125,7 +125,7 @@ protected:
{"--yi"},
systemIncludeSearchPaths,
projectIncludeSearchPaths};
- PchTask systemTask4{Utils::SmallStringVector{"ProjectPart1", "ProjectPart3"},
+ PchTask systemTask4{{1, 3},
{1, 2},
{1, 2},
{{"YI", "1", 1}, {"SAN", "3", 3}},
@@ -293,18 +293,17 @@ TEST_F(PchTaskQueue, CreateProjectTaskFromPchTask)
{
InSequence s;
MockPchCreator mockPchCreator;
- ClangBackEnd::ProjectPartPch projectPartPch{"", "/path/to/pch", 99};
+ ClangBackEnd::ProjectPartPch projectPartPch{{}, "/path/to/pch", 99};
auto tasks = queue.createProjectTasks({projectTask1});
auto projectTask = projectTask1;
projectTask.systemPchPath = "/path/to/pch";
-
- EXPECT_CALL(mockPrecompiledHeaderStorage, fetchSystemPrecompiledHeaderPath(Eq("ProjectPart1")))
+ EXPECT_CALL(mockPrecompiledHeaderStorage, fetchSystemPrecompiledHeaderPath(Eq(1)))
.WillOnce(Return(ClangBackEnd::FilePath{"/path/to/pch"}));
EXPECT_CALL(mockPchCreator, generatePch(Eq(projectTask)));
EXPECT_CALL(mockPchCreator, projectPartPch()).WillOnce(ReturnRef(projectPartPch));
EXPECT_CALL(mockPrecompiledHeaderStorage,
- insertProjectPrecompiledHeader(Eq("ProjectPart1"), Eq("/path/to/pch"), 99));
+ insertProjectPrecompiledHeader(Eq(1), Eq("/path/to/pch"), 99));
tasks.front()(mockPchCreator);
}
@@ -313,16 +312,16 @@ TEST_F(PchTaskQueue, DeleteProjectPchEntryInDatabaseIfNoPchIsGenerated)
{
InSequence s;
MockPchCreator mockPchCreator;
- ClangBackEnd::ProjectPartPch projectPartPch{"", "", 0};
+ ClangBackEnd::ProjectPartPch projectPartPch{{}, "", 0};
auto tasks = queue.createProjectTasks({projectTask1});
auto projectTask = projectTask1;
projectTask.systemPchPath = "/path/to/pch";
- EXPECT_CALL(mockPrecompiledHeaderStorage, fetchSystemPrecompiledHeaderPath(Eq("ProjectPart1")))
+ EXPECT_CALL(mockPrecompiledHeaderStorage, fetchSystemPrecompiledHeaderPath(Eq(1)))
.WillOnce(Return(ClangBackEnd::FilePath{"/path/to/pch"}));
EXPECT_CALL(mockPchCreator, generatePch(Eq(projectTask)));
EXPECT_CALL(mockPchCreator, projectPartPch()).WillOnce(ReturnRef(projectPartPch));
- EXPECT_CALL(mockPrecompiledHeaderStorage, deleteProjectPrecompiledHeader(Eq("ProjectPart1")));
+ EXPECT_CALL(mockPrecompiledHeaderStorage, deleteProjectPrecompiledHeader(Eq(1)));
tasks.front()(mockPchCreator);
}
@@ -338,15 +337,13 @@ TEST_F(PchTaskQueue, CreateSystemTaskFromPchTask)
{
InSequence s;
MockPchCreator mockPchCreator;
- ClangBackEnd::ProjectPartPch projectPartPch{"", "/path/to/pch", 99};
+ ClangBackEnd::ProjectPartPch projectPartPch{{}, "/path/to/pch", 99};
auto tasks = queue.createSystemTasks({systemTask4});
EXPECT_CALL(mockPchCreator, generatePch(Eq(systemTask4)));
EXPECT_CALL(mockPchCreator, projectPartPch()).WillOnce(ReturnRef(projectPartPch));
EXPECT_CALL(mockPrecompiledHeaderStorage,
- insertSystemPrecompiledHeaders(UnorderedElementsAre("ProjectPart1", "ProjectPart3"),
- Eq("/path/to/pch"),
- 99));
+ insertSystemPrecompiledHeaders(UnorderedElementsAre(1, 3), Eq("/path/to/pch"), 99));
tasks.front()(mockPchCreator);
}
@@ -355,13 +352,13 @@ TEST_F(PchTaskQueue, DeleteSystemPchEntryInDatabaseIfNoPchIsGenerated)
{
InSequence s;
MockPchCreator mockPchCreator;
- ClangBackEnd::ProjectPartPch projectPartPch{"", "", 0};
+ ClangBackEnd::ProjectPartPch projectPartPch{{}, "", 0};
auto tasks = queue.createSystemTasks({systemTask4});
EXPECT_CALL(mockPchCreator, generatePch(Eq(systemTask4)));
EXPECT_CALL(mockPchCreator, projectPartPch()).WillOnce(ReturnRef(projectPartPch));
EXPECT_CALL(mockPrecompiledHeaderStorage,
- deleteSystemPrecompiledHeaders(UnorderedElementsAre("ProjectPart1", "ProjectPart3")));
+ deleteSystemPrecompiledHeaders(UnorderedElementsAre(1, 3)));
tasks.front()(mockPchCreator);
}
diff --git a/tests/unit/unittest/pchtasksmerger-test.cpp b/tests/unit/unittest/pchtasksmerger-test.cpp
index da61d14adb..076e1415b2 100644
--- a/tests/unit/unittest/pchtasksmerger-test.cpp
+++ b/tests/unit/unittest/pchtasksmerger-test.cpp
@@ -52,7 +52,7 @@ protected:
protected:
NiceMock<MockPchTaskQueue> mockPchTaskQueue;
ClangBackEnd::PchTasksMerger merger{mockPchTaskQueue};
- PchTask systemTask1{"ProjectPart1",
+ PchTask systemTask1{1,
{1, 2},
{1, 2, 3},
{{"YI", "1", 1}, {"SAN", "3", 3}},
@@ -63,7 +63,7 @@ protected:
{"/framework/path", 1, IncludeSearchPathType::System}},
{{"/to/path1", 1, IncludeSearchPathType::User},
{"/to/path2", 2, IncludeSearchPathType::User}}};
- PchTask projectTask1{"ProjectPart1",
+ PchTask projectTask1{1,
{11, 12},
{11, 12},
{{"SE", "4", 4}, {"WU", "5", 5}},
@@ -73,7 +73,7 @@ protected:
{"/builtin/path", 2, IncludeSearchPathType::BuiltIn}},
{{"/to/path1", 1, IncludeSearchPathType::User},
{"/to/path2", 2, IncludeSearchPathType::User}}};
- PchTask systemTask2{"ProjectPart2",
+ PchTask systemTask2{2,
{11, 12},
{11, 12, 13},
{{"SE", "4", 4}, {"WU", "5", 5}},
@@ -84,7 +84,7 @@ protected:
{"/framework/path", 1, IncludeSearchPathType::System}},
{{"/to/path1", 1, IncludeSearchPathType::User},
{"/to/path2", 2, IncludeSearchPathType::User}}};
- PchTask projectTask2{"ProjectPart2",
+ PchTask projectTask2{2,
{11, 12},
{11, 12},
{{"SE", "4", 4}, {"WU", "5", 5}},
@@ -95,7 +95,7 @@ protected:
{"/framework/path", 1, IncludeSearchPathType::System}},
{{"/to/path1", 1, IncludeSearchPathType::User},
{"/to/path2", 2, IncludeSearchPathType::User}}};
- PchTask systemTask3{"ProjectPart3",
+ PchTask systemTask3{3,
{1, 2},
{1, 2},
{{"YI", "2", 1}, {"SAN", "3", 3}},
@@ -147,9 +147,9 @@ TEST_F(PchTasksMerger, AddSystemOnlyOneTask)
TEST_F(PchTasksMerger, RemoveTasks)
{
- EXPECT_CALL(mockPchTaskQueue, removePchTasks(ElementsAre("project1", "project2")));
+ EXPECT_CALL(mockPchTaskQueue, removePchTasks(ElementsAre(1, 2)));
- merger.removePchTasks({"project1", "project2"});
+ merger.removePchTasks({1, 2});
}
TEST_F(PchTasksMerger, MergeMacros)
@@ -286,14 +286,14 @@ TEST_F(PchTasksMerger, MergeProjectIds)
{
Merger::mergePchTasks(systemTask1, systemTask2);
- ASSERT_THAT(systemTask1.projectPartIds, ElementsAre("ProjectPart1", "ProjectPart2"));
+ ASSERT_THAT(systemTask1.projectPartIds, ElementsAre(1, 2));
}
TEST_F(PchTasksMerger, DontMergeProjectIds)
{
Merger::mergePchTasks(systemTask1, systemTask3);
- ASSERT_THAT(systemTask1.projectPartIds, ElementsAre("ProjectPart1"));
+ ASSERT_THAT(systemTask1.projectPartIds, ElementsAre(1));
}
TEST_F(PchTasksMerger, MergeIncludeSearchPaths)
diff --git a/tests/unit/unittest/precompiledheaderstorage-test.cpp b/tests/unit/unittest/precompiledheaderstorage-test.cpp
index 22dffe3c29..13fca71fdc 100644
--- a/tests/unit/unittest/precompiledheaderstorage-test.cpp
+++ b/tests/unit/unittest/precompiledheaderstorage-test.cpp
@@ -42,13 +42,12 @@ class PrecompiledHeaderStorage : public testing::Test
protected:
NiceMock<MockSqliteDatabase> database;
Storage storage{database};
- MockSqliteWriteStatement &insertProjectPartStatement = storage.m_insertProjectPartStatement;
- MockSqliteWriteStatement &insertProjectPrecompiledHeaderStatement = storage.m_insertProjectPrecompiledHeaderStatement;
- MockSqliteWriteStatement &deleteProjectPrecompiledHeaderStatement = storage.m_deleteProjectPrecompiledHeaderStatement;
- MockSqliteWriteStatement &insertSystemPrecompiledHeaderStatement = storage.m_insertSystemPrecompiledHeaderStatement;
- MockSqliteWriteStatement &deleteSystemPrecompiledHeaderStatement = storage.m_deleteSystemPrecompiledHeaderStatement;
- MockSqliteReadStatement &fetchSystemPrecompiledHeaderPathStatement = storage.m_fetchSystemPrecompiledHeaderPathStatement;
- MockSqliteReadStatement &getPrecompiledHeader = storage.m_getPrecompiledHeader;
+ MockSqliteWriteStatement &insertProjectPrecompiledHeaderStatement = storage.insertProjectPrecompiledHeaderStatement;
+ MockSqliteWriteStatement &deleteProjectPrecompiledHeaderStatement = storage.deleteProjectPrecompiledHeaderStatement;
+ MockSqliteWriteStatement &insertSystemPrecompiledHeaderStatement = storage.insertSystemPrecompiledHeaderStatement;
+ MockSqliteWriteStatement &deleteSystemPrecompiledHeaderStatement = storage.deleteSystemPrecompiledHeaderStatement;
+ MockSqliteReadStatement &fetchSystemPrecompiledHeaderPathStatement = storage.fetchSystemPrecompiledHeaderPathStatement;
+ MockSqliteReadStatement &getPrecompiledHeader = storage.getPrecompiledHeader;
};
TEST_F(PrecompiledHeaderStorage, UseTransaction)
@@ -66,14 +65,13 @@ TEST_F(PrecompiledHeaderStorage, InsertProjectPrecompiledHeader)
InSequence s;
EXPECT_CALL(database, immediateBegin());
- EXPECT_CALL(insertProjectPartStatement, write(TypedEq<Utils::SmallStringView>("project1")));
EXPECT_CALL(insertProjectPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project1"),
+ write(TypedEq<int>(1),
TypedEq<Utils::SmallStringView>("/path/to/pch"),
TypedEq<long long>(22)));
EXPECT_CALL(database, commit());
- storage.insertProjectPrecompiledHeader("project1", "/path/to/pch", 22);
+ storage.insertProjectPrecompiledHeader(1, "/path/to/pch", 22);
}
TEST_F(PrecompiledHeaderStorage, InsertProjectPrecompiledHeaderStatementIsBusy)
@@ -82,14 +80,13 @@ TEST_F(PrecompiledHeaderStorage, InsertProjectPrecompiledHeaderStatementIsBusy)
EXPECT_CALL(database, immediateBegin()).WillOnce(Throw(Sqlite::StatementIsBusy("busy")));
EXPECT_CALL(database, immediateBegin());
- EXPECT_CALL(insertProjectPartStatement, write(TypedEq<Utils::SmallStringView>("project1")));
EXPECT_CALL(insertProjectPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project1"),
+ write(TypedEq<int>(1),
TypedEq<Utils::SmallStringView>("/path/to/pch"),
TypedEq<long long>(22)));
EXPECT_CALL(database, commit());
- storage.insertProjectPrecompiledHeader("project1", "/path/to/pch", 22);
+ storage.insertProjectPrecompiledHeader(1, "/path/to/pch", 22);
}
TEST_F(PrecompiledHeaderStorage, DeleteProjectPrecompiledHeader)
@@ -97,10 +94,10 @@ TEST_F(PrecompiledHeaderStorage, DeleteProjectPrecompiledHeader)
InSequence s;
EXPECT_CALL(database, immediateBegin());
- EXPECT_CALL(deleteProjectPrecompiledHeaderStatement, write(TypedEq<Utils::SmallStringView>("project1")));
+ EXPECT_CALL(deleteProjectPrecompiledHeaderStatement, write(TypedEq<int>(1)));
EXPECT_CALL(database, commit());
- storage.deleteProjectPrecompiledHeader("project1");
+ storage.deleteProjectPrecompiledHeader(1);
}
TEST_F(PrecompiledHeaderStorage, DeleteProjectPrecompiledHeaderStatementIsBusy)
@@ -109,10 +106,10 @@ TEST_F(PrecompiledHeaderStorage, DeleteProjectPrecompiledHeaderStatementIsBusy)
EXPECT_CALL(database, immediateBegin()).WillOnce(Throw(Sqlite::StatementIsBusy("busy")));
EXPECT_CALL(database, immediateBegin());
- EXPECT_CALL(deleteProjectPrecompiledHeaderStatement, write(TypedEq<Utils::SmallStringView>("project1")));
+ EXPECT_CALL(deleteProjectPrecompiledHeaderStatement, write(TypedEq<int>(1)));
EXPECT_CALL(database, commit());
- storage.deleteProjectPrecompiledHeader("project1");
+ storage.deleteProjectPrecompiledHeader(1);
}
TEST_F(PrecompiledHeaderStorage, InsertSystemPrecompiledHeaders)
@@ -120,19 +117,17 @@ TEST_F(PrecompiledHeaderStorage, InsertSystemPrecompiledHeaders)
InSequence s;
EXPECT_CALL(database, immediateBegin());
- EXPECT_CALL(insertProjectPartStatement, write(TypedEq<Utils::SmallStringView>("project1")));
EXPECT_CALL(insertSystemPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project1"),
+ write(TypedEq<int>(1),
TypedEq<Utils::SmallStringView>("/path/to/pch"),
TypedEq<long long>(22)));
- EXPECT_CALL(insertProjectPartStatement, write(TypedEq<Utils::SmallStringView>("project2")));
EXPECT_CALL(insertSystemPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project2"),
+ write(TypedEq<int>(2),
TypedEq<Utils::SmallStringView>("/path/to/pch"),
TypedEq<long long>(22)));
EXPECT_CALL(database, commit());
- storage.insertSystemPrecompiledHeaders({"project1", "project2"}, "/path/to/pch", 22);
+ storage.insertSystemPrecompiledHeaders({1, 2}, "/path/to/pch", 22);
}
TEST_F(PrecompiledHeaderStorage, InsertSystemPrecompiledHeadersStatementIsBusy)
@@ -141,19 +136,17 @@ TEST_F(PrecompiledHeaderStorage, InsertSystemPrecompiledHeadersStatementIsBusy)
EXPECT_CALL(database, immediateBegin()).WillOnce(Throw(Sqlite::StatementIsBusy("busy")));
EXPECT_CALL(database, immediateBegin());
- EXPECT_CALL(insertProjectPartStatement, write(TypedEq<Utils::SmallStringView>("project1")));
EXPECT_CALL(insertSystemPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project1"),
+ write(TypedEq<int>(1),
TypedEq<Utils::SmallStringView>("/path/to/pch"),
TypedEq<long long>(22)));
- EXPECT_CALL(insertProjectPartStatement, write(TypedEq<Utils::SmallStringView>("project2")));
EXPECT_CALL(insertSystemPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project2"),
+ write(TypedEq<int>(2),
TypedEq<Utils::SmallStringView>("/path/to/pch"),
TypedEq<long long>(22)));
EXPECT_CALL(database, commit());
- storage.insertSystemPrecompiledHeaders({"project1", "project2"}, "/path/to/pch", 22);
+ storage.insertSystemPrecompiledHeaders({1, 2}, "/path/to/pch", 22);
}
TEST_F(PrecompiledHeaderStorage, DeleteSystemPrecompiledHeaders)
@@ -161,13 +154,11 @@ TEST_F(PrecompiledHeaderStorage, DeleteSystemPrecompiledHeaders)
InSequence s;
EXPECT_CALL(database, immediateBegin());
- EXPECT_CALL(deleteSystemPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project1")));
- EXPECT_CALL(deleteSystemPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project2")));
+ EXPECT_CALL(deleteSystemPrecompiledHeaderStatement, write(TypedEq<int>(1)));
+ EXPECT_CALL(deleteSystemPrecompiledHeaderStatement, write(TypedEq<int>(2)));
EXPECT_CALL(database, commit());
- storage.deleteSystemPrecompiledHeaders({"project1", "project2"});
+ storage.deleteSystemPrecompiledHeaders({1, 2});
}
TEST_F(PrecompiledHeaderStorage, DeleteSystemPrecompiledHeadersStatementIsBusy)
@@ -176,13 +167,11 @@ TEST_F(PrecompiledHeaderStorage, DeleteSystemPrecompiledHeadersStatementIsBusy)
EXPECT_CALL(database, immediateBegin()).WillOnce(Throw(Sqlite::StatementIsBusy("busy")));
EXPECT_CALL(database, immediateBegin());
- EXPECT_CALL(deleteSystemPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project1")));
- EXPECT_CALL(deleteSystemPrecompiledHeaderStatement,
- write(TypedEq<Utils::SmallStringView>("project2")));
+ EXPECT_CALL(deleteSystemPrecompiledHeaderStatement, write(TypedEq<int>(1)));
+ EXPECT_CALL(deleteSystemPrecompiledHeaderStatement, write(TypedEq<int>(2)));
EXPECT_CALL(database, commit());
- storage.deleteSystemPrecompiledHeaders({"project1", "project2"});
+ storage.deleteSystemPrecompiledHeaders({1, 2});
}
TEST_F(PrecompiledHeaderStorage, CompilePrecompiledHeaderStatements)
@@ -198,42 +187,38 @@ TEST_F(PrecompiledHeaderStorage, FetchSystemPrecompiledHeaderCalls)
InSequence s;
EXPECT_CALL(database, deferredBegin());
- EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement,
- valueReturnFilePath(TypedEq<Utils::SmallStringView>("project1")));
+ EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement, valueReturnFilePath(TypedEq<int>(1)));
EXPECT_CALL(database, commit());
- storage.fetchSystemPrecompiledHeaderPath("project1");
+ storage.fetchSystemPrecompiledHeaderPath(1);
}
TEST_F(PrecompiledHeaderStorage, FetchSystemPrecompiledHeader)
{
- EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement,
- valueReturnFilePath(TypedEq<Utils::SmallStringView>("project1")))
+ EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement, valueReturnFilePath(TypedEq<int>(1)))
.WillOnce(Return(ClangBackEnd::FilePath{"/path/to/pch"}));
- auto path = storage.fetchSystemPrecompiledHeaderPath("project1");
+ auto path = storage.fetchSystemPrecompiledHeaderPath(1);
ASSERT_THAT(path, "/path/to/pch");
}
TEST_F(PrecompiledHeaderStorage, FetchSystemPrecompiledHeaderReturnsEmptyPath)
{
- EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement,
- valueReturnFilePath(TypedEq<Utils::SmallStringView>("project1")))
+ EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement, valueReturnFilePath(TypedEq<int>(1)))
.WillOnce(Return(ClangBackEnd::FilePath{}));
- auto path = storage.fetchSystemPrecompiledHeaderPath("project1");
+ auto path = storage.fetchSystemPrecompiledHeaderPath(1);
ASSERT_THAT(path, IsEmpty());
}
TEST_F(PrecompiledHeaderStorage, FetchSystemPrecompiledHeaderReturnsNullOptional)
{
- EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement,
- valueReturnFilePath(TypedEq<Utils::SmallStringView>("project1")))
+ EXPECT_CALL(fetchSystemPrecompiledHeaderPathStatement, valueReturnFilePath(TypedEq<int>(1)))
.WillOnce(Return(Utils::optional<ClangBackEnd::FilePath>{}));
- auto path = storage.fetchSystemPrecompiledHeaderPath("project1");
+ auto path = storage.fetchSystemPrecompiledHeaderPath(1);
ASSERT_THAT(path, IsEmpty());
}
@@ -247,7 +232,7 @@ TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeaderCallsValueInStatement)
TEST_F(PrecompiledHeaderStorage, FetchPrecompiledHeader)
{
- ClangBackEnd::ProjectPartPch pch{"", "/path/to/pch", 131};
+ ClangBackEnd::ProjectPartPch pch{{}, "/path/to/pch", 131};
EXPECT_CALL(getPrecompiledHeader, valueReturnProjectPartPch(Eq(25))).WillRepeatedly(Return(pch));
auto precompiledHeader = storage.fetchPrecompiledHeader(25);
diff --git a/tests/unit/unittest/projectparts-test.cpp b/tests/unit/unittest/projectparts-test.cpp
deleted file mode 100644
index 16f1ef0988..0000000000
--- a/tests/unit/unittest/projectparts-test.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 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 "googletest.h"
-
-#include <projectpartsmanager.h>
-
-#include <projectpartcontainer.h>
-
-namespace {
-
-using testing::ElementsAre;
-using testing::UnorderedElementsAre;
-using testing::IsEmpty;
-
-using ClangBackEnd::ProjectPartContainer;
-using ClangBackEnd::FilePathId;
-
-class ProjectParts : public testing::Test
-{
-protected:
- ClangBackEnd::ProjectPartsManager projectParts;
- FilePathId firstHeader{1};
- FilePathId secondHeader{2};
- FilePathId firstSource{11};
- FilePathId secondSource{12};
- FilePathId thirdSource{13};
- ProjectPartContainer projectPartContainer1{
- "id",
- {"-DUNIX", "-O2"},
- {{"DEFINE", "1", 1}},
- {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
- {{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User}},
- {firstHeader, secondHeader},
- {firstSource, secondSource},
- Utils::Language::C,
- Utils::LanguageVersion::C11,
- Utils::LanguageExtension::All};
- ProjectPartContainer updatedProjectPartContainer1{
- "id",
- {"-DUNIX", "-O2"},
- {{"DEFINE", "1", 1}},
- {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
- {{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User}},
- {firstHeader, secondHeader},
- {firstSource, secondSource, thirdSource},
- Utils::Language::C,
- Utils::LanguageVersion::C11,
- Utils::LanguageExtension::All};
- ProjectPartContainer projectPartContainer2{
- "id2",
- {"-DUNIX", "-O2"},
- {{"DEFINE", "1", 1}},
- {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
- {{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User}},
- {firstHeader, secondHeader},
- {firstSource, secondSource},
- Utils::Language::C,
- Utils::LanguageVersion::C11,
- Utils::LanguageExtension::All};
-};
-
-TEST_F(ProjectParts, GetNoProjectPartsForAddingEmptyProjectParts)
-{
- auto updatedProjectParts = projectParts.update({});
-
- ASSERT_THAT(updatedProjectParts, IsEmpty());
-}
-
-TEST_F(ProjectParts, GetProjectPartForAddingProjectPart)
-{
- auto updatedProjectParts = projectParts.update({projectPartContainer1});
-
- ASSERT_THAT(updatedProjectParts, ElementsAre(projectPartContainer1));
-}
-
-TEST_F(ProjectParts, ProjectPartAdded)
-{
- projectParts.update({projectPartContainer1});
-
- ASSERT_THAT(projectParts.projectParts(), ElementsAre(projectPartContainer1));
-}
-
-TEST_F(ProjectParts, FilteredProjectPartAdded)
-{
- projectParts.update({projectPartContainer1});
-
- projectParts.update({projectPartContainer1});
-
- ASSERT_THAT(projectParts.projectParts(), ElementsAre(projectPartContainer1));
-}
-
-TEST_F(ProjectParts, DoNotUpdateNotNewProjectPart)
-{
- projectParts.update({projectPartContainer1});
-
- auto updatedProjectParts = projectParts.update({projectPartContainer1});
-
- ASSERT_THAT(updatedProjectParts, IsEmpty());
-}
-
-TEST_F(ProjectParts, NoDuplicateProjectPartAfterUpdatingWithNotNewProjectPart)
-{
- projectParts.update({projectPartContainer1});
-
- auto updatedProjectParts = projectParts.update({projectPartContainer1});
-
- ASSERT_THAT(projectParts.projectParts(), ElementsAre(projectPartContainer1));
-}
-
-TEST_F(ProjectParts, MergeProjectParts)
-{
- projectParts.mergeProjectParts({projectPartContainer1, projectPartContainer2});
-
- ASSERT_THAT(projectParts.projectParts(), ElementsAre(projectPartContainer1, projectPartContainer2));
-}
-
-TEST_F(ProjectParts, MergeProjectMultipleTimesParts)
-{
- projectParts.mergeProjectParts({projectPartContainer2});
-
- projectParts.mergeProjectParts({projectPartContainer1});
-
- ASSERT_THAT(projectParts.projectParts(), ElementsAre(projectPartContainer1, projectPartContainer2));
-}
-
-TEST_F(ProjectParts, GetNewProjectParts)
-{
- projectParts.mergeProjectParts({projectPartContainer2});
-
- auto newProjectParts = projectParts.newProjectParts({projectPartContainer1, projectPartContainer2});
-
- ASSERT_THAT(newProjectParts, ElementsAre(projectPartContainer1));
-}
-
-TEST_F(ProjectParts, GetUpdatedProjectPart)
-{
- projectParts.update({projectPartContainer1, projectPartContainer2});
-
- auto updatedProjectParts = projectParts.update({updatedProjectPartContainer1});
-
- ASSERT_THAT(updatedProjectParts, ElementsAre(updatedProjectPartContainer1));
-}
-
-TEST_F(ProjectParts, ProjectPartIsReplacedWithUpdatedProjectPart)
-{
- projectParts.update({projectPartContainer1, projectPartContainer2});
-
- projectParts.update({updatedProjectPartContainer1});
-
- ASSERT_THAT(projectParts.projectParts(), ElementsAre(updatedProjectPartContainer1, projectPartContainer2));
-}
-
-TEST_F(ProjectParts, Remove)
-{
- projectParts.update({projectPartContainer1, projectPartContainer2});
-
- projectParts.remove({projectPartContainer1.projectPartId});
-
- ASSERT_THAT(projectParts.projectParts(), ElementsAre(projectPartContainer2));
-}
-
-TEST_F(ProjectParts, GetProjectById)
-{
- projectParts.update({projectPartContainer1, projectPartContainer2});
-
- auto projectPartContainers = projectParts.projects({projectPartContainer1.projectPartId});
-
- ASSERT_THAT(projectPartContainers, ElementsAre(projectPartContainer1));
-}
-
-TEST_F(ProjectParts, GetProjectsByIds)
-{
- projectParts.update({projectPartContainer1, projectPartContainer2});
-
- auto projectPartContainers = projectParts.projects({projectPartContainer1.projectPartId, projectPartContainer2.projectPartId});
-
- ASSERT_THAT(projectPartContainers, UnorderedElementsAre(projectPartContainer1, projectPartContainer2));
-}
-
-TEST_F(ProjectParts, UpdateDeferred)
-{
- auto projectPartContainers = projectParts.update({projectPartContainer1, projectPartContainer2});
-
- projectParts.updateDeferred({projectPartContainer1});
-
- ASSERT_THAT(projectParts.deferredUpdates(), ElementsAre(projectPartContainer1));
-
-}
-
-TEST_F(ProjectParts, NotUpdateDeferred)
-{
- auto projectPartContainers = projectParts.update({projectPartContainer1, projectPartContainer2});
-
- ASSERT_THAT(projectParts.deferredUpdates(), IsEmpty());
-}
-
-TEST_F(ProjectParts, UpdateDeferredCleansDeferredUpdates)
-{
- auto projectPartContainers = projectParts.update({projectPartContainer1, projectPartContainer2});
- projectParts.updateDeferred({projectPartContainer1});
-
- projectParts.deferredUpdates();
-
- ASSERT_THAT(projectParts.deferredUpdates(), IsEmpty());
-
-}
-}
diff --git a/tests/unit/unittest/projectpartsmanager-test.cpp b/tests/unit/unittest/projectpartsmanager-test.cpp
new file mode 100644
index 0000000000..b2b2fbc263
--- /dev/null
+++ b/tests/unit/unittest/projectpartsmanager-test.cpp
@@ -0,0 +1,321 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 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 "googletest.h"
+#include "mockprojectpartsstorage.h"
+
+#include <projectpartsmanager.h>
+
+#include <projectpartcontainer.h>
+
+namespace {
+
+using ClangBackEnd::FilePathId;
+using ClangBackEnd::ProjectPartContainer;
+using ClangBackEnd::ProjectPartContainers;
+
+class ProjectPartsManager : public testing::Test
+{
+protected:
+ NiceMock<MockProjectPartsStorage> mockProjectPartsStorage;
+ ClangBackEnd::ProjectPartsManager manager{mockProjectPartsStorage};
+ FilePathId firstHeader{1};
+ FilePathId secondHeader{2};
+ FilePathId firstSource{11};
+ FilePathId secondSource{12};
+ FilePathId thirdSource{13};
+ ProjectPartContainer projectPartContainer1{
+ 1,
+ {"-DUNIX", "-O2"},
+ {{"DEFINE", "1", 1}},
+ {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
+ {{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User}},
+ {firstHeader, secondHeader},
+ {firstSource, secondSource},
+ Utils::Language::C,
+ Utils::LanguageVersion::C11,
+ Utils::LanguageExtension::All};
+ ProjectPartContainer updatedProjectPartContainer1{
+ 1,
+ {"-DUNIX", "-O2"},
+ {{"DEFINE", "1", 1}},
+ {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
+ {{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User}},
+ {firstHeader, secondHeader},
+ {firstSource, secondSource, thirdSource},
+ Utils::Language::C,
+ Utils::LanguageVersion::C11,
+ Utils::LanguageExtension::All};
+ ProjectPartContainer projectPartContainer2{
+ 2,
+ {"-DUNIX", "-O2"},
+ {{"DEFINE", "1", 1}},
+ {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
+ {{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User}},
+ {firstHeader, secondHeader},
+ {firstSource, secondSource},
+ Utils::Language::C,
+ Utils::LanguageVersion::C11,
+ Utils::LanguageExtension::All};
+};
+
+TEST_F(ProjectPartsManager, GetNoProjectPartsForAddingEmptyProjectParts)
+{
+ auto updatedProjectParts = manager.update({});
+
+ ASSERT_THAT(updatedProjectParts, IsEmpty());
+}
+
+TEST_F(ProjectPartsManager, GetProjectPartForAddingProjectPart)
+{
+ auto updatedProjectParts = manager.update({projectPartContainer1});
+
+ ASSERT_THAT(updatedProjectParts, ElementsAre(projectPartContainer1));
+}
+
+TEST_F(ProjectPartsManager, GetProjectPartForAddingProjectPartWithProjectPartAlreadyInTheDatabase)
+{
+ ON_CALL(mockProjectPartsStorage, fetchProjectParts(_))
+ .WillByDefault(Return(ProjectPartContainers{projectPartContainer1}));
+
+ auto updatedProjectParts = manager.update({projectPartContainer1, projectPartContainer2});
+
+ ASSERT_THAT(updatedProjectParts, ElementsAre(projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, GetProjectPartForAddingProjectPartWithOlderProjectPartAlreadyInTheDatabase)
+{
+ ON_CALL(mockProjectPartsStorage, fetchProjectParts(_))
+ .WillByDefault(Return(ProjectPartContainers{projectPartContainer1}));
+
+ auto updatedProjectParts = manager.update({updatedProjectPartContainer1, projectPartContainer2});
+
+ ASSERT_THAT(updatedProjectParts, ElementsAre(updatedProjectPartContainer1, projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, ProjectPartAdded)
+{
+ manager.update({projectPartContainer1});
+
+ ASSERT_THAT(manager.projectParts(), ElementsAre(projectPartContainer1));
+}
+
+TEST_F(ProjectPartsManager, ProjectPartAddedWithProjectPartAlreadyInTheDatabase)
+{
+ ON_CALL(mockProjectPartsStorage, fetchProjectParts(_))
+ .WillByDefault(Return(ProjectPartContainers{projectPartContainer1}));
+
+ manager.update({projectPartContainer1, projectPartContainer2});
+
+ ASSERT_THAT(manager.projectParts(), ElementsAre(projectPartContainer1, projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, ProjectPartAddedWithOlderProjectPartAlreadyInTheDatabase)
+{
+ ON_CALL(mockProjectPartsStorage, fetchProjectParts(_))
+ .WillByDefault(Return(ProjectPartContainers{projectPartContainer1}));
+
+ manager.update({updatedProjectPartContainer1, projectPartContainer2});
+
+ ASSERT_THAT(manager.projectParts(),
+ ElementsAre(updatedProjectPartContainer1, projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, FilteredProjectPartAdded)
+{
+ manager.update({projectPartContainer1});
+
+ manager.update({projectPartContainer1});
+
+ ASSERT_THAT(manager.projectParts(), ElementsAre(projectPartContainer1));
+}
+
+TEST_F(ProjectPartsManager, DoNotUpdateNotNewProjectPart)
+{
+ manager.update({projectPartContainer1});
+
+ auto updatedProjectParts = manager.update({projectPartContainer1});
+
+ ASSERT_THAT(updatedProjectParts, IsEmpty());
+}
+
+TEST_F(ProjectPartsManager, NoDuplicateProjectPartAfterUpdatingWithNotNewProjectPart)
+{
+ manager.update({projectPartContainer1});
+
+ auto updatedProjectParts = manager.update({projectPartContainer1});
+
+ ASSERT_THAT(manager.projectParts(), ElementsAre(projectPartContainer1));
+}
+
+TEST_F(ProjectPartsManager, MergeProjectParts)
+{
+ manager.mergeProjectParts({projectPartContainer1, projectPartContainer2});
+
+ ASSERT_THAT(manager.projectParts(), ElementsAre(projectPartContainer1, projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, MergeProjectMultipleTimesParts)
+{
+ manager.mergeProjectParts({projectPartContainer2});
+
+ manager.mergeProjectParts({projectPartContainer1});
+
+ ASSERT_THAT(manager.projectParts(), ElementsAre(projectPartContainer1, projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, GetNewProjectParts)
+{
+ auto newProjectParts = manager.filterNewProjectParts({projectPartContainer1, projectPartContainer2},
+ {projectPartContainer2});
+
+ ASSERT_THAT(newProjectParts, ElementsAre(projectPartContainer1));
+}
+
+TEST_F(ProjectPartsManager, GetUpdatedProjectPart)
+{
+ manager.update({projectPartContainer1, projectPartContainer2});
+
+ auto updatedProjectParts = manager.update({updatedProjectPartContainer1});
+
+ ASSERT_THAT(updatedProjectParts, ElementsAre(updatedProjectPartContainer1));
+}
+
+TEST_F(ProjectPartsManager, ProjectPartIsReplacedWithUpdatedProjectPart)
+{
+ manager.update({projectPartContainer1, projectPartContainer2});
+
+ manager.update({updatedProjectPartContainer1});
+
+ ASSERT_THAT(manager.projectParts(),
+ ElementsAre(updatedProjectPartContainer1, projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, Remove)
+{
+ manager.update({projectPartContainer1, projectPartContainer2});
+
+ manager.remove({projectPartContainer1.projectPartId});
+
+ ASSERT_THAT(manager.projectParts(), ElementsAre(projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, GetProjectById)
+{
+ manager.update({projectPartContainer1, projectPartContainer2});
+
+ auto projectPartContainers = manager.projects({projectPartContainer1.projectPartId});
+
+ ASSERT_THAT(projectPartContainers, ElementsAre(projectPartContainer1));
+}
+
+TEST_F(ProjectPartsManager, GetProjectsByIds)
+{
+ manager.update({projectPartContainer1, projectPartContainer2});
+
+ auto projectPartContainers = manager.projects(
+ {projectPartContainer1.projectPartId, projectPartContainer2.projectPartId});
+
+ ASSERT_THAT(projectPartContainers, UnorderedElementsAre(projectPartContainer1, projectPartContainer2));
+}
+
+TEST_F(ProjectPartsManager, UpdateDeferred)
+{
+ auto projectPartContainers = manager.update({projectPartContainer1, projectPartContainer2});
+
+ manager.updateDeferred({projectPartContainer1});
+
+ ASSERT_THAT(manager.deferredUpdates(), ElementsAre(projectPartContainer1));
+}
+
+TEST_F(ProjectPartsManager, NotUpdateDeferred)
+{
+ auto projectPartContainers = manager.update({projectPartContainer1, projectPartContainer2});
+
+ ASSERT_THAT(manager.deferredUpdates(), IsEmpty());
+}
+
+TEST_F(ProjectPartsManager, UpdateDeferredCleansDeferredUpdates)
+{
+ auto projectPartContainers = manager.update({projectPartContainer1, projectPartContainer2});
+ manager.updateDeferred({projectPartContainer1});
+
+ manager.deferredUpdates();
+
+ ASSERT_THAT(manager.deferredUpdates(), IsEmpty());
+}
+
+TEST_F(ProjectPartsManager, UpdateCallsIfNewProjectPartIsAdded)
+{
+ EXPECT_CALL(mockProjectPartsStorage,
+ fetchProjectParts(ElementsAre(Eq(projectPartContainer1.projectPartId))));
+ EXPECT_CALL(mockProjectPartsStorage, updateProjectParts(ElementsAre(projectPartContainer1)));
+
+ manager.update({projectPartContainer1});
+}
+
+TEST_F(ProjectPartsManager, UpdateCallsNotUpdateProjectPartsInStorageIfNoNewerProjectPartsExists)
+{
+ manager.update({projectPartContainer1});
+
+ EXPECT_CALL(mockProjectPartsStorage, updateProjectParts(ElementsAre(projectPartContainer1))).Times(0);
+
+ manager.update({projectPartContainer1});
+}
+
+TEST_F(ProjectPartsManager, UpdateCallsNotFetchProjectPartsInStorageIfNoNewerProjectPartsExists)
+{
+ manager.update({projectPartContainer1});
+
+ EXPECT_CALL(mockProjectPartsStorage,
+ fetchProjectParts(ElementsAre(Eq(projectPartContainer1.projectPartId))))
+ .Times(0);
+
+ manager.update({projectPartContainer1});
+}
+
+TEST_F(ProjectPartsManager, UpdateCallsIfOldProjectPartIsAdded)
+{
+ EXPECT_CALL(mockProjectPartsStorage,
+ fetchProjectParts(ElementsAre(Eq(projectPartContainer1.projectPartId))))
+ .WillRepeatedly(Return(ProjectPartContainers{projectPartContainer1}));
+ EXPECT_CALL(mockProjectPartsStorage, updateProjectParts(ElementsAre(projectPartContainer1))).Times(0);
+
+ manager.update({projectPartContainer1});
+}
+
+TEST_F(ProjectPartsManager, UpdateCallsIfUpdatedProjectPartIsAdded)
+{
+ manager.update({projectPartContainer1});
+
+ EXPECT_CALL(mockProjectPartsStorage,
+ fetchProjectParts(ElementsAre(Eq(projectPartContainer1.projectPartId))))
+ .WillRepeatedly(Return(ProjectPartContainers{projectPartContainer1}));
+ EXPECT_CALL(mockProjectPartsStorage,
+ updateProjectParts(ElementsAre(updatedProjectPartContainer1)));
+
+ manager.update({updatedProjectPartContainer1});
+}
+} // namespace
diff --git a/tests/unit/unittest/projectpartsstorage-test.cpp b/tests/unit/unittest/projectpartsstorage-test.cpp
new file mode 100644
index 0000000000..ad78b0b833
--- /dev/null
+++ b/tests/unit/unittest/projectpartsstorage-test.cpp
@@ -0,0 +1,435 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 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 "googletest.h"
+
+#include "mocksqlitedatabase.h"
+
+#include <projectpartsstorage.h>
+#include <refactoringdatabaseinitializer.h>
+#include <sqlitedatabase.h>
+#include <sqlitereadstatement.h>
+#include <sqlitewritestatement.h>
+
+namespace {
+
+using ClangBackEnd::FilePathId;
+using ClangBackEnd::IncludeSearchPath;
+using ClangBackEnd::IncludeSearchPaths;
+using ClangBackEnd::IncludeSearchPathType;
+using ClangBackEnd::ProjectPartId;
+using ClangBackEnd::ProjectPartIds;
+
+class Data
+{
+protected:
+ ClangBackEnd::ProjectPartContainer projectPart1{1,
+ {"-m32"},
+ {{"FOO", "1", 1}},
+ {{"/include", 1, IncludeSearchPathType::System}},
+ {{"/home/yi", 2, IncludeSearchPathType::User}},
+ {1, 2},
+ {3, 4},
+ Utils::Language::Cxx,
+ Utils::LanguageVersion::CXX14,
+ Utils::LanguageExtension::Microsoft};
+ ClangBackEnd::ProjectPartContainer projectPart2{2,
+ {"-m64"},
+ {{"BAR", "2", 1}},
+ {{"/usr/include", 1, IncludeSearchPathType::System}},
+ {{"/home/er", 2, IncludeSearchPathType::User}},
+ {5, 6},
+ {7, 8},
+ Utils::Language::C,
+ Utils::LanguageVersion::C11,
+ Utils::LanguageExtension::Gnu};
+};
+
+class ProjectPartsStorage : public testing::Test, public Data
+{
+ using Storage = ClangBackEnd::ProjectPartsStorage<MockSqliteDatabase>;
+
+protected:
+ ProjectPartsStorage()
+ {
+ ON_CALL(fetchProjectPartByIdStatement, valueReturnProjectPartContainer(Eq(1)))
+ .WillByDefault(Return(projectPart1));
+ ON_CALL(fetchProjectPartByIdStatement, valueReturnProjectPartContainer(Eq(2)))
+ .WillByDefault(Return(projectPart2));
+ ON_CALL(fetchProjectPartsHeadersByIdStatement, valuesReturnFilePathIds(_, Eq(1)))
+ .WillByDefault(Return(projectPart1.headerPathIds));
+ ON_CALL(fetchProjectPartsHeadersByIdStatement, valuesReturnFilePathIds(_, Eq(2)))
+ .WillByDefault(Return(projectPart2.headerPathIds));
+ ON_CALL(fetchProjectPartsSourcesByIdStatement, valuesReturnFilePathIds(_, Eq(1)))
+ .WillByDefault(Return(projectPart1.sourcePathIds));
+ ON_CALL(fetchProjectPartsSourcesByIdStatement, valuesReturnFilePathIds(_, Eq(2)))
+ .WillByDefault(Return(projectPart2.sourcePathIds));
+ }
+ NiceMock<MockSqliteDatabase> mockDatabase;
+ Storage storage{mockDatabase};
+ MockSqliteReadStatement &fetchProjectPartIdStatement = storage.fetchProjectPartIdStatement;
+ MockSqliteWriteStatement &insertProjectPartNameStatement = storage.insertProjectPartNameStatement;
+ MockSqliteReadStatement &fetchProjectPartNameStatement = storage.fetchProjectPartNameStatement;
+ MockSqliteReadStatement &fetchProjectPartsStatement = storage.fetchProjectPartsStatement;
+ MockSqliteReadStatement &fetchProjectPartByIdStatement = storage.fetchProjectPartByIdStatement;
+ MockSqliteWriteStatement &updateProjectPartStatement = storage.updateProjectPartStatement;
+ MockSqliteReadStatement &getProjectPartArtefactsBySourceId = storage.getProjectPartArtefactsBySourceId;
+ MockSqliteReadStatement &getProjectPartArtefactsByProjectPartId = storage.getProjectPartArtefactsByProjectPartId;
+ MockSqliteWriteStatement &deleteProjectPartsHeadersByIdStatement = storage.deleteProjectPartsHeadersByIdStatement;
+ MockSqliteWriteStatement &deleteProjectPartsSourcesByIdStatement = storage.deleteProjectPartsSourcesByIdStatement;
+ MockSqliteWriteStatement &insertProjectPartsHeadersStatement = storage.insertProjectPartsHeadersStatement;
+ MockSqliteWriteStatement &insertProjectPartsSourcesStatement = storage.insertProjectPartsSourcesStatement;
+ MockSqliteReadStatement &fetchProjectPartsHeadersByIdStatement = storage.fetchProjectPartsHeadersByIdStatement;
+ MockSqliteReadStatement &fetchProjectPartsSourcesByIdStatement = storage.fetchProjectPartsSourcesByIdStatement;
+ IncludeSearchPaths systemIncludeSearchPaths{{"/includes", 1, IncludeSearchPathType::BuiltIn},
+ {"/other/includes", 2, IncludeSearchPathType::System}};
+ IncludeSearchPaths projectIncludeSearchPaths{{"/project/includes", 1, IncludeSearchPathType::User},
+ {"/other/project/includes",
+ 2,
+ IncludeSearchPathType::User}};
+ Utils::SmallString systemIncludeSearchPathsText{R"([["/includes",1,2],["/other/includes",2,3]])"};
+ Utils::SmallString projectIncludeSearchPathsText{
+ R"([["/project/includes",1,1],["/other/project/includes",2,1]])"};
+ ClangBackEnd::ProjectPartArtefact artefact{R"(["-DFOO"])",
+ R"([["FOO","1",1]])",
+ systemIncludeSearchPathsText,
+ projectIncludeSearchPathsText,
+ 74,
+ Utils::Language::Cxx,
+ Utils::LanguageVersion::CXX11,
+ Utils::LanguageExtension::None};
+};
+
+TEST_F(ProjectPartsStorage, CallsFetchProjectIdWithNonExistingProjectPartName)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartIdStatement,
+ valueReturnProjectPartId(TypedEq<Utils::SmallStringView>("test")));
+ EXPECT_CALL(insertProjectPartNameStatement, write(TypedEq<Utils::SmallStringView>("test")));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.fetchProjectPartId("test");
+}
+
+TEST_F(ProjectPartsStorage, CallsFetchProjectIdWithExistingProjectPart)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartIdStatement,
+ valueReturnProjectPartId(TypedEq<Utils::SmallStringView>("test")))
+ .WillOnce(Return(Utils::optional<ProjectPartId>{20}));
+ EXPECT_CALL(insertProjectPartNameStatement, write(TypedEq<Utils::SmallStringView>("test"))).Times(0);
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.fetchProjectPartId("test");
+}
+
+TEST_F(ProjectPartsStorage, CallsFetchProjectIdWithBusyDatabaset)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartIdStatement,
+ valueReturnProjectPartId(TypedEq<Utils::SmallStringView>("test")));
+ EXPECT_CALL(insertProjectPartNameStatement, write(TypedEq<Utils::SmallStringView>("test")))
+ .WillOnce(Throw(Sqlite::StatementIsBusy("busy")));
+ EXPECT_CALL(mockDatabase, rollback());
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartIdStatement,
+ valueReturnProjectPartId(TypedEq<Utils::SmallStringView>("test")));
+ EXPECT_CALL(insertProjectPartNameStatement, write(TypedEq<Utils::SmallStringView>("test")));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.fetchProjectPartId("test");
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectIdWithNonExistingProjectPartName)
+{
+ ON_CALL(fetchProjectPartIdStatement,
+ valueReturnProjectPartId(TypedEq<Utils::SmallStringView>("test")))
+ .WillByDefault(Return(Utils::optional<ProjectPartId>{}));
+ ON_CALL(mockDatabase, lastInsertedRowId()).WillByDefault(Return(21));
+
+ auto id = storage.fetchProjectPartId("test");
+
+ ASSERT_THAT(id.projectPathId, 21);
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectIdWithNonExistingProjectPartNameAndIsBusy)
+{
+ InSequence s;
+ EXPECT_CALL(fetchProjectPartIdStatement,
+ valueReturnProjectPartId(TypedEq<Utils::SmallStringView>("test")))
+ .WillOnce(Throw(Sqlite::StatementIsBusy("busy")));
+ EXPECT_CALL(fetchProjectPartIdStatement,
+ valueReturnProjectPartId(TypedEq<Utils::SmallStringView>("test")))
+ .WillOnce(Return(ClangBackEnd::ProjectPartId{21}));
+ ON_CALL(mockDatabase, lastInsertedRowId()).WillByDefault(Return(21));
+
+ auto id = storage.fetchProjectPartId("test");
+
+ ASSERT_THAT(id.projectPathId, 21);
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectIdWithExistingProjectPartName)
+{
+ ON_CALL(fetchProjectPartIdStatement,
+ valueReturnProjectPartId(TypedEq<Utils::SmallStringView>("test")))
+ .WillByDefault(Return(Utils::optional<ProjectPartId>{20}));
+
+ auto id = storage.fetchProjectPartId("test");
+
+ ASSERT_THAT(id.projectPathId, 20);
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartName)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartNameStatement, valueReturnPathString(TypedEq<int>(12)))
+ .WillOnce(Return(Utils::optional<Utils::PathString>{"test"}));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.fetchProjectPartName(12);
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartNameStatementIsBusy)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartNameStatement, valueReturnPathString(TypedEq<int>(12)))
+ .WillOnce(Throw(Sqlite::StatementIsBusy{""}));
+ EXPECT_CALL(mockDatabase, rollback());
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartNameStatement, valueReturnPathString(TypedEq<int>(12)))
+ .WillOnce(Return(Utils::optional<Utils::PathString>{"test"}));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.fetchProjectPartName(12);
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectParts)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartsStatement, valuesReturnProjectPartContainers(4096));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.fetchProjectParts();
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartsByIds)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartByIdStatement, valueReturnProjectPartContainer(Eq(1)));
+ EXPECT_CALL(fetchProjectPartByIdStatement, valueReturnProjectPartContainer(Eq(2)));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.fetchProjectParts({1, 2});
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartsByIdsIsBusy)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartByIdStatement, valueReturnProjectPartContainer(Eq(1)));
+ EXPECT_CALL(fetchProjectPartByIdStatement, valueReturnProjectPartContainer(Eq(2)))
+ .WillOnce(Throw(Sqlite::StatementIsBusy{""}));
+ EXPECT_CALL(mockDatabase, rollback());
+ EXPECT_CALL(mockDatabase, deferredBegin());
+ EXPECT_CALL(fetchProjectPartByIdStatement, valueReturnProjectPartContainer(Eq(1)));
+ EXPECT_CALL(fetchProjectPartByIdStatement, valueReturnProjectPartContainer(Eq(2)));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.fetchProjectParts({1, 2});
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartsByIdsHasMissingId)
+{
+ auto projectParts = storage.fetchProjectParts({1, 2, 3});
+
+ ASSERT_THAT(projectParts, ElementsAre(projectPart1, projectPart2));
+}
+
+TEST_F(ProjectPartsStorage, ConvertStringsToJson)
+{
+ Utils::SmallStringVector strings{"foo", "bar", "foo"};
+
+ auto jsonText = storage.toJson(strings);
+
+ ASSERT_THAT(jsonText, Eq("[\"foo\",\"bar\",\"foo\"]"));
+}
+
+TEST_F(ProjectPartsStorage, UpdateProjectParts)
+{
+ InSequence sequence;
+
+ EXPECT_CALL(mockDatabase, immediateBegin());
+ EXPECT_CALL(updateProjectPartStatement,
+ write(TypedEq<int>(1),
+ TypedEq<Utils::SmallStringView>(R"(["-m32"])"),
+ TypedEq<Utils::SmallStringView>(R"([["FOO","1",1]])"),
+ TypedEq<Utils::SmallStringView>(R"([["/include",1,3]])"),
+ TypedEq<Utils::SmallStringView>(R"([["/home/yi",2,1]])"),
+ 1,
+ 35,
+ 2));
+ EXPECT_CALL(deleteProjectPartsHeadersByIdStatement, write(TypedEq<int>(1)));
+ EXPECT_CALL(insertProjectPartsHeadersStatement, write(TypedEq<int>(1), TypedEq<int>(1)));
+ EXPECT_CALL(insertProjectPartsHeadersStatement, write(TypedEq<int>(1), TypedEq<int>(2)));
+ EXPECT_CALL(deleteProjectPartsSourcesByIdStatement, write(TypedEq<int>(1)));
+ EXPECT_CALL(insertProjectPartsSourcesStatement, write(TypedEq<int>(1), TypedEq<int>(3)));
+ EXPECT_CALL(insertProjectPartsSourcesStatement, write(TypedEq<int>(1), TypedEq<int>(4)));
+ EXPECT_CALL(updateProjectPartStatement,
+ write(TypedEq<int>(2),
+ TypedEq<Utils::SmallStringView>(R"(["-m64"])"),
+ TypedEq<Utils::SmallStringView>(R"([["BAR","2",1]])"),
+ TypedEq<Utils::SmallStringView>(R"([["/usr/include",1,3]])"),
+ TypedEq<Utils::SmallStringView>(R"([["/home/er",2,1]])"),
+ 0,
+ 2,
+ 1));
+ EXPECT_CALL(deleteProjectPartsHeadersByIdStatement, write(TypedEq<int>(2)));
+ EXPECT_CALL(insertProjectPartsHeadersStatement, write(TypedEq<int>(2), TypedEq<int>(5)));
+ EXPECT_CALL(insertProjectPartsHeadersStatement, write(TypedEq<int>(2), TypedEq<int>(6)));
+ EXPECT_CALL(deleteProjectPartsSourcesByIdStatement, write(TypedEq<int>(2)));
+ EXPECT_CALL(insertProjectPartsSourcesStatement, write(TypedEq<int>(2), TypedEq<int>(7)));
+ EXPECT_CALL(insertProjectPartsSourcesStatement, write(TypedEq<int>(2), TypedEq<int>(8)));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.updateProjectParts({projectPart1, projectPart2});
+}
+
+TEST_F(ProjectPartsStorage, UpdateProjectPartsIsBusy)
+{
+ InSequence sequence;
+
+ EXPECT_CALL(mockDatabase, immediateBegin()).WillOnce(Throw(Sqlite::StatementIsBusy{""}));
+ EXPECT_CALL(mockDatabase, immediateBegin());
+ EXPECT_CALL(updateProjectPartStatement,
+ write(TypedEq<int>(1),
+ TypedEq<Utils::SmallStringView>(R"(["-m32"])"),
+ TypedEq<Utils::SmallStringView>(R"([["FOO","1",1]])"),
+ TypedEq<Utils::SmallStringView>(R"([["/include",1,3]])"),
+ TypedEq<Utils::SmallStringView>(R"([["/home/yi",2,1]])"),
+ 1,
+ 35,
+ 2));
+ EXPECT_CALL(mockDatabase, commit());
+
+ storage.updateProjectParts({projectPart1});
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdCallsValueInStatement)
+{
+ EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
+ .WillRepeatedly(Return(artefact));
+
+ storage.fetchProjectPartArtefact(FilePathId{1});
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartArtefactBySourceIdReturnArtefact)
+{
+ EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
+ .WillRepeatedly(Return(artefact));
+
+ auto result = storage.fetchProjectPartArtefact(FilePathId{1});
+
+ ASSERT_THAT(result, Eq(artefact));
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartArtefactByProjectPartIdCallsValueInStatement)
+{
+ EXPECT_CALL(getProjectPartArtefactsByProjectPartId, valueReturnProjectPartArtefact(74))
+ .WillRepeatedly(Return(artefact));
+
+ storage.fetchProjectPartArtefact(ProjectPartId{74});
+}
+
+TEST_F(ProjectPartsStorage, FetchProjectPartArtefactByProjectPartIdReturnArtefact)
+{
+ EXPECT_CALL(getProjectPartArtefactsByProjectPartId, valueReturnProjectPartArtefact(74))
+ .WillRepeatedly(Return(artefact));
+
+ auto result = storage.fetchProjectPartArtefact(ProjectPartId{74});
+
+ ASSERT_THAT(result, Eq(artefact));
+}
+
+class ProjectPartsStorageSlow : public testing::Test, public Data
+{
+ using Storage = ClangBackEnd::ProjectPartsStorage<Sqlite::Database>;
+
+protected:
+ Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
+ ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
+ Storage storage{database};
+};
+
+TEST_F(ProjectPartsStorageSlow, FetchProjectPartName)
+{
+ auto id = storage.fetchProjectPartId("test");
+
+ auto name = storage.fetchProjectPartName(id);
+
+ ASSERT_THAT(name, "test");
+}
+
+TEST_F(ProjectPartsStorageSlow, FetchNonExistingProjectPartName)
+{
+ ASSERT_THROW(storage.fetchProjectPartName(ClangBackEnd::ProjectPartId{1}),
+ ClangBackEnd::ProjectPartDoesNotExists);
+}
+
+TEST_F(ProjectPartsStorageSlow, FetchProjectPartId)
+{
+ auto first = storage.fetchProjectPartId("test");
+
+ auto second = storage.fetchProjectPartId("test");
+
+ ASSERT_THAT(first, Eq(second));
+}
+
+TEST_F(ProjectPartsStorageSlow, FetchProjectParts)
+{
+ projectPart1.projectPartId = storage.fetchProjectPartId("project1");
+ projectPart2.projectPartId = storage.fetchProjectPartId("project2");
+ storage.updateProjectParts({projectPart1, projectPart2});
+
+ auto projectParts = storage.fetchProjectParts(
+ {projectPart1.projectPartId, projectPart2.projectPartId});
+
+ ASSERT_THAT(projectParts, ElementsAre(projectPart1, projectPart2));
+}
+} // namespace
diff --git a/tests/unit/unittest/projectupdater-test.cpp b/tests/unit/unittest/projectupdater-test.cpp
index f41ddf89d4..028a6161c9 100644
--- a/tests/unit/unittest/projectupdater-test.cpp
+++ b/tests/unit/unittest/projectupdater-test.cpp
@@ -30,6 +30,8 @@
#include "mockpchmanagerserver.h"
#include "mockprecompiledheaderstorage.h"
#include "mockprogressmanager.h"
+#include "mockprojectpartsstorage.h"
+#include "mocksqlitetransactionbackend.h"
#include <pchmanagerprojectupdater.h>
@@ -37,6 +39,7 @@
#include <pchmanagerclient.h>
#include <precompiledheaderstorage.h>
#include <precompiledheadersupdatedmessage.h>
+#include <projectpartsstorage.h>
#include <refactoringdatabaseinitializer.h>
#include <removegeneratedfilesmessage.h>
#include <removeprojectpartsmessage.h>
@@ -89,7 +92,7 @@ protected:
projectPart.files.push_back(nonActiveProjectFile);
projectPart.displayName = "projectb";
projectPart.projectMacros = {{"FOO", "2"}, {"BAR", "1"}};
- projectPartId = projectPart.id();
+ projectPartId = projectPartsStorage.fetchProjectPartId(Utils::SmallString{projectPart.id()});
projectPart2.files.push_back(header2ProjectFile);
projectPart2.files.push_back(header1ProjectFile);
@@ -98,7 +101,7 @@ protected:
projectPart2.files.push_back(nonActiveProjectFile);
projectPart2.displayName = "projectaa";
projectPart2.projectMacros = {{"BAR", "1"}, {"FOO", "2"}};
- projectPartId2 = projectPart2.id();
+ projectPartId2 = projectPartsStorage.fetchProjectPartId(Utils::SmallString{projectPart2.id()});
nonBuildingProjectPart.files.push_back(cannotBuildSourceProjectFile);
nonBuildingProjectPart.displayName = "nonbuilding";
@@ -109,7 +112,7 @@ protected:
Utils::SmallStringVector arguments2{
ClangPchManager::ProjectUpdater::toolChainArguments(&projectPart2)};
- expectedContainer = {projectPartId.clone(),
+ expectedContainer = {projectPartId,
arguments.clone(),
Utils::clone(compilerMacros),
{{CLANG_RESOURCE_DIR, 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
@@ -119,7 +122,7 @@ protected:
Utils::Language::Cxx,
Utils::LanguageVersion::LatestCxx,
Utils::LanguageExtension::None};
- expectedContainer2 = {projectPartId2.clone(),
+ expectedContainer2 = {projectPartId2,
arguments2.clone(),
Utils::clone(compilerMacros),
{{CLANG_RESOURCE_DIR, 1, ClangBackEnd::IncludeSearchPathType::BuiltIn}},
@@ -137,13 +140,14 @@ protected:
ClangBackEnd::FilePathCaching filePathCache{database};
NiceMock<MockProgressManager> mockPchCreationProgressManager;
NiceMock<MockProgressManager> mockDependencyCreationProgressManager;
+ ClangBackEnd::ProjectPartsStorage<Sqlite::Database> projectPartsStorage{database};
ClangPchManager::PchManagerClient pchManagerClient{mockPchCreationProgressManager,
mockDependencyCreationProgressManager};
MockPchManagerNotifier mockPchManagerNotifier{pchManagerClient};
NiceMock<MockPchManagerServer> mockPchManagerServer;
- ClangPchManager::ProjectUpdater updater{mockPchManagerServer, filePathCache};
- Utils::SmallString projectPartId;
- Utils::SmallString projectPartId2;
+ ClangPchManager::ProjectUpdater updater{mockPchManagerServer, filePathCache, projectPartsStorage};
+ ClangBackEnd::ProjectPartId projectPartId;
+ ClangBackEnd::ProjectPartId projectPartId2;
Utils::PathStringVector headerPaths = {"/path/to/header1.h", "/path/to/header2.h"};
Utils::PathStringVector sourcePaths = {"/path/to/source1.cpp", "/path/to/source2.cpp"};
ClangBackEnd::CompilerMacros compilerMacros = {{"BAR", "1", 1}, {"FOO", "2", 2}};
@@ -227,18 +231,21 @@ TEST_F(ProjectUpdater, CallRemoveProjectParts)
EXPECT_CALL(mockPchManagerServer, removeProjectParts(message));
- updater.removeProjectParts({QString(projectPartId2), QString(projectPartId)});
+ updater.removeProjectParts({projectPartId2, projectPartId});
}
TEST_F(ProjectUpdater, CallPrecompiledHeaderRemovedInPchManagerProjectUpdater)
{
- ClangPchManager::PchManagerProjectUpdater pchUpdater{mockPchManagerServer, pchManagerClient, filePathCache};
+ ClangPchManager::PchManagerProjectUpdater pchUpdater{mockPchManagerServer,
+ pchManagerClient,
+ filePathCache,
+ projectPartsStorage};
ClangBackEnd::RemoveProjectPartsMessage message{{projectPartId, projectPartId2}};
- EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderRemoved(projectPartId.toQString()));
- EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderRemoved(projectPartId2.toQString()));
+ EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderRemoved(projectPartId));
+ EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderRemoved(projectPartId2));
- pchUpdater.removeProjectParts({QString(projectPartId), QString(projectPartId2)});
+ pchUpdater.removeProjectParts({projectPartId, projectPartId2});
}
TEST_F(ProjectUpdater, ConvertProjectPartToProjectPartContainer)
@@ -258,6 +265,25 @@ TEST_F(ProjectUpdater, ConvertProjectPartToProjectPartContainersHaveSameSizeLike
ASSERT_THAT(containers, SizeIs(2));
}
+TEST_F(ProjectUpdater, CallStorageInsideTransaction)
+{
+ InSequence s;
+ CppTools::ProjectPart projectPart;
+ projectPart.displayName = "project";
+ Utils::SmallString projectPartName = projectPart.id();
+ MockSqliteTransactionBackend mockSqliteTransactionBackend;
+ MockProjectPartsStorage mockProjectPartsStorage;
+ ON_CALL(mockProjectPartsStorage, transactionBackend())
+ .WillByDefault(ReturnRef(mockSqliteTransactionBackend));
+ ClangPchManager::ProjectUpdater updater{mockPchManagerServer,
+ filePathCache,
+ mockProjectPartsStorage};
+
+ EXPECT_CALL(mockProjectPartsStorage, fetchProjectPartId(Eq(projectPartName)));
+
+ updater.toProjectPartContainers({&projectPart});
+}
+
TEST_F(ProjectUpdater, CreateSortedExcludedPaths)
{
auto excludedPaths = updater.createExcludedPaths({generatedFile2, generatedFile3, generatedFile});
@@ -383,5 +409,15 @@ TEST_F(ProjectUpdater, ToolChainArgumentsMSVC)
"-U__cpp_variadic_using"));
}
+TEST_F(ProjectUpdater, FetchProjectPartName)
+{
+ updater.updateProjectParts({&projectPart}, {});
+
+ auto projectPartName = updater.fetchProjectPartName(1);
+
+ ASSERT_THAT(projectPartName, Eq(" projectb"));
}
+// test for update many time and get the same id
+
+} // namespace
diff --git a/tests/unit/unittest/refactoringclientserverinprocess-test.cpp b/tests/unit/unittest/refactoringclientserverinprocess-test.cpp
index c6e4d59c3a..113e21859e 100644
--- a/tests/unit/unittest/refactoringclientserverinprocess-test.cpp
+++ b/tests/unit/unittest/refactoringclientserverinprocess-test.cpp
@@ -180,19 +180,20 @@ TEST_F(RefactoringClientServerInProcess, RequestSourceRangesForQueryMessage)
TEST_F(RefactoringClientServerInProcess, SendUpdateProjectPartsMessage)
{
- ProjectPartContainer projectPart2{"projectPartId",
- {"-x", "c++-header", "-Wno-pragma-once-outside-header"},
- {{"DEFINE", "1", 1}},
- {IncludeSearchPath{"/system/path", 2, IncludeSearchPathType::System},
- IncludeSearchPath{"/builtin/path", 3, IncludeSearchPathType::BuiltIn},
- IncludeSearchPath{"/framework/path", 1, IncludeSearchPathType::System}},
- {IncludeSearchPath{"/to/path1", 1, IncludeSearchPathType::User},
- IncludeSearchPath{"/to/path2", 2, IncludeSearchPathType::User}},
- {{1, 1}},
- {{1, 2}},
- Utils::Language::C,
- Utils::LanguageVersion::C11,
- Utils::LanguageExtension::All};
+ ProjectPartContainer projectPart2{
+ 1,
+ {"-x", "c++-header", "-Wno-pragma-once-outside-header"},
+ {{"DEFINE", "1", 1}},
+ {IncludeSearchPath{"/system/path", 2, IncludeSearchPathType::System},
+ IncludeSearchPath{"/builtin/path", 3, IncludeSearchPathType::BuiltIn},
+ IncludeSearchPath{"/framework/path", 1, IncludeSearchPathType::System}},
+ {IncludeSearchPath{"/to/path1", 1, IncludeSearchPathType::User},
+ IncludeSearchPath{"/to/path2", 2, IncludeSearchPathType::User}},
+ {{1, 1}},
+ {{1, 2}},
+ Utils::Language::C,
+ Utils::LanguageVersion::C11,
+ Utils::LanguageExtension::All};
UpdateProjectPartsMessage message{{projectPart2}, {"toolChainArgument"}};
EXPECT_CALL(mockRefactoringServer, updateProjectParts(message));
@@ -214,7 +215,7 @@ TEST_F(RefactoringClientServerInProcess, SendUpdateGeneratedFilesMessage)
TEST_F(RefactoringClientServerInProcess, SendRemoveProjectPartsMessage)
{
- RemoveProjectPartsMessage message{{"projectPartId1", "projectPartId2"}};
+ RemoveProjectPartsMessage message{{1, 2}};
EXPECT_CALL(mockRefactoringServer, removeProjectParts(message));
diff --git a/tests/unit/unittest/refactoringcompilationdatabase-test.cpp b/tests/unit/unittest/refactoringcompilationdatabase-test.cpp
index 59f88f8b53..5af5325e48 100644
--- a/tests/unit/unittest/refactoringcompilationdatabase-test.cpp
+++ b/tests/unit/unittest/refactoringcompilationdatabase-test.cpp
@@ -61,7 +61,7 @@ protected:
RefactoringCompilationDatabase()
{
database.addFile(ClangBackEnd::NativeFilePathView{temporarySourceFilePath},
- {"cc", toNativePath(temporaryDirectoryPath + "/data.cpp").path(), "-DNO_DEBUG"});
+ {"cc", toNativePath(temporaryDirectoryPath + "/data.cpp"), "-DNO_DEBUG"});
}
protected:
@@ -83,13 +83,13 @@ TEST_F(RefactoringCompilationDatabase, CompileCommandForFilePath)
auto compileCommands = database.getAllCompileCommands();
ASSERT_THAT(compileCommands,
- Contains(IsCompileCommand(
- temporaryDirectoryPath,
- toNativePath(temporaryDirectoryPath + "/data.cpp").path(),
- std::vector<std::string>{
- "cc",
- std::string(toNativePath(temporaryDirectoryPath + "/data.cpp").path()),
- "-DNO_DEBUG"})));
+ Contains(IsCompileCommand(temporaryDirectoryPath,
+ toNativePath(temporaryDirectoryPath + "/data.cpp"),
+ std::vector<std::string>{"cc",
+ std::string(toNativePath(
+ temporaryDirectoryPath
+ + "/data.cpp")),
+ "-DNO_DEBUG"})));
}
TEST_F(RefactoringCompilationDatabase, NoCompileCommandForFilePath)
@@ -97,13 +97,13 @@ TEST_F(RefactoringCompilationDatabase, NoCompileCommandForFilePath)
auto compileCommands = database.getAllCompileCommands();
ASSERT_THAT(compileCommands,
- Not(Contains(IsCompileCommand(
- temporaryDirectoryPath,
- toNativePath(temporaryDirectoryPath + "/data.cpp2").path(),
- std::vector<std::string>{
- "cc",
- std::string(toNativePath(temporaryDirectoryPath + "/data.cpp").path()),
- "-DNO_DEBUG"}))));
+ Not(Contains(IsCompileCommand(temporaryDirectoryPath,
+ toNativePath(temporaryDirectoryPath + "/data.cpp2"),
+ std::vector<std::string>{"cc",
+ std::string(toNativePath(
+ temporaryDirectoryPath
+ + "/data.cpp")),
+ "-DNO_DEBUG"}))));
}
TEST_F(RefactoringCompilationDatabase, FilePaths)
diff --git a/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp b/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp
index ebd67dccba..4865e2ebff 100644
--- a/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp
+++ b/tests/unit/unittest/refactoringdatabaseinitializer-test.cpp
@@ -98,18 +98,18 @@ TEST_F(RefactoringDatabaseInitializer, AddProjectPartsTable)
initializer.createProjectPartsTable();
}
-TEST_F(RefactoringDatabaseInitializer, AddProjectPartsSourcesTable)
+TEST_F(RefactoringDatabaseInitializer, AddProjectPartsFilesTable)
{
InSequence s;
EXPECT_CALL(mockDatabase,
- execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsSources(projectPartId INTEGER, "
+ execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsFiles(projectPartId INTEGER, "
"sourceId INTEGER, sourceType INTEGER, pchCreationTimeStamp INTEGER, "
"hasMissingIncludes INTEGER)")));
- EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsSources_sourceId_projectPartId ON projectPartsSources(sourceId, projectPartId)")));
- EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsSources_projectPartId ON projectPartsSources(projectPartId)")));
+ EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsFiles_sourceId_projectPartId ON projectPartsFiles(sourceId, projectPartId)")));
+ EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsFiles_projectPartId ON projectPartsFiles(projectPartId)")));
- initializer.createProjectPartsSourcesTable();
+ initializer.createProjectPartsFilesTable();
}
TEST_F(RefactoringDatabaseInitializer, AddUsedMacrosTable)
@@ -155,6 +155,34 @@ TEST_F(RefactoringDatabaseInitializer, AddPrecompiledHeaderTable)
initializer.createPrecompiledHeadersTable();
}
+TEST_F(RefactoringDatabaseInitializer, AddProjectPartsHeadersTable)
+{
+ InSequence s;
+
+ EXPECT_CALL(mockDatabase,
+ execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsHeaders(projectPartId INTEGER, "
+ "sourceId INTEGER)")));
+ EXPECT_CALL(mockDatabase,
+ execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsHeaders_projectPartId ON "
+ "projectPartsHeaders(projectPartId)")));
+
+ initializer.createProjectPartsHeadersTable();
+}
+
+TEST_F(RefactoringDatabaseInitializer, AddProjectPartsSourcesTable)
+{
+ InSequence s;
+
+ 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_projectPartId ON "
+ "projectPartsSources(projectPartId)")));
+
+ initializer.createProjectPartsSourcesTable();
+}
+
TEST_F(RefactoringDatabaseInitializer, CreateInTheContructor)
{
InSequence s;
@@ -179,11 +207,11 @@ TEST_F(RefactoringDatabaseInitializer, CreateInTheContructor)
"language INTEGER, languageVersion INTEGER, languageExtension INTEGER)")));
EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectParts_projectPartName ON projectParts(projectPartName)")));
EXPECT_CALL(mockDatabase,
- execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsSources(projectPartId INTEGER, "
+ execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsFiles(projectPartId INTEGER, "
"sourceId INTEGER, sourceType INTEGER, pchCreationTimeStamp INTEGER, "
"hasMissingIncludes INTEGER)")));
- EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsSources_sourceId_projectPartId ON projectPartsSources(sourceId, projectPartId)")));
- EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsSources_projectPartId ON projectPartsSources(projectPartId)")));
+ EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsFiles_sourceId_projectPartId ON projectPartsFiles(sourceId, projectPartId)")));
+ EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsFiles_projectPartId ON projectPartsFiles(projectPartId)")));
EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS usedMacros(usedMacroId INTEGER PRIMARY KEY, sourceId INTEGER, macroName TEXT)")));
EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_usedMacros_sourceId_macroName ON usedMacros(sourceId, macroName)")));
EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_usedMacros_macroName ON usedMacros(macroName)")));
@@ -195,6 +223,18 @@ TEST_F(RefactoringDatabaseInitializer, CreateInTheContructor)
EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS sourceDependencies(sourceId INTEGER, dependencySourceId INTEGER)")));
EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_sourceDependencies_sourceId_dependencySourceId ON sourceDependencies(sourceId, dependencySourceId)")));
EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS precompiledHeaders(projectPartId INTEGER PRIMARY KEY, projectPchPath TEXT, projectPchBuildTime INTEGER, systemPchPath TEXT, systemPchBuildTime INTEGER)")));
+ EXPECT_CALL(mockDatabase,
+ execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsHeaders(projectPartId INTEGER, "
+ "sourceId INTEGER)")));
+ EXPECT_CALL(mockDatabase,
+ execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsHeaders_projectPartId ON "
+ "projectPartsHeaders(projectPartId)")));
+ 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_projectPartId ON "
+ "projectPartsSources(projectPartId)")));
EXPECT_CALL(mockDatabase, commit());
EXPECT_CALL(mockDatabase, setIsInitialized(true));
@@ -223,9 +263,9 @@ TEST_F(RefactoringDatabaseInitializer, DontCreateIfAlreadyInitialized)
"TEXT, includeSearchPaths TEXT)")))
.Times(0);
EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectParts_projectPartName ON projectParts(projectPartName)"))).Times(0);
- EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsSources(projectPartId INTEGER, sourceId INTEGER)"))).Times(0);
- EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsSources_sourceId_projectPartId ON projectPartsSources(sourceId, projectPartId)"))).Times(0);
- EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsSources_projectPartId ON projectPartsSources(projectPartId)"))).Times(0);
+ EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsFiles(projectPartId INTEGER, sourceId INTEGER)"))).Times(0);
+ EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsFiles_sourceId_projectPartId ON projectPartsFiles(sourceId, projectPartId)"))).Times(0);
+ EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsFiles_projectPartId ON projectPartsFiles(projectPartId)"))).Times(0);
EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS usedMacros(usedMacroId INTEGER PRIMARY KEY, sourceId INTEGER, macroName TEXT)"))).Times(0);
EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_usedMacros_sourceId_macroName ON usedMacros(sourceId, macroName)"))).Times(0);
EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_usedMacros_macroName ON usedMacros(macroName)"))).Times(0);
@@ -236,6 +276,22 @@ TEST_F(RefactoringDatabaseInitializer, DontCreateIfAlreadyInitialized)
EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS sourceDependencies(sourceId INTEGER, dependencySourceId INTEGER)"))).Times(0);
EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_sourceDependencies_sourceId_dependencySourceId ON sourceDependencies(sourceId, dependencySourceId)"))).Times(0);
EXPECT_CALL(mockDatabase, execute(Eq("CREATE TABLE IF NOT EXISTS precompiledHeaders(projectPartId INTEGER PRIMARY KEY, pchPath TEXT, pchBuildTime INTEGER)"))).Times(0);
+ EXPECT_CALL(mockDatabase,
+ execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsHeaders(projectPartId INTEGER, "
+ "sourceId INTEGER)")))
+ .Times(0);
+ EXPECT_CALL(mockDatabase,
+ execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsHeaders_projectPartId ON "
+ "projectPartsHeaders(projectPartId)")))
+ .Times(0);
+ EXPECT_CALL(mockDatabase,
+ execute(Eq("CREATE TABLE IF NOT EXISTS projectPartsSources(projectPartId INTEGER, "
+ "sourceId INTEGER)")))
+ .Times(0);
+ EXPECT_CALL(mockDatabase,
+ execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsSources_projectPartId ON "
+ "projectPartsSources(projectPartId)")))
+ .Times(0);
EXPECT_CALL(mockDatabase, commit()).Times(0);
Initializer initializer{mockDatabase};
diff --git a/tests/unit/unittest/refactoringprojectupdater-test.cpp b/tests/unit/unittest/refactoringprojectupdater-test.cpp
index bab2377993..028edc0f7f 100644
--- a/tests/unit/unittest/refactoringprojectupdater-test.cpp
+++ b/tests/unit/unittest/refactoringprojectupdater-test.cpp
@@ -27,6 +27,7 @@
#include "mockcppmodelmanager.h"
#include "mockprogressmanager.h"
+#include "mockprojectpartsstorage.h"
#include "mockrefactoringserver.h"
#include <sqlitedatabase.h>
@@ -48,9 +49,9 @@ using CppTools::ProjectPart;
using ClangBackEnd::UpdateProjectPartsMessage;
using ClangBackEnd::RemoveProjectPartsMessage;
-MATCHER_P(IsProjectPartContainer, projectPartId,
- std::string(negation ? "hasn't" : "has")
- + " name " + std::string(projectPartId))
+MATCHER_P(IsProjectPartContainer,
+ projectPartId,
+ std::string(negation ? "hasn't" : "has") + " id " + PrintToString(projectPartId))
{
const ClangBackEnd::ProjectPartContainer &container = arg;
@@ -68,20 +69,6 @@ protected:
return projectPart;
}
- Utils::SmallString createProjectPartId(const char *name)
- {
- ProjectPart::Ptr projectPart{new ProjectPart};
- projectPart->displayName = QString::fromUtf8(name, std::strlen(name));
- return projectPart->id();
- }
-
- QString createProjectPartQStringId(const char *name)
- {
- ProjectPart::Ptr projectPart{new ProjectPart};
- projectPart->displayName = QString::fromUtf8(name, std::strlen(name));
- return projectPart->id();
- }
-
protected:
Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database};
@@ -89,46 +76,53 @@ protected:
NiceMock<MockRefactoringServer> mockRefactoringServer;
NiceMock<MockProgressManager> mockPchCreationProgressManager;
NiceMock<MockProgressManager> mockDependencyCreationProgressManager;
+ NiceMock<MockProjectPartsStorage> mockProjectPartsStorage;
ClangPchManager::PchManagerClient pchManagerClient{mockPchCreationProgressManager,
mockDependencyCreationProgressManager};
MockCppModelManager mockCppModelManager;
- ClangRefactoring::RefactoringProjectUpdater updater{mockRefactoringServer, pchManagerClient, mockCppModelManager, filePathCache};
+ ClangRefactoring::RefactoringProjectUpdater updater{mockRefactoringServer,
+ pchManagerClient,
+ mockCppModelManager,
+ filePathCache,
+ mockProjectPartsStorage};
Utils::SmallString projectPartId;
};
TEST_F(RefactoringProjectUpdater, DontUpdateProjectPartIfNoProjectPartExistsForId)
{
- EXPECT_CALL(mockCppModelManager, projectPartForId(Eq(createProjectPartQStringId("project1"))));
+ InSequence s;
+
+ EXPECT_CALL(mockProjectPartsStorage, fetchProjectPartName(Eq(3)))
+ .WillOnce(Return(QString("project1")));
+ EXPECT_CALL(mockCppModelManager, projectPartForId(Eq(QString("project1"))));
+ EXPECT_CALL(mockRefactoringServer, updateProjectParts(_)).Times(0);
- pchManagerClient.precompiledHeadersUpdated({{{createProjectPartId("project1"), "/path/to/pch", 12}}});
+ pchManagerClient.precompiledHeadersUpdated({{{3, "/path/to/pch", 12}}});
}
TEST_F(RefactoringProjectUpdater, UpdateProjectPart)
{
- EXPECT_CALL(mockCppModelManager, projectPartForId(Eq(createProjectPartQStringId("project1")))).WillRepeatedly(Return(createProjectPart("project1")));
- EXPECT_CALL(mockRefactoringServer, updateProjectParts(
- Field(&UpdateProjectPartsMessage::projectsParts,
- ElementsAre(IsProjectPartContainer(createProjectPartId("project1"))))));
-
- pchManagerClient.precompiledHeadersUpdated({{{createProjectPartId("project1"), "/path/to/pch", 12}}});
+ InSequence s;
+
+ EXPECT_CALL(mockProjectPartsStorage, fetchProjectPartName(Eq(3)))
+ .WillRepeatedly(Return(QString(" project1")));
+ EXPECT_CALL(mockCppModelManager, projectPartForId(Eq(QString(" project1"))))
+ .WillRepeatedly(Return(createProjectPart("project1")));
+ EXPECT_CALL(mockProjectPartsStorage, fetchProjectPartId(Eq(" project1")))
+ .WillOnce(Return(ClangBackEnd::ProjectPartId{3}));
+ EXPECT_CALL(mockRefactoringServer,
+ updateProjectParts(Field(&UpdateProjectPartsMessage::projectsParts,
+ ElementsAre(IsProjectPartContainer(3)))));
+
+ pchManagerClient.precompiledHeadersUpdated({{{3, "/path/to/pch", 12}}});
}
TEST_F(RefactoringProjectUpdater, RemoveProjectPart)
{
- EXPECT_CALL(mockRefactoringServer, removeProjectParts(
- Field(&RemoveProjectPartsMessage::projectsPartIds,
- ElementsAre(Eq("project1")))));
-
- pchManagerClient.precompiledHeaderRemoved({"project1"});
-}
-
-TEST_F(RefactoringProjectUpdater, UpdateGeneratedFiles)
-{
- EXPECT_CALL(mockRefactoringServer, removeProjectParts(
- Field(&RemoveProjectPartsMessage::projectsPartIds,
- ElementsAre(Eq("project1")))));
+ EXPECT_CALL(mockRefactoringServer,
+ removeProjectParts(
+ Field(&RemoveProjectPartsMessage::projectsPartIds, ElementsAre(Eq(1)))));
- pchManagerClient.precompiledHeaderRemoved({"project1"});
+ pchManagerClient.precompiledHeaderRemoved(1);
}
-
}
diff --git a/tests/unit/unittest/refactoringserver-test.cpp b/tests/unit/unittest/refactoringserver-test.cpp
index 7ac60c45d1..8a81e37258 100644
--- a/tests/unit/unittest/refactoringserver-test.cpp
+++ b/tests/unit/unittest/refactoringserver-test.cpp
@@ -319,7 +319,7 @@ TEST_F(RefactoringServer, RemoveGeneratedFilesSetMemberWhichIsUsedForSymbolIndex
TEST_F(RefactoringServer, UpdateProjectPartsCallsSymbolIndexingUpdateProjectParts)
{
ProjectPartContainers projectParts{
- {{"projectPartId",
+ {{1,
{"-I", TESTDATA_DIR},
{{"DEFINE", "1", 1}},
IncludeSearchPaths{{"/includes", 1, IncludeSearchPathType::BuiltIn},
diff --git a/tests/unit/unittest/symbolindexer-test.cpp b/tests/unit/unittest/symbolindexer-test.cpp
index ea015bdee6..edfcb286ad 100644
--- a/tests/unit/unittest/symbolindexer-test.cpp
+++ b/tests/unit/unittest/symbolindexer-test.cpp
@@ -23,15 +23,16 @@
**
****************************************************************************/
-#include "googletest.h"
#include "filesystem-utilities.h"
+#include "googletest.h"
+#include "mockbuilddependenciesstorage.h"
#include "mockclangpathwatcher.h"
+#include "mockfilepathcaching.h"
#include "mockprecompiledheaderstorage.h"
+#include "mockprojectpartsstorage.h"
+#include "mocksqlitetransactionbackend.h"
#include "mocksymbolscollector.h"
#include "mocksymbolstorage.h"
-#include "mockfilepathcaching.h"
-#include "mocksqlitetransactionbackend.h"
-#include "mockbuilddependenciesstorage.h"
#include <filepathcaching.h>
#include <filestatuscache.h>
@@ -50,27 +51,29 @@
namespace {
-using Utils::PathString;
using ClangBackEnd::CompilerMacro;
-using ClangBackEnd::FileStatuses;
using ClangBackEnd::FilePathId;
using ClangBackEnd::FilePathIds;
using ClangBackEnd::FilePathView;
+using ClangBackEnd::FileStatuses;
+using ClangBackEnd::ProcessorManager;
using ClangBackEnd::ProjectPartContainer;
using ClangBackEnd::ProjectPartContainers;
-using ClangBackEnd::V2::FileContainers;
+using ClangBackEnd::ProjectPartId;
+using ClangBackEnd::ProjectPartIds;
+using ClangBackEnd::SourceDependencies;
+using ClangBackEnd::SourceLocationEntries;
+using ClangBackEnd::SourceLocationEntry;
+using ClangBackEnd::SourceLocationKind;
using ClangBackEnd::SymbolEntries;
using ClangBackEnd::SymbolEntry;
using ClangBackEnd::SymbolIndexerTask;
using ClangBackEnd::SymbolIndexerTaskQueue;
-using ClangBackEnd::TaskScheduler;
-using ClangBackEnd::ProcessorManager;
-using ClangBackEnd::SourceDependencies;
-using ClangBackEnd::SourceLocationEntries;
-using ClangBackEnd::SourceLocationEntry;
using ClangBackEnd::SymbolKind;
-using ClangBackEnd::SourceLocationKind;
+using ClangBackEnd::TaskScheduler;
using ClangBackEnd::UsedMacros;
+using ClangBackEnd::V2::FileContainers;
+using Utils::PathString;
using OptionalProjectPartArtefact = Utils::optional<ClangBackEnd::ProjectPartArtefact>;
struct Data
@@ -106,7 +109,8 @@ protected:
ON_CALL(mockCollector, usedMacros()).WillByDefault(ReturnRef(usedMacros));
ON_CALL(mockCollector, fileStatuses()).WillByDefault(ReturnRef(fileStatus));
ON_CALL(mockCollector, sourceDependencies()).WillByDefault(ReturnRef(sourceDependencies));
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(A<FilePathId>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<FilePathId>()))
+ .WillByDefault(Return(artefact));
ON_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(A<FilePathId>())).WillByDefault(Return(-1));
ON_CALL(mockCollector, collectSymbols()).WillByDefault(Return(true));
@@ -167,7 +171,7 @@ protected:
ClangBackEnd::IncludeSearchPaths projectIncludeSearchPaths{
{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User},
{"/other/project/includes", 2, ClangBackEnd::IncludeSearchPathType::User}};
- ProjectPartContainer projectPart1{"project1",
+ ProjectPartContainer projectPart1{1,
{"-Wno-pragma-once-outside-header"},
{{"BAR", "1", 1}, {"FOO", "1", 2}},
Utils::clone(systemIncludeSearchPaths),
@@ -177,7 +181,7 @@ protected:
Utils::Language::Cxx,
Utils::LanguageVersion::CXX14,
Utils::LanguageExtension::None};
- ProjectPartContainer projectPart2{"project2",
+ ProjectPartContainer projectPart2{2,
{"-Wno-pragma-once-outside-header"},
{{"BAR", "1", 1}, {"FOO", "0", 2}},
Utils::clone(systemIncludeSearchPaths),
@@ -187,7 +191,7 @@ protected:
Utils::Language::Cxx,
Utils::LanguageVersion::CXX14,
Utils::LanguageExtension::None};
- ProjectPartContainer projectPart3{"project3",
+ ProjectPartContainer projectPart3{3,
{"-Wno-pragma-once-outside-header"},
{{"BAR", "1", 1}, {"FOO", "1", 2}},
Utils::clone(systemIncludeSearchPaths),
@@ -222,16 +226,17 @@ protected:
"",
"",
"",
- 74,
+ 1,
Utils::Language::Cxx,
Utils::LanguageVersion::CXX14,
Utils::LanguageExtension::None};
Utils::optional<ClangBackEnd::ProjectPartArtefact > nullArtefact;
- ClangBackEnd::ProjectPartPch projectPartPch{"/path/to/pch", 4};
+ ClangBackEnd::ProjectPartPch projectPartPch{74, "/path/to/pch", 4};
NiceMock<MockSqliteTransactionBackend> mockSqliteTransactionBackend;
NiceMock<MockSymbolStorage> mockSymbolStorage;
NiceMock<MockBuildDependenciesStorage> mockBuildDependenciesStorage;
NiceMock<MockPrecompiledHeaderStorage> mockPrecompiledHeaderStorage;
+ NiceMock<MockProjectPartsStorage> mockProjectPartsStorage;
NiceMock<MockClangPathWatcher> mockPathWatcher;
ClangBackEnd::FileStatusCache fileStatusCache{filePathCache};
ClangBackEnd::GeneratedFiles generatedFiles;
@@ -245,7 +250,8 @@ protected:
mockPathWatcher,
filePathCache,
fileStatusCache,
- mockSqliteTransactionBackend};
+ mockSqliteTransactionBackend,
+ mockProjectPartsStorage};
SymbolIndexerTaskQueue indexerQueue{indexerScheduler, progressCounter};
Scheduler indexerScheduler{collectorManger,
indexerQueue,
@@ -273,23 +279,22 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsAddFilesInCollector)
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path())));
+ toNativePath("/includes"))));
indexer.updateProjectParts({projectPart1});
}
TEST_F(SymbolIndexer, UpdateProjectPartsCallsAddFilesWithPrecompiledHeaderInCollector)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<Utils::SmallStringView>(projectPart1.projectPartId))).WillByDefault(Return(emptyArtefact));
- ON_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(artefact.projectPartId)))
+ ON_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(projectPart1.projectPartId)))
.WillByDefault(Return(projectPartPch));
EXPECT_CALL(mockCollector,
@@ -306,26 +311,27 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsAddFilesWithPrecompiledHeaderInColl
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path(),
+ toNativePath("/includes"),
"-Xclang",
"-include-pch",
"-Xclang",
- toNativePath("/path/to/pch").path())));
+ toNativePath("/path/to/pch"))));
indexer.updateProjectParts({projectPart1});
}
TEST_F(SymbolIndexer, UpdateProjectPartsCallsAddFilesWithoutPrecompiledHeaderInCollector)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<Utils::SmallStringView>(projectPart1.projectPartId))).WillByDefault(Return(emptyArtefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(TypedEq<ProjectPartId>(1)))
+ .WillByDefault(Return(emptyArtefact));
EXPECT_CALL(mockCollector,
setFile(main1PathId,
@@ -341,15 +347,15 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsAddFilesWithoutPrecompiledHeaderInC
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path())));
+ toNativePath("/includes"))));
indexer.updateProjectParts({projectPart1});
}
@@ -411,83 +417,12 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsAddSymbolsAndSourceLocationsInStora
indexer.updateProjectParts({projectPart1, projectPart2});
}
-TEST_F(SymbolIndexer, UpdateProjectPartsCallsUpdateProjectPartsInStorage)
-{
- EXPECT_CALL(mockSymbolStorage,
- insertOrUpdateProjectPart(
- Eq("project1"),
- ElementsAre("-Wno-pragma-once-outside-header"),
- ElementsAre(CompilerMacro{"BAR", "1", 1}, CompilerMacro{"FOO", "1", 2}),
- Eq(systemIncludeSearchPaths),
- Eq(projectIncludeSearchPaths),
- Eq(Utils::Language::Cxx),
- Eq(Utils::LanguageVersion::CXX14),
- Eq(Utils::LanguageExtension::None)));
- EXPECT_CALL(
- mockSymbolStorage,
- insertOrUpdateProjectPart(
- Eq("project2"),
- ElementsAre("-Wno-pragma-once-outside-header"),
- ElementsAre(CompilerMacro{"BAR", "1", 1}, CompilerMacro{"FOO", "0", 2}),
- Eq(systemIncludeSearchPaths),
- Eq(projectIncludeSearchPaths),
- Eq(Utils::Language::Cxx),
- Eq(Utils::LanguageVersion::CXX14),
- Eq(Utils::LanguageExtension::None)));
-
- indexer.updateProjectParts({projectPart1, projectPart2});
-}
-
-TEST_F(SymbolIndexer, UpdateProjectPartsCallsInsertOrUpdateUsedMacros)
-{
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(Eq(usedMacros)))
- .Times(2);
-
- indexer.updateProjectParts({projectPart1, projectPart2});
-}
-
-TEST_F(SymbolIndexer, UpdateProjectPartsCallsInsertFileStatuses)
-{
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(Eq(fileStatus)))
- .Times(2);
-
- indexer.updateProjectParts({projectPart1, projectPart2});
-}
-
-TEST_F(SymbolIndexer, UpdateProjectPartsCallsInsertOrUpdateSourceDependencies)
-{
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(Eq(sourceDependencies)))
- .Times(2);
-
- indexer.updateProjectParts({projectPart1, projectPart2});
-}
-
-TEST_F(SymbolIndexer, UpdateProjectPartsCallsFetchProjectPartArtefacts)
-{
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<Utils::SmallStringView>(projectPart1.projectPartId)));
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<Utils::SmallStringView>(projectPart2.projectPartId)));
-
- indexer.updateProjectParts({projectPart1, projectPart2});
-}
-
-TEST_F(SymbolIndexer, UpdateProjectPartsCallsInOrderWithoutProjectPartArtifact)
+TEST_F(SymbolIndexer, UpdateProjectPartsCallsInOrder)
{
InSequence s;
- EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin());
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<Utils::SmallStringView>(projectPart1.projectPartId))).WillOnce(Return(nullArtefact));
- EXPECT_CALL(mockSymbolStorage,
- insertOrUpdateProjectPart(Eq(projectPart1.projectPartId),
- Eq(projectPart1.toolChainArguments),
- Eq(projectPart1.compilerMacros),
- Eq(projectPart1.systemIncludeSearchPaths),
- Eq(projectPart1.projectIncludeSearchPaths),
- Eq(Utils::Language::Cxx),
- Eq(Utils::LanguageVersion::CXX14),
- Eq(Utils::LanguageExtension::None)))
- .WillOnce(Return(12));
- EXPECT_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(12)));
- EXPECT_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(Eq(main1PathId))).Times(0);
+ EXPECT_CALL(mockSqliteTransactionBackend, deferredBegin());
+ EXPECT_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(projectPart1.projectPartId)));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
EXPECT_CALL(mockCollector,
setFile(main1PathId,
@@ -503,74 +438,18 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsInOrderWithoutProjectPartArtifact)
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path())));
+ toNativePath("/includes"))));
EXPECT_CALL(mockCollector, collectSymbols());
EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin());
EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(symbolEntries, sourceLocations));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(Eq(usedMacros)));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(Eq(fileStatus)));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(Eq(sourceDependencies)));
- EXPECT_CALL(mockSqliteTransactionBackend, commit());
-
- indexer.updateProjectParts({projectPart1});
-}
-
-TEST_F(SymbolIndexer, UpdateProjectPartsCallsInOrderWithProjectPartArtifact)
-{
- InSequence s;
-
- EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin());
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<Utils::SmallStringView>(projectPart1.projectPartId))).WillRepeatedly(Return(artefact));
- EXPECT_CALL(mockSymbolStorage,
- insertOrUpdateProjectPart(Eq(projectPart1.projectPartId),
- Eq(projectPart1.toolChainArguments),
- Eq(projectPart1.compilerMacros),
- Eq(projectPart1.systemIncludeSearchPaths),
- Eq(projectPart1.projectIncludeSearchPaths),
- Eq(Utils::Language::Cxx),
- Eq(Utils::LanguageVersion::CXX14),
- Eq(Utils::LanguageExtension::None)))
- .WillOnce(Return(-1));
- EXPECT_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(artefact.projectPartId)));
- EXPECT_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(Eq(main1PathId))).WillOnce(Return(-1));
- EXPECT_CALL(mockSqliteTransactionBackend, commit());
- EXPECT_CALL(mockCollector,
- setFile(Eq(main1PathId),
- ElementsAre("clang++",
- "-w",
- "-Wno-pragma-once-outside-header",
- "-DNOMINMAX",
- "-x",
- "c++",
- "-std=c++14",
- "-nostdinc",
- "-nostdinc++",
- "-DBAR=1",
- "-DFOO=1",
- "-I",
- toNativePath("/project/includes").path(),
- "-I",
- toNativePath("/other/project/includes").path(),
- "-isystem",
- toNativePath(TESTDATA_DIR).path(),
- "-isystem",
- toNativePath("/other/includes").path(),
- "-isystem",
- toNativePath("/includes").path())));
- EXPECT_CALL(mockCollector, collectSymbols());
- EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin());
- EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(symbolEntries, sourceLocations));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(Eq(usedMacros)));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(Eq(fileStatus)));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(Eq(sourceDependencies)));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
indexer.updateProjectParts({projectPart1});
@@ -580,22 +459,8 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsInOrderButGetsAnErrorForCollectingS
{
InSequence s;
- EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin());
- EXPECT_CALL(mockSymbolStorage,
- fetchProjectPartArtefact(TypedEq<Utils::SmallStringView>(projectPart1.projectPartId)))
- .WillOnce(Return(nullArtefact));
- EXPECT_CALL(mockSymbolStorage,
- insertOrUpdateProjectPart(Eq(projectPart1.projectPartId),
- Eq(projectPart1.toolChainArguments),
- Eq(projectPart1.compilerMacros),
- Eq(projectPart1.systemIncludeSearchPaths),
- Eq(projectPart1.projectIncludeSearchPaths),
- Eq(Utils::Language::Cxx),
- Eq(Utils::LanguageVersion::CXX14),
- Eq(Utils::LanguageExtension::None)))
- .WillOnce(Return(12));
- EXPECT_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(12)));
- EXPECT_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(Eq(main1PathId))).Times(0);
+ EXPECT_CALL(mockSqliteTransactionBackend, deferredBegin());
+ EXPECT_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(projectPart1.projectPartId)));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
EXPECT_CALL(mockCollector,
setFile(main1PathId,
@@ -611,22 +476,18 @@ TEST_F(SymbolIndexer, UpdateProjectPartsCallsInOrderButGetsAnErrorForCollectingS
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path())));
+ toNativePath("/includes"))));
EXPECT_CALL(mockCollector, collectSymbols()).WillOnce(Return(false));
EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin()).Times(0);
EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(symbolEntries, sourceLocations)).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(Eq(usedMacros))).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(Eq(fileStatus))).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(Eq(sourceDependencies)))
- .Times(0);
EXPECT_CALL(mockSqliteTransactionBackend, commit()).Times(0);
indexer.updateProjectParts({projectPart1});
@@ -643,13 +504,14 @@ TEST_F(SymbolIndexer, CallSetNotifier)
mockPathWatcher,
filePathCache,
fileStatusCache,
- mockSqliteTransactionBackend};
+ mockSqliteTransactionBackend,
+ mockProjectPartsStorage};
}
TEST_F(SymbolIndexer, PathChangedCallsFetchProjectPartArtefactInStorage)
{
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(sourceFileIds[0]));
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(sourceFileIds[1]));
+ EXPECT_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(sourceFileIds[0]));
+ EXPECT_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(sourceFileIds[1]));
indexer.pathsChanged(sourceFileIds);
}
@@ -659,7 +521,9 @@ TEST_F(SymbolIndexer, UpdateChangedPathCallsInOrder)
InSequence s;
EXPECT_CALL(mockSqliteTransactionBackend, deferredBegin());
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<FilePathId>(sourceFileIds[0]))).WillOnce(Return(artefact));
+ EXPECT_CALL(mockProjectPartsStorage,
+ fetchProjectPartArtefact(TypedEq<FilePathId>(sourceFileIds[0])))
+ .WillOnce(Return(artefact));
EXPECT_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(artefact.projectPartId)));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
EXPECT_CALL(mockCollector,
@@ -676,21 +540,18 @@ TEST_F(SymbolIndexer, UpdateChangedPathCallsInOrder)
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path())));
+ toNativePath("/includes"))));
EXPECT_CALL(mockCollector, collectSymbols());
EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin());
EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(symbolEntries, sourceLocations));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(Eq(usedMacros)));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(Eq(fileStatus)));
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(Eq(sourceDependencies)));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
indexer.pathsChanged({sourceFileIds[0]});
@@ -701,16 +562,14 @@ TEST_F(SymbolIndexer, HandleEmptyOptionalArtifactInUpdateChangedPath)
InSequence s;
EXPECT_CALL(mockSqliteTransactionBackend, deferredBegin());
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(sourceFileIds[0])).WillOnce(Return(nullArtefact));
+ EXPECT_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(sourceFileIds[0]))
+ .WillOnce(Return(nullArtefact));
EXPECT_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(_)).Times(0);
EXPECT_CALL(mockSqliteTransactionBackend, commit()).Times(0);
EXPECT_CALL(mockCollector, setFile(_, _)).Times(0);
EXPECT_CALL(mockCollector, collectSymbols()).Times(0);
EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin()).Times(0);
EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(_, _)).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(_)).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(_)).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(_)).Times(0);
EXPECT_CALL(mockSqliteTransactionBackend, commit()).Times(0);
indexer.pathsChanged({sourceFileIds[0]});
@@ -721,7 +580,8 @@ TEST_F(SymbolIndexer, UpdateChangedPathCallsInOrderButGetsAnErrorForCollectingSy
InSequence s;
EXPECT_CALL(mockSqliteTransactionBackend, deferredBegin());
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<FilePathId>(sourceFileIds[0])))
+ EXPECT_CALL(mockProjectPartsStorage,
+ fetchProjectPartArtefact(TypedEq<FilePathId>(sourceFileIds[0])))
.WillOnce(Return(artefact));
EXPECT_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(artefact.projectPartId)));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
@@ -739,22 +599,18 @@ TEST_F(SymbolIndexer, UpdateChangedPathCallsInOrderButGetsAnErrorForCollectingSy
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path())));
+ toNativePath("/includes"))));
EXPECT_CALL(mockCollector, collectSymbols()).WillOnce(Return(false));
EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin()).Times(0);
EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(symbolEntries, sourceLocations)).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(Eq(usedMacros))).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(Eq(fileStatus))).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(Eq(sourceDependencies)))
- .Times(0);
EXPECT_CALL(mockSqliteTransactionBackend, commit()).Times(0);
indexer.pathsChanged({sourceFileIds[0]});
@@ -762,8 +618,8 @@ TEST_F(SymbolIndexer, UpdateChangedPathCallsInOrderButGetsAnErrorForCollectingSy
TEST_F(SymbolIndexer, UpdateChangedPathIsUsingPrecompiledHeader)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<FilePathId>(sourceFileIds[0])))
- .WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(TypedEq<FilePathId>(sourceFileIds[0])))
+ .WillByDefault(Return(artefact));
ON_CALL(mockPrecompiledHeaderStorage, fetchPrecompiledHeader(Eq(artefact.projectPartId)))
.WillByDefault(Return(projectPartPch));
std::vector<SymbolIndexerTask> symbolIndexerTask;
@@ -782,27 +638,27 @@ TEST_F(SymbolIndexer, UpdateChangedPathIsUsingPrecompiledHeader)
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path(),
+ toNativePath("/includes"),
"-Xclang",
"-include-pch",
"-Xclang",
- toNativePath("/path/to/pch").path())));
+ toNativePath("/path/to/pch"))));
indexer.pathsChanged({sourceFileIds[0]});
}
TEST_F(SymbolIndexer, UpdateChangedPathIsNotUsingPrecompiledHeaderIfItNotExists)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<FilePathId>(sourceFileIds[0])))
- .WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(TypedEq<FilePathId>(sourceFileIds[0])))
+ .WillByDefault(Return(artefact));
std::vector<SymbolIndexerTask> symbolIndexerTask;
EXPECT_CALL(mockCollector,
@@ -819,15 +675,15 @@ TEST_F(SymbolIndexer, UpdateChangedPathIsNotUsingPrecompiledHeaderIfItNotExists)
"-DBAR=1",
"-DFOO=1",
"-I",
- toNativePath("/project/includes").path(),
+ toNativePath("/project/includes"),
"-I",
- toNativePath("/other/project/includes").path(),
+ toNativePath("/other/project/includes"),
"-isystem",
- toNativePath(TESTDATA_DIR).path(),
+ toNativePath(TESTDATA_DIR),
"-isystem",
- toNativePath("/other/includes").path(),
+ toNativePath("/other/includes"),
"-isystem",
- toNativePath("/includes").path())));
+ toNativePath("/includes"))));
indexer.pathsChanged({sourceFileIds[0]});
}
@@ -835,7 +691,8 @@ TEST_F(SymbolIndexer, UpdateChangedPathIsNotUsingPrecompiledHeaderIfItNotExists)
TEST_F(SymbolIndexer, CompilerMacrosAndIncludeSearchPathsAreNotDifferent)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
auto areDifferent = indexer.compilerMacrosOrIncludeSearchPathsAreDifferent(projectPart1,
artefact);
@@ -845,7 +702,8 @@ TEST_F(SymbolIndexer, CompilerMacrosAndIncludeSearchPathsAreNotDifferent)
TEST_F(SymbolIndexer, CompilerMacrosAreDifferent)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
auto areDifferent = indexer.compilerMacrosOrIncludeSearchPathsAreDifferent(projectPart2,
artefact);
@@ -861,19 +719,20 @@ TEST_F(SymbolIndexer, SystemIncludeSearchPathsAreDifferent)
ClangBackEnd::IncludeSearchPaths newProjectIncludeSearchPaths{
{"/project/includes", 1, ClangBackEnd::IncludeSearchPathType::User},
{"/other/project/includes2", 2, ClangBackEnd::IncludeSearchPathType::User}};
- ProjectPartContainer projectPart3{
- "project3",
- {"-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"},
- {{"BAR", "1", 1}, {"FOO", "1", 2}},
- {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn},
- {"/other/includes2", 2, ClangBackEnd::IncludeSearchPathType::System}},
- Utils::clone(projectIncludeSearchPaths),
- {header1PathId},
- {main1PathId},
- Utils::Language::C,
- Utils::LanguageVersion::C11,
- Utils::LanguageExtension::All};
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>()))
+ ProjectPartContainer projectPart3{3,
+ {"-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"},
+ {{"BAR", "1", 1}, {"FOO", "1", 2}},
+ {{"/includes", 1, ClangBackEnd::IncludeSearchPathType::BuiltIn},
+ {"/other/includes2",
+ 2,
+ ClangBackEnd::IncludeSearchPathType::System}},
+ Utils::clone(projectIncludeSearchPaths),
+ {header1PathId},
+ {main1PathId},
+ Utils::Language::C,
+ Utils::LanguageVersion::C11,
+ Utils::LanguageExtension::All};
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
.WillByDefault(Return(artefact));
auto areDifferent = indexer.compilerMacrosOrIncludeSearchPathsAreDifferent(
@@ -885,7 +744,7 @@ TEST_F(SymbolIndexer, SystemIncludeSearchPathsAreDifferent)
TEST_F(SymbolIndexer, ProjectIncludeSearchPathsAreDifferent)
{
ProjectPartContainer projectPart3{
- "project3",
+ 3,
{"-I", TESTDATA_DIR, "-Wno-pragma-once-outside-header"},
{{"BAR", "1", 1}, {"FOO", "1", 2}},
Utils::clone(systemIncludeSearchPaths),
@@ -896,7 +755,7 @@ TEST_F(SymbolIndexer, ProjectIncludeSearchPathsAreDifferent)
Utils::Language::C,
Utils::LanguageVersion::C11,
Utils::LanguageExtension::All};
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>()))
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
.WillByDefault(Return(artefact));
auto areDifferent = indexer.compilerMacrosOrIncludeSearchPathsAreDifferent(
@@ -904,31 +763,30 @@ TEST_F(SymbolIndexer, ProjectIncludeSearchPathsAreDifferent)
ASSERT_TRUE(areDifferent);
}
-TEST_F(SymbolIndexer, DontReparseInUpdateProjectPartsIfDefinesAreTheSame)
+
+TEST_F(SymbolIndexer, DISABLED_DontReparseInUpdateProjectPartsIfDefinesAreTheSame)
{
InSequence s;
ON_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(A<FilePathId>())).WillByDefault(Return(QDateTime::currentSecsSinceEpoch()));
EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin());
- EXPECT_CALL(mockSymbolStorage, fetchProjectPartArtefact(TypedEq<Utils::SmallStringView>(projectPart1.projectPartId))).WillRepeatedly(Return(artefact));
- EXPECT_CALL(mockSymbolStorage,
- insertOrUpdateProjectPart(Eq(projectPart1.projectPartId),
- Eq(projectPart1.toolChainArguments),
- Eq(projectPart1.compilerMacros),
- Eq(projectPart1.systemIncludeSearchPaths),
- Eq(projectPart1.projectIncludeSearchPaths),
- Eq(Utils::Language::Cxx),
- Eq(Utils::LanguageVersion::CXX14),
- Eq(Utils::LanguageExtension::None)));
+ EXPECT_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(TypedEq<ProjectPartId>(1)))
+ .WillRepeatedly(Return(artefact));
+ EXPECT_CALL(mockProjectPartsStorage,
+ updateProjectPart(Eq(projectPart1.projectPartId),
+ Eq(projectPart1.toolChainArguments),
+ Eq(projectPart1.compilerMacros),
+ Eq(projectPart1.systemIncludeSearchPaths),
+ Eq(projectPart1.projectIncludeSearchPaths),
+ Eq(Utils::Language::Cxx),
+ Eq(Utils::LanguageVersion::CXX14),
+ Eq(Utils::LanguageExtension::None)));
EXPECT_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(A<FilePathId>())).WillRepeatedly(Return(QDateTime::currentSecsSinceEpoch()));
EXPECT_CALL(mockSqliteTransactionBackend, commit());
EXPECT_CALL(mockCollector, setFile(_, _)).Times(0);
EXPECT_CALL(mockCollector, collectSymbols()).Times(0);
EXPECT_CALL(mockSqliteTransactionBackend, immediateBegin()).Times(0);
EXPECT_CALL(mockSymbolStorage, addSymbolsAndSourceLocations(_, _)).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateUsedMacros(_)).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateFileStatuses(_)).Times(0);
- EXPECT_CALL(mockBuildDependenciesStorage, insertOrUpdateSourceDependencies(_)).Times(0);
EXPECT_CALL(mockSqliteTransactionBackend, commit()).Times(0);
indexer.updateProjectPart(std::move(projectPart1));
@@ -947,7 +805,8 @@ TEST_F(SymbolIndexer, PathsChangedUpdatesFileStatusCache)
TEST_F(SymbolIndexer, GetUpdatableFilePathIdsIfCompilerMacrosAreDifferent)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
auto filePathIds = indexer.updatableFilePathIds(projectPart2, artefact);
@@ -956,7 +815,8 @@ TEST_F(SymbolIndexer, GetUpdatableFilePathIdsIfCompilerMacrosAreDifferent)
TEST_F(SymbolIndexer, GetUpdatableFilePathIdsIfIncludeSearchPathsAreDifferent)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
auto filePathIds = indexer.updatableFilePathIds(projectPart3, artefact);
@@ -965,7 +825,8 @@ TEST_F(SymbolIndexer, GetUpdatableFilePathIdsIfIncludeSearchPathsAreDifferent)
TEST_F(SymbolIndexer, GetNoUpdatableFilePathIdsIfArtefactsAreTheSame)
{
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
ON_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(A<FilePathId>())).WillByDefault(Return(QDateTime::currentSecsSinceEpoch()));
auto filePathIds = indexer.updatableFilePathIds(projectPart1, artefact);
@@ -976,7 +837,8 @@ TEST_F(SymbolIndexer, GetNoUpdatableFilePathIdsIfArtefactsAreTheSame)
TEST_F(SymbolIndexer, OutdatedFilesPassUpdatableFilePathIds)
{
indexer.pathsChanged({main1PathId});
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
ON_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(A<FilePathId>()))
.WillByDefault(Return(0));
@@ -988,7 +850,8 @@ TEST_F(SymbolIndexer, OutdatedFilesPassUpdatableFilePathIds)
TEST_F(SymbolIndexer, UpToDateFilesDontPassFilteredUpdatableFilePathIds)
{
indexer.pathsChanged({main1PathId});
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
ON_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(A<FilePathId>()))
.WillByDefault(Return(QDateTime::currentSecsSinceEpoch()));
@@ -1001,7 +864,8 @@ TEST_F(SymbolIndexer, OutdatedFilesAreParsedInUpdateProjectParts)
{
indexer.pathsChanged({main1PathId});
indexerScheduler.syncTasks();
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
ON_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(A<FilePathId>()))
.WillByDefault(Return(0));
@@ -1010,12 +874,13 @@ TEST_F(SymbolIndexer, OutdatedFilesAreParsedInUpdateProjectParts)
indexer.updateProjectParts({projectPart1});
}
-TEST_F(SymbolIndexer, UpToDateFilesAreNotParsedInUpdateProjectParts)
+TEST_F(SymbolIndexer, DISABLED_UpToDateFilesAreNotParsedInUpdateProjectParts)
{
indexer.pathsChanged({main1PathId});
indexerScheduler.syncTasks();
- ON_CALL(mockSymbolStorage, fetchProjectPartArtefact(An<Utils::SmallStringView>())).WillByDefault(Return(artefact));
+ ON_CALL(mockProjectPartsStorage, fetchProjectPartArtefact(A<ProjectPartId>()))
+ .WillByDefault(Return(artefact));
ON_CALL(mockBuildDependenciesStorage, fetchLowestLastModifiedTime(A<FilePathId>()))
.WillByDefault(Return(QDateTime::currentSecsSinceEpoch()));
diff --git a/tests/unit/unittest/symbolindexing-test.cpp b/tests/unit/unittest/symbolindexing-test.cpp
index 41bf3a5c3b..6e094951f3 100644
--- a/tests/unit/unittest/symbolindexing-test.cpp
+++ b/tests/unit/unittest/symbolindexing-test.cpp
@@ -31,6 +31,7 @@
#include <filepathcaching.h>
#include <projectpartcontainer.h>
+#include <projectpartsstorage.h>
#include <refactoringdatabaseinitializer.h>
#include <QDir>
@@ -83,11 +84,12 @@ protected:
FilePathCaching filePathCache{database};
ClangBackEnd::GeneratedFiles generatedFiles;
NiceMock<MockFunction<void(int, int)>> mockSetProgressCallback;
+ ClangBackEnd::ProjectPartsStorage<Sqlite::Database> projectPartStorage{database};
ClangBackEnd::SymbolIndexing indexing{database, filePathCache, generatedFiles, mockSetProgressCallback.AsStdFunction()};
StatementFactory queryFactory{database};
Query query{queryFactory};
PathString main1Path = TESTDATA_DIR "/symbolindexing_main1.cpp";
- ProjectPartContainer projectPart1{"project1",
+ ProjectPartContainer projectPart1{projectPartStorage.fetchProjectPartId("project1"),
{},
{{"DEFINE", "1", 1}},
{{TESTDATA_DIR, 1, ClangBackEnd::IncludeSearchPathType::System}},
diff --git a/tests/unit/unittest/symbolstorage-test.cpp b/tests/unit/unittest/symbolstorage-test.cpp
index ddd7136252..059b1a3c0f 100644
--- a/tests/unit/unittest/symbolstorage-test.cpp
+++ b/tests/unit/unittest/symbolstorage-test.cpp
@@ -36,10 +36,6 @@
namespace {
using ClangBackEnd::FilePathCachingInterface;
-using ClangBackEnd::FilePathId;
-using ClangBackEnd::IncludeSearchPath;
-using ClangBackEnd::IncludeSearchPaths;
-using ClangBackEnd::IncludeSearchPathType;
using ClangBackEnd::SourceLocationEntries;
using ClangBackEnd::SourceLocationEntry;
using ClangBackEnd::SourceLocationKind;
@@ -58,43 +54,20 @@ class SymbolStorage : public testing::Test
protected:
NiceMock<MockSqliteDatabase> mockDatabase;
Storage storage{mockDatabase};
- MockSqliteWriteStatement &insertSymbolsToNewSymbolsStatement = storage.m_insertSymbolsToNewSymbolsStatement;
- MockSqliteWriteStatement &insertLocationsToNewLocationsStatement = storage.m_insertLocationsToNewLocationsStatement;
- MockSqliteReadStatement &selectNewSourceIdsStatement = storage.m_selectNewSourceIdsStatement;
- MockSqliteWriteStatement &addNewSymbolsToSymbolsStatement = storage.m_addNewSymbolsToSymbolsStatement;
- MockSqliteWriteStatement &syncNewSymbolsFromSymbolsStatement = storage.m_syncNewSymbolsFromSymbolsStatement;
- MockSqliteWriteStatement &syncSymbolsIntoNewLocationsStatement = storage.m_syncSymbolsIntoNewLocationsStatement;
- MockSqliteWriteStatement &deleteAllLocationsFromUpdatedFilesStatement = storage.m_deleteAllLocationsFromUpdatedFilesStatement;
- MockSqliteWriteStatement &insertNewLocationsInLocationsStatement = storage.m_insertNewLocationsInLocationsStatement;
- MockSqliteWriteStatement &deleteNewSymbolsTableStatement = storage.m_deleteNewSymbolsTableStatement;
- MockSqliteWriteStatement &deleteNewLocationsTableStatement = storage.m_deleteNewLocationsTableStatement;
- MockSqliteWriteStatement &insertOrUpdateProjectPartStatement = storage.m_insertOrUpdateProjectPartStatement;
- MockSqliteReadStatement &getProjectPartIdStatement = storage.m_getProjectPartIdStatement;
- MockSqliteReadStatement &getProjectPartArtefactsBySourceId = storage.m_getProjectPartArtefactsBySourceId;
- MockSqliteReadStatement &getProjectPartArtefactsByProjectPartName = storage.m_getProjectPartArtefactsByProjectPartName;
-
+ MockSqliteWriteStatement &insertSymbolsToNewSymbolsStatement = storage.insertSymbolsToNewSymbolsStatement;
+ MockSqliteWriteStatement &insertLocationsToNewLocationsStatement = storage.insertLocationsToNewLocationsStatement;
+ MockSqliteReadStatement &selectNewSourceIdsStatement = storage.selectNewSourceIdsStatement;
+ MockSqliteWriteStatement &addNewSymbolsToSymbolsStatement = storage.addNewSymbolsToSymbolsStatement;
+ MockSqliteWriteStatement &syncNewSymbolsFromSymbolsStatement = storage.syncNewSymbolsFromSymbolsStatement;
+ MockSqliteWriteStatement &syncSymbolsIntoNewLocationsStatement = storage.syncSymbolsIntoNewLocationsStatement;
+ MockSqliteWriteStatement &deleteAllLocationsFromUpdatedFilesStatement = storage.deleteAllLocationsFromUpdatedFilesStatement;
+ MockSqliteWriteStatement &insertNewLocationsInLocationsStatement = storage.insertNewLocationsInLocationsStatement;
+ MockSqliteWriteStatement &deleteNewSymbolsTableStatement = storage.deleteNewSymbolsTableStatement;
+ MockSqliteWriteStatement &deleteNewLocationsTableStatement = storage.deleteNewLocationsTableStatement;
SymbolEntries symbolEntries{{1, {"functionUSR", "function", SymbolKind::Function}},
{2, {"function2USR", "function2", SymbolKind::Function}}};
SourceLocationEntries sourceLocations{{1, 3, {42, 23}, SourceLocationKind::Declaration},
{2, 4, {7, 11}, SourceLocationKind::Definition}};
- IncludeSearchPaths systemIncludeSearchPaths{
- {"/includes", 1, IncludeSearchPathType::BuiltIn},
- {"/other/includes", 2, IncludeSearchPathType::System}};
- IncludeSearchPaths projectIncludeSearchPaths{
- {"/project/includes", 1, IncludeSearchPathType::User},
- {"/other/project/includes", 2, IncludeSearchPathType::User}};
- Utils::SmallString systemIncludeSearchPathsText{
- R"([["/includes",1,2],["/other/includes",2,3]])"};
- Utils::SmallString projectIncludeSearchPathsText{
- R"([["/project/includes",1,1],["/other/project/includes",2,1]])"};
- ClangBackEnd::ProjectPartArtefact artefact{R"(["-DFOO"])",
- R"([["FOO","1",1]])",
- systemIncludeSearchPathsText,
- projectIncludeSearchPathsText,
- 74,
- Utils::Language::Cxx,
- Utils::LanguageVersion::CXX11,
- Utils::LanguageExtension::None};
};
TEST_F(SymbolStorage, CreateAndFillTemporaryLocationsTable)
@@ -174,78 +147,6 @@ TEST_F(SymbolStorage, AddSymbolsAndSourceLocationsCallsWrite)
storage.addSymbolsAndSourceLocations(symbolEntries, sourceLocations);
}
-TEST_F(SymbolStorage, ConvertStringsToJson)
-{
- Utils::SmallStringVector strings{"foo", "bar", "foo"};
-
- auto jsonText = storage.toJson(strings);
-
- ASSERT_THAT(jsonText, Eq("[\"foo\",\"bar\",\"foo\"]"));
-}
-
-TEST_F(SymbolStorage, InsertOrUpdateProjectPart)
-{
- InSequence sequence;
-
- EXPECT_CALL(insertOrUpdateProjectPartStatement,
- write(TypedEq<Utils::SmallStringView>("project"),
- TypedEq<Utils::SmallStringView>(R"(["foo"])"),
- TypedEq<Utils::SmallStringView>(R"([["FOO","1",1]])"),
- TypedEq<Utils::SmallStringView>(systemIncludeSearchPathsText),
- TypedEq<Utils::SmallStringView>(projectIncludeSearchPathsText),
- 1,
- 34,
- 0));
- EXPECT_CALL(
- getProjectPartIdStatement, valueReturnInt32(TypedEq<Utils::SmallStringView>("project")))
- .WillOnce(Return(74));
-
- storage.insertOrUpdateProjectPart("project",
- {"foo"},
- {{"FOO", "1", 1}},
- systemIncludeSearchPaths,
- projectIncludeSearchPaths,
- Utils::Language::Cxx,
- Utils::LanguageVersion::CXX11,
- Utils::LanguageExtension::None);
-}
-
-TEST_F(SymbolStorage, FetchProjectPartArtefactBySourceIdCallsValueInStatement)
-{
- EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
- .WillRepeatedly(Return(artefact));
-
- storage.fetchProjectPartArtefact(1);
-}
-
-TEST_F(SymbolStorage, FetchProjectPartArtefactBySourceIdReturnArtefact)
-{
- EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
- .WillRepeatedly(Return(artefact));
-
- auto result = storage.fetchProjectPartArtefact(1);
-
- ASSERT_THAT(result, Eq(artefact));
-}
-
-TEST_F(SymbolStorage, FetchProjectPartArtefactByProjectNameCallsValueInStatement)
-{
- EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
- .WillRepeatedly(Return(artefact));
-
- storage.fetchProjectPartArtefact(1);
-}
-
-TEST_F(SymbolStorage, FetchProjectPartArtefactByProjectNameReturnArtefact)
-{
- EXPECT_CALL(getProjectPartArtefactsBySourceId, valueReturnProjectPartArtefact(1))
- .WillRepeatedly(Return(artefact));
-
- auto result = storage.fetchProjectPartArtefact(1);
-
- ASSERT_THAT(result, Eq(artefact));
-}
-
TEST_F(SymbolStorage, AddNewSymbolsTable)
{
InSequence s;
diff --git a/tests/unit/unittest/toolchainargumentscache-test.cpp b/tests/unit/unittest/toolchainargumentscache-test.cpp
index 8f032fa43d..de088f6537 100644
--- a/tests/unit/unittest/toolchainargumentscache-test.cpp
+++ b/tests/unit/unittest/toolchainargumentscache-test.cpp
@@ -30,12 +30,13 @@
namespace {
using ClangBackEnd::ProjectPartContainer;
+using ClangBackEnd::ProjectPartIds;
MATCHER_P2(IsEntry,
projectPartIds,
arguments,
std::string(negation ? "isn't " : "is ")
- + PrintToString(ClangBackEnd::ArgumentsEntry(projectPartIds.clone(), arguments)))
+ + PrintToString(ClangBackEnd::ArgumentsEntry(Utils::clone(projectPartIds), arguments)))
{
const ClangBackEnd::ArgumentsEntry &entry= arg;
@@ -46,10 +47,10 @@ class ToolChainArgumentsCache : public testing::Test
{
public:
ClangBackEnd::ToolChainsArgumentsCache cache;
- ProjectPartContainer projectPart1{"project1", {}, {}, {}, {}, {}, {}, {}, {}, {}};
- ProjectPartContainer projectPart2{"project2", {}, {}, {}, {}, {}, {}, {}, {}, {}};
- ProjectPartContainer projectPart3{"project3", {}, {}, {}, {}, {}, {}, {}, {}, {}};
- ProjectPartContainer projectPart4{"project4", {}, {}, {}, {}, {}, {}, {}, {}, {}};
+ ProjectPartContainer projectPart1{1, {}, {}, {}, {}, {}, {}, {}, {}, {}};
+ ProjectPartContainer projectPart2{2, {}, {}, {}, {}, {}, {}, {}, {}, {}};
+ ProjectPartContainer projectPart3{3, {}, {}, {}, {}, {}, {}, {}, {}, {}};
+ ProjectPartContainer projectPart4{4, {}, {}, {}, {}, {}, {}, {}, {}, {}};
Utils::SmallStringVector arguments1{"yi", "er"};
Utils::SmallStringVector arguments2{"san", "se"};
};
@@ -67,9 +68,8 @@ TEST_F(ToolChainArgumentsCache, AddNewArguments)
cache.update({projectPart1, projectPart3}, arguments1);
- ASSERT_THAT(
- cache.arguments({projectPart1.projectPartId}),
- ElementsAre(IsEntry(Utils::SmallStringVector{projectPart1.projectPartId}, arguments1)));
+ ASSERT_THAT(cache.arguments({projectPart1.projectPartId}),
+ ElementsAre(IsEntry(ProjectPartIds{projectPart1.projectPartId}, arguments1)));
}
TEST_F(ToolChainArgumentsCache, AddDifferentProjectParts)
@@ -78,9 +78,8 @@ TEST_F(ToolChainArgumentsCache, AddDifferentProjectParts)
cache.update({projectPart2, projectPart4}, arguments1);
- ASSERT_THAT(
- cache.arguments(Utils::SmallStringVector{projectPart2.projectPartId}),
- ElementsAre(IsEntry(Utils::SmallStringVector{projectPart2.projectPartId}, arguments1)));
+ ASSERT_THAT(cache.arguments(ProjectPartIds{projectPart2.projectPartId}),
+ ElementsAre(IsEntry(ProjectPartIds{projectPart2.projectPartId}, arguments1)));
}
TEST_F(ToolChainArgumentsCache, AddDifferentProjectPartsReverseOrder)
@@ -89,9 +88,8 @@ TEST_F(ToolChainArgumentsCache, AddDifferentProjectPartsReverseOrder)
cache.update({projectPart1, projectPart4}, arguments1);
- ASSERT_THAT(
- cache.arguments(Utils::SmallStringVector{projectPart2.projectPartId}),
- ElementsAre(IsEntry(Utils::SmallStringVector{projectPart2.projectPartId}, arguments1)));
+ ASSERT_THAT(cache.arguments(ProjectPartIds{projectPart2.projectPartId}),
+ ElementsAre(IsEntry(ProjectPartIds{projectPart2.projectPartId}, arguments1)));
}
TEST_F(ToolChainArgumentsCache, AddDifferentProjectPartsDoesNotRemoveOldEntry)
@@ -100,9 +98,8 @@ TEST_F(ToolChainArgumentsCache, AddDifferentProjectPartsDoesNotRemoveOldEntry)
cache.update({projectPart2, projectPart4}, arguments1);
- ASSERT_THAT(
- cache.arguments(Utils::SmallStringVector{projectPart1.projectPartId}),
- ElementsAre(IsEntry(Utils::SmallStringVector{projectPart1.projectPartId}, arguments1)));
+ ASSERT_THAT(cache.arguments(ProjectPartIds{projectPart1.projectPartId}),
+ ElementsAre(IsEntry(ProjectPartIds{projectPart1.projectPartId}, arguments1)));
}
TEST_F(ToolChainArgumentsCache, AddSameArgumentsDoesNotIncreseEntryCount)
@@ -130,9 +127,8 @@ TEST_F(ToolChainArgumentsCache, RemoveIdsFromOtherEntries)
cache.update({projectPart2, projectPart4}, arguments2);
- ASSERT_THAT(
- cache.arguments(Utils::SmallStringVector{projectPart2.projectPartId}),
- ElementsAre(IsEntry(Utils::SmallStringVector{projectPart2.projectPartId}, arguments2)));
+ ASSERT_THAT(cache.arguments(ProjectPartIds{projectPart2.projectPartId}),
+ ElementsAre(IsEntry(ProjectPartIds{projectPart2.projectPartId}, arguments2)));
}
TEST_F(ToolChainArgumentsCache, RemoveIdsFromOtherEntriesWithArgumentsAlreadyExists)
@@ -142,9 +138,8 @@ TEST_F(ToolChainArgumentsCache, RemoveIdsFromOtherEntriesWithArgumentsAlreadyExi
cache.update({projectPart2, projectPart4}, arguments2);
- ASSERT_THAT(
- cache.arguments({projectPart2.projectPartId}),
- ElementsAre(IsEntry(Utils::SmallStringVector{projectPart2.projectPartId}, arguments2)));
+ ASSERT_THAT(cache.arguments({projectPart2.projectPartId}),
+ ElementsAre(IsEntry(ProjectPartIds{projectPart2.projectPartId}, arguments2)));
}
TEST_F(ToolChainArgumentsCache, RemoveEntryIfEmpty)
@@ -165,12 +160,11 @@ TEST_F(ToolChainArgumentsCache, GetMutipleEntries)
auto arguments = cache.arguments(
{projectPart1.projectPartId, projectPart2.projectPartId, projectPart3.projectPartId});
- ASSERT_THAT(
- arguments,
- ElementsAre(IsEntry(Utils::SmallStringVector{projectPart2.projectPartId}, arguments1),
- IsEntry(Utils::SmallStringVector{projectPart1.projectPartId,
- projectPart3.projectPartId},
- arguments2)));
+ ASSERT_THAT(arguments,
+ ElementsAre(IsEntry(ProjectPartIds{projectPart2.projectPartId}, arguments1),
+ IsEntry(ProjectPartIds{projectPart1.projectPartId,
+ projectPart3.projectPartId},
+ arguments2)));
}
TEST_F(ToolChainArgumentsCache, RemoveMutipleIds)
@@ -180,10 +174,10 @@ TEST_F(ToolChainArgumentsCache, RemoveMutipleIds)
cache.remove({projectPart1.projectPartId, projectPart2.projectPartId});
- ASSERT_THAT(
- cache.arguments(
- {projectPart1.projectPartId, projectPart2.projectPartId, projectPart3.projectPartId}),
- ElementsAre(IsEntry(Utils::SmallStringVector{projectPart3.projectPartId}, arguments2)));
+ ASSERT_THAT(cache.arguments({projectPart1.projectPartId,
+ projectPart2.projectPartId,
+ projectPart3.projectPartId}),
+ ElementsAre(IsEntry(ProjectPartIds{projectPart3.projectPartId}, arguments2)));
}
TEST_F(ToolChainArgumentsCache, RemoveEntriesIfEntryIsEmptyAfterRemovingIds)
diff --git a/tests/unit/unittest/unittest.pro b/tests/unit/unittest/unittest.pro
index 6fccdebcc7..4fbba5b413 100644
--- a/tests/unit/unittest/unittest.pro
+++ b/tests/unit/unittest/unittest.pro
@@ -65,7 +65,8 @@ SOURCES += \
pchmanagerclient-test.cpp \
pchmanagerserver-test.cpp \
processevents-utilities.cpp \
- projectparts-test.cpp \
+ projectpartsmanager-test.cpp \
+ projectpartsstorage-test.cpp \
projectupdater-test.cpp \
readandwritemessageblock-test.cpp \
sizedarray-test.cpp \
@@ -226,7 +227,8 @@ HEADERS += \
mockpchmanagerclient.h \
mockpchmanagernotifier.h \
mockpchmanagerserver.h \
- mockprojectparts.h \
+ mockprojectpartsmanager.h \
+ mockprojectpartsstorage.h \
mockqfilesystemwatcher.h \
mocksearch.h \
mocksearchhandle.h \