aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/SciLexer.h4
-rw-r--r--include/Scintilla.iface4
-rw-r--r--src/LexVB.cxx73
3 files changed, 56 insertions, 25 deletions
diff --git a/include/SciLexer.h b/include/SciLexer.h
index 6f6c75908..050d0ecc8 100644
--- a/include/SciLexer.h
+++ b/include/SciLexer.h
@@ -252,6 +252,10 @@
#define SCE_B_OPERATOR 6
#define SCE_B_IDENTIFIER 7
#define SCE_B_DATE 8
+#define SCE_B_STRINGEOL 9
+#define SCE_B_KEYWORD2 10
+#define SCE_B_KEYWORD3 11
+#define SCE_B_KEYWORD4 12
#define SCE_PROPS_DEFAULT 0
#define SCE_PROPS_COMMENT 1
#define SCE_PROPS_SECTION 2
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index cc3304c52..720c2c5c7 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -1905,6 +1905,10 @@ val SCE_B_PREPROCESSOR=5
val SCE_B_OPERATOR=6
val SCE_B_IDENTIFIER=7
val SCE_B_DATE=8
+val SCE_B_STRINGEOL=9
+val SCE_B_KEYWORD2=10
+val SCE_B_KEYWORD3=11
+val SCE_B_KEYWORD4=12
# Lexical states for SCLEX_PROPERTIES
lex Properties=SCLEX_PROPERTIES SCE_PROPS_
val SCE_PROPS_DEFAULT=0
diff --git a/src/LexVB.cxx b/src/LexVB.cxx
index 72fdb9c3c..93bdedbd8 100644
--- a/src/LexVB.cxx
+++ b/src/LexVB.cxx
@@ -2,7 +2,7 @@
/** @file LexVB.cxx
** Lexer for Visual Basic and VBScript.
**/
-// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
+// Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
@@ -24,16 +24,19 @@ static bool IsVBComment(Accessor &styler, int pos, int len) {
return len>0 && styler[pos]=='\'';
}
-static inline bool IsTypeCharacter(const int ch) {
+static inline bool IsTypeCharacter(int ch) {
return ch == '%' || ch == '&' || ch == '@' || ch == '!' || ch == '#' || ch == '$';
}
-static inline bool IsAWordChar(const int ch) {
- return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_');
+// Extended to accept accented characters
+static inline bool IsAWordChar(int ch) {
+ return ch >= 0x80 ||
+ (isalnum(ch) || ch == '.' || ch == '_');
}
-static inline bool IsAWordStart(const int ch) {
- return (ch < 0x80) && (isalnum(ch) || ch == '_');
+static inline bool IsAWordStart(int ch) {
+ return ch >= 0x80 ||
+ (isalnum(ch) || ch == '_');
}
static inline bool IsADateCharacter(const int ch) {
@@ -45,6 +48,9 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
WordList *keywordlists[], Accessor &styler, bool vbScriptSyntax) {
WordList &keywords = *keywordlists[0];
+ WordList &keywords2 = *keywordlists[1];
+ WordList &keywords3 = *keywordlists[2];
+ WordList &keywords4 = *keywordlists[3];
styler.StartAt(startPos);
@@ -56,26 +62,37 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
if (sc.state == SCE_B_OPERATOR) {
sc.SetState(SCE_B_DEFAULT);
- } else if (sc.state == SCE_B_KEYWORD) {
+ } else if (sc.state == SCE_B_IDENTIFIER) {
if (!IsAWordChar(sc.ch)) {
- if (vbScriptSyntax || !IsTypeCharacter(sc.ch)) {
- if (sc.ch == ']')
- sc.Forward();
- char s[100];
- sc.GetCurrentLowered(s, sizeof(s));
+ // In Basic (except VBScript), a variable name or a function name
+ // can end with a special character indicating the type of the value
+ // held or returned.
+ bool skipType = false;
+ if (!vbScriptSyntax && IsTypeCharacter(sc.ch)) {
+ sc.Forward(); // Skip it
+ skipType = true;
+ }
+ if (sc.ch == ']') {
+ sc.Forward();
+ }
+ char s[100];
+ sc.GetCurrentLowered(s, sizeof(s));
+ if (skipType) {
+ s[strlen(s) - 1] = '\0';
+ }
+ if (strcmp(s, "rem") == 0) {
+ sc.ChangeState(SCE_B_COMMENT);
+ } else {
if (keywords.InList(s)) {
- if (strcmp(s, "rem") == 0) {
- sc.ChangeState(SCE_B_COMMENT);
- if (sc.atLineEnd) {
- sc.SetState(SCE_B_DEFAULT);
- }
- } else {
- sc.SetState(SCE_B_DEFAULT);
- }
- } else {
- sc.ChangeState(SCE_B_IDENTIFIER);
- sc.SetState(SCE_B_DEFAULT);
- }
+ sc.ChangeState(SCE_B_KEYWORD);
+ } else if (keywords2.InList(s)) {
+ sc.ChangeState(SCE_B_KEYWORD2);
+ } else if (keywords3.InList(s)) {
+ sc.ChangeState(SCE_B_KEYWORD3);
+ } else if (keywords4.InList(s)) {
+ sc.ChangeState(SCE_B_KEYWORD4);
+ } // Else, it is really an identifier...
+ sc.SetState(SCE_B_DEFAULT);
}
}
} else if (sc.state == SCE_B_NUMBER) {
@@ -90,6 +107,9 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
sc.Forward();
}
sc.ForwardSetState(SCE_B_DEFAULT);
+ } else if (sc.atLineEnd) {
+ sc.ChangeState(SCE_B_STRINGEOL);
+ sc.ForwardSetState(SCE_B_DEFAULT);
}
} else if (sc.state == SCE_B_COMMENT) {
if (sc.atLineEnd) {
@@ -132,7 +152,7 @@ static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle,
} else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
sc.SetState(SCE_B_NUMBER);
} else if (IsAWordStart(sc.ch) || (sc.ch == '[')) {
- sc.SetState(SCE_B_KEYWORD);
+ sc.SetState(SCE_B_IDENTIFIER);
} else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {
sc.SetState(SCE_B_OPERATOR);
}
@@ -202,6 +222,9 @@ static void ColouriseVBScriptDoc(unsigned int startPos, int length, int initStyl
static const char * const vbWordListDesc[] = {
"Keywords",
+ "user1",
+ "user2",
+ "user3",
0
};