Fix GDScript LSP variable rename
This commit is contained in:
parent
24cb43a874
commit
10fe6f14bb
3 changed files with 45 additions and 19 deletions
|
@ -400,6 +400,20 @@ void ExtendGDScriptParser::parse_function_symbol(const GDScriptParser::FunctionN
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case GDScriptParser::TypeNode::VARIABLE: {
|
||||||
|
GDScriptParser::VariableNode *variable_node = (GDScriptParser::VariableNode *)(node);
|
||||||
|
lsp::DocumentSymbol symbol;
|
||||||
|
symbol.kind = lsp::SymbolKind::Variable;
|
||||||
|
symbol.name = variable_node->identifier->name;
|
||||||
|
symbol.range.start.line = LINE_NUMBER_TO_INDEX(variable_node->start_line);
|
||||||
|
symbol.range.start.character = LINE_NUMBER_TO_INDEX(variable_node->start_column);
|
||||||
|
symbol.range.end.line = LINE_NUMBER_TO_INDEX(variable_node->end_line);
|
||||||
|
symbol.range.end.character = LINE_NUMBER_TO_INDEX(variable_node->end_column);
|
||||||
|
symbol.uri = uri;
|
||||||
|
symbol.script_path = path;
|
||||||
|
r_symbol.children.push_back(symbol);
|
||||||
|
} break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,15 +185,27 @@ const lsp::DocumentSymbol *GDScriptWorkspace::get_local_symbol(const ExtendGDScr
|
||||||
const lsp::DocumentSymbol *class_symbol = &p_parser->get_symbols();
|
const lsp::DocumentSymbol *class_symbol = &p_parser->get_symbols();
|
||||||
|
|
||||||
for (int i = 0; i < class_symbol->children.size(); ++i) {
|
for (int i = 0; i < class_symbol->children.size(); ++i) {
|
||||||
if (class_symbol->children[i].kind == lsp::SymbolKind::Function || class_symbol->children[i].kind == lsp::SymbolKind::Class) {
|
int kind = class_symbol->children[i].kind;
|
||||||
const lsp::DocumentSymbol *function_symbol = &class_symbol->children[i];
|
switch (kind) {
|
||||||
|
case lsp::SymbolKind::Function:
|
||||||
|
case lsp::SymbolKind::Method:
|
||||||
|
case lsp::SymbolKind::Class: {
|
||||||
|
const lsp::DocumentSymbol *function_symbol = &class_symbol->children[i];
|
||||||
|
|
||||||
for (int l = 0; l < function_symbol->children.size(); ++l) {
|
for (int l = 0; l < function_symbol->children.size(); ++l) {
|
||||||
const lsp::DocumentSymbol *local = &function_symbol->children[l];
|
const lsp::DocumentSymbol *local = &function_symbol->children[l];
|
||||||
if (!local->detail.is_empty() && local->name == p_symbol_identifier) {
|
if (!local->detail.is_empty() && local->name == p_symbol_identifier) {
|
||||||
return local;
|
return local;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
} break;
|
||||||
|
|
||||||
|
case lsp::SymbolKind::Variable: {
|
||||||
|
const lsp::DocumentSymbol *variable_symbol = &class_symbol->children[i];
|
||||||
|
if (variable_symbol->name == p_symbol_identifier) {
|
||||||
|
return variable_symbol;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -650,8 +662,18 @@ const lsp::DocumentSymbol *GDScriptWorkspace::resolve_symbol(const lsp::TextDocu
|
||||||
if (const ExtendGDScriptParser *target_parser = get_parse_result(target_script_path)) {
|
if (const ExtendGDScriptParser *target_parser = get_parse_result(target_script_path)) {
|
||||||
symbol = target_parser->get_symbol_defined_at_line(LINE_NUMBER_TO_INDEX(ret.location));
|
symbol = target_parser->get_symbol_defined_at_line(LINE_NUMBER_TO_INDEX(ret.location));
|
||||||
|
|
||||||
if (symbol && symbol->kind == lsp::SymbolKind::Function && symbol->name != symbol_identifier) {
|
if (symbol) {
|
||||||
symbol = get_parameter_symbol(symbol, symbol_identifier);
|
switch (symbol->kind) {
|
||||||
|
case lsp::SymbolKind::Function: {
|
||||||
|
if (symbol->name != symbol_identifier) {
|
||||||
|
symbol = get_parameter_symbol(symbol, symbol_identifier);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case lsp::SymbolKind::Variable: {
|
||||||
|
symbol = get_local_symbol(parser, symbol_identifier);
|
||||||
|
} break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -293,16 +293,6 @@ struct WorkspaceEdit {
|
||||||
}
|
}
|
||||||
|
|
||||||
_FORCE_INLINE_ void add_change(const String &uri, const int &line, const int &start_character, const int &end_character, const String &new_text) {
|
_FORCE_INLINE_ void add_change(const String &uri, const int &line, const int &start_character, const int &end_character, const String &new_text) {
|
||||||
if (HashMap<String, Vector<TextEdit>>::Iterator E = changes.find(uri)) {
|
|
||||||
Vector<TextEdit> edit_list = E->value;
|
|
||||||
for (int i = 0; i < edit_list.size(); ++i) {
|
|
||||||
TextEdit edit = edit_list[i];
|
|
||||||
if (edit.range.start.character == start_character) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TextEdit new_edit;
|
TextEdit new_edit;
|
||||||
new_edit.newText = new_text;
|
new_edit.newText = new_text;
|
||||||
new_edit.range.start.line = line;
|
new_edit.range.start.line = line;
|
||||||
|
|
Loading…
Reference in a new issue