From 37a713bc6d1e09ad4d6c3a07945a791d5c44117c Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Thu, 8 Oct 2009 12:56:56 +0200 Subject: [PATCH] Mark the white spaces in literals, comments and preprocessor directives with the visual space format. --- src/plugins/cppeditor/cpphighlighter.cpp | 32 +++++++++++++++++++----- src/plugins/cppeditor/cpphighlighter.h | 2 ++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/plugins/cppeditor/cpphighlighter.cpp b/src/plugins/cppeditor/cpphighlighter.cpp index 5a8de5500c2..b2db7a8e42c 100644 --- a/src/plugins/cppeditor/cpphighlighter.cpp +++ b/src/plugins/cppeditor/cpphighlighter.cpp @@ -118,7 +118,7 @@ void CppHighlighter::highlightBlock(const QString &text) highlightAsPreprocessor = false; if (i == 0 && tk.is(T_POUND)) { - setFormat(tk.position(), tk.length(), m_formats[CppPreprocessorFormat]); + highightLine(text, tk.position(), tk.length(), m_formats[CppPreprocessorFormat]); highlightAsPreprocessor = true; } else if (highlightCurrentWordAsPreprocessor && @@ -130,15 +130,15 @@ void CppHighlighter::highlightBlock(const QString &text) else if (tk.is(T_STRING_LITERAL) || tk.is(T_CHAR_LITERAL) || tk.is(T_ANGLE_STRING_LITERAL) || tk.is(T_AT_STRING_LITERAL)) - setFormat(tk.position(), tk.length(), m_formats[CppStringFormat]); + highightLine(text, tk.position(), tk.length(), m_formats[CppStringFormat]); else if (tk.is(T_WIDE_STRING_LITERAL) || tk.is(T_WIDE_CHAR_LITERAL)) - setFormat(tk.position(), tk.length(), m_formats[CppStringFormat]); + highightLine(text, tk.position(), tk.length(), m_formats[CppStringFormat]); else if (tk.isComment()) { if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT)) - setFormat(tk.position(), tk.length(), m_formats[CppCommentFormat]); + highightLine(text, tk.position(), tk.length(), m_formats[CppCommentFormat]); else // a doxygen comment highlightDoxygenComment(text, tk.position(), tk.length()); @@ -328,6 +328,26 @@ bool CppHighlighter::isQtKeyword(const QStringRef &text) const return false; } +void CppHighlighter::highightLine(const QString &text, int position, int length, + const QTextCharFormat &format) +{ + const QTextCharFormat visualSpaceFormat = m_formats[CppVisualWhitespace]; + + const int end = position + length; + int index = position; + + while (index != end) { + const bool isSpace = text.at(index).isSpace(); + const int start = index; + + do { ++index; } + while (index != end && text.at(index).isSpace() == isSpace); + + const int tokenLength = index - start; + setFormat(start, tokenLength, isSpace ? visualSpaceFormat : format); + } +} + void CppHighlighter::highlightWord(QStringRef word, int position, int length) { // try to highlight Qt 'identifiers' like QObject and Q_PROPERTY @@ -362,7 +382,7 @@ void CppHighlighter::highlightDoxygenComment(const QString &text, int position, int k = CppTools::classifyDoxygenTag(start, it - start); if (k != CppTools::T_DOXY_IDENTIFIER) { - setFormat(initial, start - uc - initial, format); + highightLine(text, initial, start - uc - initial, format); setFormat(start - uc - 1, it - start + 1, kwFormat); initial = it - uc; } @@ -370,6 +390,6 @@ void CppHighlighter::highlightDoxygenComment(const QString &text, int position, ++it; } - setFormat(initial, it - uc - initial, format); + highightLine(text, initial, it - uc - initial, format); } diff --git a/src/plugins/cppeditor/cpphighlighter.h b/src/plugins/cppeditor/cpphighlighter.h index 291f213c558..d44098f89b2 100644 --- a/src/plugins/cppeditor/cpphighlighter.h +++ b/src/plugins/cppeditor/cpphighlighter.h @@ -57,6 +57,8 @@ public: private: void highlightWord(QStringRef word, int position, int length); + void highightLine(const QString &line, int position, int length, + const QTextCharFormat &format); void highlightDoxygenComment(const QString &text, int position, int length); -- GitLab