From 426ccba70e646d902ee3db52ec7219f31fb37e9b Mon Sep 17 00:00:00 2001 From: Danil Alexeev Date: Thu, 21 Sep 2023 20:11:41 +0300 Subject: [PATCH] GDScript DocGen: Fix and improve appearance of metatypes and values --- editor/editor_help.cpp | 12 +- modules/gdscript/editor/gdscript_docgen.cpp | 126 ++++++++++++++++++-- modules/gdscript/editor/gdscript_docgen.h | 10 +- 3 files changed, 130 insertions(+), 18 deletions(-) diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index e35b3058379..cc9daa3cf14 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -462,7 +462,7 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview class_desc->add_text(" = "); class_desc->pop(); class_desc->push_color(theme_cache.value_color); - _add_text(_fix_constant(p_method.arguments[j].default_value)); + class_desc->add_text(_fix_constant(p_method.arguments[j].default_value)); class_desc->pop(); } @@ -1062,7 +1062,7 @@ void EditorHelp::_update_doc() { class_desc->pop(); class_desc->push_color(theme_cache.value_color); - _add_text(_fix_constant(cd.properties[i].default_value)); + class_desc->add_text(_fix_constant(cd.properties[i].default_value)); class_desc->pop(); class_desc->push_color(theme_cache.symbol_color); @@ -1238,7 +1238,7 @@ void EditorHelp::_update_doc() { class_desc->add_text(" [" + TTR("default:") + " "); class_desc->pop(); class_desc->push_color(theme_cache.value_color); - _add_text(_fix_constant(cd.theme_properties[i].default_value)); + class_desc->add_text(_fix_constant(cd.theme_properties[i].default_value)); class_desc->pop(); class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("]"); @@ -1454,7 +1454,7 @@ void EditorHelp::_update_doc() { class_desc->add_text(" = "); class_desc->pop(); class_desc->push_color(theme_cache.value_color); - _add_text(_fix_constant(enum_list[i].value)); + class_desc->add_text(_fix_constant(enum_list[i].value)); class_desc->pop(); if (enum_list[i].is_deprecated) { @@ -1530,7 +1530,7 @@ void EditorHelp::_update_doc() { class_desc->add_text(" = "); class_desc->pop(); class_desc->push_color(theme_cache.value_color); - _add_text(_fix_constant(constants[i].value)); + class_desc->add_text(_fix_constant(constants[i].value)); class_desc->pop(); if (constants[i].is_deprecated) { @@ -1711,7 +1711,7 @@ void EditorHelp::_update_doc() { class_desc->pop(); // color class_desc->push_color(theme_cache.value_color); - _add_text(_fix_constant(cd.properties[i].default_value)); + class_desc->add_text(_fix_constant(cd.properties[i].default_value)); class_desc->pop(); // color class_desc->push_color(theme_cache.symbol_color); diff --git a/modules/gdscript/editor/gdscript_docgen.cpp b/modules/gdscript/editor/gdscript_docgen.cpp index 0b440274c05..cffd6612613 100644 --- a/modules/gdscript/editor/gdscript_docgen.cpp +++ b/modules/gdscript/editor/gdscript_docgen.cpp @@ -32,14 +32,11 @@ #include "../gdscript.h" -using GDP = GDScriptParser; -using GDType = GDP::DataType; - -static String _get_script_path(const String &p_path) { +String GDScriptDocGen::_get_script_path(const String &p_path) { return p_path.trim_prefix("res://").quote(); } -static String _get_class_name(const GDP::ClassNode &p_class) { +String GDScriptDocGen::_get_class_name(const GDP::ClassNode &p_class) { const GDP::ClassNode *curr_class = &p_class; if (!curr_class->identifier) { // All inner classes have an identifier, so this is the outer class. return _get_script_path(curr_class->fqcn); @@ -56,7 +53,7 @@ static String _get_class_name(const GDP::ClassNode &p_class) { return full_name; } -static void _doctype_from_gdtype(const GDType &p_gdtype, String &r_type, String &r_enum, bool p_is_return = false) { +void GDScriptDocGen::_doctype_from_gdtype(const GDType &p_gdtype, String &r_type, String &r_enum, bool p_is_return) { if (!p_gdtype.is_hard_type()) { r_type = "Variant"; return; @@ -82,9 +79,18 @@ static void _doctype_from_gdtype(const GDType &p_gdtype, String &r_type, String r_type = Variant::get_type_name(p_gdtype.builtin_type); return; case GDType::NATIVE: + if (p_gdtype.is_meta_type) { + //r_type = GDScriptNativeClass::get_class_static(); + r_type = "Object"; // "GDScriptNativeClass" refers to a blank page. + return; + } r_type = p_gdtype.native_type; return; case GDType::SCRIPT: + if (p_gdtype.is_meta_type) { + r_type = p_gdtype.script_type.is_valid() ? p_gdtype.script_type->get_class() : Script::get_class_static(); + return; + } if (p_gdtype.script_type.is_valid()) { if (p_gdtype.script_type->get_global_name() != StringName()) { r_type = p_gdtype.script_type->get_global_name(); @@ -102,9 +108,17 @@ static void _doctype_from_gdtype(const GDType &p_gdtype, String &r_type, String r_type = "Object"; return; case GDType::CLASS: + if (p_gdtype.is_meta_type) { + r_type = GDScript::get_class_static(); + return; + } r_type = _get_class_name(*p_gdtype.class_type); return; case GDType::ENUM: + if (p_gdtype.is_meta_type) { + r_type = "Dictionary"; + return; + } r_type = "int"; r_enum = String(p_gdtype.native_type).replace("::", "."); if (r_enum.begins_with("res://")) { @@ -123,6 +137,90 @@ static void _doctype_from_gdtype(const GDType &p_gdtype, String &r_type, String } } +String GDScriptDocGen::_docvalue_from_variant(const Variant &p_variant, int p_recursion_level) { + constexpr int MAX_RECURSION_LEVEL = 2; + + switch (p_variant.get_type()) { + case Variant::STRING: + return String(p_variant).c_escape().quote(); + case Variant::OBJECT: + return ""; + case Variant::DICTIONARY: { + const Dictionary dict = p_variant; + + if (dict.is_empty()) { + return "{}"; + } + + if (p_recursion_level > MAX_RECURSION_LEVEL) { + return "{...}"; + } + + List keys; + dict.get_key_list(&keys); + keys.sort(); + + String data; + for (List::Element *E = keys.front(); E; E = E->next()) { + if (E->prev()) { + data += ", "; + } + data += _docvalue_from_variant(E->get(), p_recursion_level + 1) + ": " + _docvalue_from_variant(dict[E->get()], p_recursion_level + 1); + } + + return "{" + data + "}"; + } break; + case Variant::ARRAY: { + const Array array = p_variant; + String result; + + if (array.get_typed_builtin() != Variant::NIL) { + result += "Array["; + + Ref