diff options
| -rw-r--r-- | include/SciLexer.h | 1 | ||||
| -rw-r--r-- | include/Scintilla.iface | 1 | ||||
| -rw-r--r-- | lexers/LexLua.cxx | 82 | 
3 files changed, 78 insertions, 6 deletions
| diff --git a/include/SciLexer.h b/include/SciLexer.h index 1d5b69ede..c7d79aa2c 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -428,6 +428,7 @@  #define SCE_LUA_WORD6 17  #define SCE_LUA_WORD7 18  #define SCE_LUA_WORD8 19 +#define SCE_LUA_LABEL 20  #define SCE_ERR_DEFAULT 0  #define SCE_ERR_PYTHON 1  #define SCE_ERR_GCC 2 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 36ead0ece..92393cd66 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -2779,6 +2779,7 @@ val SCE_LUA_WORD5=16  val SCE_LUA_WORD6=17  val SCE_LUA_WORD7=18  val SCE_LUA_WORD8=19 +val SCE_LUA_LABEL=20  # Lexical states for SCLEX_ERRORLIST  lex ErrorList=SCLEX_ERRORLIST SCE_ERR_  val SCE_ERR_DEFAULT=0 diff --git a/lexers/LexLua.cxx b/lexers/LexLua.cxx index 1dc9d4058..0bf4aeea2 100644 --- a/lexers/LexLua.cxx +++ b/lexers/LexLua.cxx @@ -59,7 +59,7 @@ static void ColouriseLuaDoc(  	// Accepts accented characters  	CharacterSet setWordStart(CharacterSet::setAlpha, "_", 0x80, true); -	CharacterSet setWord(CharacterSet::setAlphaNum, "._", 0x80, true); +	CharacterSet setWord(CharacterSet::setAlphaNum, "_", 0x80, true);  	// Not exactly following number definition (several dots are seen as OK, etc.)  	// but probably enough in most cases. [pP] is for hex floats.  	CharacterSet setNumber(CharacterSet::setDigits, ".-+abcdefpABCDEFP"); @@ -71,7 +71,7 @@ static void ColouriseLuaDoc(  	// Initialize long string [[ ... ]] or block comment --[[ ... ]] nesting level,  	// if we are inside such a string. Block comment was introduced in Lua 5.0,  	// blocks with separators [=[ ... ]=] in Lua 5.1. -	// Continuation of a string (\* whitespace escaping) is controlled by stringWs. +	// Continuation of a string (\z whitespace escaping) is controlled by stringWs.  	int nestLevel = 0;  	int sepCount = 0;  	int stringWs = 0; @@ -130,6 +130,61 @@ static void ColouriseLuaDoc(  		// Determine if the current state should terminate.  		if (sc.state == SCE_LUA_OPERATOR) { +			if (sc.ch == ':' && sc.chPrev == ':') {	// :: <label> :: forward scan +				sc.Forward(); +				int ln = 0, maxln = startPos + length - sc.currentPos; +				int c; +				while (ln < maxln) {		// determine line extent +					c = sc.GetRelative(ln); +					if (c == '\r' || c == '\n') +						break; +					ln++; +				} +				maxln = ln; ln = 0; +				while (ln < maxln) {		// skip over spaces/tabs +					if (!IsASpaceOrTab(sc.GetRelative(ln))) +						break; +					ln++; +				} +				int ws1 = ln; +				if (setWordStart.Contains(sc.GetRelative(ln))) { +					int i = 0; +					char s[100]; +					while (ln < maxln) {	// get potential label +						c = sc.GetRelative(ln); +						if (!setWord.Contains(c)) +							break; +						if (i < 90) +							s[i++] = c; +						ln++; +					} +					s[i] = '\0'; int lbl = ln; +					if (!keywords.InList(s)) { +						while (ln < maxln) {		// skip over spaces/tabs +							if (!IsASpaceOrTab(sc.GetRelative(ln))) +								break; +							ln++; +						} +						int ws2 = ln - lbl; +						if (sc.GetRelative(ln) == ':' && sc.GetRelative(ln + 1) == ':') { +							// final :: found, complete valid label construct +							sc.ChangeState(SCE_LUA_LABEL); +							if (ws1) { +								sc.SetState(SCE_LUA_DEFAULT); +								sc.Forward(ws1); +							} +							sc.SetState(SCE_LUA_LABEL); +							sc.Forward(lbl - ws1); +							if (ws2) { +								sc.SetState(SCE_LUA_DEFAULT); +								sc.Forward(ws2); +							} +							sc.SetState(SCE_LUA_LABEL); +							sc.Forward(2); +						} +					} +				} +			}  			sc.SetState(SCE_LUA_DEFAULT);  		} else if (sc.state == SCE_LUA_NUMBER) {  			// We stop the number definition on non-numerical non-dot non-eEpP non-sign non-hexdigit char @@ -140,11 +195,26 @@ static void ColouriseLuaDoc(  					sc.SetState(SCE_LUA_DEFAULT);  			}  		} else if (sc.state == SCE_LUA_IDENTIFIER) { -			if (!setWord.Contains(sc.ch) || sc.Match('.', '.')) { +			if (!(setWord.Contains(sc.ch) || sc.ch == '.') || sc.Match('.', '.')) {  				char s[100];  				sc.GetCurrent(s, sizeof(s));  				if (keywords.InList(s)) {  					sc.ChangeState(SCE_LUA_WORD); +					if (strcmp(s, "goto") == 0) {	// goto <label> forward scan +						sc.SetState(SCE_LUA_DEFAULT); +						while (IsASpaceOrTab(sc.ch)) +							sc.Forward(); +						if (setWordStart.Contains(sc.ch)) { +							sc.SetState(SCE_LUA_LABEL); +							sc.Forward(); +							while (setWord.Contains(sc.ch)) +								sc.Forward(); +							sc.GetCurrent(s, sizeof(s)); +							if (keywords.InList(s)) +								sc.ChangeState(SCE_LUA_WORD); +						} +						sc.SetState(SCE_LUA_DEFAULT); +					}  				} else if (keywords2.InList(s)) {  					sc.ChangeState(SCE_LUA_WORD2);  				} else if (keywords3.InList(s)) { @@ -174,7 +244,7 @@ static void ColouriseLuaDoc(  			if (sc.ch == '\\') {  				if (setEscapeSkip.Contains(sc.chNext)) {  					sc.Forward(); -				} else if (sc.chNext == '*') { +				} else if (sc.chNext == 'z') {  					sc.Forward();  					stringWs = 0x100;  				} @@ -192,7 +262,7 @@ static void ColouriseLuaDoc(  			if (sc.ch == '\\') {  				if (setEscapeSkip.Contains(sc.chNext)) {  					sc.Forward(); -				} else if (sc.chNext == '*') { +				} else if (sc.chNext == 'z') {  					sc.Forward();  					stringWs = 0x100;  				} @@ -269,7 +339,7 @@ static void ColouriseLuaDoc(  		}  	} -	if (setWord.Contains(sc.chPrev)) { +	if (setWord.Contains(sc.chPrev) || sc.chPrev == '.') {  		char s[100];  		sc.GetCurrent(s, sizeof(s));  		if (keywords.InList(s)) { | 
