summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2018-01-22 09:40:04 +0100
committerNikolai Kosjar <nikolai.kosjar@qt.io>2018-01-24 11:51:45 +0000
commit6b38c73205135834cd30fb2efea613b05f677127 (patch)
tree2810dd9c4cccb810626d97dfc512568b35be37cf /src/plugins
parentb31978a2f7974237f2d2363bcaed18c51b734172 (diff)
downloadqt-creator-6b38c73205135834cd30fb2efea613b05f677127.tar.gz
Clang: Centralize gathering file argument into one class
Similar to CompilerOptionsBuilder. Change-Id: Ifac0efe37608562912af20a1c22f85e5e9308094 Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp238
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.h4
2 files changed, 126 insertions, 116 deletions
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
index 03f0d2609e..b0c1959dbb 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
@@ -421,6 +421,125 @@ void ClangEditorDocumentProcessor::onParserFinished()
updateProjectPartAndTranslationUnitForEditor();
}
+namespace {
+// TODO: Can we marry this with CompilerOptionsBuilder?
+class FileOptionsBuilder
+{
+public:
+ FileOptionsBuilder(const QString &filePath, CppTools::ProjectPart &projectPart)
+ : m_filePath(filePath)
+ , m_projectPart(projectPart)
+ {
+ addLanguageOptions();
+ addDiagnosticOptions();
+ addGlobalOptions();
+ addPrecompiledHeaderOptions();
+ }
+
+ const QStringList &options() const { return m_options; }
+
+private:
+ void addLanguageOptions()
+ {
+ // Determine file kind with respect to ambiguous headers.
+ CppTools::ProjectFile::Kind fileKind = CppTools::ProjectFile::classify(m_filePath);
+ if (fileKind == CppTools::ProjectFile::AmbiguousHeader) {
+ fileKind = m_projectPart.languageVersion <= CppTools::ProjectPart::LatestCVersion
+ ? CppTools::ProjectFile::CHeader
+ : CppTools::ProjectFile::CXXHeader;
+ }
+
+ CppTools::CompilerOptionsBuilder builder(m_projectPart);
+ builder.addLanguageOption(fileKind);
+
+ m_options.append(builder.options());
+ }
+
+ void addDiagnosticOptions()
+ {
+ if (m_projectPart.project) {
+ ClangProjectSettings projectSettings(m_projectPart.project);
+ if (!projectSettings.useGlobalConfig()) {
+ const Core::Id warningConfigId = projectSettings.warningConfigId();
+ const CppTools::ClangDiagnosticConfigsModel configsModel(
+ CppTools::codeModelSettings()->clangCustomDiagnosticConfigs());
+ if (configsModel.hasConfigWithId(warningConfigId)) {
+ m_options.append(
+ configsModel.configWithId(warningConfigId).commandLineWarnings());
+ return;
+ }
+ }
+ }
+
+ m_options.append(
+ CppTools::codeModelSettings()->clangDiagnosticConfig().commandLineWarnings());
+ }
+
+ void addXclangArg(const QString &argName, const QString &argValue = QString())
+ {
+ m_options.append("-Xclang");
+ m_options.append(argName);
+ if (!argValue.isEmpty()) {
+ m_options.append("-Xclang");
+ m_options.append(argValue);
+ }
+ }
+
+ void addTidyOptions()
+ {
+ const QString tidyChecks = CppTools::codeModelSettings()->tidyChecks();
+ if (tidyChecks.isEmpty())
+ return;
+
+ addXclangArg("-add-plugin", "clang-tidy");
+ addXclangArg("-plugin-arg-clang-tidy", "-checks='-*" + tidyChecks + "'");
+ }
+
+ void addClazyOptions()
+ {
+ const QString clazyChecks = CppTools::codeModelSettings()->clazyChecks();
+ if (clazyChecks.isEmpty())
+ return;
+
+ addXclangArg("-add-plugin", "clang-lazy");
+ addXclangArg("-plugin-arg-clang-lazy", clazyChecks);
+ }
+
+ void addGlobalOptions()
+ {
+ if (!m_projectPart.project)
+ m_options.append(ClangProjectSettings::globalCommandLineOptions());
+ else
+ m_options.append(ClangProjectSettings{m_projectPart.project}.commandLineOptions());
+
+ addTidyOptions();
+ addClazyOptions();
+ }
+
+ void addPrecompiledHeaderOptions()
+ {
+ using namespace CppTools;
+
+ if (getPchUsage() == CompilerOptionsBuilder::PchUsage::None)
+ return;
+
+ if (m_projectPart.precompiledHeaders.contains(m_filePath))
+ return;
+
+ CompilerOptionsBuilder builder(m_projectPart);
+ builder.addPrecompiledHeaderOptions(CompilerOptionsBuilder::PchUsage::Use);
+
+ m_options.append(builder.options());
+ }
+
+private:
+ const QString &m_filePath;
+ const CppTools::ProjectPart &m_projectPart;
+
+ QStringList m_options;
+};
+} // namespace
+
void ClangEditorDocumentProcessor::registerTranslationUnitForEditor(
CppTools::ProjectPart &projectPart)
{
@@ -438,8 +557,9 @@ void ClangEditorDocumentProcessor::registerTranslationUnitForEditor(
return;
}
+ const FileOptionsBuilder fileOptions(filePath(), projectPart);
m_communicator.registerTranslationUnitsForEditor(
- {fileContainerWithArgumentsAndDocumentContent(projectPart)});
+ {fileContainerWithOptionsAndDocumentContent(projectPart, fileOptions.options())});
ClangCodeModel::Utils::setLastSentDocumentRevision(filePath(), revision());
}
@@ -504,122 +624,12 @@ ClangBackEnd::FileContainer ClangEditorDocumentProcessor::simpleFileContainer(
Utf8String::fromByteArray(codecName));
}
-static QStringList languageOptions(const QString &filePath, CppTools::ProjectPart &projectPart)
+ClangBackEnd::FileContainer ClangEditorDocumentProcessor::fileContainerWithOptionsAndDocumentContent(
+ CppTools::ProjectPart &projectPart, const QStringList &fileOptions) const
{
- // Determine file kind with respect to ambiguous headers.
- CppTools::ProjectFile::Kind fileKind = CppTools::ProjectFile::classify(filePath);
- if (fileKind == CppTools::ProjectFile::AmbiguousHeader) {
- fileKind = projectPart.languageVersion <= CppTools::ProjectPart::LatestCVersion
- ? CppTools::ProjectFile::CHeader
- : CppTools::ProjectFile::CXXHeader;
- }
-
- CppTools::CompilerOptionsBuilder builder(projectPart);
- builder.addLanguageOption(fileKind);
-
- return builder.options();
-}
-
-static QStringList warningOptions(CppTools::ProjectPart &projectPart)
-{
- if (projectPart.project) {
- ClangProjectSettings projectSettings(projectPart.project);
- if (!projectSettings.useGlobalConfig()) {
- const Core::Id warningConfigId = projectSettings.warningConfigId();
- const CppTools::ClangDiagnosticConfigsModel configsModel(
- CppTools::codeModelSettings()->clangCustomDiagnosticConfigs());
- if (configsModel.hasConfigWithId(warningConfigId))
- return configsModel.configWithId(warningConfigId).commandLineWarnings();
- }
- }
-
- return CppTools::codeModelSettings()->clangDiagnosticConfig().commandLineWarnings();
-}
-
-static void addXclangArg(QStringList &list, const QString &argName,
- const QString &argValue = QString())
-{
- list.append("-Xclang");
- list.append(argName);
- if (!argValue.isEmpty()) {
- list.append("-Xclang");
- list.append(argValue);
- }
-}
-
-static QStringList tidyCommandLine()
-{
- const QString tidyChecks = CppTools::codeModelSettings()->tidyChecks();
-
- if (tidyChecks.isEmpty())
- return QStringList();
-
- QStringList result;
- addXclangArg(result, "-add-plugin", "clang-tidy");
- addXclangArg(result, "-plugin-arg-clang-tidy", "-checks='-*" + tidyChecks + "'");
- return result;
-}
-
-static QStringList clazyCommandLine()
-{
- const QString clazyChecks = CppTools::codeModelSettings()->clazyChecks();
-
- if (clazyChecks.isEmpty())
- return QStringList();
-
- QStringList result;
- addXclangArg(result, "-add-plugin", "clang-lazy");
- addXclangArg(result, "-plugin-arg-clang-lazy", clazyChecks);
- return result;
-}
-
-static QStringList commandLineOptions(CppTools::ProjectPart &projectPart)
-{
- QStringList result;
- if (!projectPart.project)
- result.append(ClangProjectSettings::globalCommandLineOptions());
- else
- result.append(ClangProjectSettings{projectPart.project}.commandLineOptions());
- result.append(tidyCommandLine());
- result.append(clazyCommandLine());
- return result;
-}
-
-static QStringList precompiledHeaderOptions(
- const QString& filePath,
- CppTools::ProjectPart &projectPart)
-{
- using namespace CppTools;
-
- if (CppTools::getPchUsage() == CompilerOptionsBuilder::PchUsage::None)
- return QStringList();
-
- if (projectPart.precompiledHeaders.contains(filePath))
- return QStringList();
-
- CppTools::CompilerOptionsBuilder builder(projectPart);
- builder.addPrecompiledHeaderOptions(CompilerOptionsBuilder::PchUsage::Use);
-
- return builder.options();
-}
-
-static QStringList fileArguments(const QString &filePath, CppTools::ProjectPart &projectPart)
-{
- return languageOptions(filePath, projectPart)
- + warningOptions(projectPart)
- + commandLineOptions(projectPart)
- + precompiledHeaderOptions(filePath, projectPart);
-}
-
-ClangBackEnd::FileContainer
-ClangEditorDocumentProcessor::fileContainerWithArgumentsAndDocumentContent(
- CppTools::ProjectPart &projectPart) const
-{
- const QStringList theFileArguments = fileArguments(filePath(), projectPart);
-
return ClangBackEnd::FileContainer(filePath(),
projectPart.id(),
- Utf8StringVector(theFileArguments),
+ Utf8StringVector(fileOptions),
textDocument()->toPlainText(),
true,
revision());
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
index 0363392e8f..67ef0bc8a5 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
@@ -110,8 +110,8 @@ private:
HeaderErrorDiagnosticWidgetCreator creatorForHeaderErrorDiagnosticWidget(
const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic);
ClangBackEnd::FileContainer simpleFileContainer(const QByteArray &codecName = QByteArray()) const;
- ClangBackEnd::FileContainer fileContainerWithArgumentsAndDocumentContent(
- CppTools::ProjectPart &projectPart) const;
+ ClangBackEnd::FileContainer fileContainerWithOptionsAndDocumentContent(
+ CppTools::ProjectPart &projectPart, const QStringList &fileOptions) const;
ClangBackEnd::FileContainer fileContainerWithDocumentContent(const QString &projectpartId) const;
private: