You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-20 14:45:44 +00:00
LSP: Account for unicode identifiers
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user