diff options
-rw-r--r-- | doc/ScintillaHistory.html | 11 | ||||
-rw-r--r-- | include/SciLexer.h | 1 | ||||
-rw-r--r-- | include/Scintilla.iface | 1 | ||||
-rw-r--r-- | lexers/LexCPP.cxx | 42 |
4 files changed, 55 insertions, 0 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 99bee8d89..866193753 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -459,6 +459,17 @@ </li> </ul> <h3> + <a href="http://prdownloads.sourceforge.net/scintilla/scite342.zip?download">Release 3.4.2</a> + </h3> + <ul> + <li> + Released 1 April 2014. + </li> + <li> + C++ lexer can highlight task marker keywords in comments as SCE_C_TASKMARKER. + </li> + <ul> + <h3> <a href="http://prdownloads.sourceforge.net/scintilla/scite341.zip?download">Release 3.4.1</a> </h3> <ul> diff --git a/include/SciLexer.h b/include/SciLexer.h index cb4079b8c..cd8b581aa 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -169,6 +169,7 @@ #define SCE_C_PREPROCESSORCOMMENT 23 #define SCE_C_PREPROCESSORCOMMENTDOC 24 #define SCE_C_USERLITERAL 25 +#define SCE_C_TASKMARKER 26 #define SCE_D_DEFAULT 0 #define SCE_D_COMMENT 1 #define SCE_D_COMMENTLINE 2 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 7040b63a9..02cb97193 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -2711,6 +2711,7 @@ val SCE_C_HASHQUOTEDSTRING=22 val SCE_C_PREPROCESSORCOMMENT=23 val SCE_C_PREPROCESSORCOMMENTDOC=24 val SCE_C_USERLITERAL=25 +val SCE_C_TASKMARKER=26 # Lexical states for SCLEX_D lex D=SCLEX_D SCE_D_ val SCE_D_DEFAULT=0 diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx index 76a47e058..a78e72e2b 100644 --- a/lexers/LexCPP.cxx +++ b/lexers/LexCPP.cxx @@ -83,6 +83,30 @@ static bool followsReturnKeyword(StyleContext &sc, LexAccessor &styler) { return !*s; } +static void highlightTaskMarker(StyleContext &sc, LexAccessor &styler, + int activity, WordList &markerList, bool caseSensitive){ + if ((isoperator(sc.chPrev) || IsASpace(sc.chPrev)) && markerList.Length()) { + char marker[50]; + int currPos = (int) sc.currentPos; + int i = 0; + while (i < 50) { + char ch = styler.SafeGetCharAt(currPos + i); + if (IsASpace(ch) || isoperator(ch)) { + break; + } + if (caseSensitive) + marker[i] = ch; + else + marker[i] = tolower(ch); + i++; + } + marker[i] = '\0'; + if (markerList.InList(marker)) { + sc.SetState(SCE_C_TASKMARKER|activity); + } + } +} + static std::string GetRestOfLine(LexAccessor &styler, int start, bool allowSpace) { std::string restOfLine; int i =0; @@ -249,6 +273,7 @@ static const char *const cppWordLists[] = { "Documentation comment keywords", "Global classes and typedefs", "Preprocessor definitions", + "Task marker and error marker keywords", 0, }; @@ -328,6 +353,7 @@ class LexerCPP : public ILexerWithSubStyles { WordList keywords3; WordList keywords4; WordList ppDefinitions; + WordList markerList; std::map<std::string, std::string> preprocessorDefinitionsStart; OptionsCPP options; OptionSetCPP osCPP; @@ -452,6 +478,9 @@ int SCI_METHOD LexerCPP::WordListSet(int n, const char *wl) { case 4: wordListN = &ppDefinitions; break; + case 5: + wordListN = &markerList; + break; } int firstModification = -1; if (wordListN) { @@ -511,6 +540,7 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle, int visibleChars = 0; bool lastWordWasUUID = false; int styleBeforeDCKeyword = SCE_C_DEFAULT; + int styleBeforeTaskMarker = SCE_C_DEFAULT; bool continuationLine = false; bool isIncludePreprocessor = false; bool isStringInPreprocessor = false; @@ -725,6 +755,9 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle, if (sc.Match('*', '/')) { sc.Forward(); sc.ForwardSetState(SCE_C_DEFAULT|activitySet); + } else { + styleBeforeTaskMarker = SCE_C_COMMENT; + highlightTaskMarker(sc, styler, activitySet, markerList, caseSensitive); } break; case SCE_C_COMMENTDOC: @@ -742,6 +775,9 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle, case SCE_C_COMMENTLINE: if (sc.atLineStart && !continuationLine) { sc.SetState(SCE_C_DEFAULT|activitySet); + } else { + styleBeforeTaskMarker = SCE_C_COMMENTLINE; + highlightTaskMarker(sc, styler, activitySet, markerList, caseSensitive); } break; case SCE_C_COMMENTLINEDOC: @@ -880,6 +916,12 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle, if (sc.atLineEnd || sc.ch == ')') { sc.SetState(SCE_C_DEFAULT|activitySet); } + break; + case SCE_C_TASKMARKER: + if (isoperator(sc.ch) || IsASpace(sc.ch)) { + sc.SetState(styleBeforeTaskMarker|activitySet); + styleBeforeTaskMarker = SCE_C_DEFAULT; + } } if (sc.atLineEnd && !atLineEndBeforeSwitch) { |