1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-19 14:31:59 +00:00

LSP: Account for unicode identifiers

This commit is contained in:
HolonProduction
2025-04-13 16:18:19 +02:00
parent 215acd52e8
commit e213737d66
2 changed files with 20 additions and 9 deletions

View File

@@ -712,9 +712,9 @@ String ExtendGDScriptParser::get_identifier_under_position(const LSP::Position &
LSP::Position pos = p_position; LSP::Position pos = p_position;
if ( if (
pos.character >= line.length() // Cursor at end of line. pos.character >= line.length() // Cursor at end of line.
|| (!is_ascii_identifier_char(line[pos.character]) // Not on valid identifier char. || (!is_unicode_identifier_continue(line[pos.character]) // Not on valid identifier char.
&& (pos.character > 0 // Not line start -> there is a prev char. && (pos.character > 0 // Not line start -> there is a prev char.
&& is_ascii_identifier_char(line[pos.character - 1]) // Prev is valid identifier char. && is_unicode_identifier_continue(line[pos.character - 1]) // Prev is valid identifier char.
))) { ))) {
pos.character--; pos.character--;
} }
@@ -723,7 +723,7 @@ String ExtendGDScriptParser::get_identifier_under_position(const LSP::Position &
for (int c = pos.character; c >= 0; c--) { for (int c = pos.character; c >= 0; c--) {
start_pos = c; start_pos = c;
char32_t ch = line[c]; char32_t ch = line[c];
bool valid_char = is_ascii_identifier_char(ch); bool valid_char = is_unicode_identifier_continue(ch);
if (!valid_char) { if (!valid_char) {
break; break;
} }
@@ -732,13 +732,17 @@ String ExtendGDScriptParser::get_identifier_under_position(const LSP::Position &
int end_pos = pos.character; int end_pos = pos.character;
for (int c = pos.character; c < line.length(); c++) { for (int c = pos.character; c < line.length(); c++) {
char32_t ch = line[c]; char32_t ch = line[c];
bool valid_char = is_ascii_identifier_char(ch); bool valid_char = is_unicode_identifier_continue(ch);
if (!valid_char) { if (!valid_char) {
break; break;
} }
end_pos = c; end_pos = c;
} }
if (!is_unicode_identifier_start(line[start_pos + 1])) {
return "";
}
if (start_pos < end_pos) { if (start_pos < end_pos) {
r_range.start.line = r_range.end.line = pos.line; r_range.start.line = r_range.end.line = pos.line;
r_range.start.character = start_pos + 1; r_range.start.character = start_pos + 1;

View File

@@ -58,16 +58,19 @@ class Inner2:
# | | ^^^^ -> class2:func:arg2 # | | ^^^^ -> class2:func:arg2
# ^^^^ -> class2:func:arg1 # ^^^^ -> class2:func:arg1
class Inner3 extends Inner2: class Inner extends Inner2:
# | | ^^^^^^ -> class2 # | | ^^^^^^ -> class2
# ^^^^^^ class3 -> class3 # ^^^^^^ class3 -> class3
var whatever = "foo" var whatever = "foo"
# ^^^^^^^^ class3:whatever -> class3:whatever # ^^^^^^^^ class3:whatever -> class3:whatever
var ütf8 = ""
# ^^^^ class3:utf8 -> class3:utf8
func _init(): func _init():
# ^^^^^ class3:init # ^^^^^ class3:init
# Note: no self-ref check here: resolves to `Object._init`. # Note: no self-ref check here: resolves to `Object._init`.
# usages of `Inner3.new()` DO resolve to this `_init` # usages of `Inner.new()` DO resolve to this `_init`
pass pass
class NestedInInner3: class NestedInInner3:
@@ -97,14 +100,18 @@ func _ready():
# | | ^^^^^^ -> func:class1:value2 # | | ^^^^^^ -> func:class1:value2
# ^^^^^^ -> func:class1:value1 # ^^^^^^ -> func:class1:value1
var inner3 = Inner3.new() var inner3 = Inner.new()
# | | | | ^^^ -> class3:init # | | | | ^^^ -> class3:init
# | | ^^^^^^ -> class3 # | | ^^^^^^ -> class3
# ^^^^^^ func:class3 -> func:class3 # ^^^^^^ func:class3 -> func:class3
print(inner3) print(inner3)
# ^^^^^^ -> func:class3 # ^^^^^^ -> func:class3
var nested1 = Inner3.NestedInInner3.new() print(inner3.ütf8)
# | | ^^^^ -> class3:utf8
# ^^^^^^ -> func:class3
var nested1 = Inner三.NestedInInner3.new()
# | | | | ^^^^^^^^^^^^^^ -> class3:nested1 # | | | | ^^^^^^^^^^^^^^ -> class3:nested1
# | | ^^^^^^ -> class3 # | | ^^^^^^ -> class3
# ^^^^^^^ func:class3:nested1 -> func:class3:nested1 # ^^^^^^^ func:class3:nested1 -> func:class3:nested1
@@ -115,7 +122,7 @@ func _ready():
print(value_nested1) print(value_nested1)
# ^^^^^^^^^^^^^ -> func:class3:nested1:value # ^^^^^^^^^^^^^ -> func:class3:nested1:value
var nested2 = Inner3.AnotherNestedInInner3.new() var nested2 = Inner.AnotherNestedInInner3.new()
# | | | | ^^^^^^^^^^^^^^^^^^^^^ -> class3:nested2 # | | | | ^^^^^^^^^^^^^^^^^^^^^ -> class3:nested2
# | | ^^^^^^ -> class3 # | | ^^^^^^ -> class3
# ^^^^^^^ func:class3:nested2 -> func:class3:nested2 # ^^^^^^^ func:class3:nested2 -> func:class3:nested2