Improve binary operator highlighting

This commit is contained in:
VolTer 2022-07-22 20:13:56 +02:00
parent d6b1dd4854
commit 2e6108d181

View file

@ -46,6 +46,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
bool prev_is_char = false;
bool prev_is_number = false;
bool prev_is_binary_op = false;
bool in_keyword = false;
bool in_word = false;
bool in_function_name = false;
@ -84,16 +85,17 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
const int line_length = str.length();
Color prev_color;
if (in_region != -1 && str.length() == 0) {
if (in_region != -1 && line_length == 0) {
color_region_cache[p_line] = in_region;
}
for (int j = 0; j < str.length(); j++) {
for (int j = 0; j < line_length; j++) {
Dictionary highlighter_info;
color = font_color;
bool is_char = !is_symbol(str[j]);
bool is_a_symbol = is_symbol(str[j]);
bool is_number = is_digit(str[j]);
bool is_binary_op = false;
/* color regions */
if (is_a_symbol || in_region != -1) {
@ -244,7 +246,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
is_hex_notation = false;
}
// disallow anything not a 0 or 1
// disallow anything not a 0 or 1 in binary notation
if (is_bin_notation && (is_binary_digit(str[j]))) {
is_number = true;
} else if (is_bin_notation) {
@ -285,7 +287,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
if (!in_keyword && is_char && !prev_is_char) {
int to = j;
while (to < str.length() && !is_symbol(str[to])) {
while (to < line_length && !is_symbol(str[to])) {
to++;
}
@ -318,12 +320,12 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
in_signal_declaration = true;
} else {
int k = j;
while (k < str.length() && !is_symbol(str[k]) && str[k] != '\t' && str[k] != ' ') {
while (k < line_length && !is_symbol(str[k]) && !is_whitespace(str[k])) {
k++;
}
// check for space between name and bracket
while (k < str.length() && (str[k] == '\t' || str[k] == ' ')) {
while (k < line_length && is_whitespace(str[k])) {
k++;
}
@ -336,7 +338,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
// Check for lambda.
if (in_function_name && previous_text == GDScriptTokenizer::get_token_name(GDScriptTokenizer::Token::FUNC)) {
k = j - 1;
while (k > 0 && (str[k] == '\t' || str[k] == ' ')) {
while (k > 0 && is_whitespace(str[k])) {
k--;
}
@ -349,7 +351,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
if (!in_function_name && !in_member_variable && !in_keyword && !is_number && in_word) {
int k = j;
while (k > 0 && !is_symbol(str[k]) && str[k] != '\t' && str[k] != ' ') {
while (k > 0 && !is_symbol(str[k]) && !is_whitespace(str[k])) {
k--;
}
@ -378,7 +380,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
if (in_variable_declaration || in_function_args) {
int k = j;
// Skip space
while (k < str.length() && (str[k] == '\t' || str[k] == ' ')) {
while (k < line_length && is_whitespace(str[k])) {
k++;
}
@ -395,13 +397,41 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
in_member_variable = false;
}
if (!in_node_path && in_region == -1 && (str[j] == '^')) {
if (j > 0 && (str[j] == '&' || str[j] == '^' || str[j] == '%' || str[j] == '+' || str[j] == '-' || str[j] == '~')) {
int k = j - 1;
while (k > 0 && is_whitespace(str[k])) {
k--;
}
if (!is_symbol(str[k]) || str[k] == '"' || str[k] == '\'' || str[k] == ')' || str[k] == ']' || str[k] == '}') {
is_binary_op = true;
}
}
// Highlight '+' and '-' like numbers when unary
if ((str[j] == '+' || str[j] == '-' || str[j] == '~') && !is_binary_op) {
is_number = true;
is_a_symbol = false;
}
// Keep symbol color for binary '&&'. In the case of '&&&' use StringName color for the last ampersand
if (!in_string_name && in_region == -1 && str[j] == '&' && !is_binary_op) {
if (j >= 2 && str[j - 1] == '&' && str[j - 2] != '&' && prev_is_binary_op) {
is_binary_op = true;
} else if (j == 0 || (j > 0 && str[j - 1] != '&') || prev_is_binary_op) {
in_string_name = true;
}
} else if (in_region != -1 || is_a_symbol) {
in_string_name = false;
}
// '^^' has no special meaning, so unlike StringName, when binary, use NodePath color for the last caret
if (!in_node_path && in_region == -1 && str[j] == '^' && !is_binary_op && (j == 0 || (j > 0 && str[j - 1] != '^') || prev_is_binary_op)) {
in_node_path = true;
} else if (in_region != -1 || (is_a_symbol && str[j] != '/' && str[j] != '%')) {
} else if (in_region != -1 || is_a_symbol) {
in_node_path = false;
}
if (!in_node_ref && in_region == -1 && (str[j] == '$' || str[j] == '%')) {
if (!in_node_ref && in_region == -1 && (str[j] == '$' || (str[j] == '%' && !is_binary_op))) {
in_node_ref = true;
} else if (in_region != -1 || (is_a_symbol && str[j] != '/' && str[j] != '%')) {
in_node_ref = false;
@ -413,16 +443,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
in_annotation = false;
}
if (!in_string_name && in_region == -1 && str[j] == '&') {
in_string_name = true;
} else if (in_region != -1 || is_a_symbol) {
in_string_name = false;
}
if (in_node_path) {
next_type = NODE_PATH;
color = node_path_color;
} else if (in_node_ref) {
if (in_node_ref) {
next_type = NODE_REF;
color = node_ref_color;
} else if (in_annotation) {
@ -431,6 +452,9 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
} else if (in_string_name) {
next_type = STRING_NAME;
color = string_name_color;
} else if (in_node_path) {
next_type = NODE_PATH;
color = node_path_color;
} else if (in_keyword) {
next_type = KEYWORD;
color = keyword_color;
@ -487,6 +511,7 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
prev_is_char = is_char;
prev_is_number = is_number;
prev_is_binary_op = is_binary_op;
if (color != prev_color) {
prev_color = color;