You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
sort code completions with rules
Fixups Add levenshtein distance for comparisons, remove kind sort order, try to improve as many different use cases as possible Trying again to improve code completion Sort code autocompletion options by similarity based on input To make it really brief, uses a combination `String.similiary`, the category system introduced in a previous PR, and some filtering to yield more predictable results, instead of scattering every completion option at seemingly random. It also gives much higher priority to strings that contain the base in full, closer to the beginning or are perfect matches. Also moves CodeCompletionOptionCompare to code_edit.cpp Co-Authored-By: Micky <66727710+Mickeon@users.noreply.github.com> Co-Authored-By: Eric M <41730826+EricEzaM@users.noreply.github.com>
This commit is contained in:
@@ -259,51 +259,4 @@ public:
|
||||
~ScriptTextEditor();
|
||||
};
|
||||
|
||||
const int KIND_COUNT = 10;
|
||||
// The order in which to sort code completion options.
|
||||
const ScriptLanguage::CodeCompletionKind KIND_SORT_ORDER[KIND_COUNT] = {
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_VARIABLE,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_MEMBER,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_ENUM,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_SIGNAL,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_CONSTANT,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_CLASS,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_NODE_PATH,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_FILE_PATH,
|
||||
ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT,
|
||||
};
|
||||
|
||||
// The custom comparer which will sort completion options.
|
||||
struct CodeCompletionOptionCompare {
|
||||
_FORCE_INLINE_ bool operator()(const ScriptLanguage::CodeCompletionOption &l, const ScriptLanguage::CodeCompletionOption &r) const {
|
||||
if (l.location == r.location) {
|
||||
// If locations are same, sort on kind
|
||||
if (l.kind == r.kind) {
|
||||
// If kinds are same, sort alphanumeric
|
||||
return l.display < r.display;
|
||||
}
|
||||
|
||||
// Sort kinds based on the const sorting array defined above. Lower index = higher priority.
|
||||
int l_index = -1;
|
||||
int r_index = -1;
|
||||
for (int i = 0; i < KIND_COUNT; i++) {
|
||||
const ScriptLanguage::CodeCompletionKind kind = KIND_SORT_ORDER[i];
|
||||
l_index = kind == l.kind ? i : l_index;
|
||||
r_index = kind == r.kind ? i : r_index;
|
||||
|
||||
if (l_index != -1 && r_index != -1) {
|
||||
return l_index < r_index;
|
||||
}
|
||||
}
|
||||
|
||||
// This return should never be hit unless something goes wrong.
|
||||
// l and r should always have a Kind which is in the sort order array.
|
||||
return l.display < r.display;
|
||||
}
|
||||
|
||||
return l.location < r.location;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // SCRIPT_TEXT_EDITOR_H
|
||||
|
||||
Reference in New Issue
Block a user