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) { | 
