Clang: Allow to provide extra command line options

This can be used to experiment with clang options that e.g. affect
diagnostics.

Changes take effect on editor re-open.

Change-Id: Ie46d0ff085a3700a748dbcf4b94b93b0bf9c4642
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com>
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2015-11-10 16:54:53 +01:00
parent 72785e3a11
commit d8f119c8a2
8 changed files with 108 additions and 50 deletions

View File

@@ -142,7 +142,7 @@
\li Select \uicontrol Tools > \uicontrol Options > \li Select \uicontrol Tools > \uicontrol Options >
\uicontrol {C++} > \uicontrol {Code Model}, \uicontrol {C++} > \uicontrol {Code Model},
and select the parser to use for files of each type. and select \uicontrol {Use Clang Code Model}.
\li To process pre-compiled headers before processing any project files, \li To process pre-compiled headers before processing any project files,
deselect the \uicontrol {Ignore pre-compiled headers} check box. deselect the \uicontrol {Ignore pre-compiled headers} check box.

View File

@@ -41,8 +41,9 @@
#include <diagnosticcontainer.h> #include <diagnosticcontainer.h>
#include <sourcelocationcontainer.h> #include <sourcelocationcontainer.h>
#include <cpptools/cppcodemodelsettings.h>
#include <cpptools/cppprojects.h> #include <cpptools/cppprojects.h>
#include <cpptools/cpptoolsplugin.h> #include <cpptools/cpptoolsreuse.h>
#include <cpptools/cppworkingcopy.h> #include <cpptools/cppworkingcopy.h>
#include <texteditor/convenience.h> #include <texteditor/convenience.h>
@@ -319,15 +320,21 @@ static QStringList languageOptions(const QString &filePath, CppTools::ProjectPar
return builder.options(); return builder.options();
} }
static QStringList fileArguments(const QString &filePath, CppTools::ProjectPart *projectPart)
{
return QStringList(languageOptions(filePath, projectPart))
+ CppTools::codeModelSettings()->extraClangOptions();
}
ClangBackEnd::FileContainer ClangBackEnd::FileContainer
ClangEditorDocumentProcessor::fileContainer(CppTools::ProjectPart *projectPart) const ClangEditorDocumentProcessor::fileContainer(CppTools::ProjectPart *projectPart) const
{ {
const auto projectPartId = projectPart const auto projectPartId = projectPart
? Utf8String::fromString(projectPart->id()) ? Utf8String::fromString(projectPart->id())
: Utf8String(); : Utf8String();
const auto theLanguageOption = languageOptions(filePath(), projectPart); const QStringList theFileArguments = fileArguments(filePath(), projectPart);
return {filePath(), projectPartId, Utf8StringVector(theLanguageOption), revision()}; return {filePath(), projectPartId, Utf8StringVector(theFileArguments), revision()};
} }
} // namespace Internal } // namespace Internal

View File

@@ -127,8 +127,6 @@ public:
optionsBuilder.addHeaderPathOptions(); optionsBuilder.addHeaderPathOptions();
optionsBuilder.addProjectConfigFileInclude(); optionsBuilder.addProjectConfigFileInclude();
optionsBuilder.addDiagnosticOptions();
optionsBuilder.addExtraOptions(); optionsBuilder.addExtraOptions();
return optionsBuilder.options(); return optionsBuilder.options();
@@ -191,30 +189,7 @@ private:
add(QLatin1String("-fdiagnostics-show-note-include-stack")); add(QLatin1String("-fdiagnostics-show-note-include-stack"));
add(QLatin1String("-fmacro-backtrace-limit=0")); add(QLatin1String("-fmacro-backtrace-limit=0"));
add(QLatin1String("-fretain-comments-from-system-headers")); add(QLatin1String("-fretain-comments-from-system-headers"));
// TODO: -Xclang -ferror-limit -Xclang 0 ? add(QLatin1String("-ferror-limit=1000"));
}
void addDiagnosticOptions()
{
add(QStringLiteral("-fmessage-length=0"));
add(QStringLiteral("-fdiagnostics-show-note-include-stack"));
add(QStringLiteral("-fmacro-backtrace-limit=0"));
add(QStringLiteral("-fretain-comments-from-system-headers"));
add(QStringLiteral("-ferror-limit=1000"));
add(QStringLiteral("-Weverything"));
add(QStringLiteral("-Wno-c++98-compat"));
add(QStringLiteral("-Wno-c++98-compat-pedantic"));
add(QStringLiteral("-Wno-unused-macros"));
add(QStringLiteral("-Wno-newline-eof"));
add(QStringLiteral("-Wno-exit-time-destructors"));
add(QStringLiteral("-Wno-global-constructors"));
add(QStringLiteral("-Wno-gnu-zero-variadic-macro-arguments"));
add(QStringLiteral("-Wno-documentation"));
add(QStringLiteral("-Wno-shadow"));
if (m_projectPart.languageVersion >= ProjectPart::CXX98)
add(QStringLiteral("-Wno-missing-prototypes"));
} }
}; };

View File

