diff options
Diffstat (limited to 'src/LexPerl.cxx')
-rw-r--r-- | src/LexPerl.cxx | 158 |
1 files changed, 81 insertions, 77 deletions
diff --git a/src/LexPerl.cxx b/src/LexPerl.cxx index b323f152e..c7d827301 100644 --- a/src/LexPerl.cxx +++ b/src/LexPerl.cxx @@ -133,8 +133,8 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, char *Delimiter; // the Delimiter, 256: sizeof PL_tokenbuf HereDocCls() { State = 0; - Quote = 0; - Quoted = false; + Quote = 0; + Quoted = false; DelimiterLength = 0; Delimiter = new char[HERE_DELIM_MAX]; Delimiter[0] = '\0'; @@ -146,24 +146,24 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, HereDocCls HereDoc; // TODO: FIFO for stacked here-docs class QuoteCls { - public: - int Rep; - int Count; + public: + int Rep; + int Count; char Up; char Down; QuoteCls() { this->New(1); } void New(int r) { - Rep = r; + Rep = r; Count = 0; - Up = '\0'; - Down = '\0'; + Up = '\0'; + Down = '\0'; } void Open(char u) { Count++; - Up = u; - Down = opposite(Up); + Up = u; + Down = opposite(Up); } }; QuoteCls Quote; @@ -187,18 +187,18 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, state = styler.StyleAt(startPos - 1); } if ( state == SCE_PL_STRING_Q - || state == SCE_PL_STRING_QQ - || state == SCE_PL_STRING_QX - || state == SCE_PL_STRING_QR - || state == SCE_PL_STRING_QW - || state == SCE_PL_REGEX - || state == SCE_PL_REGSUBST - || state == SCE_PL_STRING - || state == SCE_PL_BACKTICKS - || state == SCE_PL_CHARACTER - || state == SCE_PL_NUMBER - || state == SCE_PL_IDENTIFIER - ) { + || state == SCE_PL_STRING_QQ + || state == SCE_PL_STRING_QX + || state == SCE_PL_STRING_QR + || state == SCE_PL_STRING_QW + || state == SCE_PL_REGEX + || state == SCE_PL_REGSUBST + || state == SCE_PL_STRING + || state == SCE_PL_BACKTICKS + || state == SCE_PL_CHARACTER + || state == SCE_PL_NUMBER + || state == SCE_PL_IDENTIFIER + ) { while ((startPos > 1) && (styler.StyleAt(startPos - 1) == state)) { startPos--; } @@ -269,7 +269,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, if (state == SCE_PL_DEFAULT) { if (isdigit(ch) || (isdigit(chNext) && - (ch == '.' || ch == 'v'))) { + (ch == '.' || ch == 'v'))) { state = SCE_PL_NUMBER; numState = PERLNUM_DECIMAL; dotCount = 0; @@ -284,7 +284,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, if (chPrev == '>' && styler.SafeGetCharAt(i - 2) == '-') { state = SCE_PL_IDENTIFIER; // part of "->" expr if ((!iswordchar(chNext) && chNext != '\'') - || (chNext == '.' && chNext2 == '.')) { + || (chNext == '.' && chNext2 == '.')) { // We need that if length of word == 1! styler.ColourTo(i, SCE_PL_IDENTIFIER); state = SCE_PL_DEFAULT; @@ -314,14 +314,14 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, i++; chNext = chNext2; Quote.New(1); - } else if (ch == 'x' && (chNext == '=' || // repetition - (chNext != '_' && !isalnum(chNext)) || - (isdigit(chPrev) && isdigit(chNext)))) { + } else if (ch == 'x' && (chNext == '=' || // repetition + (chNext != '_' && !isalnum(chNext)) || + (isdigit(chPrev) && isdigit(chNext)))) { styler.ColourTo(i, SCE_PL_OPERATOR); } else { state = SCE_PL_WORD; if ((!iswordchar(chNext) && chNext != '\'') - || (chNext == '.' && chNext2 == '.')) { + || (chNext == '.' && chNext2 == '.')) { // We need that if length of word == 1! // This test is copied from the SCE_PL_WORD handler. classifyWordPerl(styler.GetStartSegment(), i, keywords, styler); @@ -364,7 +364,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } } else if (ch == '@') { if (isalpha(chNext) || chNext == '#' || chNext == '$' - || chNext == '_' || chNext == '+') { + || chNext == '_' || chNext == '+') { state = SCE_PL_ARRAY; } else if (chNext != '{' && chNext != '[') { styler.ColourTo(i, SCE_PL_ARRAY); @@ -401,7 +401,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, char bkch; styler.Flush(); while ((bk > 0) && (styler.StyleAt(bk) == SCE_PL_DEFAULT || - styler.StyleAt(bk) == SCE_PL_COMMENTLINE)) { + styler.StyleAt(bk) == SCE_PL_COMMENTLINE)) { bk--; } if (bk == 0) { @@ -447,10 +447,10 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } bkstyle = styler.StyleAt(bk); if (bkstyle == SCE_PL_SCALAR - || bkstyle == SCE_PL_ARRAY - || bkstyle == SCE_PL_HASH - || bkstyle == SCE_PL_SYMBOLTABLE - || bkstyle == SCE_PL_OPERATOR) { + || bkstyle == SCE_PL_ARRAY + || bkstyle == SCE_PL_HASH + || bkstyle == SCE_PL_SYMBOLTABLE + || bkstyle == SCE_PL_OPERATOR) { preferRE = false; } } @@ -496,7 +496,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, bk--; } break; - // other styles uses the default, preferRE=false + // other styles uses the default, preferRE=false case SCE_PL_WORD: case SCE_PL_POD: case SCE_PL_POD_VERB: @@ -525,11 +525,11 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, if (fwch == ' ') { if (styler.SafeGetCharAt(fw-1) != '\\' || styler.SafeGetCharAt(fw-2) != '\\') - break; + break; } else if (isEOLChar(fwch) || isspacechar(fwch)) { break; } else if (fwch == '>') { - if ((fw - i) == 2 && // '<=>' case + if ((fw - i) == 2 && // '<=>' case styler.SafeGetCharAt(fw-1) == '=') { styler.ColourTo(fw, SCE_PL_OPERATOR); } else { @@ -633,12 +633,12 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } } else if (state == SCE_PL_WORD) { if ((!iswordchar(chNext) && chNext != '\'') - || chNext == '.') { + || chNext == '.') { // ".." is always an operator if preceded by a SCE_PL_WORD. // "." never used in Perl variable names // Archaic Perl has quotes inside names if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__") - || isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) { + || isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) { styler.ColourTo(i, SCE_PL_DATASECTION); state = SCE_PL_DATASECTION; } else { @@ -649,7 +649,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } } else if (state == SCE_PL_IDENTIFIER) { if ((!iswordchar(chNext) && chNext != '\'') - || chNext == '.') { + || chNext == '.') { styler.ColourTo(i, SCE_PL_IDENTIFIER); state = SCE_PL_DEFAULT; ch = ' '; @@ -705,7 +705,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } else if (isalpha(chNext) || chNext == '_') { // an unquoted here-doc delimiter, no special handling } else if (isspacechar(chNext) || isdigit(chNext) || chNext == '\\' - || chNext == '=' || chNext == '$' || chNext == '@') { + || chNext == '=' || chNext == '$' || chNext == '@') { // left shift << or <<= operator cases styler.ColourTo(i, SCE_PL_OPERATOR); state = SCE_PL_DEFAULT; @@ -759,7 +759,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, chNext = styler.SafeGetCharAt(i + 1); } } else if (state == SCE_PL_POD - || state == SCE_PL_POD_VERB) { + || state == SCE_PL_POD_VERB) { if (isEOLChar(chPrev)) { if (ch ==' ' || ch == '\t') { styler.ColourTo(i - 1, state); @@ -780,9 +780,9 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } } } else if (state == SCE_PL_SCALAR // variable names - || state == SCE_PL_ARRAY - || state == SCE_PL_HASH - || state == SCE_PL_SYMBOLTABLE) { + || state == SCE_PL_ARRAY + || state == SCE_PL_HASH + || state == SCE_PL_SYMBOLTABLE) { if (ch == ':' && chNext == ':') { // skip :: i++; ch = chNext; @@ -790,7 +790,7 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } else if (isEndVar(ch)) { if ((state == SCE_PL_SCALAR || state == SCE_PL_ARRAY) - && i == (styler.GetStartSegment() + 1)) { + && i == (styler.GetStartSegment() + 1)) { // Special variable: $(, $_ etc. styler.ColourTo(i, state); state = SCE_PL_DEFAULT; @@ -801,8 +801,8 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } } } else if (state == SCE_PL_REGEX - || state == SCE_PL_STRING_QR - ) { + || state == SCE_PL_STRING_QR + ) { if (!Quote.Up && !isspacechar(ch)) { Quote.Open(ch); } else if (ch == '\\' && Quote.Up != '\\') { @@ -895,13 +895,13 @@ static void ColourisePerlDoc(unsigned int startPos, int length, int initStyle, } } } else if (state == SCE_PL_STRING_Q - || state == SCE_PL_STRING_QQ - || state == SCE_PL_STRING_QX - || state == SCE_PL_STRING_QW - || state == SCE_PL_STRING - || state == SCE_PL_CHARACTER - || state == SCE_PL_BACKTICKS - ) { + || state == SCE_PL_STRING_QQ + || state == SCE_PL_STRING_QX + || state == SCE_PL_STRING_QW + || state == SCE_PL_STRING + || state == SCE_PL_CHARACTER + || state == SCE_PL_BACKTICKS + ) { if (!Quote.Down && !isspacechar(ch)) { Quote.Open(ch); } else if (ch == '\\' && Quote.Up != '\\') { @@ -939,7 +939,8 @@ static bool IsCommentLine(int line, Accessor &styler) { int eol_pos = styler.LineStart(line + 1) - 1; for (int i = pos; i < eol_pos; i++) { char ch = styler[i]; - if (ch == '#') + int style = styler.StyleAt(i); + if (ch == '#' && style == SCE_PL_COMMENTLINE) return true; else if (ch != ' ' && ch != '\t') return false; @@ -948,7 +949,7 @@ static bool IsCommentLine(int line, Accessor &styler) { } static void FoldPerlDoc(unsigned int startPos, int length, int, WordList *[], - Accessor &styler) { + Accessor &styler) { bool foldComment = styler.GetPropertyInt("fold.comment") != 0; bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; // Custom folding of POD and packages @@ -974,16 +975,15 @@ static void FoldPerlDoc(unsigned int startPos, int length, int, WordList *[], styleNext = styler.StyleAt(i + 1); bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); bool atLineStart = isEOLChar(chPrev) || i == 0; - // Comment folding - if (foldComment && atEOL && IsCommentLine(lineCurrent, styler)) - { - if (!IsCommentLine(lineCurrent - 1, styler) - && IsCommentLine(lineCurrent + 1, styler)) - levelCurrent++; - else if (IsCommentLine(lineCurrent - 1, styler) - && !IsCommentLine(lineCurrent+1, styler)) - levelCurrent--; - } + // Comment folding + if (foldComment && atEOL && IsCommentLine(lineCurrent, styler)) { + if (!IsCommentLine(lineCurrent - 1, styler) + && IsCommentLine(lineCurrent + 1, styler)) + levelCurrent++; + else if (IsCommentLine(lineCurrent - 1, styler) + && !IsCommentLine(lineCurrent+1, styler)) + levelCurrent--; + } if (style == SCE_C_OPERATOR) { if (ch == '{') { levelCurrent++; @@ -1002,13 +1002,17 @@ static void FoldPerlDoc(unsigned int startPos, int length, int, WordList *[], else if (styler.Match(i, "=head")) isPodHeading = true; } else if (style == SCE_PL_DATASECTION) { - if (ch == '=' && isalpha(chNext) && levelCurrent == SC_FOLDLEVELBASE) - levelCurrent++; - else if (styler.Match(i, "=cut") && levelCurrent > SC_FOLDLEVELBASE) - levelCurrent--; - else if (styler.Match(i, "=head")) + if (ch == '=' && isalpha(chNext) && levelCurrent == SC_FOLDLEVELBASE) + levelCurrent++; + else if (styler.Match(i, "=cut") && levelCurrent > SC_FOLDLEVELBASE) + levelCurrent--; + else if (styler.Match(i, "=head")) isPodHeading = true; - } + // if package used or unclosed brace, level > SC_FOLDLEVELBASE! + // reset needed as level test is vs. SC_FOLDLEVELBASE + else if (styler.Match(i, "__END__")) + levelCurrent = SC_FOLDLEVELBASE; + } } // Custom package folding if (foldPackage && atLineStart) { @@ -1020,9 +1024,9 @@ static void FoldPerlDoc(unsigned int startPos, int length, int, WordList *[], if (atEOL) { int lev = levelPrev; if (isPodHeading) { - lev = levelPrev - 1; - lev |= SC_FOLDLEVELHEADERFLAG; - isPodHeading = false; + lev = levelPrev - 1; + lev |= SC_FOLDLEVELHEADERFLAG; + isPodHeading = false; } // Check if line was a package declaration // because packages need "special" treatment @@ -1031,7 +1035,7 @@ static void FoldPerlDoc(unsigned int startPos, int length, int, WordList *[], levelCurrent = SC_FOLDLEVELBASE + 1; isPackageLine = false; } - lev |= levelCurrent << 16; + lev |= levelCurrent << 16; if (visibleChars == 0 && foldCompact) lev |= SC_FOLDLEVELWHITEFLAG; if ((levelCurrent > levelPrev) && (visibleChars > 0)) |