diff options
author | Jerome LAFORGE <jerome.laforge@gmail.com> | 2012-03-11 08:52:55 +0100 |
---|---|---|
committer | Jerome LAFORGE <jerome.laforge@gmail.com> | 2012-03-11 08:52:55 +0100 |
commit | 9070ea289fa078a869d80b6ab1ae7c03af160cd8 (patch) | |
tree | f77e222433dbfb2397613b08ed92570a4c123b83 /lexers/LexSQL.cxx | |
parent | 746fbbd9e7d969c2cf538a6e3e5776ba611e3f04 (diff) | |
download | scintilla-mirror-9070ea289fa078a869d80b6ab1ae7c03af160cd8.tar.gz |
Manage MERGE statement like CASE statement.
Bug #3499664.
Diffstat (limited to 'lexers/LexSQL.cxx')
-rw-r--r-- | lexers/LexSQL.cxx | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/lexers/LexSQL.cxx b/lexers/LexSQL.cxx index 3a8ddeceb..2e3bc2bb8 100644 --- a/lexers/LexSQL.cxx +++ b/lexers/LexSQL.cxx @@ -105,6 +105,15 @@ public : return sqlStatesLine; } + unsigned short int IntoMergeStatement (unsigned short int sqlStatesLine, bool enable) { + if (enable) + sqlStatesLine |= MASK_MERGE_STATEMENT; + else + sqlStatesLine &= ~MASK_MERGE_STATEMENT; + + return sqlStatesLine; + } + unsigned short int BeginCaseBlock (unsigned short int sqlStatesLine) { if ((sqlStatesLine & MASK_NESTED_CASES) < MASK_NESTED_CASES) { sqlStatesLine++; @@ -139,6 +148,10 @@ public : return (sqlStatesLine & MASK_INTO_DECLARE) != 0; } + bool IsIntoMergeStatement (unsigned short int sqlStatesLine) { + return (sqlStatesLine & MASK_MERGE_STATEMENT) != 0; + } + unsigned short int ForLine(int lineNumber) { if ((lineNumber > 0) && (sqlStatement.size() > static_cast<size_t>(lineNumber))) { return sqlStatement[lineNumber]; @@ -156,7 +169,8 @@ private : MASK_INTO_EXCEPTION = 0x2000, MASK_INTO_CONDITION = 0x4000, MASK_IGNORE_WHEN = 0x8000, - MASK_NESTED_CASES = 0x0FFF + MASK_MERGE_STATEMENT = 0x0800, + MASK_NESTED_CASES = 0x07FF }; }; @@ -560,6 +574,11 @@ void SCI_METHOD LexerSQL::Fold(unsigned int startPos, int length, int initStyle, endFound = false; isUnfoldingIgnored = false; } + if ((!IsCommentStyle(style) && ch == ';') && sqlStates.IsIntoMergeStatement(sqlStatesCurrentLine)) { + // This is the end of "MERGE" statement. + sqlStatesCurrentLine = sqlStates.IntoMergeStatement(sqlStatesCurrentLine, false); + levelNext-=2; + } if (options.foldComment && IsStreamCommentStyle(style)) { if (!IsStreamCommentStyle(stylePrev)) { levelNext++; @@ -717,11 +736,15 @@ void SCI_METHOD LexerSQL::Fold(unsigned int startPos, int length, int initStyle, } else if ((!options.foldOnlyBegin) && strcmp(s, "when") == 0 && !sqlStates.IsIgnoreWhen(sqlStatesCurrentLine) && - !sqlStates.IsIntoExceptionBlock(sqlStatesCurrentLine) && - sqlStates.IsIntoCaseBlock(sqlStatesCurrentLine)) { + !sqlStates.IsIntoExceptionBlock(sqlStatesCurrentLine) && ( + sqlStates.IsIntoCaseBlock(sqlStatesCurrentLine) || + sqlStates.IsIntoMergeStatement(sqlStatesCurrentLine) + ) + ) { sqlStatesCurrentLine = sqlStates.IntoCondition(sqlStatesCurrentLine, true); // Don't foldind when CASE and WHEN are on the same line (with flag statementFound) (eg. "CASE selector WHEN expression1 THEN sequence_of_statements1;\n") + // and same way for MERGE statement. if (!statementFound) { levelCurrent--; levelNext--; @@ -736,6 +759,11 @@ void SCI_METHOD LexerSQL::Fold(unsigned int startPos, int length, int initStyle, strcmp(s, "procedure") == 0 || strcmp(s, "package") == 0)) { sqlStatesCurrentLine = sqlStates.IntoDeclareBlock(sqlStatesCurrentLine, true); + } else if ((!options.foldOnlyBegin) && + strcmp(s, "merge") == 0) { + sqlStatesCurrentLine = sqlStates.IntoMergeStatement(sqlStatesCurrentLine, true); + levelNext += 2; + statementFound = true; } } if (atEOL) { |