@@ -36,6 +36,7 @@ using namespace CppTools;
static QLatin1String cppHeaderMimeType(Constants::CPP_HEADER_MIMETYPE); static QLatin1String cppHeaderMimeType(Constants::CPP_HEADER_MIMETYPE);
static QLatin1String cHeaderMimeType(Constants::C_HEADER_MIMETYPE); static QLatin1String cHeaderMimeType(Constants::C_HEADER_MIMETYPE);
static QLatin1String clangExtraOptionsKey(Constants::CPPTOOLS_EXTRA_CLANG_OPTIONS);
void CppCodeModelSettings::fromSettings(QSettings *s) void CppCodeModelSettings::fromSettings(QSettings *s)
{ {
@@ -45,6 +46,8 @@ void CppCodeModelSettings::fromSettings(QSettings *s)
foreach (const QString &mimeType, supportedMimeTypes()) foreach (const QString &mimeType, supportedMimeTypes())
setIdForMimeType(supporters, mimeType); setIdForMimeType(supporters, mimeType);
setExtraClangOptions(s->value(clangExtraOptionsKey, defaultExtraClangOptions()).toStringList());
QVariant v = s->value(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), PchUse_None); QVariant v = s->value(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), PchUse_None);
setPCHUsage(static_cast<PCHUsage>(v.toInt())); setPCHUsage(static_cast<PCHUsage>(v.toInt()));
s->endGroup(); s->endGroup();
@@ -59,6 +62,7 @@ void CppCodeModelSettings::toSettings(QSettings *s)
foreach (const QString &mimeType, m_modelManagerSupportByMimeType.keys()) foreach (const QString &mimeType, m_modelManagerSupportByMimeType.keys())
var[mimeType] = m_modelManagerSupportByMimeType[mimeType]; var[mimeType] = m_modelManagerSupportByMimeType[mimeType];
s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY), QVariant(var)); s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY), QVariant(var));
s->setValue(clangExtraOptionsKey, extraClangOptions());
s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), pchUsage()); s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), pchUsage());
s->endGroup(); s->endGroup();
@@ -116,6 +120,33 @@ bool CppCodeModelSettings::hasModelManagerSupportIdForMimeType(const QString &mi
return m_modelManagerSupportByMimeType.value(mimeType) == id; return m_modelManagerSupportByMimeType.value(mimeType) == id;
} }
QStringList CppCodeModelSettings::defaultExtraClangOptions()
{
return {
QStringLiteral("-Weverything"),
QStringLiteral("-Wno-c++98-compat"),
QStringLiteral("-Wno-c++98-compat-pedantic"),
QStringLiteral("-Wno-unused-macros"),
QStringLiteral("-Wno-newline-eof"),
QStringLiteral("-Wno-exit-time-destructors"),
QStringLiteral("-Wno-global-constructors"),
QStringLiteral("-Wno-gnu-zero-variadic-macro-arguments"),
QStringLiteral("-Wno-documentation"),
QStringLiteral("-Wno-shadow"),
QStringLiteral("-Wno-missing-prototypes"), // Not optimal for C projects.
};
}
QStringList CppCodeModelSettings::extraClangOptions() const
{
return m_extraClangOptions;
}
void CppCodeModelSettings::setExtraClangOptions(const QStringList &extraClangOptions)
{
m_extraClangOptions = extraClangOptions;
}
void CppCodeModelSettings::setIdForMimeType(const QVariant &var, const QString &mimeType) void CppCodeModelSettings::setIdForMimeType(const QVariant &var, const QString &mimeType)
{ {
QHash<QString, QVariant> mimeToId = var.toHash(); QHash<QString, QVariant> mimeToId = var.toHash();

View File

@@ -73,6 +73,10 @@ public:
void setDefaultId(const QString &defaultId) void setDefaultId(const QString &defaultId)
{ m_defaultId = defaultId; } { m_defaultId = defaultId; }
static QStringList defaultExtraClangOptions();
QStringList extraClangOptions() const;
void setExtraClangOptions(const QStringList &extraClangOptions);
PCHUsage pchUsage() const { return m_pchUsage; } PCHUsage pchUsage() const { return m_pchUsage; }
void setPCHUsage(PCHUsage pchUsage) { m_pchUsage = pchUsage; } void setPCHUsage(PCHUsage pchUsage) { m_pchUsage = pchUsage; }
@@ -90,6 +94,7 @@ private:
private: private:
QHash<QString, QString> m_modelManagerSupportByMimeType; QHash<QString, QString> m_modelManagerSupportByMimeType;
QHash<QString, QString> m_modelManagerSupportsByName; QHash<QString, QString> m_modelManagerSupportsByName;
QStringList m_extraClangOptions;
QString m_defaultId; QString m_defaultId;
PCHUsage m_pchUsage; PCHUsage m_pchUsage;
}; };

View File

