summaryrefslogtreecommitdiffstats
path: root/modules/gdscript/language_server/gdscript_workspace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript/language_server/gdscript_workspace.cpp')
-rw-r--r--modules/gdscript/language_server/gdscript_workspace.cpp71
1 files changed, 64 insertions, 7 deletions
diff --git a/modules/gdscript/language_server/gdscript_workspace.cpp b/modules/gdscript/language_server/gdscript_workspace.cpp
index 068930002b..d21f53652f 100644
--- a/modules/gdscript/language_server/gdscript_workspace.cpp
+++ b/modules/gdscript/language_server/gdscript_workspace.cpp
@@ -148,13 +148,10 @@ ExtendGDScriptParser *GDScriptWorkspace::get_parse_successed_script(const String
}
ExtendGDScriptParser *GDScriptWorkspace::get_parse_result(const String &p_path) {
- const Map<String, ExtendGDScriptParser *>::Element *S = scripts.find(p_path);
+ const Map<String, ExtendGDScriptParser *>::Element *S = parse_results.find(p_path);
if (!S) {
+ parse_local_script(p_path);
S = parse_results.find(p_path);
- if (!S) {
- parse_local_script(p_path);
- S = scripts.find(p_path);
- }
}
if (S) {
return S->get();
@@ -162,6 +159,22 @@ ExtendGDScriptParser *GDScriptWorkspace::get_parse_result(const String &p_path)
return NULL;
}
+void GDScriptWorkspace::strip_flat_symbols(const String &p_branch) {
+
+ typedef Map<String, const lsp::DocumentSymbol *>::Element *Item;
+
+ List<Item> removal_items;
+ for (Item E = flat_symbols.front(); E; E = E->next()) {
+ if (E->key().begins_with(p_branch)) {
+ removal_items.push_back(E);
+ }
+ }
+
+ for (List<Item>::Element *E = removal_items.front(); E; E = E->next()) {
+ flat_symbols.erase(E->get());
+ }
+}
+
String GDScriptWorkspace::marked_documentation(const String &p_bbcode) {
String markdown = p_bbcode.strip_edges();
@@ -313,21 +326,41 @@ Error GDScriptWorkspace::initialize() {
native_symbols.insert(class_name, class_symbol);
}
+ if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
+ // expand symbol trees to the flat symbol pool
+ for (Map<StringName, lsp::DocumentSymbol>::Element *E = native_symbols.front(); E; E = E->next()) {
+ const lsp::DocumentSymbol &class_symbol = E->get();
+ for (int i = 0; i < class_symbol.children.size(); i++) {
+ const lsp::DocumentSymbol &symbol = class_symbol.children[i];
+ flat_symbols.insert(JOIN_SYMBOLS(class_symbol.name, symbol.name), &symbol);
+ }
+ }
+ }
+
reload_all_workspace_scripts();
return OK;
}
Error GDScriptWorkspace::parse_script(const String &p_path, const String &p_content) {
+
ExtendGDScriptParser *parser = memnew(ExtendGDScriptParser);
Error err = parser->parse(p_content, p_path);
Map<String, ExtendGDScriptParser *>::Element *last_parser = parse_results.find(p_path);
Map<String, ExtendGDScriptParser *>::Element *last_script = scripts.find(p_path);
if (err == OK) {
+
remove_cache_parser(p_path);
parse_results[p_path] = parser;
scripts[p_path] = parser;
+
+ if (GDScriptLanguageProtocol::get_singleton()->is_smart_resolve_enabled()) {
+ // update flat symbol pool
+ strip_flat_symbols(p_path);
+ parser->dump_member_symbols(flat_symbols);
+ }
+
} else {
if (last_parser && last_script && last_parser->get() != last_script->get()) {
memdelete(last_parser->get());
@@ -377,11 +410,13 @@ void GDScriptWorkspace::publish_diagnostics(const String &p_path) {
}
void GDScriptWorkspace::completion(const lsp::CompletionParams &p_params, List<ScriptCodeCompletionOption> *r_options) {
+
String path = get_file_path(p_params.textDocument.uri);
String call_hint;
bool forced = false;
- if (Map<String, ExtendGDScriptParser *>::Element *E = parse_results.find(path)) {
- String code = E->get()->get_text_for_completion(p_params.position);
+
+ if (const ExtendGDScriptParser *parser = get_parse_result(path)) {
+ String code = parser->get_text_for_completion(p_params.position);
GDScriptLanguage::get_singleton()->complete_code(code, path, NULL, r_options, forced, call_hint);
}
}
@@ -442,6 +477,28 @@ const lsp::DocumentSymbol *GDScriptWorkspace::resolve_symbol(const lsp::TextDocu
return symbol;
}
+void GDScriptWorkspace::resolve_related_symbols(const lsp::TextDocumentPositionParams &p_doc_pos, List<const lsp::DocumentSymbol *> &r_list) {
+
+ String path = get_file_path(p_doc_pos.textDocument.uri);
+ if (const ExtendGDScriptParser *parser = get_parse_result(path)) {
+
+ String symbol_identifier;
+ Vector2i offset;
+ symbol_identifier = parser->get_identifier_under_position(p_doc_pos.position, offset);
+
+ for (Map<String, const lsp::DocumentSymbol *>::Element *E = flat_symbols.front(); E; E = E->next()) {
+ String id = E->key();
+ int idx = id.find_last(".");
+ if (idx >= 0 && idx < id.length() - 1) {
+ String name = id.substr(idx + 1, id.length());
+ if (name == symbol_identifier) {
+ r_list.push_back(E->get());
+ }
+ }
+ }
+ }
+}
+
GDScriptWorkspace::GDScriptWorkspace() {
ProjectSettings::get_singleton()->get_resource_path();
}