diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-01-22 09:40:04 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-01-24 11:51:45 +0000 |
commit | 6b38c73205135834cd30fb2efea613b05f677127 (patch) | |
tree | 2810dd9c4cccb810626d97dfc512568b35be37cf /src/plugins | |
parent | b31978a2f7974237f2d2363bcaed18c51b734172 (diff) | |
download | qt-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.cpp | 238 | ||||
-rw-r--r-- | src/plugins/clangcodemodel/clangeditordocumentprocessor.h | 4 |
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: |