From 92407fc7670c1cdbc89c84a7b3a5f00f5fbb356e Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Wed, 20 Mar 2024 20:35:47 +0800 Subject: [PATCH] fix #286 : Show type completion info after 'const' and 'volatile' --- NEWS.md | 1 + RedPandaIDE/editor.cpp | 28 +++++++++++++++++++++------- RedPandaIDE/editor.h | 2 +- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/NEWS.md b/NEWS.md index bc641fcd..07404540 100644 --- a/NEWS.md +++ b/NEWS.md @@ -60,6 +60,7 @@ Red Panda C++ Version 2.27 - fix: Custom compile options not correctly parsed. - enhancement: "Mouse scroll direction" option in Options / Editor / General - change: Invert scroll direction in horizontal, like in vertical. + - enhancement: Show type completion info after 'const' and 'volatile' Red Panda C++ Version 2.26 - enhancement: Code suggestion for embedded std::vectors. diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 1241ddb3..a08cd524 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -876,9 +876,16 @@ void Editor::keyPressEvent(QKeyEvent *event) handled=true; return; } else { - QString lastWord = getPreviousWordAtPositionForSuggestion(ws); - if (mParser && !lastWord.isEmpty()) { - if (lastWord == "typedef" || lastWord == "const") { + bool hasConst; + QString lastWord = getPreviousWordAtPositionForSuggestion(ws, hasConst); + if (mParser && (!lastWord.isEmpty() || hasConst)) { + if (lastWord.isEmpty()) { + Q_ASSERT(hasConst); + processCommand(QSynedit::EditCommand::Char,ch,nullptr); + showCompletion(lastWord,false, CodeCompletionType::Types); + handled=true; + return; + } else if ( lastWord == "typedef" ) { processCommand(QSynedit::EditCommand::Char,ch,nullptr); showCompletion(lastWord,false, CodeCompletionType::Types); handled=true; @@ -1436,7 +1443,8 @@ void Editor::inputMethodEvent(QInputMethodEvent *event) int idCharPressed=caretX()-ws.ch; idCharPressed += s.length(); if (idCharPressed>=pSettings->codeCompletion().minCharRequired()) { - QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY()); + bool hasConst; + QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY(), hasConst); if (mParser && !lastWord.isEmpty()) { if (CppTypeKeywords.contains(lastWord)) { return; @@ -4319,8 +4327,9 @@ void Editor::updateFunctionTip(bool showTip) //handle class initializer if (x >= 0 && hasPreviousWord) { QSynedit::BufferCoord pos = pWordBegin; + bool hasConst; pos.ch = pWordBegin.ch; - QString previousWord = getPreviousWordAtPositionForSuggestion(pos); + QString previousWord = getPreviousWordAtPositionForSuggestion(pos, hasConst); PStatement statement = mParser->findStatementOf( mFilename, @@ -4912,8 +4921,9 @@ QString getWordAtPosition(QSynedit::QSynEdit *editor, const QSynedit::BufferCoor return result; } -QString Editor::getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoord &p) +QString Editor::getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoord &p, bool &hasConst) { + hasConst = false; QString result; if ((p.line<1) || (p.line>document()->count())) { return ""; @@ -4969,8 +4979,12 @@ QString Editor::getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoo return ""; result = s.mid(wordBegin, wordEnd - wordBegin+1); - if ((result != "const") && !skipNextWord) + if (result == "const" || result == "volatile") + hasConst = true; + else if (!skipNextWord) break; + // if ((result != "const") && !skipNextWord) + // break; wordEnd = wordBegin-1; } return result; diff --git a/RedPandaIDE/editor.h b/RedPandaIDE/editor.h index 0781d3b8..be2357a6 100644 --- a/RedPandaIDE/editor.h +++ b/RedPandaIDE/editor.h @@ -184,7 +184,7 @@ public: void removeBreakpointFocus(); void modifyBreakpointProperty(int line); void setActiveBreakpointFocus(int Line, bool setFocus=true); - QString getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoord& p); + QString getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoord& p, bool &hasConst); QString getPreviousWordAtPositionForCompleteFunctionDefinition(const QSynedit::BufferCoord& p); void reformat(bool doReparse=true); void checkSyntaxInBack();