aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexers/LexSQL.cxx
diff options
context:
space:
mode:
authorJerome LAFORGE <jerome.laforge@gmail.com>2012-03-11 08:52:55 +0100
committerJerome LAFORGE <jerome.laforge@gmail.com>2012-03-11 08:52:55 +0100
commit9070ea289fa078a869d80b6ab1ae7c03af160cd8 (patch)
treef77e222433dbfb2397613b08ed92570a4c123b83 /lexers/LexSQL.cxx
parent746fbbd9e7d969c2cf538a6e3e5776ba611e3f04 (diff)
downloadscintilla-mirror-9070ea289fa078a869d80b6ab1ae7c03af160cd8.tar.gz
Manage MERGE statement like CASE statement.
Bug #3499664.
Diffstat (limited to 'lexers/LexSQL.cxx')
-rw-r--r--lexers/LexSQL.cxx34
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) {