diff options
author | Jerome LAFORGE <jerome.laforge@gmail.com> | 2012-09-25 18:38:58 +0200 |
---|---|---|
committer | Jerome LAFORGE <jerome.laforge@gmail.com> | 2012-09-25 18:38:58 +0200 |
commit | d6c103266296459f4932d33f572994d894d35719 (patch) | |
tree | f6fa3beefce4c3be8581bea6b6f5ad309d9102b0 /lexers/LexSQL.cxx | |
parent | 3e8d0d57f8b7f96a4e14bf6d204abf482473a250 (diff) | |
download | scintilla-mirror-d6c103266296459f4932d33f572994d894d35719.tar.gz |
Fix bad folding with CASE statement when it is used for assignment.
Reported by : Erik Sinde
Bug #3571820
Diffstat (limited to 'lexers/LexSQL.cxx')
-rw-r--r-- | lexers/LexSQL.cxx | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/lexers/LexSQL.cxx b/lexers/LexSQL.cxx index ccb88f8dc..dc4bf6697 100644 --- a/lexers/LexSQL.cxx +++ b/lexers/LexSQL.cxx @@ -122,13 +122,11 @@ public : return sqlStatesLine; } - - unsigned short int IntoSelectStatement (unsigned short int sqlStatesLine, bool found) { + unsigned short int IntoSelectStatementOrAssignment (unsigned short int sqlStatesLine, bool found) { if (found) - sqlStatesLine |= MASK_INTO_SELECT_STATEMENT; + sqlStatesLine |= MASK_INTO_SELECT_STATEMENT_OR_ASSIGNEMENT; else - sqlStatesLine &= ~MASK_INTO_SELECT_STATEMENT; - + sqlStatesLine &= ~MASK_INTO_SELECT_STATEMENT_OR_ASSIGNEMENT; return sqlStatesLine; } @@ -161,11 +159,9 @@ public : bool IsIntoExceptionBlock (unsigned short int sqlStatesLine) { return (sqlStatesLine & MASK_INTO_EXCEPTION) != 0; } - - bool IsIntoSelectStatement (unsigned short int sqlStatesLine) { - return (sqlStatesLine & MASK_INTO_SELECT_STATEMENT) != 0; + bool IsIntoSelectStatementOrAssignment (unsigned short int sqlStatesLine) { + return (sqlStatesLine & MASK_INTO_SELECT_STATEMENT_OR_ASSIGNEMENT) != 0; } - bool IsCaseMergeWithoutWhenFound (unsigned short int sqlStatesLine) { return (sqlStatesLine & MASK_CASE_MERGE_WITHOUT_WHEN_FOUND) != 0; } @@ -188,7 +184,7 @@ private : SparseState <unsigned short int> sqlStatement; enum { MASK_NESTED_CASES = 0x01FF, - MASK_INTO_SELECT_STATEMENT = 0x0200, + MASK_INTO_SELECT_STATEMENT_OR_ASSIGNEMENT = 0x0200, MASK_CASE_MERGE_WITHOUT_WHEN_FOUND = 0x0400, MASK_MERGE_STATEMENT = 0x0800, MASK_INTO_DECLARE = 0x1000, @@ -608,9 +604,12 @@ void SCI_METHOD LexerSQL::Fold(unsigned int startPos, int length, int initStyle, sqlStatesCurrentLine = sqlStates.IntoMergeStatement(sqlStatesCurrentLine, false); levelNext--; } - if (sqlStates.IsIntoSelectStatement(sqlStatesCurrentLine)) - sqlStatesCurrentLine = sqlStates.IntoSelectStatement(sqlStatesCurrentLine, false); + if (sqlStates.IsIntoSelectStatementOrAssignment(sqlStatesCurrentLine)) + sqlStatesCurrentLine = sqlStates.IntoSelectStatementOrAssignment(sqlStatesCurrentLine, false); } + if (ch == ':' && chNext == '=' && !IsCommentStyle(style)) + sqlStatesCurrentLine = sqlStates.IntoSelectStatementOrAssignment(sqlStatesCurrentLine, true); + if (options.foldComment && IsStreamCommentStyle(style)) { if (!IsStreamCommentStyle(stylePrev)) { levelNext++; @@ -666,10 +665,9 @@ void SCI_METHOD LexerSQL::Fold(unsigned int startPos, int length, int initStyle, } else { s[j] = '\0'; } - if (!options.foldOnlyBegin && strcmp(s, "select") == 0) { - sqlStatesCurrentLine = sqlStates.IntoSelectStatement(sqlStatesCurrentLine, true); + sqlStatesCurrentLine = sqlStates.IntoSelectStatementOrAssignment(sqlStatesCurrentLine, true); } else if (strcmp(s, "if") == 0) { if (endFound) { endFound = false; @@ -766,7 +764,7 @@ void SCI_METHOD LexerSQL::Fold(unsigned int startPos, int length, int initStyle, (strcmp(s, "endif") == 0)) { endFound = true; levelNext--; - if (sqlStates.IsIntoSelectStatement(sqlStatesCurrentLine) && !sqlStates.IsCaseMergeWithoutWhenFound(sqlStatesCurrentLine)) + if (sqlStates.IsIntoSelectStatementOrAssignment(sqlStatesCurrentLine) && !sqlStates.IsCaseMergeWithoutWhenFound(sqlStatesCurrentLine)) levelNext--; if (levelNext < SC_FOLDLEVELBASE) { levelNext = SC_FOLDLEVELBASE; |