diff options
Diffstat (limited to 'modules/gdscript/gdscript_editor.cpp')
-rw-r--r-- | modules/gdscript/gdscript_editor.cpp | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 951ae6ce99..cfff20f6d3 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -43,6 +43,7 @@ #include "core/config/engine.h" #include "core/core_constants.h" #include "core/io/file_access.h" +#include "core/math/expression.h" #ifdef TOOLS_ENABLED #include "core/config/project_settings.h" @@ -427,7 +428,30 @@ void GDScriptLanguage::debug_get_globals(List<String> *p_globals, List<Variant> } String GDScriptLanguage::debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems, int p_max_depth) { - return ""; + List<String> names; + List<Variant> values; + debug_get_stack_level_locals(p_level, &names, &values, p_max_subitems, p_max_depth); + + Vector<String> name_vector; + for (const String &name : names) { + name_vector.push_back(name); + } + + Array value_array; + for (const Variant &value : values) { + value_array.push_back(value); + } + + Expression expression; + if (expression.parse(p_expression, name_vector) == OK) { + ScriptInstance *instance = debug_get_stack_level_instance(p_level); + if (instance) { + Variant return_val = expression.execute(value_array, instance->get_owner()); + return return_val.get_construct_string(); + } + } + + return String(); } void GDScriptLanguage::get_recognized_extensions(List<String> *p_extensions) const { @@ -1115,10 +1139,12 @@ static void _find_identifiers_in_class(const GDScriptParser::ClassNode *p_class, continue; } option = ScriptLanguage::CodeCompletionOption(member.function->identifier->name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, location); - if (member.function->parameters.size() > 0) { + if (member.function->parameters.size() > 0 || (member.function->info.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } break; case GDScriptParser::ClassNode::Member::SIGNAL: @@ -1160,6 +1186,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base if (!p_types_only && base_type.is_meta_type && base_type.kind != GDScriptParser::DataType::BUILTIN && base_type.kind != GDScriptParser::DataType::ENUM) { ScriptLanguage::CodeCompletionOption option("new", ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, ScriptLanguage::LOCATION_LOCAL); option.insert_text += "("; + option.display += U"(\u2026)"; r_result.insert(option.display, option); } @@ -1217,10 +1244,12 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base } int location = p_recursion_depth + _get_method_location(scr->get_class_name(), E.name); ScriptLanguage::CodeCompletionOption option(E.name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, location); - if (E.arguments.size()) { + if (E.arguments.size() || (E.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } r_result.insert(option.display, option); } @@ -1303,10 +1332,12 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base } int location = p_recursion_depth + _get_method_location(type, E.name); ScriptLanguage::CodeCompletionOption option(E.name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, location); - if (E.arguments.size()) { + if (E.arguments.size() || (E.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } r_result.insert(option.display, option); } @@ -1374,10 +1405,12 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base continue; } ScriptLanguage::CodeCompletionOption option(E.name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, location); - if (E.arguments.size()) { + if (E.arguments.size() || (E.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } r_result.insert(option.display, option); } @@ -1409,8 +1442,10 @@ static void _find_identifiers(const GDScriptParser::CompletionContext &p_context ScriptLanguage::CodeCompletionOption option(String(E), ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION); if (function.arguments.size() || (function.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } r_result.insert(option.display, option); } @@ -1457,6 +1492,7 @@ static void _find_identifiers(const GDScriptParser::CompletionContext &p_context while (*kwa) { ScriptLanguage::CodeCompletionOption option(*kwa, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION); option.insert_text += "("; + option.display += U"(\u2026)"; r_result.insert(option.display, option); kwa++; } @@ -1467,6 +1503,7 @@ static void _find_identifiers(const GDScriptParser::CompletionContext &p_context for (List<StringName>::Element *E = utility_func_names.front(); E; E = E->next()) { ScriptLanguage::CodeCompletionOption option(E->get(), ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION); option.insert_text += "("; + option.display += U"(\u2026)"; // As all utility functions contain an argument or more, this is hardcoded here. r_result.insert(option.display, option); } @@ -3448,7 +3485,7 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c } String arg = arg_itr->name; if (arg.contains(":")) { - arg = arg.substr(0, arg.find(":")); + arg = arg.substr(0, arg.find_char(':')); } method_hint += arg; if (use_type_hint) { |