From d13e89cbbdda9722fc636b0666adce58501d1c9b Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sun, 2 Jan 2022 08:38:11 +0200 Subject: Some changes in Syntax --- src/Row.zig | 54 ++++++++++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 30 deletions(-) (limited to 'src/Row.zig') diff --git a/src/Row.zig b/src/Row.zig index 38fb72b..a47be6a 100644 --- a/src/Row.zig +++ b/src/Row.zig @@ -149,14 +149,12 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void { } const syntax = buf.syntax.?; - const kw1 = syntax.keywords1; - const kw2 = syntax.keywords2; - var after_sep = true; var in_comment = if (self.idx > 0) buf.rows.items[self.idx - 1].ends_with_open_comment else false; var curr_str_quote: ?u8 = null; var i: usize = 0; + var last_sep: usize = 0; main_loop: while (i < self.rdata.items.len) { const prev_hl = if (i > 0) self.hldata.items[i - 1] else .normal; @@ -165,7 +163,7 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void { if (curr_str_quote == null and !in_comment and scs.len + i <= self.rdata.items.len) { if (std.mem.eql(u8, scs, self.rdata.items[i..(i + scs.len)])) { std.mem.set(Highlight, self.hldata.items[i..], .comment); - break; + break :main_loop; } } } @@ -181,16 +179,16 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void { std.mem.set(Highlight, self.hldata.items[i..(i + mce.len)], .comment_ml); i += mce.len; in_comment = false; - after_sep = true; + last_sep = i; } else { i += 1; - continue; + continue :main_loop; } } else if (mcs.len + i <= self.rdata.items.len and std.mem.eql(u8, mcs, self.rdata.items[i..(i + mcs.len)])) { std.mem.set(Highlight, self.hldata.items[i..(i + mcs.len)], .comment_ml); i += mcs.len; in_comment = true; - continue; + continue :main_loop; } } } @@ -208,54 +206,50 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void { i += 1; } else if (c == quote) { curr_str_quote = null; - after_sep = true; + last_sep = i; } - continue; + continue :main_loop; } else { // TODO: Move this to syntax struct if (c == '"' or c == '\'') { curr_str_quote = c; self.hldata.items[i] = .string; i += 1; - continue; + continue :main_loop; } } } if (syntax.flags.hl_numbers) { - if ((std.ascii.isDigit(c) and (after_sep or prev_hl == .number)) or (c == '.' and prev_hl == .number)) { - after_sep = false; + if ((std.ascii.isDigit(c) and (last_sep == i or prev_hl == .number)) + or (c == '.' and prev_hl == .number) + ) { self.hldata.items[i] = .number; i += 1; - continue; + continue :main_loop; } } - if (after_sep) { - for (kw1) |kw| { - if (i + kw.len <= self.rdata.items.len and std.mem.eql(u8, kw, self.rdata.items[i..(i + kw.len)]) and (i + kw.len == self.rdata.items.len or syntax.isSeparator(self.rdata.items[i + kw.len]))) { - std.mem.set(Highlight, self.hldata.items[i..(i + kw.len)], .keyword1); - i += kw.len; - after_sep = false; - continue :main_loop; - } + if (syntax.isSeparator(c)) { + const id = self.rdata.items[last_sep..i]; + if (syntax.keyword_classifier(id)) |hl| { + std.mem.set(Highlight, self.hldata.items[last_sep..i], hl); } - for (kw2) |kw| { - if (i + kw.len <= self.rdata.items.len and std.mem.eql(u8, kw, self.rdata.items[i..(i + kw.len)]) and (i + kw.len == self.rdata.items.len or syntax.isSeparator(self.rdata.items[i + kw.len]))) { - std.mem.set(Highlight, self.hldata.items[i..(i + kw.len)], .keyword2); - i += kw.len; - after_sep = false; - continue :main_loop; - } - } + last_sep = i + 1; } - after_sep = syntax.isSeparator(c); i += 1; } + if (!in_comment) { + const id = self.rdata.items[last_sep..self.rdata.items.len]; + if (syntax.keyword_classifier(id)) |hl| { + std.mem.set(Highlight, self.hldata.items[last_sep..self.rdata.items.len], hl); + } + } + if (in_comment != self.ends_with_open_comment) { self.ends_with_open_comment = in_comment; if (self.idx + 1 < buf.rows.items.len) { -- cgit v1.2.3