From e291a2e2fb926896aa8811cf4dfa36c7cb042697 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Fri, 22 Mar 2024 19:53:09 +0800 Subject: [PATCH] fix #300 - enhancement: Show type completion hint after "constexpr"/"extern"/"static"/"consteval"/"constinit"/"const"/"volatile" etc. --- NEWS.md | 3 +-- RedPandaIDE/editor.cpp | 35 +++++++++++++++++++++++------------ RedPandaIDE/editor.h | 2 +- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/NEWS.md b/NEWS.md index 8d673b49..ba764a35 100644 --- a/NEWS.md +++ b/NEWS.md @@ -60,7 +60,6 @@ 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' - fix: Caret unseen when move to a long line end by press END. - fix: No icons for inherited class private members. - fix: Ctrl+Return insert linebreak shouldn't scroll unnecessarilly. @@ -78,7 +77,7 @@ Red Panda C++ Version 2.27 - enhancement: Improvement in italic font support. - fix: History not correctly loaded with up/down arrow key in the debug console. - enhancement: Improve lambda support. - + - enhancement: Show type completion hint after "constexpr"/"extern"/"static"/"consteval"/"constinit"/"const"/"volatile" etc. Red Panda C++ Version 2.26 - enhancement: Code suggestion for embedded std::vectors. diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 7fd80c30..2785b05d 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -58,6 +58,17 @@ QHash> Editor::mSharedParsers; +static QSet CppTypeQualifiers { + "const", + "consteval", + "constexpr", + "constinit", + "extern", + "static", + "mutable", + "volatile", +}; + Editor::Editor(QWidget *parent): Editor(parent,"untitled",ENCODING_AUTO_DETECT,nullptr,true,nullptr) { @@ -875,11 +886,11 @@ void Editor::keyPressEvent(QKeyEvent *event) handled=true; return; } else { - bool hasConst; - QString lastWord = getPreviousWordAtPositionForSuggestion(ws, hasConst); - if (mParser && (!lastWord.isEmpty() || hasConst)) { + bool hasTypeQualifier; + QString lastWord = getPreviousWordAtPositionForSuggestion(ws, hasTypeQualifier); + if (mParser && (!lastWord.isEmpty() || hasTypeQualifier)) { if (lastWord.isEmpty()) { - Q_ASSERT(hasConst); + Q_ASSERT(hasTypeQualifier); processCommand(QSynedit::EditCommand::Char,ch,nullptr); showCompletion(lastWord,false, CodeCompletionType::Types); handled=true; @@ -1442,8 +1453,8 @@ void Editor::inputMethodEvent(QInputMethodEvent *event) int idCharPressed=caretX()-ws.ch; idCharPressed += s.length(); if (idCharPressed>=pSettings->codeCompletion().minCharRequired()) { - bool hasConst; - QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY(), hasConst); + bool hasTypeQualifier; + QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY(), hasTypeQualifier); if (mParser && !lastWord.isEmpty()) { if (CppTypeKeywords.contains(lastWord)) { return; @@ -4326,9 +4337,9 @@ void Editor::updateFunctionTip(bool showTip) //handle class initializer if (x >= 0 && hasPreviousWord) { QSynedit::BufferCoord pos = pWordBegin; - bool hasConst; + bool hasTypeQualifier; pos.ch = pWordBegin.ch; - QString previousWord = getPreviousWordAtPositionForSuggestion(pos, hasConst); + QString previousWord = getPreviousWordAtPositionForSuggestion(pos, hasTypeQualifier); PStatement statement = mParser->findStatementOf( mFilename, @@ -4920,9 +4931,9 @@ QString getWordAtPosition(QSynedit::QSynEdit *editor, const QSynedit::BufferCoor return result; } -QString Editor::getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoord &p, bool &hasConst) +QString Editor::getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoord &p, bool &hasTypeQualifier) { - hasConst = false; + hasTypeQualifier = false; QString result; if ((p.line<1) || (p.line>document()->count())) { return ""; @@ -4978,8 +4989,8 @@ QString Editor::getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoo return ""; result = s.mid(wordBegin, wordEnd - wordBegin+1); - if (result == "const" || result == "volatile") - hasConst = true; + if (CppTypeQualifiers.contains(result)) + hasTypeQualifier = true; else if (!skipNextWord) break; // if ((result != "const") && !skipNextWord) diff --git a/RedPandaIDE/editor.h b/RedPandaIDE/editor.h index be2357a6..9cba2dec 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, bool &hasConst); + QString getPreviousWordAtPositionForSuggestion(const QSynedit::BufferCoord& p, bool &hasTypeQualifier); QString getPreviousWordAtPositionForCompleteFunctionDefinition(const QSynedit::BufferCoord& p); void reformat(bool doReparse=true); void checkSyntaxInBack();