aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cppeditor/cppeditorwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cppeditor/cppeditorwidget.cpp')
-rw-r--r--src/plugins/cppeditor/cppeditorwidget.cpp80
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