aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <unknown>2002-10-26 05:27:52 +0000
committernyamatongwe <unknown>2002-10-26 05:27:52 +0000
commitd95bafd568103fccaae972069dcf0da113ab872d (patch)
tree444942c9c8b415ce6cf90e7fe4419b6197c0d420
parentaa53e0eead83f8fee2a97a7193d53d88488df3bb (diff)
downloadscintilla-mirror-d95bafd568103fccaae972069dcf0da113ab872d.tar.gz
Patch from Philippe to handle block comments, and the deep nesting of
strings and block comments.
-rw-r--r--src/LexLua.cxx65
1 files changed, 48 insertions, 17 deletions
diff --git a/src/LexLua.cxx b/src/LexLua.cxx
index fc9607e25..b7920ef20 100644
--- a/src/LexLua.cxx
+++ b/src/LexLua.cxx
@@ -23,8 +23,6 @@
#include "Scintilla.h"
#include "SciLexer.h"
-#define SCE_LUA_LAST_STYLE SCE_LUA_WORD6
-
static inline bool IsAWordChar(const int ch) {
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
}
@@ -61,14 +59,16 @@ static void ColouriseLuaDoc(
WordList &keywords5 = *keywordlists[4];
WordList &keywords6 = *keywordlists[5];
- // Must initialize the literal string nesting level, if we are inside such a string.
+ int currentLine = styler.GetLine(startPos);
+ // Initialize the literal string [[ ... ]] nesting level, if we are inside such a string.
int literalStringLevel = 0;
if (initStyle == SCE_LUA_LITERALSTRING) {
- literalStringLevel = 1;
+ literalStringLevel = styler.GetLineState(currentLine - 1);
}
- // We use states above the last one to indicate nesting level of literal strings
- if (initStyle > SCE_LUA_LAST_STYLE) {
- literalStringLevel = initStyle - SCE_LUA_LAST_STYLE + 1;
+ // Initialize the block comment --[[ ... ]] nesting level, if we are inside such a comment
+ int blockCommentLevel = 0;
+ if (initStyle == SCE_LUA_COMMENT) {
+ blockCommentLevel = styler.GetLineState(currentLine - 1);
}
// Do not leak onto next line
@@ -78,9 +78,28 @@ static void ColouriseLuaDoc(
StyleContext sc(startPos, length, initStyle, styler);
if (startPos == 0 && sc.ch == '#') {
+ // shbang line: # is a comment only if first char of the script
sc.SetState(SCE_LUA_COMMENTLINE);
}
for (; sc.More(); sc.Forward()) {
+ if (sc.atLineEnd) {
+ // Update the line state, so it can be seen by next line
+ currentLine = styler.GetLine(sc.currentPos);
+ switch (sc.state) {
+ case SCE_LUA_LITERALSTRING:
+ // Inside a literal string, we set the line state
+ styler.SetLineState(currentLine, literalStringLevel);
+ break;
+ case SCE_LUA_COMMENT: // Block comment
+ // Inside a block comment, we set the line state
+ styler.SetLineState(currentLine, blockCommentLevel);
+ break;
+ default:
+ // Reset the line state
+ styler.SetLineState(currentLine, 0);
+ break;
+ }
+ }
if (sc.atLineStart && (sc.state == SCE_LUA_STRING)) {
// Prevent SCE_LUA_STRINGEOL from leaking back to previous line
sc.SetState(SCE_LUA_STRING);
@@ -88,7 +107,7 @@ static void ColouriseLuaDoc(
// Handle string line continuation
if ((sc.state == SCE_LUA_STRING || sc.state == SCE_LUA_CHARACTER) &&
- sc.ch == '\\') {
+ sc.ch == '\\') {
if (sc.chNext == '\n' || sc.chNext == '\r') {
sc.Forward();
if (sc.ch == '\r' && sc.chNext == '\n') {
@@ -154,22 +173,31 @@ static void ColouriseLuaDoc(
sc.ChangeState(SCE_LUA_STRINGEOL);
sc.ForwardSetState(SCE_LUA_DEFAULT);
}
- } else if (sc.state == SCE_LUA_LITERALSTRING || sc.state > SCE_LUA_LAST_STYLE) {
+ } else if (sc.state == SCE_LUA_LITERALSTRING) {
if (sc.Match('[', '[')) {
literalStringLevel++;
- sc.SetState(SCE_LUA_LAST_STYLE + literalStringLevel - 1);
+ sc.Forward();
+ sc.SetState(SCE_LUA_LITERALSTRING);
} else if (sc.Match(']', ']') && literalStringLevel > 0) {
literalStringLevel--;
sc.Forward();
if (literalStringLevel == 0) {
sc.ForwardSetState(SCE_LUA_DEFAULT);
- } else if (literalStringLevel == 1) {
- sc.ForwardSetState(SCE_LUA_LITERALSTRING);
- } else {
- sc.ForwardSetState(SCE_LUA_LAST_STYLE + literalStringLevel - 1);
+ }
+ }
+ } else if (sc.state == SCE_LUA_COMMENT) { // Lua 5.0's block comment
+ if (sc.Match('[', '[')) {
+ blockCommentLevel++;
+ sc.Forward();
+ } else if (sc.Match(']', ']') && blockCommentLevel > 0) {
+ blockCommentLevel--;
+ sc.Forward();
+ if (blockCommentLevel == 0) {
+ sc.ForwardSetState(SCE_LUA_DEFAULT);
}
}
}
+
// Determine if a new state should be entered.
if (sc.state == SCE_LUA_DEFAULT) {
if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
@@ -184,12 +212,16 @@ static void ColouriseLuaDoc(
literalStringLevel = 1;
sc.SetState(SCE_LUA_LITERALSTRING);
sc.Forward();
+ } else if (sc.Match("--[[")) { // Lua 5.0's block comment
+ blockCommentLevel = 1;
+ sc.SetState(SCE_LUA_COMMENT);
+ sc.Forward(3);
} else if (sc.Match('-', '-')) {
sc.SetState(SCE_LUA_COMMENTLINE);
sc.Forward();
- } else if (sc.Match('$') && sc.atLineStart) {
+ } else if (sc.atLineStart && sc.Match('$')) {
sc.SetState(SCE_LUA_PREPROCESSOR); // Obsolete since Lua 4.0, but still in old code
- } else if (isLuaOperator(static_cast<char>(sc.ch))) {
+ } else if (isLuaOperator(static_cast<char>(sc.ch))) {
sc.SetState(SCE_LUA_OPERATOR);
}
}
@@ -197,7 +229,6 @@ static void ColouriseLuaDoc(
sc.Complete();
}
-
static void FoldLuaDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[],
Accessor &styler) {
unsigned int lengthDoc = startPos + length;