aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--lexers/LexRust.cxx46
1 files changed, 28 insertions, 18 deletions
diff --git a/lexers/LexRust.cxx b/lexers/LexRust.cxx
index 994f938fd..8917b9182 100644
--- a/lexers/LexRust.cxx
+++ b/lexers/LexRust.cxx
@@ -447,35 +447,46 @@ enum CommentState {
* 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;
if (c == '*') {
- if (pos < max) {
- pos++;
- c = styler.SafeGetCharAt(pos, '\0');
- if (c != '*') {
- maybe_doc_comment = true;
- }
+ 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))
- 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 {
+ pos++;
+ }
if (pos >= max) {
if (state == DocComment || (state == UnknownComment && maybe_doc_comment))
styler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCKDOC);
@@ -483,7 +494,6 @@ static void ResumeBlockComment(Accessor &styler, int& pos, int max, CommentState
styler.ColourTo(pos - 1, SCE_RUST_COMMENTBLOCK);
break;
}
- pos++;
c = styler.SafeGetCharAt(pos, '\0');
}
}
@@ -527,7 +537,7 @@ 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) {
@@ -619,7 +629,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) {