[geany/geany] 36537c: Update Rust Scintilla lexer to Scintilla revision 4946:4d9978010c3a

SiegeLord git-noreply at xxxxx
Tue Jan 14 17:50:37 UTC 2014


Branch:      refs/heads/master
Author:      SiegeLord <slabode at aim.com>
Committer:   SiegeLord <slabode at aim.com>
Date:        Tue, 14 Jan 2014 17:50:37 UTC
Commit:      36537c4dcd7d3f78075289128c0e0a4a13544880
             https://github.com/geany/geany/commit/36537c4dcd7d3f78075289128c0e0a4a13544880

Log Message:
-----------
Update Rust Scintilla lexer to Scintilla revision 4946:4d9978010c3a


Modified Paths:
--------------
    scintilla/lexers/LexRust.cxx

Modified: scintilla/lexers/LexRust.cxx
177 files changed, 95 insertions(+), 82 deletions(-)
===================================================================
@@ -34,6 +34,9 @@
 using namespace Scintilla;
 #endif
 
+static const int NUM_RUST_KEYWORD_LISTS = 7;
+static const int MAX_RUST_IDENT_CHARS = 1023;
+
 static bool IsStreamCommentStyle(int style) {
 	return style == SCE_RUST_COMMENTBLOCK ||
 		   style == SCE_RUST_COMMENTBLOCKDOC;
@@ -67,7 +70,7 @@ struct OptionsRust {
 	}
 };
 
