summaryrefslogtreecommitdiffstats
path: root/core/object/script_language.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/object/script_language.cpp')
-rw-r--r--core/object/script_language.cpp57
1 files changed, 54 insertions, 3 deletions
diff --git a/core/object/script_language.cpp b/core/object/script_language.cpp
index 71f40660f4..a8b0e426ae 100644
--- a/core/object/script_language.cpp
+++ b/core/object/script_language.cpp
@@ -34,7 +34,6 @@
#include "core/core_string_names.h"
#include "core/debugger/engine_debugger.h"
#include "core/debugger/script_debugger.h"
-#include "core/variant/typed_array.h"
#include <stdint.h>
@@ -43,7 +42,7 @@ int ScriptServer::_language_count = 0;
bool ScriptServer::scripting_enabled = true;
bool ScriptServer::reload_scripts_on_save = false;
-bool ScriptServer::languages_finished = false;
+SafeFlag ScriptServer::languages_finished; // Used until GH-76581 is fixed properly.
ScriptEditRequestFunction ScriptServer::edit_request_func = nullptr;
void Script::_notification(int p_what) {
@@ -229,7 +228,7 @@ void ScriptServer::finish_languages() {
_languages[i]->finish();
}
global_classes_clear();
- languages_finished = true;
+ languages_finished.set();
}
void ScriptServer::set_reload_scripts_on_save(bool p_enable) {
@@ -241,12 +240,18 @@ bool ScriptServer::is_reload_scripts_on_save_enabled() {
}
void ScriptServer::thread_enter() {
+ if (!languages_finished.is_set()) {
+ return;
+ }
for (int i = 0; i < _language_count; i++) {
_languages[i]->thread_enter();
}
}
void ScriptServer::thread_exit() {
+ if (!languages_finished.is_set()) {
+ return;
+ }
for (int i = 0; i < _language_count; i++) {
_languages[i]->thread_exit();
}
@@ -461,6 +466,52 @@ void ScriptLanguage::get_core_type_words(List<String> *p_core_type_words) const
void ScriptLanguage::frame() {
}
+TypedArray<int> ScriptLanguage::CodeCompletionOption::get_option_characteristics(const String &p_base) {
+ // Return characacteristics of the match found by order of importance.
+ // Matches will be ranked by a lexicographical order on the vector returned by this function.
+ // The lower values indicate better matches and that they should go before in the order of appearance.
+ if (last_matches == matches) {
+ return charac;
+ }
+ charac.clear();
+ // Ensure base is not empty and at the same time that matches is not empty too.
+ if (p_base.length() == 0) {
+ last_matches = matches;
+ charac.push_back(location);
+ return charac;
+ }
+ charac.push_back(matches.size());
+ charac.push_back((matches[0].first == 0) ? 0 : 1);
+ charac.push_back(location);
+ const char32_t *target_char = &p_base[0];
+ int bad_case = 0;
+ for (const Pair<int, int> &match_segment : matches) {
+ const char32_t *string_to_complete_char = &display[match_segment.first];
+ for (int j = 0; j < match_segment.second; j++, string_to_complete_char++, target_char++) {
+ if (*string_to_complete_char != *target_char) {
+ bad_case++;
+ }
+ }
+ }
+ charac.push_back(bad_case);
+ charac.push_back(matches[0].first);
+ last_matches = matches;
+ return charac;
+}
+
+void ScriptLanguage::CodeCompletionOption::clear_characteristics() {
+ charac = TypedArray<int>();
+}
+
+TypedArray<int> ScriptLanguage::CodeCompletionOption::get_option_cached_characteristics() const {
+ // Only returns the cached value and warns if it was not updated since the last change of matches.
+ if (last_matches != matches) {
+ WARN_PRINT("Characteristics are not up to date.");
+ }
+
+ return charac;
+}
+
bool PlaceHolderScriptInstance::set(const StringName &p_name, const Variant &p_value) {
if (script->is_placeholder_fallback_enabled()) {
return false;