diff options
Diffstat (limited to 'src/plugins/cppeditor/cppeditorwidget.cpp')
-rw-r--r-- | src/plugins/cppeditor/cppeditorwidget.cpp | 80 |
1 files changed, 74 insertions, 6 deletions
diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp index 2ce2c1092b..8861cd63e9 100644 --- a/src/plugins/cppeditor/cppeditorwidget.cpp +++ b/src/plugins/cppeditor/cppeditorwidget.cpp @@ -45,7 +45,6 @@ #include <coreplugin/editormanager/documentmodel.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/find/searchresultwindow.h> -#include <coreplugin/infobar.h> #include <cpptools/cppcanonicalsymbol.h> #include <cpptools/cppchecksymbols.h> @@ -83,6 +82,7 @@ #include <cplusplus/ASTPath.h> #include <cplusplus/FastPreprocessor.h> #include <cplusplus/MatchingText.h> +#include <utils/infobar.h> #include <utils/progressindicator.h> #include <utils/qtcassert.h> #include <utils/textutils.h> @@ -105,6 +105,7 @@ using namespace Core; using namespace CPlusPlus; using namespace CppTools; using namespace TextEditor; +using namespace Utils; namespace CppEditor { namespace Internal { @@ -326,7 +327,8 @@ void CppEditorWidget::onCodeWarningsUpdated(unsigned revision, if (revision != documentRevision()) return; - setExtraSelections(TextEditorWidget::CodeWarningsSelection, selections); + setExtraSelections(TextEditorWidget::CodeWarningsSelection, + unselectLeadingWhitespace(selections)); setRefactorMarkers(refactorMarkers + RefactorMarker::filterOutType( this->refactorMarkers(), CppTools::Constants::CPP_CLANG_FIXIT_AVAILABLE_MARKER_ID)); } @@ -696,6 +698,7 @@ void CppEditorWidget::switchDeclarationDefinition(bool inNextSplit) // Find function declaration or definition under cursor Function *functionDefinitionSymbol = nullptr; Symbol *functionDeclarationSymbol = nullptr; + Symbol *declarationSymbol = nullptr; ASTPath astPathFinder(d->m_lastSemanticInfo.doc); const QList<AST *> astPath = astPathFinder(textCursor()); @@ -707,9 +710,12 @@ void CppEditorWidget::switchDeclarationDefinition(bool inNextSplit) } else if (SimpleDeclarationAST *simpleDeclaration = ast->asSimpleDeclaration()) { if (List<Symbol *> *symbols = simpleDeclaration->symbols) { if (Symbol *symbol = symbols->value) { - if (symbol->isDeclaration() && symbol->type()->isFunctionType()) { - functionDeclarationSymbol = symbol; - break; // Function declaration found! + if (symbol->isDeclaration()) { + declarationSymbol = symbol; + if (symbol->type()->isFunctionType()) { + functionDeclarationSymbol = symbol; + break; // Function declaration found! + } } } } @@ -723,6 +729,11 @@ void CppEditorWidget::switchDeclarationDefinition(bool inNextSplit) ->findMatchingDefinition(functionDeclarationSymbol, d->m_modelManager->snapshot()); if (symbol) symbolLink = symbol->toLink(); + } else if (declarationSymbol) { + Symbol *symbol = d->m_modelManager->symbolFinder() + ->findMatchingVarDefinition(declarationSymbol, d->m_modelManager->snapshot()); + if (symbol) + symbolLink = symbol->toLink(); } else if (functionDefinitionSymbol) { const Snapshot snapshot = d->m_modelManager->snapshot(); LookupContext context(d->m_lastSemanticInfo.doc, snapshot); @@ -860,7 +871,7 @@ protected: QMenu *CppEditorWidget::createRefactorMenu(QWidget *parent) const { auto *menu = new QMenu(tr("&Refactor"), parent); - menu->addAction(ActionManager::command(Constants::RENAME_SYMBOL_UNDER_CURSOR)->action()); + menu->addAction(ActionManager::command(TextEditor::Constants::RENAME_SYMBOL)->action()); // ### enable // updateSemanticInfo(m_semanticHighlighter->semanticInfo(currentSource())); @@ -1154,6 +1165,63 @@ void CppEditorWidget::invokeTextEditorWidgetAssist(TextEditor::AssistKind assist invokeAssist(assistKind, provider); } +const QList<QTextEdit::ExtraSelection> CppEditorWidget::unselectLeadingWhitespace( + const QList<QTextEdit::ExtraSelection> &selections) +{ + QList<QTextEdit::ExtraSelection> filtered; + for (const QTextEdit::ExtraSelection &sel : selections) { + QList<QTextEdit::ExtraSelection> splitSelections; + int firstNonWhitespacePos = -1; + int lastNonWhitespacePos = -1; + bool split = false; + const QTextBlock firstBlock = sel.cursor.document()->findBlock(sel.cursor.selectionStart()); + bool inIndentation = firstBlock.position() == sel.cursor.selectionStart(); + const auto createSplitSelection = [&] { + QTextEdit::ExtraSelection newSelection; + newSelection.cursor = QTextCursor(sel.cursor.document()); + newSelection.cursor.setPosition(firstNonWhitespacePos); + newSelection.cursor.setPosition(lastNonWhitespacePos + 1, QTextCursor::KeepAnchor); + newSelection.format = sel.format; + splitSelections << newSelection; + }; + for (int i = sel.cursor.selectionStart(); i < sel.cursor.selectionEnd(); ++i) { + const QChar curChar = sel.cursor.document()->characterAt(i); + if (!curChar.isSpace()) { + if (firstNonWhitespacePos == -1) + firstNonWhitespacePos = i; + lastNonWhitespacePos = i; + } + if (!inIndentation) { + if (curChar == QChar::ParagraphSeparator) + inIndentation = true; + continue; + } + if (curChar == QChar::ParagraphSeparator) + continue; + if (curChar.isSpace()) { + if (firstNonWhitespacePos != -1) { + createSplitSelection(); + firstNonWhitespacePos = -1; + lastNonWhitespacePos = -1; + } + split = true; + continue; + } + inIndentation = false; + } + + if (!split) { + filtered << sel; + continue; + } + + if (firstNonWhitespacePos != -1) + createSplitSelection(); + filtered << splitSelections; + } + return filtered; +} + } // namespace Internal } // namespace CppEditor |