@@ -46,7 +46,11 @@ CppCodeModelSettingsWidget::CppCodeModelSettingsWidget(QWidget *parent)
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
m_ui->theGroupBox->setVisible(true); m_ui->clangSettingsGroupBox->setVisible(true);
connect(m_ui->clangOptionsResetButton, &QPushButton::clicked, [this]() {
const QString options = m_settings->defaultExtraClangOptions().join(QLatin1Char('\n'));
m_ui->clangOptionsToAppendTextEdit->document()->setPlainText(options);
});
} }
CppCodeModelSettingsWidget::~CppCodeModelSettingsWidget() CppCodeModelSettingsWidget::~CppCodeModelSettingsWidget()
@@ -96,8 +100,11 @@ void CppCodeModelSettingsWidget::setupClangCodeModelWidgets() const
isClangActive = isClangCodeModelActive(*m_settings.data()); isClangActive = isClangCodeModelActive(*m_settings.data());
m_ui->activateClangCodeModelPluginHint->setVisible(!isClangAvailable); m_ui->activateClangCodeModelPluginHint->setVisible(!isClangAvailable);
m_ui->useClangCheckBox->setEnabled(isClangAvailable); m_ui->clangSettingsGroupBox->setEnabled(isClangAvailable);
m_ui->useClangCheckBox->setChecked(isClangActive); m_ui->clangSettingsGroupBox->setChecked(isClangActive);
const QString extraClangOptions = m_settings->extraClangOptions().join(QLatin1Char('\n'));
m_ui->clangOptionsToAppendTextEdit->document()->setPlainText(extraClangOptions);
} }
bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const
@@ -106,13 +113,18 @@ bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const
// Until then, ensure that the settings are set uniformly for all the mime types // Until then, ensure that the settings are set uniformly for all the mime types
// to avoid surprises. // to avoid surprises.
const QString activeCodeModelId = m_ui->useClangCheckBox->isChecked() const QString activeCodeModelId = m_ui->clangSettingsGroupBox->isChecked()
? QLatin1String("ClangCodeMode.ClangCodeMode") ? QLatin1String("ClangCodeMode.ClangCodeMode")
: QLatin1String("CppTools.BuiltinCodeModel"); : QLatin1String("CppTools.BuiltinCodeModel");
foreach (const QString &mimeType, m_settings->supportedMimeTypes()) foreach (const QString &mimeType, m_settings->supportedMimeTypes())
m_settings->setModelManagerSupportIdForMimeType(mimeType, activeCodeModelId); m_settings->setModelManagerSupportIdForMimeType(mimeType, activeCodeModelId);
const QString clangOptionsText = m_ui->clangOptionsToAppendTextEdit->document()->toPlainText();
const QStringList extraClangOptions = clangOptionsText.split(QLatin1Char('\n'),
QString::SkipEmptyParts);
m_settings->setExtraClangOptions(extraClangOptions);
return true; return true;
} }

View File

@@ -15,27 +15,54 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QGroupBox" name="theGroupBox"> <widget class="QLabel" name="activateClangCodeModelPluginHint">
<property name="title"> <property name="text">
<string>Code Completion and Semantic Highlighting</string> <string>&lt;i&gt;Activate the Clang Code Model plugin to enable the options here.&lt;/i&gt;</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> </widget>
<property name="fieldGrowthPolicy"> </item>
<enum>QFormLayout::AllNonFixedFieldsGrow</enum> <item>
</property> <widget class="QGroupBox" name="clangSettingsGroupBox">
<item row="1" column="0"> <property name="title">
<widget class="QCheckBox" name="useClangCheckBox"> <string>Use Clang Code Model</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="clangOptionsGeneralHintLabel">
<property name="text"> <property name="text">
<string>Use Clang Code Model</string> <string>Append additional command line options to Clang, one per line. &lt;i&gt;Use this with care.&lt;/i&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item>
<widget class="QLabel" name="activateClangCodeModelPluginHint"> <widget class="QPlainTextEdit" name="clangOptionsToAppendTextEdit"/>
<property name="text"> </item>
<string>&lt;i&gt;Activate the Clang Code Model plugin to enable the options here.&lt;/i&gt;</string> <item>
</property> <layout class="QHBoxLayout" name="horizontalLayout">
</widget> <item>
<widget class="QPushButton" name="clangOptionsResetButton">
<property name="text">
<string>Reset Options</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@@ -55,6 +55,7 @@ enum { lowerCaseFilesDefault = 1 };
const char CPPTOOLS_SORT_EDITOR_DOCUMENT_OUTLINE[] = "SortedMethodOverview"; const char CPPTOOLS_SORT_EDITOR_DOCUMENT_OUTLINE[] = "SortedMethodOverview";
const char CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY[] = "ModelManagerSupporters"; const char CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY[] = "ModelManagerSupporters";
const char CPPTOOLS_MODEL_MANAGER_PCH_USAGE[] = "PCHUsage"; const char CPPTOOLS_MODEL_MANAGER_PCH_USAGE[] = "PCHUsage";
const char CPPTOOLS_EXTRA_CLANG_OPTIONS[] = "ExtraClangOptions";
const char CPP_CODE_STYLE_SETTINGS_ID[] = "A.Cpp.Code Style"; const char CPP_CODE_STYLE_SETTINGS_ID[] = "A.Cpp.Code Style";
const char CPP_CODE_STYLE_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Code Style"); const char CPP_CODE_STYLE_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Code Style");