From 31702189be07872b998a4252f5b306383210ba1a Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 21 Dec 2023 17:22:33 +0100 Subject: [PATCH] Nim: Clean up some editor component creation Change-Id: Ic14e7852b1cb6db47b689e59ad24b3d0eb9c4792 Reviewed-by: Jarek Kobus --- src/plugins/nim/editor/nimeditorfactory.cpp | 13 ++--- src/plugins/nim/editor/nimhighlighter.cpp | 31 +++++++--- src/plugins/nim/editor/nimhighlighter.h | 21 +------ src/plugins/nim/editor/nimindenter.cpp | 56 ++++++++++++------- src/plugins/nim/editor/nimindenter.h | 25 +-------- .../nimcodestylepreferencesfactory.cpp | 2 +- 6 files changed, 68 insertions(+), 80 deletions(-) diff --git a/src/plugins/nim/editor/nimeditorfactory.cpp b/src/plugins/nim/editor/nimeditorfactory.cpp index 92d6f05c0f3..ac8aa6c9329 100644 --- a/src/plugins/nim/editor/nimeditorfactory.cpp +++ b/src/plugins/nim/editor/nimeditorfactory.cpp @@ -13,7 +13,6 @@ #include #include #include -#include using namespace TextEditor; using namespace Utils; @@ -37,12 +36,8 @@ NimEditorFactory::NimEditorFactory() setDocumentCreator([]() { return new TextDocument(Constants::C_NIMEDITOR_ID); }); - setIndenterCreator([](QTextDocument *doc) { - return new NimIndenter(doc); - }); - setSyntaxHighlighterCreator([]() { - return new NimHighlighter; - }); + setIndenterCreator(&createNimIndenter); + setSyntaxHighlighterCreator(&createNimHighlighter); setCompletionAssistProvider(new NimCompletionAssistProvider()); setCommentDefinition(CommentDefinition::HashStyle); setParenthesesMatchingEnabled(true); @@ -51,8 +46,8 @@ NimEditorFactory::NimEditorFactory() void NimEditorFactory::decorateEditor(TextEditorWidget *editor) { - editor->textDocument()->resetSyntaxHighlighter([] { return new NimHighlighter();}); - editor->textDocument()->setIndenter(new NimIndenter(editor->textDocument()->document())); + editor->textDocument()->resetSyntaxHighlighter(&createNimHighlighter); + editor->textDocument()->setIndenter(createNimIndenter(editor->textDocument()->document())); } } // Nim diff --git a/src/plugins/nim/editor/nimhighlighter.cpp b/src/plugins/nim/editor/nimhighlighter.cpp index be2ef605253..d2a2e6add5f 100644 --- a/src/plugins/nim/editor/nimhighlighter.cpp +++ b/src/plugins/nim/editor/nimhighlighter.cpp @@ -7,19 +7,31 @@ #include #include + #include namespace Nim { -NimHighlighter::NimHighlighter() +class NimHighlighter final : public TextEditor::SyntaxHighlighter { - setDefaultTextFormatCategories(); -} +public: + NimHighlighter() + { + setDefaultTextFormatCategories(); + } + + void highlightBlock(const QString &text) final + { + setCurrentBlockState(highlightLine(text, previousBlockState())); + } + +private: + TextEditor::TextStyle styleForToken(const NimLexer::Token &token, const QString &tokenValue); + TextEditor::TextStyle styleForIdentifier(const NimLexer::Token &token, const QString &tokenValue); + + int highlightLine(const QString &text, int initialState); +}; -void NimHighlighter::highlightBlock(const QString &text) -{ - setCurrentBlockState(highlightLine(text, previousBlockState())); -} TextEditor::TextStyle NimHighlighter::styleForToken(const NimLexer::Token &token, const QString &tokenValue) @@ -92,4 +104,9 @@ int NimHighlighter::highlightLine(const QString &text, int initialState) return lexer.state(); } +TextEditor::SyntaxHighlighter *createNimHighlighter() +{ + return new NimHighlighter; +} + } // Nim diff --git a/src/plugins/nim/editor/nimhighlighter.h b/src/plugins/nim/editor/nimhighlighter.h index 2b1e5c3cb94..ad7e6c77e15 100644 --- a/src/plugins/nim/editor/nimhighlighter.h +++ b/src/plugins/nim/editor/nimhighlighter.h @@ -3,27 +3,10 @@ #pragma once -#include "../tools/nimlexer.h" - #include namespace Nim { -class NimHighlighter : public TextEditor::SyntaxHighlighter -{ - Q_OBJECT +TextEditor::SyntaxHighlighter *createNimHighlighter(); -public: - NimHighlighter(); - -protected: - void highlightBlock(const QString &text) override; - -private: - TextEditor::TextStyle styleForToken(const NimLexer::Token &token, const QString &tokenValue); - TextEditor::TextStyle styleForIdentifier(const NimLexer::Token &token, const QString &tokenValue); - - int highlightLine(const QString &text, int initialState); -}; - -} +} // Nim diff --git a/src/plugins/nim/editor/nimindenter.cpp b/src/plugins/nim/editor/nimindenter.cpp index a74948a9150..b7f2952c76d 100644 --- a/src/plugins/nim/editor/nimindenter.cpp +++ b/src/plugins/nim/editor/nimindenter.cpp @@ -15,13 +15,40 @@ namespace Nim { -NimIndenter::NimIndenter(QTextDocument *doc) - : TextEditor::TextIndenter(doc) -{} - -bool NimIndenter::isElectricCharacter(const QChar &ch) const +class NimIndenter final : public TextEditor::TextIndenter { - return NimIndenter::electricCharacters().contains(ch); +public: + explicit NimIndenter(QTextDocument *doc) + : TextEditor::TextIndenter(doc) + {} + + bool isElectricCharacter(const QChar &ch) const final + { + return ch == QLatin1Char(':') || ch == QLatin1Char('='); + } + + void indentBlock(const QTextBlock &block, + const QChar &typedChar, + const TextEditor::TabSettings &settings, + int cursorPositionInEditor = -1) final; + +private: + bool startsBlock(const QString &line, int state) const; + bool endsBlock(const QString &line, int state) const; + + int calculateIndentationDiff(const QString &previousLine, + int previousState, + int indentSize) const; +}; + +static QString rightTrimmed(const QString &str) +{ + int n = str.size() - 1; + for (; n >= 0; --n) { + if (!str.at(n).isSpace()) + return str.left(n + 1); + } + return QString(); } void NimIndenter::indentBlock(const QTextBlock &block, @@ -60,12 +87,6 @@ void NimIndenter::indentBlock(const QTextBlock &block, settings.indentLine(block, std::max(0, indentation)); } -const QSet &NimIndenter::electricCharacters() -{ - static QSet result{QLatin1Char(':'), QLatin1Char('=')}; - return result; -} - bool NimIndenter::startsBlock(const QString &line, int state) const { NimLexer lexer(line.constData(), line.length(), static_cast(state)); @@ -88,7 +109,7 @@ bool NimIndenter::startsBlock(const QString &line, int state) const // electric characters start a new block, and are operators if (previous.type == NimLexer::TokenType::Operator) { QStringView ref = QStringView(line).mid(previous.begin, previous.length); - return ref.isEmpty() ? false : electricCharacters().contains(ref.at(0)); + return ref.isEmpty() ? false : isElectricCharacter(ref.at(0)); } // some keywords starts a new block @@ -141,14 +162,9 @@ int NimIndenter::calculateIndentationDiff(const QString &previousLine, int previ return 0; } -QString NimIndenter::rightTrimmed(const QString &str) +TextEditor::Indenter *createNimIndenter(QTextDocument *doc) { - int n = str.size() - 1; - for (; n >= 0; --n) { - if (!str.at(n).isSpace()) - return str.left(n + 1); - } - return QString(); + return new NimIndenter(doc); } } // Nim diff --git a/src/plugins/nim/editor/nimindenter.h b/src/plugins/nim/editor/nimindenter.h index 45cbdba1d3a..8f8a3e718b5 100644 --- a/src/plugins/nim/editor/nimindenter.h +++ b/src/plugins/nim/editor/nimindenter.h @@ -7,29 +7,6 @@ namespace Nim { -class NimIndenter : public TextEditor::TextIndenter -{ -public: - explicit NimIndenter(QTextDocument *doc); - - bool isElectricCharacter(const QChar &ch) const override; - - void indentBlock(const QTextBlock &block, - const QChar &typedChar, - const TextEditor::TabSettings &settings, - int cursorPositionInEditor = -1) override; - -private: - static const QSet &electricCharacters(); - - bool startsBlock(const QString &line, int state) const; - bool endsBlock(const QString &line, int state) const; - - int calculateIndentationDiff(const QString &previousLine, - int previousState, - int indentSize) const; - - static QString rightTrimmed(const QString &other); -}; +TextEditor::Indenter *createNimIndenter(QTextDocument *doc); } // namespace Nim diff --git a/src/plugins/nim/settings/nimcodestylepreferencesfactory.cpp b/src/plugins/nim/settings/nimcodestylepreferencesfactory.cpp index e018cca8918..c2ecdf3039f 100644 --- a/src/plugins/nim/settings/nimcodestylepreferencesfactory.cpp +++ b/src/plugins/nim/settings/nimcodestylepreferencesfactory.cpp @@ -49,7 +49,7 @@ CodeStyleEditorWidget *NimCodeStylePreferencesFactory::createEditor( Indenter *NimCodeStylePreferencesFactory::createIndenter(QTextDocument *doc) const { - return new NimIndenter(doc); + return createNimIndenter(doc); } QString NimCodeStylePreferencesFactory::snippetProviderGroupId() const