diff options
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettings.cpp | 3 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettings.h | 19 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettingspage.cpp | 16 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodemodelsettingspage.ui | 21 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager_test.cpp | 100 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsnapshotupdater.cpp | 19 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsnapshotupdater.h | 4 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsconstants.h | 1 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolseditorsupport.cpp | 5 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsplugin.h | 1 |
11 files changed, 185 insertions, 6 deletions
diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index a115d16bd0..d319f5c5db 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -42,6 +42,8 @@ void CppCodeModelSettings::fromSettings(QSettings *s) setIdForMimeType(supporters, QLatin1String(Constants::CPP_SOURCE_MIMETYPE)); setIdForMimeType(supporters, QLatin1String(Constants::OBJECTIVE_C_SOURCE_MIMETYPE)); setIdForMimeType(supporters, QLatin1String(Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)); + QVariant v = s->value(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), PchUse_None); + setPCHUsage(static_cast<PCHUsage>(v.toInt())); s->endGroup(); } @@ -52,6 +54,7 @@ void CppCodeModelSettings::toSettings(QSettings *s) foreach (const QString &mimeType, m_modelManagerSupportByMimeType.keys()) var[mimeType] = m_modelManagerSupportByMimeType[mimeType]; s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY), QVariant(var)); + s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), pchUsage()); s->endGroup(); } diff --git a/src/plugins/cpptools/cppcodemodelsettings.h b/src/plugins/cpptools/cppcodemodelsettings.h index be4042a318..ef1f8d63e0 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.h +++ b/src/plugins/cpptools/cppcodemodelsettings.h @@ -43,11 +43,15 @@ namespace Internal { class CppCodeModelSettings { - QHash<QString, QString> m_modelManagerSupportByMimeType; - QHash<QString, QString> m_availableModelManagerSupportersByName; - QString m_defaultId; +public: + enum PCHUsage { + PchUse_None = 1, + PchUse_BuildSystem = 2, + }; public: + CppCodeModelSettings(): m_pchUsage(PchUse_None) {} + void fromSettings(QSettings *s); void toSettings(QSettings *s); @@ -65,8 +69,17 @@ public: void setDefaultId(const QString &defaultId) { m_defaultId = defaultId; } + PCHUsage pchUsage() const { return m_pchUsage; } + void setPCHUsage(PCHUsage pchUsage) { m_pchUsage = pchUsage; } + private: void setIdForMimeType(const QVariant &var, const QString &mimeType); + +private: + QHash<QString, QString> m_modelManagerSupportByMimeType; + QHash<QString, QString> m_availableModelManagerSupportersByName; + QString m_defaultId; + PCHUsage m_pchUsage; }; } // namespace Internal diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.cpp b/src/plugins/cpptools/cppcodemodelsettingspage.cpp index af18b70445..e5fd37824a 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.cpp +++ b/src/plugins/cpptools/cppcodemodelsettingspage.cpp @@ -43,6 +43,8 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(QWidget *parent) , m_ui(new Ui::CppCodeModelSettingsPage) { m_ui->setupUi(this); + + m_ui->theGroupBox->setVisible(false); } CppCodeModelSettingsWidget::~CppCodeModelSettingsWidget() @@ -58,6 +60,8 @@ void CppCodeModelSettingsWidget::setSettings(const QSharedPointer<CppCodeModelSe applyToWidget(m_ui->cppChooser, QLatin1String(Constants::CPP_SOURCE_MIMETYPE)); applyToWidget(m_ui->objcChooser, QLatin1String(Constants::OBJECTIVE_C_SOURCE_MIMETYPE)); applyToWidget(m_ui->objcppChooser, QLatin1String(Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)); + + m_ui->ignorePCHCheckBox->setChecked(s->pchUsage() == CppCodeModelSettings::PchUse_None); } void CppCodeModelSettingsWidget::applyToWidget(QComboBox *chooser, const QString &mimeType) const @@ -85,6 +89,14 @@ void CppCodeModelSettingsWidget::applyToSettings() const changed |= applyToSettings(m_ui->objcppChooser, QLatin1String(Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)); + if (m_ui->ignorePCHCheckBox->isChecked() != + (m_settings->pchUsage() == CppCodeModelSettings::PchUse_None)) { + m_settings->setPCHUsage( + m_ui->ignorePCHCheckBox->isChecked() ? CppCodeModelSettings::PchUse_None + : CppCodeModelSettings::PchUse_BuildSystem); + changed = true; + } + if (changed) m_settings->toSettings(Core::ICore::settings()); } @@ -97,7 +109,9 @@ QString CppCodeModelSettingsWidget::searchKeywords() const << ' ' << m_ui->cLabel->text() << ' ' << m_ui->cppLabel->text() << ' ' << m_ui->objcLabel->text() - << ' ' << m_ui->objcppLabel->text(); + << ' ' << m_ui->objcppLabel->text() + << ' ' << m_ui->anotherGroupBox->title() + << ' ' << m_ui->ignorePCHCheckBox->text(); foreach (const QString &mmsNames, m_settings->availableModelManagerSupportersByName().keys()) ts << ' ' << mmsNames; rc.remove(QLatin1Char('&')); diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.ui b/src/plugins/cpptools/cppcodemodelsettingspage.ui index 70155c527b..310c01d966 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.ui +++ b/src/plugins/cpptools/cppcodemodelsettingspage.ui @@ -13,7 +13,7 @@ <property name="windowTitle"> <string>Form</string> </property> - <layout class="QVBoxLayout" name="verticalLayout"> + <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QGroupBox" name="theGroupBox"> <property name="title"> @@ -78,6 +78,25 @@ </widget> </item> <item> + <widget class="QGroupBox" name="anotherGroupBox"> + <property name="title"> + <string>Pre-compiled Headers</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QCheckBox" name="ignorePCHCheckBox"> + <property name="toolTip"> + <string><html><head/><body><p>When pre-compiled headers are not ignored, the parsing for code completion and semantic highlighting will process the pre-compiled header before processing any file.</p></body></html></string> + </property> + <property name="text"> + <string>Ignore pre-compiled headers</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index 17391483e0..db76d6ecc1 100644 --- a/src/plugins/cpptools/cppmodelmanager_test.cpp +++ b/src/plugins/cpptools/cppmodelmanager_test.cpp @@ -870,3 +870,103 @@ void CppToolsPlugin::test_modelmanager_defines_per_project() QCOMPARE(decl->name()->identifier()->chars(), "two"); } } + +void CppToolsPlugin::test_modelmanager_defines_per_project_pch() +{ + ModelManagerTestHelper helper; + + MyTestDataDir testDataDirectory(QLatin1String("testdata_defines")); + const QString main1File = testDataDirectory.file(QLatin1String("main1.cpp")); + const QString main2File = testDataDirectory.file(QLatin1String("main2.cpp")); + const QString header = testDataDirectory.file(QLatin1String("header.h")); + const QString pch1File = testDataDirectory.file(QLatin1String("pch1.h")); + const QString pch2File = testDataDirectory.file(QLatin1String("pch2.h")); + + CppModelManager *mm = CppModelManager::instance(); + + Project *project = helper.createProject( + QLatin1String("test_modelmanager_defines_per_project_pch")); + + ProjectPart::Ptr part1(new ProjectPart); + part1->files.append(ProjectFile(main1File, ProjectFile::CXXSource)); + part1->files.append(ProjectFile(header, ProjectFile::CXXHeader)); + part1->cxxVersion = ProjectPart::CXX11; + part1->qtVersion = ProjectPart::NoQt; + part1->precompiledHeaders.append(pch1File); + part1->includePaths = QStringList() << testDataDirectory.includeDir(false); + + ProjectPart::Ptr part2(new ProjectPart); + part2->files.append(ProjectFile(main2File, ProjectFile::CXXSource)); + part2->files.append(ProjectFile(header, ProjectFile::CXXHeader)); + part2->cxxVersion = ProjectPart::CXX11; + part2->qtVersion = ProjectPart::NoQt; + part2->precompiledHeaders.append(pch2File); + part2->includePaths = QStringList() << testDataDirectory.includeDir(false); + + ProjectInfo pi = mm->projectInfo(project); + pi.appendProjectPart(part1); + pi.appendProjectPart(part2); + + mm->updateProjectInfo(pi); + + helper.waitForRefreshedSourceFiles(); + + QCOMPARE(mm->snapshot().size(), 4); + + // Open a file in the editor + QCOMPARE(Core::EditorManager::documentModel()->openedDocuments().size(), 0); + + { + Core::IEditor *editor = Core::EditorManager::openEditor(main1File); + EditorCloser closer(editor); + QVERIFY(editor); + QCOMPARE(Core::EditorManager::documentModel()->openedDocuments().size(), 1); + QVERIFY(mm->isCppEditor(editor)); + + CppEditorSupport *sup = mm->cppEditorSupport( + qobject_cast<TextEditor::BaseTextEditor *>(editor)); + while (sup->lastSemanticInfoDocument().isNull()) + QCoreApplication::processEvents(); + + sup->snapshotUpdater()->setUsePrecompiledHeaders(true); + sup->snapshotUpdater()->update(mm->workingCopy()); + + Document::Ptr doc = mm->snapshot().document(main1File); + QVERIFY(doc); + QVERIFY(doc->globalNamespace()); + QCOMPARE(doc->globalSymbolCount(), 1U); + CPlusPlus::Symbol *s = doc->globalSymbolAt(0); + QVERIFY(s); + CPlusPlus::Declaration *decl = s->asDeclaration(); + QVERIFY(decl); + QVERIFY(decl->type()->isIntegerType()); + QCOMPARE(decl->name()->identifier()->chars(), "one"); + } + + { + Core::IEditor *editor = Core::EditorManager::openEditor(main2File); + EditorCloser closer(editor); + QVERIFY(editor); + QCOMPARE(Core::EditorManager::documentModel()->openedDocuments().size(), 1); + QVERIFY(mm->isCppEditor(editor)); + + CppEditorSupport *sup = mm->cppEditorSupport( + qobject_cast<TextEditor::BaseTextEditor *>(editor)); + while (sup->lastSemanticInfoDocument().isNull()) + QCoreApplication::processEvents(); + + sup->snapshotUpdater()->setUsePrecompiledHeaders(true); + sup->snapshotUpdater()->update(mm->workingCopy()); + + Document::Ptr doc = mm->snapshot().document(main2File); + QVERIFY(doc); + QVERIFY(doc->globalNamespace()); + QCOMPARE(doc->globalSymbolCount(), 1U); + CPlusPlus::Symbol *s = doc->globalSymbolAt(0); + QVERIFY(s); + CPlusPlus::Declaration *decl = s->asDeclaration(); + QVERIFY(decl); + QVERIFY(decl->type()->isIntegerType()); + QCOMPARE(decl->name()->identifier()->chars(), "two"); + } +} diff --git a/src/plugins/cpptools/cppsnapshotupdater.cpp b/src/plugins/cpptools/cppsnapshotupdater.cpp index f12f888af7..473ec66b60 100644 --- a/src/plugins/cpptools/cppsnapshotupdater.cpp +++ b/src/plugins/cpptools/cppsnapshotupdater.cpp @@ -39,6 +39,7 @@ using namespace CppTools::Internal; SnapshotUpdater::SnapshotUpdater(const QString &fileInEditor) : m_mutex(QMutex::Recursive) , m_fileInEditor(fileInEditor) + , m_usePrecompiledHeaders(false) { } @@ -56,6 +57,7 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy) QByteArray configFile = modelManager->codeModelConfiguration(); QStringList includePaths; QStringList frameworkPaths; + QStringList precompiledHeaders; updateProjectPart(); @@ -63,6 +65,8 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy) configFile += m_projectPart->defines; includePaths = m_projectPart->includePaths; frameworkPaths = m_projectPart->frameworkPaths; + if (m_usePrecompiledHeaders) + precompiledHeaders = m_projectPart->precompiledHeaders; } if (configFile != m_configFile) { @@ -81,6 +85,11 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy) invalidateSnapshot = true; } + if (precompiledHeaders != m_precompiledHeaders) { + m_precompiledHeaders = precompiledHeaders; + invalidateSnapshot = true; + } + unsigned rev = 0; if (Document::Ptr doc = document()) rev = doc->revision(); @@ -130,6 +139,9 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy) preproc.setIncludePaths(m_includePaths); preproc.setFrameworkPaths(m_frameworkPaths); preproc.run(configurationFileName); + if (m_usePrecompiledHeaders) + foreach (const QString &precompiledHeader, m_precompiledHeaders) + preproc.run(precompiledHeader); preproc.run(m_fileInEditor); m_snapshot = preproc.snapshot(); @@ -159,6 +171,13 @@ Document::Ptr SnapshotUpdater::document() const return m_snapshot.document(m_fileInEditor); } +void SnapshotUpdater::setUsePrecompiledHeaders(bool usePrecompiledHeaders) +{ + QMutexLocker locker(&m_mutex); + + m_usePrecompiledHeaders = usePrecompiledHeaders; +} + void SnapshotUpdater::updateProjectPart() { CppModelManager *cmm = dynamic_cast<CppModelManager *>(CppModelManagerInterface::instance()); diff --git a/src/plugins/cpptools/cppsnapshotupdater.h b/src/plugins/cpptools/cppsnapshotupdater.h index 8db54def7e..6f0f90ac4f 100644 --- a/src/plugins/cpptools/cppsnapshotupdater.h +++ b/src/plugins/cpptools/cppsnapshotupdater.h @@ -64,6 +64,8 @@ public: QStringList frameworkPaths() const { return m_frameworkPaths; } + void setUsePrecompiledHeaders(bool usePrecompiledHeaders); + private: void updateProjectPart(); void addFileAndDependencies(QSet<QString> *toRemove, const QString &fileName) const; @@ -75,8 +77,10 @@ private: QByteArray m_configFile; QStringList m_includePaths; QStringList m_frameworkPaths; + QStringList m_precompiledHeaders; CPlusPlus::Snapshot m_snapshot; CPlusPlus::DependencyTable m_deps; + bool m_usePrecompiledHeaders; }; } // namespace CppTools diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index 0fa5d036cd..ae3d384f2f 100644 --- a/src/plugins/cpptools/cpptoolsconstants.h +++ b/src/plugins/cpptools/cpptoolsconstants.h @@ -52,6 +52,7 @@ const char CPPTOOLS_SETTINGSGROUP[] = "CppTools"; const char LOWERCASE_CPPFILES_KEY[] = "LowerCaseFiles"; enum { lowerCaseFilesDefault = 1 }; const char CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY[] = "ModelManagerSupporters"; +const char CPPTOOLS_MODEL_MANAGER_PCH_USAGE[] = "PCHUsage"; const char CPP_CODE_STYLE_SETTINGS_ID[] = "A.Code Style"; const char CPP_CODE_STYLE_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Code Style"); diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp index 98e913dedd..c1053c2218 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.cpp +++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp @@ -27,8 +27,10 @@ ** ****************************************************************************/ +#include "cppcodemodelsettings.h" #include "cppcompletionassistprovider.h" #include "cpptoolseditorsupport.h" +#include "cpptoolsplugin.h" #include "cppmodelmanager.h" #include "cpplocalsymbols.h" @@ -251,6 +253,9 @@ QSharedPointer<SnapshotUpdater> CppEditorSupport::snapshotUpdater() if (!updater) { updater = QSharedPointer<SnapshotUpdater>(new SnapshotUpdater(fileName())); m_snapshotUpdater = updater; + + QSharedPointer<CppCodeModelSettings> cms = CppToolsPlugin::instance()->codeModelSettings(); + updater->setUsePrecompiledHeaders(cms->pchUsage() != CppCodeModelSettings::PchUse_None); } return updater; } diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp index 3d84020d06..ff69f7746a 100644 --- a/src/plugins/cpptools/cpptoolsplugin.cpp +++ b/src/plugins/cpptools/cpptoolsplugin.cpp @@ -129,7 +129,7 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) addAutoReleasedObject(new CppFunctionsFilter(locatorData)); addAutoReleasedObject(new CppCurrentDocumentFilter(modelManager)); addAutoReleasedObject(new CppFileSettingsPage(m_fileSettings)); -// addAutoReleasedObject(new CppCodeModelSettingsPage(m_codeModelSettings)); + addAutoReleasedObject(new CppCodeModelSettingsPage(m_codeModelSettings)); addAutoReleasedObject(new SymbolsFindFilter(modelManager)); addAutoReleasedObject(new CppCodeStyleSettingsPage); diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index b45631ab8d..3a0c4b9024 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -212,6 +212,7 @@ private slots: void test_modelmanager_gc_if_last_cppeditor_closed(); void test_modelmanager_dont_gc_opened_files(); void test_modelmanager_defines_per_project(); + void test_modelmanager_defines_per_project_pch(); void test_cpplocatorfilters_CppLocatorFilter(); void test_cpplocatorfilters_CppLocatorFilter_data(); |