summaryrefslogtreecommitdiffstats
path: root/core/object
diff options
context:
space:
mode:
authorRémi Verschelde <remi@verschelde.fr>2023-06-08 18:14:31 +0200
committerGitHub <noreply@github.com>2023-06-08 18:14:31 +0200
commit577ab3c5653e9987b8501a7bfc3db96da245c01f (patch)
tree029e1f7c8723925faf30be31a056a9dd2f755efa /core/object
parent3a19d8169155141fec645136c985f7c01e11dc36 (diff)
parent006e899bb34dbf024aeff1dae97468ae5547a415 (diff)
downloadredot-engine-577ab3c5653e9987b8501a7bfc3db96da245c01f.tar.gz
Merge pull request #75746 from ajreckof/order_autocomplete
Sort code autocompletion with rules
Diffstat (limited to 'core/object')
-rw-r--r--core/object/script_language.cpp47
-rw-r--r--core/object/script_language.h14
2 files changed, 58 insertions, 3 deletions
diff --git a/core/object/script_language.cpp b/core/object/script_language.cpp
index 71f40660f4..6f047d80aa 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>
@@ -461,6 +460,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;
diff --git a/core/object/script_language.h b/core/object/script_language.h
index 696c9a94a5..829f01fbcc 100644
--- a/core/object/script_language.h
+++ b/core/object/script_language.h
@@ -35,6 +35,7 @@
#include "core/io/resource.h"
#include "core/templates/pair.h"
#include "core/templates/rb_map.h"
+#include "core/variant/typed_array.h"
class ScriptLanguage;
template <typename T>
@@ -305,8 +306,8 @@ public:
virtual Error open_in_external_editor(const Ref<Script> &p_script, int p_line, int p_col) { return ERR_UNAVAILABLE; }
virtual bool overrides_external_editor() { return false; }
- /* Keep enum in Sync with: */
- /* /scene/gui/code_edit.h - CodeEdit::CodeCompletionKind */
+ // Keep enums in sync with:
+ // scene/gui/code_edit.h - CodeEdit::CodeCompletionKind
enum CodeCompletionKind {
CODE_COMPLETION_KIND_CLASS,
CODE_COMPLETION_KIND_FUNCTION,
@@ -321,6 +322,7 @@ public:
CODE_COMPLETION_KIND_MAX
};
+ // scene/gui/code_edit.h - CodeEdit::CodeCompletionLocation
enum CodeCompletionLocation {
LOCATION_LOCAL = 0,
LOCATION_PARENT_MASK = 1 << 8,
@@ -336,6 +338,7 @@ public:
Ref<Resource> icon;
Variant default_value;
Vector<Pair<int, int>> matches;
+ Vector<Pair<int, int>> last_matches;
int location = LOCATION_OTHER;
CodeCompletionOption() {}
@@ -346,6 +349,13 @@ public:
kind = p_kind;
location = p_location;
}
+
+ TypedArray<int> get_option_characteristics(const String &p_base);
+ void clear_characteristics();
+ TypedArray<int> get_option_cached_characteristics() const;
+
+ private:
+ TypedArray<int> charac;
};
virtual Error complete_code(const String &p_code, const String &p_path, Object *p_owner, List<CodeCompletionOption> *r_options, bool &r_force, String &r_call_hint) { return ERR_UNAVAILABLE; }