diff options
author | Joe Mueller <unknown> | 2015-03-18 16:20:46 -0700 |
---|---|---|
committer | Joe Mueller <unknown> | 2015-03-18 16:20:46 -0700 |
commit | ec1db4487b8283de1b251016c99652c191c33a37 (patch) | |
tree | a8741d6791c28f8ca23f8bb94aa1abfe41b71928 /lexers/LexVerilog.cxx | |
parent | f8192d915374325f48149b2f04aab0cd3b0dba7c (diff) | |
download | scintilla-mirror-ec1db4487b8283de1b251016c99652c191c33a37.tar.gz |
fix bug in fold.at.else processing, the code for "begin" that set levelMinCurrent was missing. Add support for lexer.verilog.fold.preprocessor.else that behaves like fold.at.else only for preprocessor `else and `elseif directives.
Diffstat (limited to 'lexers/LexVerilog.cxx')
-rw-r--r-- | lexers/LexVerilog.cxx | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/lexers/LexVerilog.cxx b/lexers/LexVerilog.cxx index 89c287d0b..f0995be24 100644 --- a/lexers/LexVerilog.cxx +++ b/lexers/LexVerilog.cxx @@ -118,6 +118,7 @@ public: struct OptionsVerilog { bool foldComment; bool foldPreprocessor; + bool foldPreprocessorElse; bool foldCompact; bool foldAtElse; bool foldAtModule; @@ -128,6 +129,7 @@ struct OptionsVerilog { OptionsVerilog() { foldComment = false; foldPreprocessor = false; + foldPreprocessorElse = false; foldCompact = false; foldAtElse = false; foldAtModule = false; @@ -161,6 +163,8 @@ struct OptionSetVerilog : public OptionSet<OptionsVerilog> { "Set to 1 to style input, output, and inout ports differently from regular keywords."); DefineProperty("lexer.verilog.allupperkeywords", &OptionsVerilog::allUppercaseDocKeyword, "Set to 1 to style identifiers that are all uppercase as documentation keyword."); + DefineProperty("lexer.verilog.fold.preprocessor.else", &OptionsVerilog::foldPreprocessorElse, + "This option enables folding on `else and `elsif preprocessor directives."); } }; @@ -852,6 +856,27 @@ void SCI_METHOD LexerVerilog::Fold(unsigned int startPos, int length, int initSt j++; } if (styler.Match(j, "if")) { + if (options.foldPreprocessorElse) { + // Measure the minimum before a begin to allow + // folding on "end else begin" + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } + } + levelNext++; + } else if (options.foldPreprocessorElse && styler.Match(j, "else")) { + levelNext--; + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } + levelNext++; + } else if (options.foldPreprocessorElse && styler.Match(j, "elsif")) { + levelNext--; + // Measure the minimum before a begin to allow + // folding on "end else begin" + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } levelNext++; } else if (styler.Match(j, "endif")) { levelNext--; @@ -913,8 +938,14 @@ void SCI_METHOD LexerVerilog::Fold(unsigned int startPos, int length, int initSt styler.Match(j, "specify") || styler.Match(j, "table") || styler.Match(j, "task") || - (styler.Match(j, "module") && options.foldAtModule) || - styler.Match(j, "begin")) { + (styler.Match(j, "module") && options.foldAtModule)) { + levelNext++; + } else if (styler.Match(j, "begin")) { + // Measure the minimum before a begin to allow + // folding on "end else begin" + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } levelNext++; } else if (styler.Match(j, "class")) { // class does not introduce a block when used in a typedef statement @@ -958,7 +989,7 @@ void SCI_METHOD LexerVerilog::Fold(unsigned int startPos, int length, int initSt } if (atEOL) { int levelUse = levelCurrent; - if (options.foldAtElse) { + if (options.foldAtElse||options.foldPreprocessorElse) { levelUse = levelMinCurrent; } int lev = levelUse | levelNext << 16; |