diff options
author | Neil <nyamatongwe@gmail.com> | 2017-01-19 16:02:20 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2017-01-19 16:02:20 +1100 |
commit | 77d1370542d24488065909e9d3895c9bd59f7e53 (patch) | |
tree | 0309412af79fe95d28d440899c99b9f433459c50 | |
parent | 8271ebfbbf820bcc539f9cf25eecf1754191a018 (diff) | |
download | scintilla-mirror-77d1370542d24488065909e9d3895c9bd59f7e53.tar.gz |
Bug [#1902]. Require Matlab block comment start/end to be alone on a line.
-rw-r--r-- | doc/ScintillaHistory.html | 4 | ||||
-rw-r--r-- | lexers/LexMatlab.cxx | 33 |
2 files changed, 28 insertions, 9 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 80d7c8e73..e3d0dce25 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -530,6 +530,10 @@ <a href="http://sourceforge.net/p/scintilla/bugs/1900/">Bug #1900</a>. </li> <li> + The Matlab lexer requires block comment start and end to be alone on a line. + <a href="http://sourceforge.net/p/scintilla/bugs/1902/">Bug #1902</a>. + </li> + <li> The Python lexer partly supports f-strings, allows Unicode identifiers, and no longer allows @1 to be a decorator. <a href="http://sourceforge.net/p/scintilla/bugs/1848/">Bug #1848</a>. </li> diff --git a/lexers/LexMatlab.cxx b/lexers/LexMatlab.cxx index ca5e4d908..45f0b6926 100644 --- a/lexers/LexMatlab.cxx +++ b/lexers/LexMatlab.cxx @@ -18,6 +18,9 @@ ** ** Changes by John Donoghue 2016/11/15 ** - update matlab code folding + ** + ** Changes by John Donoghue 2017/01/18 + ** - update matlab block comment detection **/ // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org> // The License.txt file describes the conditions under which this software may be distributed. @@ -73,6 +76,15 @@ static int CheckKeywordFoldPoint(char *str) { return 0; } +static bool IsSpaceToEOL(Sci_Position startPos, Accessor &styler) { + Sci_Position line = styler.GetLine(startPos); + Sci_Position eol_pos = styler.LineStart(line + 1) - 1; + for (Sci_Position i = startPos; i < eol_pos; i++) { + char ch = styler[i]; + if(!IsASpace(ch)) return false; + } + return true; +} static void ColouriseMatlabOctaveDoc( Sci_PositionU startPos, Sci_Position length, int initStyle, @@ -180,7 +192,7 @@ static void ColouriseMatlabOctaveDoc( } } else if (sc.state == SCE_MATLAB_COMMENT) { // end or start of a nested a block comment? - if( IsCommentChar(sc.ch) && sc.chNext == '}' && nonSpaceColumn == column) { + if( IsCommentChar(sc.ch) && sc.chNext == '}' && nonSpaceColumn == column && IsSpaceToEOL(sc.currentPos+2, styler)) { if(commentDepth > 0) commentDepth --; curLine = styler.GetLine(sc.currentPos); @@ -192,7 +204,7 @@ static void ColouriseMatlabOctaveDoc( transpose = false; } } - else if( IsCommentChar(sc.ch) && sc.chNext == '{' && nonSpaceColumn == column) + else if( IsCommentChar(sc.ch) && sc.chNext == '{' && nonSpaceColumn == column && IsSpaceToEOL(sc.currentPos+2, styler)) { commentDepth ++; @@ -214,8 +226,11 @@ static void ColouriseMatlabOctaveDoc( if (sc.state == SCE_MATLAB_DEFAULT) { if (IsCommentChar(sc.ch)) { // ncrement depth if we are a block comment - if(sc.chNext == '{' && nonSpaceColumn == column) - commentDepth ++; + if(sc.chNext == '{' && nonSpaceColumn == column) { + if(IsSpaceToEOL(sc.currentPos+2, styler)) { + commentDepth ++; + } + } curLine = styler.GetLine(sc.currentPos); styler.SetLineState(curLine, commentDepth); sc.SetState(SCE_MATLAB_COMMENT); @@ -284,13 +299,13 @@ static void FoldMatlabOctaveDoc(Sci_PositionU startPos, Sci_Position length, int style = styleNext; styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - + // a line that starts with a comment if (style == SCE_MATLAB_COMMENT && IsComment(ch) && visibleChars == 0) { - // start/end of block comment - if (chNext == '{') + // start/end of block comment + if (chNext == '{' && IsSpaceToEOL(i+2, styler)) levelNext ++; - if (chNext == '}') + if (chNext == '}' && IsSpaceToEOL(i+2, styler)) levelNext --; } // keyword @@ -303,7 +318,7 @@ static void FoldMatlabOctaveDoc(Sci_PositionU startPos, Sci_Position length, int if (styleNext != SCE_MATLAB_KEYWORD) { word[wordlen] = '\0'; wordlen = 0; - + levelNext += CheckKeywordFoldPoint(word); } } |