-static const char * const rustWordLists[] = {
+static const char * const rustWordLists[NUM_RUST_KEYWORD_LISTS + 1] = {
 			"Primary keywords and identifiers",
 			"Built in types",
 			"Other keywords",
@@ -114,7 +117,7 @@ struct OptionSetRust : public OptionSet<OptionsRust> {
 };
 
 class LexerRust : public ILexer {
-	WordList keywords[7];
+	WordList keywords[NUM_RUST_KEYWORD_LISTS];
 	OptionsRust options;
 	OptionSetRust osRust;
 public:
@@ -159,7 +162,7 @@ int SCI_METHOD LexerRust::PropertySet(const char *key, const char *val) {
 
 int SCI_METHOD LexerRust::WordListSet(int n, const char *wl) {
 	int firstModification = -1;
-	if (n < 7) {
+	if (n < NUM_RUST_KEYWORD_LISTS) {
 		WordList *wordListN = &keywords[n];
 		WordList wlNew;
 		wlNew.Set(wl);
@@ -209,12 +212,12 @@ static void ScanIdentifier(Accessor& styler, int& pos, WordList *keywords) {
 		pos++;
 		styler.ColourTo(pos - 1, SCE_RUST_MACRO);
 	} else {
-		char s[1024];
+		char s[MAX_RUST_IDENT_CHARS + 1];
 		int len = pos - start;
-		len = len > 1024 ? 1024 : len;
+		len = len > MAX_RUST_IDENT_CHARS ? MAX_RUST_IDENT_CHARS : len;
 		GrabString(s, styler, start, len);
 		bool keyword = false;
-		for (int ii = 0; ii < 7; ii++) {
+		for (int ii = 0; ii < NUM_RUST_KEYWORD_LISTS; ii++) {
 			if (keywords[ii].InList(s)) {
 				styler.ColourTo(pos - 1, SCE_RUST_WORD + ii);
 				keyword = true;
@@ -237,41 +240,28 @@ static void ScanDigits(Accessor& styler, int& pos, int base) {
 	}
 }
 
-static bool ScanExponent(Accessor& styler, int& pos) {
-	int c = styler.SafeGetCharAt(pos, '\0');
-	if (c == 'e' || c == 'E') {
-		pos++;
-		c = styler.SafeGetCharAt(pos, '\0');
-		if (c == '-' || c == '+')
-			pos++;
-		int old_pos = pos;
-		ScanDigits(styler, pos, 10);
-		if (old_pos == pos)	{
-			return false;
-		}
-	}
-	return true;
-}
-
 static void ScanNumber(Accessor& styler, int& pos) {
 	int base = 10;
 	int c = styler.SafeGetCharAt(pos, '\0');
 	int n = styler.SafeGetCharAt(pos + 1, '\0');
 	bool error = false;
 	if (c == '0' && n == 'x') {
-        pos += 2;
-        base = 16;
-    } else if (c == '0' && n == 'b') {
-        pos += 2;
-        base = 2;
-    }
-    int old_pos = pos;
-    ScanDigits(styler, pos, base);
-    c = styler.SafeGetCharAt(pos, '\0');
-    if (c == 'u' || c == 'i') {
+		pos += 2;
+		base = 16;
+	} else if (c == '0' && n == 'b') {
+		pos += 2;
+		base = 2;
+	} else if (c == '0' && n == 'o') {
+		pos += 2;
+		base = 8;
+	}
+	int old_pos = pos;
+	ScanDigits(styler, pos, base);
+	c = styler.SafeGetCharAt(pos, '\0');
+	if (c == 'u' || c == 'i') {
 		pos++;
 		c = styler.SafeGetCharAt(pos, '\0');
-		int n = styler.SafeGetCharAt(pos + 1, '\0');
+		n = styler.SafeGetCharAt(pos + 1, '\0');
 		if (c == '8') {
 			pos++;
 		} else if (c == '1' && n == '6') {
@@ -281,16 +271,34 @@ static void ScanNumber(Accessor& styler, int& pos) {
 		} else if (c == '6' && n == '4') {
 			pos += 2;
 		}
-	} else if (c == '.') {
-		error = base != 10;
-		pos++;
-		ScanDigits(styler, pos, 10);
-		error |= !ScanExponent(styler, pos);
+	} else {
+		n = styler.SafeGetCharAt(pos + 1, '\0');
+		if (c == '.' && !(IsIdentifierStart(n) || n == '.')) {
+			error |= base != 10;
+			pos++;
+			ScanDigits(styler, pos, 10);
+		}
+
+		c = styler.SafeGetCharAt(pos, '\0');
+		if (c == 'e' || c == 'E') {
+			error |= base != 10;
+			pos++;
+			c = styler.SafeGetCharAt(pos, '\0');
+			if (c == '-' || c == '+')
+				pos++;
+			int old_pos = pos;
+			ScanDigits(styler, pos, 10);
+			if (old_pos == pos) {
+				error = true;
+			}
+		}
+		
 		c = styler.SafeGetCharAt(pos, '\0');
 		if (c == 'f') {
+			error |= base != 10;
 			pos++;
 			c = styler.SafeGetCharAt(pos, '\0');
-			int n = styler.SafeGetCharAt(pos + 1, '\0');
+			n = styler.SafeGetCharAt(pos + 1, '\0');
 			if (c == '3' && n == '2') {
 				pos += 2;
 			} else if (c == '6' && n == '4') {
@@ -438,83 +446,86 @@ enum CommentState {
 };
 
 /*
- * The rule for block-doc comments is as follows (use x for asterisk)... /xx and /x! start doc comments
- * unless the entire comment is x's.
+ * The rule for block-doc comments is as follows: /xxN and /x! (where x is an asterisk, N is a non-asterisk) start doc comments.
+ * Otherwise it's a regular comment.
  */
-static void ResumeBlockComment(Accessor &styler, int& pos, int max, CommentState state) {
+static void ResumeBlockComment(Accessor &styler, int& pos, int max, CommentState state, int level) {
 	int c = styler.SafeGetCharAt(pos, '\0');
 	bool maybe_doc_comment = false;
-	bool any_non_asterisk = false;
-	if (c == '*' || c == '!') {
+	if (c == '*') {
+		int n = styler.SafeGetCharAt(pos + 1, '\0');
+		if (n != '*' && n != '/') {
+			maybe_doc_comment = true;
+		}
+	} else if (c == '!') {
 		maybe_doc_comment = true;
 	}
+
 	for (;;) {
+		int n = styler.SafeGetCharAt(pos + 1, '\0');
 		if (pos == styler.LineEnd(styler.GetLine(pos)))
-			styler.SetLineState(styler.GetLine(pos), 0);
+			styler.SetLineState(styler.GetLine(pos), level);
 		if (c == '*') {
-			int n = styler.SafeGetCharAt(pos + 1, '\0');
+			pos++;
 			if (n == '/') {
-				pos += 2;
-				if (state == DocComment || (state == UnknownComment && maybe_doc_comment && any_non_asterisk))
-					styler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCKDOC);
-				else
-					styler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCK);
-				break;
+				pos++;
+				level--;
+				if (level == 0) {
+					styler.SetLineState(styler.GetLine(pos), 0);
+					if (state == DocComment || (state == UnknownComment && maybe_doc_comment))
+						styler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCKDOC);
+					else
+						styler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCK);
+					break;
+				}
+			}
+		} else if (c == '/') {
+			pos++;
+			if (n == '*') {
+				pos++;
+				level++;
 			}
-		} else {
-			any_non_asterisk = true;
 		}
-		if (c == '\0' || pos >= max) {
+		else {
+			pos++;
+		}
+		if (pos >= max) {
 			if (state == DocComment || (state == UnknownComment && maybe_doc_comment))
 				styler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCKDOC);
 			else
 				styler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCK);
 			break;
 		}
-		pos++;
 		c = styler.SafeGetCharAt(pos, '\0');
 	}
 }
 
 /*
- * The rule for line-doc comments is as follows... /// and //! start doc comments
- * unless the comment is composed entirely of /'s followed by whitespace. That is:
- * // - comment
- * /// - doc-comment
- * //// - comment
- * ////a - doc-comment
+ * The rule for line-doc comments is as follows... ///N and //! (where N is a non slash) start doc comments.
+ * Otherwise it's a normal line comment.
  */
 static void ResumeLineComment(Accessor &styler, int& pos, int max, CommentState state) {
 	bool maybe_doc_comment = false;
-	int num_leading_slashes = 0;
 	int c = styler.SafeGetCharAt(pos, '\0');
 	if (c == '/') {
-		num_leading_slashes = 1;
-		while (pos < max) {
+		if (pos < max) {
 			pos++;
 			c = styler.SafeGetCharAt(pos, '\0');
-			if (c == '/') {
-				num_leading_slashes++;
-			} else {
-				break;
+			if (c != '/') {
+				maybe_doc_comment = true;
 			}
 		}
 	} else if (c == '!') {
 		maybe_doc_comment = true;
 	}
 
-	bool non_white_space = false;
-	while (pos < max && c != '\n' && c != '\0') {
-		if (!IsWhitespace(c))
-			non_white_space = true;
+	while (pos < max && c != '\n') {
 		if (pos == styler.LineEnd(styler.GetLine(pos)))
 			styler.SetLineState(styler.GetLine(pos), 0);
 		pos++;
 		c = styler.SafeGetCharAt(pos, '\0');
 	}
 
-	maybe_doc_comment |= num_leading_slashes == 1 || (num_leading_slashes > 1 && non_white_space);
-
 	if (state == DocComment || (state == UnknownComment && maybe_doc_comment))
 		styler.ColourTo(pos - 1, SCE_RUST_COMMENTLINEDOC);
 	else
@@ -528,14 +539,14 @@ static void ScanComments(Accessor &styler, int& pos, int max) {
 	if (c == '/')
 		ResumeLineComment(styler, pos, max, UnknownComment);
 	else if (c == '*')
-		ResumeBlockComment(styler, pos, max, UnknownComment);
+		ResumeBlockComment(styler, pos, max, UnknownComment, 1);
 }
 
 static void ResumeString(Accessor &styler, int& pos, int max) {
 	int c = styler.SafeGetCharAt(pos, '\0');
 	bool error = false;
 	while (c != '"' && !error) {
-		if (c == '\0' || pos >= max) {
+		if (pos >= max) {
 			error = true;
 			break;
 		}
@@ -570,6 +581,9 @@ static void ResumeString(Accessor &styler, int& pos, int max) {
 
 static void ResumeRawString(Accessor &styler, int& pos, int max, int num_hashes) {
 	for (;;) {
+		if (pos == styler.LineEnd(styler.GetLine(pos)))
+			styler.SetLineState(styler.GetLine(pos), num_hashes);
+
 		int c = styler.SafeGetCharAt(pos, '\0');
 		if (c == '"') {
 			pos++;
@@ -583,13 +597,12 @@ static void ResumeRawString(Accessor &styler, int& pos, int max, int num_hashes)
 				styler.ColourTo(pos - 1, SCE_RUST_STRINGR);
 				break;
 			}
-		} else if (c == '\0' || pos >= max) {
+		} else if (pos >= max) {
 			styler.ColourTo(pos - 1, SCE_RUST_STRINGR);
 			break;
+		} else {		
+			pos++;
 		}
-		if (pos == styler.LineEnd(styler.GetLine(pos)))
-			styler.SetLineState(styler.GetLine(pos), num_hashes);
-		pos++;
 	}
 }
 
@@ -618,7 +631,7 @@ void SCI_METHOD LexerRust::Lex(unsigned int startPos, int length, int initStyle,
 	styler.StartSegment(pos);
 
 	if (initStyle == SCE_RUST_COMMENTBLOCK || initStyle == SCE_RUST_COMMENTBLOCKDOC) {
-		ResumeBlockComment(styler, pos, max, initStyle == SCE_RUST_COMMENTBLOCKDOC ? DocComment : NotDocComment);
+		ResumeBlockComment(styler, pos, max, initStyle == SCE_RUST_COMMENTBLOCKDOC ? DocComment : NotDocComment, styler.GetLineState(styler.GetLine(pos) - 1));
 	} else if (initStyle == SCE_RUST_COMMENTLINE || initStyle == SCE_RUST_COMMENTLINEDOC) {
 		ResumeLineComment(styler, pos, max, initStyle == SCE_RUST_COMMENTLINEDOC ? DocComment : NotDocComment);
 	} else if (initStyle == SCE_RUST_STRING) {



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list