summaryrefslogtreecommitdiff
path: root/modules/gdscript
diff options
context:
space:
mode:
authorFrancois Belair <razoric480@gmail.com>2021-08-06 14:55:05 -0400
committerFrancois Belair <razoric480@gmail.com>2021-08-06 14:55:05 -0400
commit070d63496622bfd87f98c8f49669b87756906834 (patch)
treea3bdd06e116a179b31ad4b5a88854c9c1b994404 /modules/gdscript
parent18c5d862e425b121498aaf613772169f911581e6 (diff)
Fix LSP completion crashing on scene-less scripts
Diffstat (limited to 'modules/gdscript')
-rw-r--r--modules/gdscript/language_server/gdscript_text_document.cpp10
-rw-r--r--modules/gdscript/language_server/gdscript_workspace.cpp28
2 files changed, 22 insertions, 16 deletions
diff --git a/modules/gdscript/language_server/gdscript_text_document.cpp b/modules/gdscript/language_server/gdscript_text_document.cpp
index c0013ac23a..9574c765bc 100644
--- a/modules/gdscript/language_server/gdscript_text_document.cpp
+++ b/modules/gdscript/language_server/gdscript_text_document.cpp
@@ -431,9 +431,13 @@ void GDScriptTextDocument::sync_script_content(const String &p_path, const Strin
GDScriptLanguageProtocol::get_singleton()->get_workspace()->parse_script(path, p_content);
EditorFileSystem::get_singleton()->update_file(path);
- Ref<GDScript> script = ResourceLoader::load(path);
- script->load_source_code(path);
- script->reload(true);
+ Error error;
+ Ref<GDScript> script = ResourceLoader::load(path, "", ResourceFormatLoader::CACHE_MODE_REUSE, &error);
+ if (error == OK) {
+ if (script->load_source_code(path) == OK) {
+ script->reload(true);
+ }
+ }
}
void GDScriptTextDocument::show_native_symbol_in_editor(const String &p_symbol_id) {
diff --git a/modules/gdscript/language_server/gdscript_workspace.cpp b/modules/gdscript/language_server/gdscript_workspace.cpp
index 4fc229a0f8..1512b4bb89 100644
--- a/modules/gdscript/language_server/gdscript_workspace.cpp
+++ b/modules/gdscript/language_server/gdscript_workspace.cpp
@@ -523,22 +523,24 @@ void GDScriptWorkspace::completion(const lsp::CompletionParams &p_params, List<S
Array stack;
Node *current = nullptr;
- stack.push_back(owner_scene_node);
+ if (owner_scene_node != nullptr) {
+ stack.push_back(owner_scene_node);
- while (!stack.is_empty()) {
- current = stack.pop_back();
- Ref<GDScript> script = current->get_script();
- if (script.is_valid() && script->get_path() == path) {
- break;
- }
- for (int i = 0; i < current->get_child_count(); ++i) {
- stack.push_back(current->get_child(i));
+ while (!stack.is_empty()) {
+ current = stack.pop_back();
+ Ref<GDScript> script = current->get_script();
+ if (script.is_valid() && script->get_path() == path) {
+ break;
+ }
+ for (int i = 0; i < current->get_child_count(); ++i) {
+ stack.push_back(current->get_child(i));
+ }
}
- }
- Ref<GDScript> script = current->get_script();
- if (!script.is_valid() || script->get_path() != path) {
- current = owner_scene_node;
+ Ref<GDScript> script = current->get_script();
+ if (!script.is_valid() || script->get_path() != path) {
+ current = owner_scene_node;
+ }
}
String code = parser->get_text_for_completion(p_params.position);