1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-12 13:20:55 +00:00

GDScript: Add support for variadic functions

This commit is contained in:
Danil Alexeev
2025-03-30 12:59:05 +03:00
parent 3b963ab8b6
commit ee121ef80e
33 changed files with 416 additions and 65 deletions

View File

@@ -582,14 +582,20 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
for (int j = 0; j < p_method.arguments.size(); j++) {
const DocData::ArgumentDoc &argument = p_method.arguments[j];
class_desc->push_color(theme_cache.text_color);
if (j > 0) {
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(", ");
class_desc->pop(); // color
}
class_desc->push_color(theme_cache.text_color);
class_desc->add_text(argument.name);
class_desc->pop(); // color
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(colon_nbsp);
class_desc->pop(); // color
_add_type(argument.type, argument.enumeration, argument.is_bitfield);
if (!argument.default_value.is_empty()) {
@@ -601,13 +607,11 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
class_desc->add_text(_fix_constant(argument.default_value));
class_desc->pop(); // color
}
class_desc->pop(); // color
}
if (is_vararg) {
if (!p_method.arguments.is_empty()) {
class_desc->push_color(theme_cache.text_color);
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(", ");
class_desc->pop(); // color
}
@@ -615,6 +619,22 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("...");
class_desc->pop(); // color
const DocData::ArgumentDoc &rest_argument = p_method.rest_argument;
class_desc->push_color(theme_cache.text_color);
class_desc->add_text(rest_argument.name.is_empty() ? "args" : rest_argument.name);
class_desc->pop(); // color
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(colon_nbsp);
class_desc->pop(); // color
if (rest_argument.type.is_empty()) {
_add_type("Array");
} else {
_add_type(rest_argument.type, rest_argument.enumeration, rest_argument.is_bitfield);
}
}
class_desc->push_color(theme_cache.symbol_color);
@@ -1558,14 +1578,20 @@ void EditorHelp::_update_doc() {
for (int j = 0; j < signal.arguments.size(); j++) {
const DocData::ArgumentDoc &argument = signal.arguments[j];
class_desc->push_color(theme_cache.text_color);
if (j > 0) {
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(", ");
class_desc->pop(); // color
}
class_desc->push_color(theme_cache.text_color);
class_desc->add_text(argument.name);
class_desc->pop(); // color
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(colon_nbsp);
class_desc->pop(); // color
_add_type(argument.type, argument.enumeration, argument.is_bitfield);
// Signals currently do not support default argument values, neither the core nor GDScript.
@@ -1579,8 +1605,6 @@ void EditorHelp::_update_doc() {
class_desc->add_text(_fix_constant(argument.default_value));
class_desc->pop(); // color
}
class_desc->pop(); // color
}
class_desc->push_color(theme_cache.symbol_color);
@@ -2002,14 +2026,20 @@ void EditorHelp::_update_doc() {
for (int j = 0; j < annotation.arguments.size(); j++) {
const DocData::ArgumentDoc &argument = annotation.arguments[j];
class_desc->push_color(theme_cache.text_color);
if (j > 0) {
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(", ");
class_desc->pop(); // color
}
class_desc->push_color(theme_cache.text_color);
class_desc->add_text(argument.name);
class_desc->pop(); // color
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(colon_nbsp);
class_desc->pop(); // color
_add_type(argument.type, argument.enumeration, argument.is_bitfield);
if (!argument.default_value.is_empty()) {
@@ -2021,13 +2051,11 @@ void EditorHelp::_update_doc() {
class_desc->add_text(_fix_constant(argument.default_value));
class_desc->pop(); // color
}
class_desc->pop(); // color
}
if (annotation.qualifiers.contains("vararg")) {
if (!annotation.arguments.is_empty()) {
class_desc->push_color(theme_cache.text_color);
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(", ");
class_desc->pop(); // color
}
@@ -2035,6 +2063,22 @@ void EditorHelp::_update_doc() {
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text("...");
class_desc->pop(); // color
const DocData::ArgumentDoc &rest_argument = annotation.rest_argument;
class_desc->push_color(theme_cache.text_color);
class_desc->add_text(rest_argument.name.is_empty() ? "args" : rest_argument.name);
class_desc->pop(); // color
class_desc->push_color(theme_cache.symbol_color);
class_desc->add_text(colon_nbsp);
class_desc->pop(); // color
if (rest_argument.type.is_empty()) {
_add_type("Array");
} else {
_add_type(rest_argument.type, rest_argument.enumeration, rest_argument.is_bitfield);
}
}
class_desc->push_color(theme_cache.symbol_color);
@@ -3730,10 +3774,13 @@ EditorHelpBit::HelpData EditorHelpBit::_get_method_help_data(const StringName &p
}
current.doc_type = { method.return_type, method.return_enum, method.return_is_bitfield };
for (const DocData::ArgumentDoc &argument : method.arguments) {
const DocType argument_type = { argument.type, argument.enumeration, argument.is_bitfield };
current.arguments.push_back({ argument.name, argument_type, argument.default_value });
const DocType argument_doc_type = { argument.type, argument.enumeration, argument.is_bitfield };
current.arguments.push_back({ argument.name, argument_doc_type, argument.default_value });
}
current.qualifiers = method.qualifiers;
const DocData::ArgumentDoc &rest_argument = method.rest_argument;
const DocType rest_argument_doc_type = { rest_argument.type, rest_argument.enumeration, rest_argument.is_bitfield };
current.rest_argument = { rest_argument.name, rest_argument_doc_type, rest_argument.default_value };
if (method.name == p_method_name) {
result = current;
@@ -3895,6 +3942,7 @@ void EditorHelpBit::_update_labels() {
title->pop(); // font
const Color text_color = get_theme_color(SNAME("text_color"), SNAME("EditorHelp"));
const Color symbol_color = get_theme_color(SNAME("symbol_color"), SNAME("EditorHelp"));
const Color value_color = get_theme_color(SNAME("value_color"), SNAME("EditorHelp"));
const Color qualifier_color = get_theme_color(SNAME("qualifier_color"), SNAME("EditorHelp"));
@@ -3970,10 +4018,14 @@ void EditorHelpBit::_update_labels() {
const ArgumentData &argument = help_data.arguments[i];
if (i > 0) {
title->push_color(symbol_color);
title->add_text(", ");
title->pop(); // color
}
title->push_color(text_color);
title->add_text(argument.name);
title->pop(); // color
title->push_color(symbol_color);
title->add_text(colon_nbsp);
@@ -3994,12 +4046,30 @@ void EditorHelpBit::_update_labels() {
if (help_data.qualifiers.contains("vararg")) {
if (!help_data.arguments.is_empty()) {
title->push_color(symbol_color);
title->add_text(", ");
title->pop(); // color
}
title->push_color(symbol_color);
title->add_text("...");
title->pop(); // color
const ArgumentData &rest_argument = help_data.rest_argument;
title->push_color(text_color);
title->add_text(rest_argument.name.is_empty() ? "args" : rest_argument.name);
title->pop(); // color
title->push_color(symbol_color);
title->add_text(colon_nbsp);
title->pop(); // color
if (rest_argument.doc_type.type.is_empty()) {
_add_type_to_title({ "Array", "", false });
} else {
_add_type_to_title(rest_argument.doc_type);
}
}
title->push_color(symbol_color);