diff options
Diffstat (limited to 'src/plugins/cppeditor/quickfixes/cppquickfix.cpp')
-rw-r--r-- | src/plugins/cppeditor/quickfixes/cppquickfix.cpp | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/src/plugins/cppeditor/quickfixes/cppquickfix.cpp b/src/plugins/cppeditor/quickfixes/cppquickfix.cpp new file mode 100644 index 0000000000..a4052db83e --- /dev/null +++ b/src/plugins/cppeditor/quickfixes/cppquickfix.cpp @@ -0,0 +1,187 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "cppquickfix.h" + +#include "../baseeditordocumentprocessor.h" +#include "../cppeditortr.h" +#include "../cppeditorwidget.h" +#include "../cppfunctiondecldeflink.h" +#include "../cpprefactoringchanges.h" +#include "assigntolocalvariable.h" +#include "bringidentifierintoscope.h" +#include "completeswitchstatement.h" +#include "convertfromandtopointer.h" +#include "convertnumericliteral.h" +#include "convertqt4connect.h" +#include "convertstringliteral.h" +#include "converttocamelcase.h" +#include "converttometamethodcall.h" +#include "cppcodegenerationquickfixes.h" +#include "cppinsertvirtualmethods.h" +#include "cppquickfixassistant.h" +#include "createdeclarationfromuse.h" +#include "extractfunction.h" +#include "extractliteralasparameter.h" +#include "insertfunctiondefinition.h" +#include "logicaloperationquickfixes.h" +#include "moveclasstoownfile.h" +#include "movefunctiondefinition.h" +#include "rearrangeparamdeclarationlist.h" +#include "reformatpointerdeclaration.h" +#include "removeusingnamespace.h" +#include "rewritecomment.h" +#include "rewritecontrolstatements.h" +#include "splitsimpledeclaration.h" +#include "synchronizememberfunctionorder.h" + +#include <extensionsystem/pluginmanager.h> +#include <extensionsystem/pluginspec.h> + +using namespace CPlusPlus; +using namespace TextEditor; + +namespace CppEditor { +namespace Internal { +namespace { + +class ApplyDeclDefLinkOperation : public CppQuickFixOperation +{ +public: + explicit ApplyDeclDefLinkOperation(const CppQuickFixInterface &interface, + const std::shared_ptr<FunctionDeclDefLink> &link) + : CppQuickFixOperation(interface, 100) + , m_link(link) + {} + + void perform() override + { + if (editor()->declDefLink() == m_link) + editor()->applyDeclDefLinkChanges(/*don't jump*/false); + } + +private: + std::shared_ptr<FunctionDeclDefLink> m_link; +}; + +class ExtraRefactoringOperations : public CppQuickFixFactory +{ +public: + void doMatch(const CppQuickFixInterface &interface, QuickFixOperations &result) override + { + const auto processor = CppModelManager::cppEditorDocumentProcessor(interface.filePath()); + if (processor) { + const auto clangFixItOperations = processor->extraRefactoringOperations(interface); + result.append(clangFixItOperations); + } + } +}; + +//! Applies function signature changes +class ApplyDeclDefLinkChanges: public CppQuickFixFactory +{ +public: + void doMatch(const CppQuickFixInterface &interface, TextEditor::QuickFixOperations &result) override + { + std::shared_ptr<FunctionDeclDefLink> link = interface.editor()->declDefLink(); + if (!link || !link->isMarkerVisible()) + return; + + auto op = new ApplyDeclDefLinkOperation(interface, link); + op->setDescription(Tr::tr("Apply Function Signature Changes")); + result << op; + } +}; + +} // namespace + +static ExtensionSystem::IPlugin *getCppEditor() +{ + using namespace ExtensionSystem; + for (PluginSpec * const spec : PluginManager::plugins()) { + if (spec->name() == "CppEditor") + return spec->plugin(); + } + QTC_ASSERT(false, return nullptr); +} + +CppQuickFixOperation::~CppQuickFixOperation() = default; + +void createCppQuickFixFactories() +{ + new ApplyDeclDefLinkChanges; + new ExtraRefactoringOperations; + + registerAssignToLocalVariableQuickfix(); + registerBringIdentifierIntoScopeQuickfixes(); + registerCodeGenerationQuickfixes(); + registerCompleteSwitchStatementQuickfix(); + registerConvertFromAndToPointerQuickfix(); + registerConvertNumericLiteralQuickfix(); + registerConvertQt4ConnectQuickfix(); + registerConvertStringLiteralQuickfixes(); + registerConvertToCamelCaseQuickfix(); + registerConvertToMetaMethodCallQuickfix(); + registerCreateDeclarationFromUseQuickfixes(); + registerExtractFunctionQuickfix(); + registerExtractLiteralAsParameterQuickfix(); + registerInsertFunctionDefinitionQuickfixes(); + registerInsertVirtualMethodsQuickfix(); + registerLogicalOperationQuickfixes(); + registerMoveClassToOwnFileQuickfix(); + registerMoveFunctionDefinitionQuickfixes(); + registerRearrangeParamDeclarationListQuickfix(); + registerReformatPointerDeclarationQuickfix(); + registerRemoveUsingNamespaceQuickfix(); + registerRewriteCommentQuickfixes(); + registerRewriteControlStatementQuickfixes(); + registerSplitSimpleDeclarationQuickfix(); + registerSynchronizeMemberFunctionOrderQuickfix(); +} + +static QList<CppQuickFixFactory *> g_cppQuickFixFactories; + +void destroyCppQuickFixFactories() +{ + for (int i = g_cppQuickFixFactories.size(); --i >= 0; ) + delete g_cppQuickFixFactories.at(i); +} + +} // namespace Internal + +CppQuickFixFactory::CppQuickFixFactory() +{ + Internal::g_cppQuickFixFactories.append(this); +} + +CppQuickFixFactory::~CppQuickFixFactory() +{ + Internal::g_cppQuickFixFactories.removeOne(this); +} + +ExtensionSystem::IPlugin *CppQuickFixFactory::cppEditor() +{ + static ExtensionSystem::IPlugin * const plugin = Internal::getCppEditor(); + return plugin; +} + +void CppQuickFixFactory::match(const Internal::CppQuickFixInterface &interface, + QuickFixOperations &result) +{ + if (m_clangdReplacement) { + if (const auto clangdVersion = CppModelManager::usesClangd( + interface.currentFile()->editor()->textDocument()); + clangdVersion && clangdVersion >= m_clangdReplacement) { + return; + } + } + + doMatch(interface, result); +} + +const QList<CppQuickFixFactory *> &CppQuickFixFactory::cppQuickFixFactories() +{ + return Internal::g_cppQuickFixFactories; +} + +} // namespace CppEditor |