aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexers/LexNim.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'lexers/LexNim.cxx')
-rw-r--r--lexers/LexNim.cxx811
1 files changed, 0 insertions, 811 deletions
diff --git a/lexers/LexNim.cxx b/lexers/LexNim.cxx
deleted file mode 100644
index d1b462abe..000000000
--- a/lexers/LexNim.cxx
+++ /dev/null
@@ -1,811 +0,0 @@
-// Scintilla source code edit control
-/** @file LexNim.cxx
-** Lexer for Nim
-** Written by Jad Altahan (github.com/xv)
-** Nim manual: https://nim-lang.org/docs/manual.html
-**/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include <string>
-#include <map>
-#include <algorithm>
-
-#include "ILexer.h"
-#include "Scintilla.h"
-#include "SciLexer.h"
-
-#include "StringCopy.h"
-#include "WordList.h"
-#include "LexAccessor.h"
-#include "Accessor.h"
-#include "StyleContext.h"
-#include "CharacterSet.h"
-#include "LexerModule.h"
-#include "OptionSet.h"
-#include "DefaultLexer.h"
-
-using namespace Scintilla;
-
-namespace {
- // Use an unnamed namespace to protect the functions and classes from name conflicts
-
-enum NumType {
- Binary,
- Octal,
- Exponent,
- Hexadecimal,
- Decimal,
- FormatError
-};
-
-int GetNumStyle(const int numType) noexcept {
- if (numType == NumType::FormatError) {
- return SCE_NIM_NUMERROR;
- }
-
- return SCE_NIM_NUMBER;
-}
-
-constexpr bool IsLetter(const int ch) noexcept {
- // 97 to 122 || 65 to 90
- return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
-}
-
-bool IsAWordChar(const int ch) noexcept {
- return ch < 0x80 && (isalnum(ch) || ch == '_' || ch == '.');
-}
-
-int IsNumHex(const StyleContext &sc) noexcept {
- return sc.chNext == 'x' || sc.chNext == 'X';
-}
-
-int IsNumBinary(const StyleContext &sc) noexcept {
- return sc.chNext == 'b' || sc.chNext == 'B';
-}
-
-int IsNumOctal(const StyleContext &sc) {
- return IsADigit(sc.chNext) || sc.chNext == 'o';
-}
-
-constexpr bool IsNewline(const int ch) noexcept {
- return (ch == '\n' || ch == '\r');
-}
-
-bool IsFuncName(const char *str) noexcept {
- const char *identifiers[] = {
- "proc",
- "func",
- "macro",
- "method",
- "template",
- "iterator",
- "converter"
- };
-
- for (const char *id : identifiers) {
- if (strcmp(str, id) == 0) {
- return true;
- }
- }
-
- return false;
-}
-
-constexpr bool IsTripleLiteral(const int style) noexcept {
- return style == SCE_NIM_TRIPLE || style == SCE_NIM_TRIPLEDOUBLE;
-}
-
-constexpr bool IsLineComment(const int style) noexcept {
- return style == SCE_NIM_COMMENTLINE || style == SCE_NIM_COMMENTLINEDOC;
-}
-
-constexpr bool IsStreamComment(const int style) noexcept {
- return style == SCE_NIM_COMMENT || style == SCE_NIM_COMMENTDOC;
-}
-
-// Adopted from Accessor.cxx
-int GetIndent(const Sci_Position line, Accessor &styler) {
- Sci_Position startPos = styler.LineStart(line);
- const Sci_Position eolPos = styler.LineStart(line + 1) - 1;
-
- char ch = styler[startPos];
- int style = styler.StyleAt(startPos);
-
- int indent = 0;
- bool inPrevPrefix = line > 0;
- Sci_Position posPrev = inPrevPrefix ? styler.LineStart(line - 1) : 0;
-
- // No fold points inside triple literals
- while ((IsASpaceOrTab(ch) || IsTripleLiteral(style)) && (startPos < eolPos)) {
- if (inPrevPrefix) {
- const char chPrev = styler[posPrev++];
- if (chPrev != ' ' && chPrev != '\t') {
- inPrevPrefix = false;
- }
- }
-
- if (ch == '\t') {
- indent = (indent / 8 + 1) * 8;
- } else {
- indent++;
- }
-
- startPos++;
- ch = styler[startPos];
- style = styler.StyleAt(startPos);
- }
-
- // Prevent creating fold lines for comments if indented
- if (!(IsStreamComment(style) || IsLineComment(style)))
- indent += SC_FOLDLEVELBASE;
-
- if (styler.LineStart(line) == styler.Length()
- || IsASpaceOrTab(ch)
- || IsNewline(ch)
- || IsStreamComment(style)
- || IsLineComment(style)) {
- return indent | SC_FOLDLEVELWHITEFLAG;
- } else {
- return indent;
- }
-}
-
-int IndentAmount(const Sci_Position line, Accessor &styler) {
- const int indent = GetIndent(line, styler);
- const int indentLevel = indent & SC_FOLDLEVELNUMBERMASK;
- return indentLevel <= SC_FOLDLEVELBASE ? indent : indentLevel | (indent & ~SC_FOLDLEVELNUMBERMASK);
-}
-
-struct OptionsNim {
- bool fold;
- bool foldCompact;
- bool highlightRawStrIdent;
-
- OptionsNim() {
- fold = true;
- foldCompact = true;
- highlightRawStrIdent = false;
- }
-};
-
-static const char *const nimWordListDesc[] = {
- "Keywords",
- nullptr
-};
-
-struct OptionSetNim : public OptionSet<OptionsNim> {
- OptionSetNim() {
- DefineProperty("lexer.nim.raw.strings.highlight.ident", &OptionsNim::highlightRawStrIdent,
- "Set to 1 to enable highlighting generalized raw string identifiers. "
- "Generalized raw string identifiers are anything other than r (or R).");
-
- DefineProperty("fold", &OptionsNim::fold);
- DefineProperty("fold.compact", &OptionsNim::foldCompact);
-
- DefineWordListSets(nimWordListDesc);
- }
-};
-
-LexicalClass lexicalClasses[] = {
- // Lexer Nim SCLEX_NIM SCE_NIM_:
- 0, "SCE_NIM_DEFAULT", "default", "White space",
- 1, "SCE_NIM_COMMENT", "comment block", "Block comment",
- 2, "SCE_NIM_COMMENTDOC", "comment block doc", "Block doc comment",
- 3, "SCE_NIM_COMMENTLINE", "comment line", "Line comment",
- 4, "SCE_NIM_COMMENTLINEDOC", "comment doc", "Line doc comment",
- 5, "SCE_NIM_NUMBER", "literal numeric", "Number",
- 6, "SCE_NIM_STRING", "literal string", "String",
- 7, "SCE_NIM_CHARACTER", "literal string", "Single quoted string",
- 8, "SCE_NIM_WORD", "keyword", "Keyword",
- 9, "SCE_NIM_TRIPLE", "literal string", "Triple quotes",
- 10, "SCE_NIM_TRIPLEDOUBLE", "literal string", "Triple double quotes",
- 11, "SCE_NIM_BACKTICKS", "operator definition", "Identifiers",
- 12, "SCE_NIM_FUNCNAME", "identifier", "Function name definition",
- 13, "SCE_NIM_STRINGEOL", "error literal string", "String is not closed",
- 14, "SCE_NIM_NUMERROR", "numeric error", "Numeric format error",
- 15, "SCE_NIM_OPERATOR", "operator", "Operators",
- 16, "SCE_NIM_IDENTIFIER", "identifier", "Identifiers",
-};
-
-}
-
-class LexerNim : public DefaultLexer {
- CharacterSet setWord;
- WordList keywords;
- OptionsNim options;
- OptionSetNim osNim;
-
-public:
- LexerNim() :
- DefaultLexer("nim", SCLEX_NIM, lexicalClasses, ELEMENTS(lexicalClasses)),
- setWord(CharacterSet::setAlphaNum, "_", 0x80, true) { }
-
- virtual ~LexerNim() { }
-
- void SCI_METHOD Release() noexcept override {
- delete this;
- }
-
- int SCI_METHOD Version() const noexcept override {
- return lvRelease5;
- }
-
- const char * SCI_METHOD PropertyNames() override {
- return osNim.PropertyNames();
- }
-
- int SCI_METHOD PropertyType(const char *name) override {
- return osNim.PropertyType(name);
- }
-
- const char * SCI_METHOD DescribeProperty(const char *name) override {
- return osNim.DescribeProperty(name);
- }
-
- Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override;
-
- const char * SCI_METHOD PropertyGet(const char* key) override {
- return osNim.PropertyGet(key);
- }
-
- const char * SCI_METHOD DescribeWordListSets() override {
- return osNim.DescribeWordListSets();
- }
-
- Sci_Position SCI_METHOD WordListSet(int n, const char *wl) override;
-
- void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
- void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
-
- void * SCI_METHOD PrivateCall(int, void *) noexcept override {
- return nullptr;
- }
-
- int SCI_METHOD LineEndTypesSupported() noexcept override {
- return SC_LINE_END_TYPE_UNICODE;
- }
-
- int SCI_METHOD PrimaryStyleFromStyle(int style) noexcept override {
- return style;
- }
-
- static ILexer5 *LexerFactoryNim() {
- return new LexerNim();
- }
-};
-
-Sci_Position SCI_METHOD LexerNim::PropertySet(const char *key, const char *val) {
- if (osNim.PropertySet(&options, key, val)) {
- return 0;
- }
-
- return -1;
-}
-
-Sci_Position SCI_METHOD LexerNim::WordListSet(int n, const char *wl) {
- WordList *wordListN = nullptr;
-
- switch (n) {
- case 0:
- wordListN = &keywords;
- break;
- }
-
- Sci_Position firstModification = -1;
-
- if (wordListN) {
- WordList wlNew;
- wlNew.Set(wl);
-
- if (*wordListN != wlNew) {
- wordListN->Set(wl);
- firstModification = 0;
- }
- }
-
- return firstModification;
-}
-
-void SCI_METHOD LexerNim::Lex(Sci_PositionU startPos, Sci_Position length,
- int initStyle, IDocument *pAccess) {
- // No one likes a leaky string
- if (initStyle == SCE_NIM_STRINGEOL) {
- initStyle = SCE_NIM_DEFAULT;
- }
-
- Accessor styler(pAccess, nullptr);
- StyleContext sc(startPos, length, initStyle, styler);
-
- // Nim supports nested block comments!
- Sci_Position lineCurrent = styler.GetLine(startPos);
- int commentNestLevel = lineCurrent > 0 ? styler.GetLineState(lineCurrent - 1) : 0;
-
- int numType = NumType::Decimal;
- int decimalCount = 0;
-
- bool funcNameExists = false;
- bool isStylingRawString = false;
- bool isStylingRawStringIdent = false;
-
- for (; sc.More(); sc.Forward()) {
- if (sc.atLineStart) {
- if (sc.state == SCE_NIM_STRING) {
- sc.SetState(SCE_NIM_STRING);
- }
-
- lineCurrent = styler.GetLine(sc.currentPos);
- styler.SetLineState(lineCurrent, commentNestLevel);
- }
-
- // Handle string line continuation
- if (sc.ch == '\\' && (sc.chNext == '\n' || sc.chNext == '\r') &&
- (sc.state == SCE_NIM_STRING || sc.state == SCE_NIM_CHARACTER) && !isStylingRawString) {
- sc.Forward();
-
- if (sc.ch == '\r' && sc.chNext == '\n') {
- sc.Forward();
- }
-
- continue;
- }
-
- switch (sc.state) {
- case SCE_NIM_OPERATOR:
- funcNameExists = false;
- sc.SetState(SCE_NIM_DEFAULT);
- break;
- case SCE_NIM_NUMBER:
- // For a type suffix, such as 0x80'u8
- if (sc.ch == '\'') {
- if (sc.chNext == 'i' || sc.chNext == 'I' ||
- sc.chNext == 'u' || sc.chNext == 'U' ||
- sc.chNext == 'f' || sc.chNext == 'F' ||
- sc.chNext == 'd' || sc.chNext == 'D') {
- sc.Forward(2);
- }
- } else if (sc.ch == '.') {
- if (IsADigit(sc.chNext)) {
- sc.Forward();
- } else if (numType <= NumType::Exponent) {
- sc.SetState(SCE_NIM_OPERATOR);
- break;
- } else {
- decimalCount++;
-
- if (numType == NumType::Decimal) {
- if (decimalCount <= 1 && !IsAWordChar(sc.chNext)) {
- break;
- }
- } else if (numType == NumType::Hexadecimal) {
- if (decimalCount <= 1 && IsADigit(sc.chNext, 16)) {
- break;
- }
-
- sc.SetState(SCE_NIM_OPERATOR);
- break;
- }
- }
- } else if (sc.ch == '_') {
- // Accept only one underscore between digits
- if (IsADigit(sc.chNext)) {
- sc.Forward();
- }
- } else if (numType == NumType::Decimal) {
- if (sc.chPrev != '\'' && (sc.ch == 'e' || sc.ch == 'E')) {
- numType = NumType::Exponent;
-
- if (sc.chNext == '-' || sc.chNext == '+') {
- sc.Forward();
- }
-
- break;
- }
-
- if (IsADigit(sc.ch)) {
- break;
- }
- } else if (numType == NumType::Hexadecimal) {
- if (IsADigit(sc.ch, 16)) {
- break;
- }
- } else if (IsADigit(sc.ch)) {
- if (numType == NumType::Exponent) {
- break;
- }
-
- if (numType == NumType::Octal) {
- // Accept only 0-7
- if (sc.ch <= '7') {
- break;
- }
- } else if (numType == NumType::Binary) {
- // Accept only 0 and 1
- if (sc.ch <= '1') {
- break;
- }
- }
-
- numType = NumType::FormatError;
- break;
- }
-
- sc.ChangeState(GetNumStyle(numType));
- sc.SetState(SCE_NIM_DEFAULT);
- break;
- case SCE_NIM_IDENTIFIER:
- if (sc.ch == '.' || !IsAWordChar(sc.ch)) {
- char s[100];
- sc.GetCurrent(s, sizeof(s));
- int style = SCE_NIM_IDENTIFIER;
-
- if (keywords.InList(s) && !funcNameExists) {
- // Prevent styling keywords if they are sub-identifiers
- const Sci_Position segStart = styler.GetStartSegment() - 1;
- if (segStart < 0 || styler.SafeGetCharAt(segStart, '\0') != '.') {
- style = SCE_NIM_WORD;
- }
- } else if (funcNameExists) {
- style = SCE_NIM_FUNCNAME;
- }
-
- sc.ChangeState(style);
- sc.SetState(SCE_NIM_DEFAULT);
-
- if (style == SCE_NIM_WORD) {
- funcNameExists = IsFuncName(s);
- } else {
- funcNameExists = false;
- }
- }
-
- if (IsAlphaNumeric(sc.ch) && sc.chNext == '\"') {
- isStylingRawStringIdent = true;
-
- if (options.highlightRawStrIdent) {
- if (styler.SafeGetCharAt(sc.currentPos + 2) == '\"' &&
- styler.SafeGetCharAt(sc.currentPos + 3) == '\"') {
- sc.ChangeState(SCE_NIM_TRIPLEDOUBLE);
- } else {
- sc.ChangeState(SCE_NIM_STRING);
- }
- }
-
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- }
- break;
- case SCE_NIM_FUNCNAME:
- if (sc.ch == '`') {
- funcNameExists = false;
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- } else if (sc.atLineEnd) {
- // Prevent leaking the style to the next line if not closed
- funcNameExists = false;
-
- sc.ChangeState(SCE_NIM_STRINGEOL);
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- }
- break;
- case SCE_NIM_COMMENT:
- if (sc.Match(']', '#')) {
- if (commentNestLevel > 0) {
- commentNestLevel--;
- }
-
- lineCurrent = styler.GetLine(sc.currentPos);
- styler.SetLineState(lineCurrent, commentNestLevel);
- sc.Forward();
-
- if (commentNestLevel == 0) {
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- }
- } else if (sc.Match('#', '[')) {
- commentNestLevel++;
- lineCurrent = styler.GetLine(sc.currentPos);
- styler.SetLineState(lineCurrent, commentNestLevel);
- }
- break;
- case SCE_NIM_COMMENTDOC:
- if (sc.Match("]##")) {
- if (commentNestLevel > 0) {
- commentNestLevel--;
- }
-
- lineCurrent = styler.GetLine(sc.currentPos);
- styler.SetLineState(lineCurrent, commentNestLevel);
- sc.Forward(2);
-
- if (commentNestLevel == 0) {
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- }
- } else if (sc.Match("##[")) {
- commentNestLevel++;
- lineCurrent = styler.GetLine(sc.currentPos);
- styler.SetLineState(lineCurrent, commentNestLevel);
- }
- break;
- case SCE_NIM_COMMENTLINE:
- case SCE_NIM_COMMENTLINEDOC:
- if (sc.atLineStart) {
- sc.SetState(SCE_NIM_DEFAULT);
- }
- break;
- case SCE_NIM_STRING:
- if (!isStylingRawStringIdent && !isStylingRawString && sc.ch == '\\') {
- if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
- sc.Forward();
- }
- } else if (isStylingRawString && sc.ch == '\"' && sc.chNext == '\"') {
- // Forward in situations such as r"a""bc\" so that "bc\" wouldn't be
- // considered a string of its own
- sc.Forward();
- } else if (sc.ch == '\"') {
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- } else if (sc.atLineEnd) {
- sc.ChangeState(SCE_NIM_STRINGEOL);
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- }
- break;
- case SCE_NIM_CHARACTER:
- if (sc.ch == '\\') {
- if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
- sc.Forward();
- }
- } else if (sc.ch == '\'') {
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- } else if (sc.atLineEnd) {
- sc.ChangeState(SCE_NIM_STRINGEOL);
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- }
- break;
- case SCE_NIM_BACKTICKS:
- if (sc.ch == '`' ) {
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- } else if (sc.atLineEnd) {
- sc.ChangeState(SCE_NIM_STRINGEOL);
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- }
- break;
- case SCE_NIM_TRIPLEDOUBLE:
- if (sc.Match(R"(""")")) {
-
- // Outright forward all " after the closing """ as a triple double
- //
- // A valid example where this is needed is: """8 double quotes->""""""""
- // You can have as many """ at the end as you wish, as long as the actual
- // closing literal is there
- while (sc.ch == '"') {
- sc.Forward();
- }
-
- sc.SetState(SCE_NIM_DEFAULT);
- }
- break;
- case SCE_NIM_TRIPLE:
- if (sc.Match("'''")) {
- sc.Forward(2);
- sc.ForwardSetState(SCE_NIM_DEFAULT);
- }
- break;
- }
-
- if (sc.state == SCE_NIM_DEFAULT) {
- // Number
- if (IsADigit(sc.ch)) {
- sc.SetState(SCE_NIM_NUMBER);
-
- numType = NumType::Decimal;
- decimalCount = 0;
-
- if (sc.ch == '0') {
- if (IsNumHex(sc)) {
- numType = NumType::Hexadecimal;
- } else if (IsNumBinary(sc)) {
- numType = NumType::Binary;
- } else if (IsNumOctal(sc)) {
- numType = NumType::Octal;
- }
-
- if (numType != NumType::Decimal) {
- sc.Forward();
- }
- }
- }
- // Raw string
- else if (IsAlphaNumeric(sc.ch) && sc.chNext == '\"') {
- isStylingRawString = true;
-
- // Triple doubles can be raw strings too. How sweet
- if (styler.SafeGetCharAt(sc.currentPos + 2) == '\"' &&
- styler.SafeGetCharAt(sc.currentPos + 3) == '\"') {
- sc.SetState(SCE_NIM_TRIPLEDOUBLE);
- } else {
- sc.SetState(SCE_NIM_STRING);
- }
-
- const int rawStrStyle = options.highlightRawStrIdent ? IsLetter(sc.ch) :
- (sc.ch == 'r' || sc.ch == 'R');
-
- if (rawStrStyle) {
- sc.Forward();
-
- if (sc.state == SCE_NIM_TRIPLEDOUBLE) {
- sc.Forward(2);
- }
- } else {
- // Anything other than r/R is considered a general raw string identifier
- isStylingRawStringIdent = true;
- sc.SetState(SCE_NIM_IDENTIFIER);
- }
- }
- // String and triple double literal
- else if (sc.ch == '\"') {
- isStylingRawString = false;
-
- if (sc.Match(R"(""")")) {
- sc.SetState(SCE_NIM_TRIPLEDOUBLE);
-
- // Keep forwarding until the total opening literal count is 5
- // A valid example where this is needed is: """""<-5 double quotes"""
- while (sc.ch == '"') {
- sc.Forward();
-
- if (sc.Match(R"(""")")) {
- sc.Forward();
- break;
- }
- }
- } else {
- sc.SetState(SCE_NIM_STRING);
- }
- }
- // Charecter and triple literal
- else if (sc.ch == '\'') {
- if (sc.Match("'''")) {
- sc.SetState(SCE_NIM_TRIPLE);
- } else {
- sc.SetState(SCE_NIM_CHARACTER);
- }
- }
- // Operator definition
- else if (sc.ch == '`') {
- if (funcNameExists) {
- sc.SetState(SCE_NIM_FUNCNAME);
- } else {
- sc.SetState(SCE_NIM_BACKTICKS);
- }
- }
- // Keyword
- else if (iswordstart(sc.ch)) {
- sc.SetState(SCE_NIM_IDENTIFIER);
- }
- // Comments
- else if (sc.ch == '#') {
- if (sc.Match("##[") || sc.Match("#[")) {
- commentNestLevel++;
- lineCurrent = styler.GetLine(sc.currentPos);
- styler.SetLineState(lineCurrent, commentNestLevel);
- }
-
- if (sc.Match("##[")) {
- sc.SetState(SCE_NIM_COMMENTDOC);
- sc.Forward();
- } else if (sc.Match("#[")) {
- sc.SetState(SCE_NIM_COMMENT);
- sc.Forward();
- } else if (sc.Match("##")) {
- sc.SetState(SCE_NIM_COMMENTLINEDOC);
- } else {
- sc.SetState(SCE_NIM_COMMENTLINE);
- }
- }
- // Operators
- else if (strchr("()[]{}:=;-\\/&%$!+<>|^?,.*~@", sc.ch)) {
- sc.SetState(SCE_NIM_OPERATOR);
- }
- }
-
- if (sc.atLineEnd) {
- funcNameExists = false;
- isStylingRawString = false;
- isStylingRawStringIdent = false;
- }
- }
-
- sc.Complete();
-}
-
-void SCI_METHOD LexerNim::Fold(Sci_PositionU startPos, Sci_Position length, int, IDocument *pAccess) {
- if (!options.fold) {
- return;
- }
-
- Accessor styler(pAccess, nullptr);
-
- const Sci_Position docLines = styler.GetLine(styler.Length());
- const Sci_Position maxPos = startPos + length;
- const Sci_Position maxLines = styler.GetLine(maxPos == styler.Length() ? maxPos : maxPos - 1);
-
- Sci_Position lineCurrent = styler.GetLine(startPos);
- int indentCurrent = IndentAmount(lineCurrent, styler);
-
- while (lineCurrent > 0) {
- lineCurrent--;
- indentCurrent = IndentAmount(lineCurrent, styler);
-
- if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
- break;
- }
- }
-
- int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK;
- indentCurrent = indentCurrentLevel | (indentCurrent & ~SC_FOLDLEVELNUMBERMASK);
-
- while (lineCurrent <= docLines && lineCurrent <= maxLines) {
- Sci_Position lineNext = lineCurrent + 1;
- int indentNext = indentCurrent;
- int lev = indentCurrent;
-
- if (lineNext <= docLines) {
- indentNext = IndentAmount(lineNext, styler);
- }
-
- if (indentNext & SC_FOLDLEVELWHITEFLAG) {
- indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel;
- }
-
- while (lineNext < docLines && (indentNext & SC_FOLDLEVELWHITEFLAG)) {
- lineNext++;
- indentNext = IndentAmount(lineNext, styler);
- }
-
- const int indentNextLevel = indentNext & SC_FOLDLEVELNUMBERMASK;
- indentNext = indentNextLevel | (indentNext & ~SC_FOLDLEVELNUMBERMASK);
-
- const int levelBeforeComments = std::max(indentCurrentLevel, indentNextLevel);
-
- Sci_Position skipLine = lineNext;
- int skipLevel = indentNextLevel;
-
- while (--skipLine > lineCurrent) {
- const int skipLineIndent = IndentAmount(skipLine, styler);
-
- if (options.foldCompact) {
- if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > indentNextLevel) {
- skipLevel = levelBeforeComments;
- }
-
- const int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;
- styler.SetLevel(skipLine, skipLevel | whiteFlag);
- } else {
- if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > indentNextLevel &&
- !(skipLineIndent & SC_FOLDLEVELWHITEFLAG)) {
- skipLevel = levelBeforeComments;
- }
-
- styler.SetLevel(skipLine, skipLevel);
- }
- }
-
- if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) {
- if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) {
- lev |= SC_FOLDLEVELHEADERFLAG;
- }
- }
-
- styler.SetLevel(lineCurrent, options.foldCompact ? lev : lev & ~SC_FOLDLEVELWHITEFLAG);
-
- indentCurrent = indentNext;
- indentCurrentLevel = indentNextLevel;
- lineCurrent = lineNext;
- }
-}
-
-LexerModule lmNim(SCLEX_NIM, LexerNim::LexerFactoryNim, "nim", nimWordListDesc); \ No newline at end of file