diff --git a/languages/clang/clangparsejob.cpp b/languages/clang/clangparsejob.cpp --- a/languages/clang/clangparsejob.cpp +++ b/languages/clang/clangparsejob.cpp @@ -170,7 +170,7 @@ } else { m_environment.addIncludes(IDefinesAndIncludesManager::manager()->includes(tuUrl.str())); m_environment.addDefines(IDefinesAndIncludesManager::manager()->defines(tuUrl.str())); - m_environment.setParserSettings(ClangSettingsManager::self()->parserSettings(nullptr)); + m_environment.setParserSettings(ClangSettingsManager::self()->parserSettings(tuUrl.str())); } const bool isSource = ClangHelpers::isSource(tuUrl.str()); m_environment.setQuality( diff --git a/languages/clang/clangsettings/clangsettingsmanager.h b/languages/clang/clangsettings/clangsettingsmanager.h --- a/languages/clang/clangsettings/clangsettingsmanager.h +++ b/languages/clang/clangsettings/clangsettingsmanager.h @@ -68,6 +68,8 @@ ParserSettings parserSettings(KDevelop::ProjectBaseItem* item) const; + ParserSettings parserSettings(const QString& path) const; + private: ClangSettingsManager(); diff --git a/languages/clang/clangsettings/clangsettingsmanager.cpp b/languages/clang/clangsettings/clangsettingsmanager.cpp --- a/languages/clang/clangsettings/clangsettingsmanager.cpp +++ b/languages/clang/clangsettings/clangsettingsmanager.cpp @@ -100,6 +100,11 @@ return {IDefinesAndIncludesManager::manager()->parserArguments(item)}; } +ParserSettings ClangSettingsManager::parserSettings(const QString& path) const +{ + return {IDefinesAndIncludesManager::manager()->parserArguments(path)}; +} + ClangSettingsManager::ClangSettingsManager() {} diff --git a/languages/clang/duchain/parsesession.cpp b/languages/clang/duchain/parsesession.cpp --- a/languages/clang/duchain/parsesession.cpp +++ b/languages/clang/duchain/parsesession.cpp @@ -74,7 +74,7 @@ if (parserSettings.parserOptions.isEmpty()) { // The parserOptions can be empty for some unit tests that use ParseSession directly - auto defaultArguments = ClangSettingsManager::self()->parserSettings(nullptr).toClangAPI(); + auto defaultArguments = ClangSettingsManager::self()->parserSettings(path).toClangAPI(); Q_ASSERT(!defaultArguments.isEmpty()); defaultArguments.append(QByteArrayLiteral("-nostdinc")); defaultArguments.append(QByteArrayLiteral("-nostdinc++")); diff --git a/languages/clang/tests/test_duchain.cpp b/languages/clang/tests/test_duchain.cpp --- a/languages/clang/tests/test_duchain.cpp +++ b/languages/clang/tests/test_duchain.cpp @@ -1583,11 +1583,12 @@ m_projectController->addProject(project); { + // TODO: Also test in C mode. Currently it doesn't work (some intrinsics missing?) TestFile file(R"( #include int main() { return 0; } - )", "c", project, dir.path()); + )", "cpp", project, dir.path()); file.parse(); QVERIFY(file.waitForParsed(5000)); diff --git a/languages/clang/tests/test_files.cpp b/languages/clang/tests/test_files.cpp --- a/languages/clang/tests/test_files.cpp +++ b/languages/clang/tests/test_files.cpp @@ -91,7 +91,6 @@ } if (!QTest::currentDataTag() || strcmp("invalid.cpp", QTest::currentDataTag()) != 0) { - QEXPECT_FAIL("purec.c", "not working properly yet", Continue); QVERIFY(top->problems().isEmpty()); } } diff --git a/languages/plugins/custom-definesandincludes/compilerprovider/compilerprovider.cpp b/languages/plugins/custom-definesandincludes/compilerprovider/compilerprovider.cpp --- a/languages/plugins/custom-definesandincludes/compilerprovider/compilerprovider.cpp +++ b/languages/plugins/custom-definesandincludes/compilerprovider/compilerprovider.cpp @@ -133,13 +133,23 @@ QHash CompilerProvider::defines( ProjectBaseItem* item ) const { auto config = configForItem(item); - return config.compiler->defines(config.parserArguments); + auto languageType = Utils::Cpp; + if (item) { + languageType = Utils::languageType(item->path(), config.parserArguments.parseAmbiguousAsCPP); + } + + return config.compiler->defines(languageType == Utils::C ? config.parserArguments.cArguments : config.parserArguments.cppArguments); } Path::List CompilerProvider::includes( ProjectBaseItem* item ) const { auto config = configForItem(item); - return config.compiler->includes(config.parserArguments); + auto languageType = Utils::Cpp; + if (item) { + languageType = Utils::languageType(item->path(), config.parserArguments.parseAmbiguousAsCPP); + } + + return config.compiler->includes(languageType == Utils::C ? config.parserArguments.cArguments : config.parserArguments.cppArguments); } IDefinesAndIncludesManager::Type CompilerProvider::type() const diff --git a/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.h b/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.h --- a/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.h +++ b/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.h @@ -34,20 +34,51 @@ class ProjectBaseItem; } +struct ParserArguments +{ + ParserArguments(const QString& cArguments, const QString& cppArguments, bool parseAmbiguousAsCPP) + : cArguments(cArguments) + , cppArguments(cppArguments) + , parseAmbiguousAsCPP(parseAmbiguousAsCPP) + {} + + ParserArguments() = default; + + QString cArguments; + QString cppArguments; + bool parseAmbiguousAsCPP = true; +}; + +Q_DECLARE_METATYPE(ParserArguments); + struct ConfigEntry { QString path; QStringList includes; KDevelop::Defines defines; CompilerPointer compiler; - QString parserArguments; + ParserArguments parserArguments; ConfigEntry( const QString& path = QString() ); // FIXME: get rid of this but stay backwards compatible void setDefines(const QHash& defines); }; +namespace Utils +{ +enum LanguageType +{ + C, + Cpp, + ObjC, + + Other = 100 +}; + +LanguageType languageType(const KDevelop::Path& path, bool treatAmbiguousAsCPP = true); +} + class SettingsManager { public: @@ -61,7 +92,7 @@ bool needToReparseCurrentProject( KConfig* cfg ) const; - QString defaultParserArguments() const; + ParserArguments defaultParserArguments() const; CompilerProvider* provider(); const CompilerProvider* provider() const; diff --git a/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp b/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp --- a/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp +++ b/languages/plugins/custom-definesandincludes/compilerprovider/settingsmanager.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -55,11 +56,20 @@ const QString compilerPathKey = QLatin1String( "Path" ); const QString compilerTypeKey = QLatin1String( "Type" ); -QString parserArguments() +QString parserArgumentsCPP() { return QStringLiteral("parserArguments"); } +QString parserArgumentsC() +{ + return QStringLiteral("parserArgumentsC"); +} + +QString parseAmbiguousAsCPP() +{ + return QStringLiteral("parseAmbiguousAsCPP"); +} } // the grouplist is randomly sorted b/c it uses QSet internally @@ -70,9 +80,16 @@ return list; } -QString defaultArguments() +ParserArguments defaultArguments() { - return QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -std=c++11"); + const static ParserArguments arguments + { + QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -std=c99"), + QStringLiteral("-ferror-limit=100 -fspell-checking -Wdocumentation -Wunused-parameter -Wunreachable-code -Wall -std=c++11"), + true + }; + + return arguments; } CompilerPointer createCompilerFromConfig(KConfigGroup& cfg) @@ -108,7 +125,9 @@ for ( const auto& path : paths ) { KConfigGroup pathgrp = grp.group( ConfigConstants::projectPathPrefix + QString::number( pathIndex++ ) ); pathgrp.writeEntry(ConfigConstants::projectPathKey, path.path); - pathgrp.writeEntry(ConfigConstants::parserArguments(), path.parserArguments); + pathgrp.writeEntry(ConfigConstants::parserArgumentsCPP(), path.parserArguments.cppArguments); + pathgrp.writeEntry(ConfigConstants::parserArgumentsC(), path.parserArguments.cArguments); + pathgrp.writeEntry(ConfigConstants::parseAmbiguousAsCPP(), path.parserArguments.parseAmbiguousAsCPP); { int index = 0; @@ -140,10 +159,16 @@ ConfigEntry path; path.path = pathgrp.readEntry( ConfigConstants::projectPathKey, "" ); - path.parserArguments = pathgrp.readEntry(ConfigConstants::parserArguments(), defaultArguments()); + path.parserArguments.cppArguments = pathgrp.readEntry(ConfigConstants::parserArgumentsCPP(), defaultArguments().cppArguments); + path.parserArguments.cArguments = pathgrp.readEntry(ConfigConstants::parserArgumentsC(), defaultArguments().cArguments); + path.parserArguments.parseAmbiguousAsCPP = pathgrp.readEntry(ConfigConstants::parseAmbiguousAsCPP(), defaultArguments().parseAmbiguousAsCPP); - if (path.parserArguments.isEmpty()) { - path.parserArguments = defaultArguments(); + if (path.parserArguments.cppArguments.isEmpty()) { + path.parserArguments.cppArguments = defaultArguments().cppArguments; + } + + if (path.parserArguments.cArguments.isEmpty()) { + path.parserArguments.cArguments = defaultArguments().cArguments; } { // defines @@ -199,7 +224,8 @@ pathgrp.deleteGroup(); } - Q_ASSERT(!path.parserArguments.isEmpty()); + Q_ASSERT(!path.parserArguments.cppArguments.isEmpty()); + Q_ASSERT(!path.parserArguments.cArguments.isEmpty()); paths << path; } @@ -349,7 +375,7 @@ return compilers; } -QString SettingsManager::defaultParserArguments() const +ParserArguments SettingsManager::defaultParserArguments() const { return defaultArguments(); } @@ -359,3 +385,32 @@ , compiler(SettingsManager::globalInstance()->provider()->checkCompilerExists({})) , parserArguments(defaultArguments()) {} + +namespace Utils { +LanguageType languageType(const KDevelop::Path& path, bool treatAmbiguousAsCPP) +{ + QMimeDatabase db; + const auto mimeType = db.mimeTypeForFile(path.path()).name(); + if (mimeType == QStringLiteral("text/x-csrc") || + mimeType == QStringLiteral("text/x-chdr") ) { + if (treatAmbiguousAsCPP) { + if (path.lastPathSegment().endsWith(QLatin1String(".h"), Qt::CaseInsensitive)) { + return Cpp; + } + } + + return C; + } + + if (mimeType == QStringLiteral("text/x-c++src") || + mimeType == QStringLiteral("text/x-c++hdr") ) { + return Cpp; + } + + if (mimeType == QStringLiteral("text/x-objcsrc")) { + return ObjC; + } + + return Other; +} +} diff --git a/languages/plugins/custom-definesandincludes/definesandincludesmanager.h b/languages/plugins/custom-definesandincludes/definesandincludesmanager.h --- a/languages/plugins/custom-definesandincludes/definesandincludesmanager.h +++ b/languages/plugins/custom-definesandincludes/definesandincludesmanager.h @@ -63,6 +63,7 @@ bool unregisterBackgroundProvider(BackgroundProvider* provider) override; QString parserArguments(KDevelop::ProjectBaseItem* item) const override; + QString parserArguments(const QString& path) const override; void openConfigurationDialog( const QString& pathToFile ) override; int perProjectConfigPages() const override; diff --git a/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp b/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp --- a/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp +++ b/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp @@ -74,15 +74,16 @@ } } - if (ret.parserArguments.isEmpty() || targetDirectory.segments().size() > closestPath.segments().size()) { + if (targetDirectory.segments().size() > closestPath.segments().size()) { ret.parserArguments = entry.parserArguments; closestPath = targetDirectory; } } } ret.includes.removeDuplicates(); - Q_ASSERT(!ret.parserArguments.isEmpty()); + Q_ASSERT(!ret.parserArguments.cppArguments.isEmpty()); + Q_ASSERT(!ret.parserArguments.cArguments.isEmpty()); return ret; } @@ -276,14 +277,22 @@ QString DefinesAndIncludesManager::parserArguments(KDevelop::ProjectBaseItem* item) const { - if(!item){ - return m_settings->defaultParserArguments(); - } + Q_ASSERT(item); Q_ASSERT(QThread::currentThread() == qApp->thread()); auto cfg = item->project()->projectConfiguration().data(); - return findConfigForItem(m_settings->readPaths(cfg), item).parserArguments; + const auto arguments = findConfigForItem(m_settings->readPaths(cfg), item).parserArguments; + auto languageType = Utils::languageType(item->path(), arguments.parseAmbiguousAsCPP); + + return languageType == Utils::C ? arguments.cArguments : arguments.cppArguments; +} + +QString DefinesAndIncludesManager::parserArguments(const QString& path) const +{ + const auto args = m_settings->defaultParserArguments(); + auto languageType = Utils::languageType(Path(path)); + return languageType == Utils::C ? args.cArguments : args.cppArguments; } int DefinesAndIncludesManager::perProjectConfigPages() const diff --git a/languages/plugins/custom-definesandincludes/idefinesandincludesmanager.h b/languages/plugins/custom-definesandincludes/idefinesandincludesmanager.h --- a/languages/plugins/custom-definesandincludes/idefinesandincludesmanager.h +++ b/languages/plugins/custom-definesandincludes/idefinesandincludesmanager.h @@ -135,11 +135,11 @@ /** * @param item project item. Use nullptr to get default arguments * @return The parser command-line arguments used to parse the @p item - * - * NOTE: Call it from the main thread only, the default arguments can also be retrieved from a background thread */ virtual QString parserArguments(ProjectBaseItem* item) const = 0; + virtual QString parserArguments(const QString& path) const = 0; + ///@return the instance of the plugin. inline static IDefinesAndIncludesManager* manager(); diff --git a/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.h b/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.h --- a/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.h +++ b/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.h @@ -37,22 +37,25 @@ class IProject; } +struct ParserArguments; + class ParserWidget : public QWidget { Q_OBJECT public: ParserWidget(QWidget* parent); ~ParserWidget() override; - void setParserArguments(const QString& arguments); - QString parserArguments() const; + void setParserArguments(const ParserArguments& arguments); + ParserArguments parserArguments() const; signals: void changed(); private slots: void textEdited(); - void languageStandardChanged(const QString& standard); + void languageStandardChangedC(const QString& standard); + void languageStandardChangedCpp(const QString& standard); void updateEnablements(); private: diff --git a/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp b/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp --- a/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp +++ b/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.cpp @@ -53,7 +53,7 @@ auto tmpArgs(arguments); tmpArgs.replace(standard, "c++11"); - if (tmpArgs == defaultArguments && standards.contains(standard)) { + if (tmpArgs == defaultArguments.cppArguments && standards.contains(standard)) { return false; } @@ -69,10 +69,15 @@ { m_ui->setupUi(this); - connect(m_ui->parserOptions, &QLineEdit::textEdited, this, &ParserWidget::textEdited); - connect(m_ui->languageStandards, static_castparserOptionsC, &QLineEdit::textEdited, this, &ParserWidget::textEdited); + connect(m_ui->parserOptionsCpp, &QLineEdit::textEdited, this, &ParserWidget::textEdited); + connect(m_ui->parseHeadersInPlainC, &QCheckBox::stateChanged, this, &ParserWidget::textEdited); + connect(m_ui->languageStandardsC, static_cast(&QComboBox::activated), this, -&ParserWidget::languageStandardChanged); +&ParserWidget::languageStandardChangedC); + connect(m_ui->languageStandardsCpp, static_cast(&QComboBox::activated), this, +&ParserWidget::languageStandardChangedCpp); updateEnablements(); } @@ -84,47 +89,75 @@ emit changed(); } -void ParserWidget::languageStandardChanged(const QString& standard) +void ParserWidget::languageStandardChangedC(const QString& standard) { - if (m_ui->languageStandards->currentIndex() == customProfileIdx) { - m_ui->parserOptions->setText(SettingsManager::globalInstance()->defaultParserArguments()); + if (m_ui->languageStandardsC->currentIndex() == customProfileIdx) { + m_ui->parserOptionsC->setText(SettingsManager::globalInstance()->defaultParserArguments().cArguments); } else { - auto text = SettingsManager::globalInstance()->defaultParserArguments(); + auto text = SettingsManager::globalInstance()->defaultParserArguments().cArguments; auto currentStandard = languageStandard(text); - m_ui->parserOptions->setText(text.replace(currentStandard, standard)); + m_ui->parserOptionsC->setText(text.replace(currentStandard, standard)); } textEdited(); updateEnablements(); } -void ParserWidget::setParserArguments(const QString& arguments) +void ParserWidget::languageStandardChangedCpp(const QString& standard) { - QStringList standards; - for (int i = 1; i < m_ui->languageStandards->count(); i++) { - standards << m_ui->languageStandards->itemText(i); - } - - if (isCustomParserArguments(arguments, standards)) { - m_ui->languageStandards->setCurrentIndex(customProfileIdx); + if (m_ui->languageStandardsCpp->currentIndex() == customProfileIdx) { + m_ui->parserOptionsCpp->setText(SettingsManager::globalInstance()->defaultParserArguments().cppArguments); } else { - m_ui->languageStandards->setCurrentText(languageStandard(arguments)); + auto text = SettingsManager::globalInstance()->defaultParserArguments().cppArguments; + auto currentStandard = languageStandard(text); + m_ui->parserOptionsCpp->setText(text.replace(currentStandard, standard)); } - m_ui->parserOptions->setText(arguments); + textEdited(); updateEnablements(); } -QString ParserWidget::parserArguments() const +void ParserWidget::setParserArguments(const ParserArguments& arguments) { - return m_ui->parserOptions->text(); + auto setArguments = [this](QComboBox* languageStandards, QLineEdit* parserOptions, const QString& arguments) { + QStringList standards; + for (int i = 1; i < languageStandards->count(); i++) { + standards << languageStandards->itemText(i); + } + + if (isCustomParserArguments(arguments, standards)) { + languageStandards->setCurrentIndex(customProfileIdx); + } else { + languageStandards->setCurrentText(languageStandard(arguments)); + } + + parserOptions->setText(arguments); + }; + + setArguments(m_ui->languageStandardsCpp, m_ui->parserOptionsCpp, arguments.cppArguments); + setArguments(m_ui->languageStandardsC, m_ui->parserOptionsC, arguments.cArguments); + + m_ui->parseHeadersInPlainC->setChecked(!arguments.parseAmbiguousAsCPP); + + updateEnablements(); +} + +ParserArguments ParserWidget::parserArguments() const +{ + return {m_ui->parserOptionsC->text(), m_ui->parserOptionsCpp->text(), !m_ui->parseHeadersInPlainC->isChecked()}; } void ParserWidget::updateEnablements() { - if (m_ui->languageStandards->currentIndex() == customProfileIdx) { - m_ui->parserOptions->setEnabled(true); + if (m_ui->languageStandardsCpp->currentIndex() == customProfileIdx) { + m_ui->parserOptionsCpp->setEnabled(true); + } else { + m_ui->parserOptionsCpp->setEnabled(false); + } + + if (m_ui->languageStandardsC->currentIndex() == customProfileIdx) { + m_ui->parserOptionsC->setEnabled(true); } else { - m_ui->parserOptions->setEnabled(false); + m_ui->parserOptionsC->setEnabled(false); } } diff --git a/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.ui b/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.ui --- a/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.ui +++ b/languages/plugins/custom-definesandincludes/kcm_widget/parserwidget.ui @@ -13,7 +13,17 @@ Form - + + + + + <html><head/><body><p>Check this if you want <code>*.h<code/> headers to be parsed in plain C mode. By default they are parsed as C++ headers.</p></body></html> + + + Parse *.h headers in plain C + + + @@ -23,15 +33,15 @@ - Profi&le: + C++ Profi&le: - languageStandards + languageStandardsCpp - + 0 @@ -92,27 +102,129 @@ - Command-line ar&guments: + C++ co&mmand-line arguments: - parserOptions + parserOptionsCpp - + + + + 100 + 0 + + + + + + + + C Profi&le: + + + languageStandardsCpp + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + <html><head/><body><p>Choose language profile. </p><p>Use &quot;Custom&quot; profile to modify parser command-line arguments</p></body></html> + + + + Custom + + + + + c99 + + + + + gnu99 + + + + + c11 + + + + + gnu11 + + + + + c++03 + + + + + c++11 + + + + + c++14 + + + + + + + + C co&mmand-line arguments: + + + parserOptionsC + + + + + 100 0 + + + + Qt::Vertical + + + + 20 + 40 + + + + - + Qt::Vertical diff --git a/languages/plugins/custom-definesandincludes/kcm_widget/projectpathsmodel.h b/languages/plugins/custom-definesandincludes/kcm_widget/projectpathsmodel.h --- a/languages/plugins/custom-definesandincludes/kcm_widget/projectpathsmodel.h +++ b/languages/plugins/custom-definesandincludes/kcm_widget/projectpathsmodel.h @@ -40,7 +40,7 @@ DefinesDataRole = Qt::UserRole + 2, FullUrlDataRole = Qt::UserRole + 3, CompilerDataRole = Qt::UserRole + 4, - ParserArgumentsRole = CompilerDataRole + 1 + ParserArgumentsRole = Qt::UserRole + 5 }; ProjectPathsModel( QObject* parent = 0 ); void setProject( KDevelop::IProject* w_project ); diff --git a/languages/plugins/custom-definesandincludes/kcm_widget/projectpathsmodel.cpp b/languages/plugins/custom-definesandincludes/kcm_widget/projectpathsmodel.cpp --- a/languages/plugins/custom-definesandincludes/kcm_widget/projectpathsmodel.cpp +++ b/languages/plugins/custom-definesandincludes/kcm_widget/projectpathsmodel.cpp @@ -64,7 +64,7 @@ return QVariant::fromValue(pathConfig.compiler); break; case ParserArgumentsRole: - return pathConfig.parserArguments; + return QVariant::fromValue(pathConfig.parserArguments); break; default: break; @@ -122,7 +122,7 @@ pathConfig.compiler = value.value(); break; case ParserArgumentsRole: - pathConfig.parserArguments = value.toString(); + pathConfig.parserArguments = value.value(); break; default: return false; @@ -196,7 +196,8 @@ void ProjectPathsModel::addPathInternal( const ConfigEntry& config, bool prepend ) { - Q_ASSERT(!config.parserArguments.isEmpty()); + Q_ASSERT(!config.parserArguments.cppArguments.isEmpty()); + Q_ASSERT(!config.parserArguments.cArguments.isEmpty()); // Do not allow duplicates foreach( const ConfigEntry& existingConfig, projectPaths ) { diff --git a/languages/plugins/custom-definesandincludes/kcm_widget/projectpathswidget.cpp b/languages/plugins/custom-definesandincludes/kcm_widget/projectpathswidget.cpp --- a/languages/plugins/custom-definesandincludes/kcm_widget/projectpathswidget.cpp +++ b/languages/plugins/custom-definesandincludes/kcm_widget/projectpathswidget.cpp @@ -31,6 +31,7 @@ #include #include "../compilerprovider/compilerprovider.h" +#include "../compilerprovider/settingsmanager.h" #include "ui_projectpathswidget.h" #include "ui_batchedit.h" @@ -130,7 +131,7 @@ void ProjectPathsWidget::parserArgumentsChanged() { - updatePathsModel(ui->parserWidget->parserArguments(), ProjectPathsModel::ParserArgumentsRole); + updatePathsModel(QVariant::fromValue(ui->parserWidget->parserArguments()), ProjectPathsModel::ParserArgumentsRole); } void ProjectPathsWidget::updatePathsModel(const QVariant& newData, int role) @@ -158,7 +159,7 @@ ui->compiler->setCurrentText(pathsModel->data(midx, ProjectPathsModel::CompilerDataRole).value()->name()); - ui->parserWidget->setParserArguments(pathsModel->data(midx, ProjectPathsModel::ParserArgumentsRole ).toString()); + ui->parserWidget->setParserArguments(pathsModel->data(midx, ProjectPathsModel::ParserArgumentsRole).value()); updateEnablements(); } diff --git a/languages/plugins/custom-definesandincludes/tests/test_definesandincludes.cpp b/languages/plugins/custom-definesandincludes/tests/test_definesandincludes.cpp --- a/languages/plugins/custom-definesandincludes/tests/test_definesandincludes.cpp +++ b/languages/plugins/custom-definesandincludes/tests/test_definesandincludes.cpp @@ -73,7 +73,7 @@ QCOMPARE( actualDefines, defines ); QVERIFY(!manager->parserArguments(s_currentProject->projectItem()).isEmpty()); - QVERIFY(!manager->parserArguments(nullptr).isEmpty()); + QVERIFY(!manager->parserArguments(QStringLiteral("/some/path/to/file.cpp")).isEmpty()); } void TestDefinesAndIncludes::loadMultiPathProject()