diff --git a/modules/gdscript/language_server/gdscript_extend_parser.cpp b/modules/gdscript/language_server/gdscript_extend_parser.cpp index f8df46b256..654e39d1f9 100644 --- a/modules/gdscript/language_server/gdscript_extend_parser.cpp +++ b/modules/gdscript/language_server/gdscript_extend_parser.cpp @@ -712,9 +712,9 @@ String ExtendGDScriptParser::get_identifier_under_position(const LSP::Position & LSP::Position pos = p_position; if ( 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. - && 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--; } @@ -723,7 +723,7 @@ String ExtendGDScriptParser::get_identifier_under_position(const LSP::Position & for (int c = pos.character; c >= 0; c--) { start_pos = 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) { break; } @@ -732,13 +732,17 @@ String ExtendGDScriptParser::get_identifier_under_position(const LSP::Position & int end_pos = pos.character; for (int c = pos.character; c < line.length(); 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) { break; } end_pos = c; } + if (!is_unicode_identifier_start(line[start_pos + 1])) { + return ""; + } + if (start_pos < end_pos) { r_range.start.line = r_range.end.line = pos.line; r_range.start.character = start_pos + 1; diff --git a/modules/gdscript/tests/scripts/lsp/class.gd b/modules/gdscript/tests/scripts/lsp/class.gd index 53d0b14d72..519497573c 100644 --- a/modules/gdscript/tests/scripts/lsp/class.gd +++ b/modules/gdscript/tests/scripts/lsp/class.gd @@ -58,16 +58,19 @@ class Inner2: # | | ^^^^ -> class2:func:arg2 # ^^^^ -> class2:func:arg1 -class Inner3 extends Inner2: +class Inner三 extends Inner2: # | | ^^^^^^ -> class2 # ^^^^^^ class3 -> class3 var whatever = "foo" # ^^^^^^^^ class3:whatever -> class3:whatever + var ütf8 = "" + # ^^^^ class3:utf8 -> class3:utf8 + func _init(): # ^^^^^ class3: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 class NestedInInner3: @@ -97,14 +100,18 @@ func _ready(): # | | ^^^^^^ -> func:class1:value2 # ^^^^^^ -> func:class1:value1 - var inner3 = Inner3.new() + var inner3 = Inner三.new() # | | | | ^^^ -> class3:init # | | ^^^^^^ -> class3 # ^^^^^^ func:class3 -> func:class3 print(inner3) # ^^^^^^ -> func:class3 - var nested1 = Inner3.NestedInInner3.new() + print(inner3.ütf8) + # | | ^^^^ -> class3:utf8 + # ^^^^^^ -> func:class3 + + var nested1 = Inner三.NestedInInner3.new() # | | | | ^^^^^^^^^^^^^^ -> class3:nested1 # | | ^^^^^^ -> class3 # ^^^^^^^ func:class3:nested1 -> func:class3:nested1 @@ -115,7 +122,7 @@ func _ready(): print(value_nested1) # ^^^^^^^^^^^^^ -> func:class3:nested1:value - var nested2 = Inner3.AnotherNestedInInner3.new() + var nested2 = Inner三.AnotherNestedInInner3.new() # | | | | ^^^^^^^^^^^^^^^^^^^^^ -> class3:nested2 # | | ^^^^^^ -> class3 # ^^^^^^^ func:class3:nested2 -> func:class3:nested2