summaryrefslogtreecommitdiff
path: root/syntax.c
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2022-10-29 13:28:05 -0400
committerpommicket <pommicket@gmail.com>2022-10-29 13:28:05 -0400
commitb63bd066bf06317e6637aa03369a75c018c1939f (patch)
treedd6e81867a70217cb1ddcb6a124da11b1f2cd2a0 /syntax.c
parentd48a3c719585abd1917704762a7503630434446d (diff)
better highlighting of byte/raw/f strings in python, rust
Diffstat (limited to 'syntax.c')
-rw-r--r--syntax.c50
1 files changed, 48 insertions, 2 deletions
diff --git a/syntax.c b/syntax.c
index f03b7d8..c84a77d 100644
--- a/syntax.c
+++ b/syntax.c
@@ -342,6 +342,7 @@ static void syntax_highlight_rust(SyntaxState *state, char32_t const *line, u32
bool dealt_with = false;
bool has_1_char = i + 1 < line_len;
bool has_2_chars = i + 2 < line_len;
+ bool has_3_chars = i + 3 < line_len;
switch (c) {
case '/':
@@ -370,6 +371,30 @@ static void syntax_highlight_rust(SyntaxState *state, char32_t const *line, u32
}
}
break;
+ case 'r':
+ if (char_types && !comment_depth) {
+ if (has_2_chars && line[i+1] == '#' && line[i+2] == '"') {
+ // r before raw string
+ char_types[i] = SYNTAX_STRING;
+ dealt_with = true;
+ }
+ }
+ break;
+ case 'b':
+ if (char_types && !comment_depth) {
+ if ((has_1_char && line[i+1] == '"')
+ || (has_3_chars && line[i+1] == 'r' && line[i+2] == '#' && line[i+3] == '"')) {
+ // b before byte string
+ char_types[i] = SYNTAX_STRING;
+ dealt_with = true;
+ }
+ if (has_1_char && line[i+1] == '\'') {
+ // b before byte char
+ char_types[i] = SYNTAX_CHARACTER;
+ dealt_with = true;
+ }
+ }
+ break;
case '"':
if (!comment_depth) {
if (in_string) {
@@ -380,6 +405,11 @@ static void syntax_highlight_rust(SyntaxState *state, char32_t const *line, u32
if (char_types) {
char_types[i] = SYNTAX_STRING;
dealt_with = true;
+ if (string_is_raw && has_1_char) {
+ // highlighting for final #
+ ++i;
+ char_types[i] = SYNTAX_STRING;
+ }
}
string_is_raw = false;
}
@@ -453,9 +483,15 @@ static void syntax_highlight_rust(SyntaxState *state, char32_t const *line, u32
}
break;
case '#':
- if (!in_string && !comment_depth) {
+ if (char_types && !in_string && !comment_depth) {
if (i && line[i-1] == 'r') {
- // raw identifier -- not an attribute
+ if (has_1_char && line[i+1] == '"') {
+ // raw string
+ char_types[i] = SYNTAX_STRING;
+ dealt_with = true;
+ } else {
+ // raw identifier
+ }
break;
}
if (!has_2_chars) break;
@@ -541,6 +577,16 @@ static void syntax_highlight_python(SyntaxState *state, char32_t const *line, u3
i = line_len - 1;
}
break;
+ case 'f':
+ case 'r':
+ case 'b':
+ if (char_types && i+1 < line_len && (line[i+1] == '\'' || line[i+1] == '"')) {
+ // format/raw/byte string
+ // @TODO(eventually): we don't handle raw string highlighting correctly.
+ char_types[i] = SYNTAX_STRING;
+ dealt_with = true;
+ }
+ break;
case '\'':
case '"': {
bool dbl_quoted = c == '"';