|
@@ -122,7 +122,7 @@ GDScriptParser::GDScriptParser() {
|
|
|
register_annotation(MethodInfo("@onready"), AnnotationInfo::VARIABLE, &GDScriptParser::onready_annotation);
|
|
|
// Export annotations.
|
|
|
register_annotation(MethodInfo("@export"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_NONE, Variant::NIL>);
|
|
|
- register_annotation(MethodInfo("@export_enum", PropertyInfo(Variant::STRING, "names")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_ENUM, Variant::INT>, varray(), true);
|
|
|
+ register_annotation(MethodInfo("@export_enum", PropertyInfo(Variant::STRING, "names")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_ENUM, Variant::NIL>, varray(), true);
|
|
|
register_annotation(MethodInfo("@export_file", PropertyInfo(Variant::STRING, "filter")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_FILE, Variant::STRING>, varray(""), true);
|
|
|
register_annotation(MethodInfo("@export_dir"), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_DIR, Variant::STRING>);
|
|
|
register_annotation(MethodInfo("@export_global_file", PropertyInfo(Variant::STRING, "filter")), AnnotationInfo::VARIABLE, &GDScriptParser::export_annotations<PROPERTY_HINT_GLOBAL_FILE, Variant::STRING>, varray(""), true);
|
|
@@ -3657,6 +3657,10 @@ bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node
|
|
|
|
|
|
String hint_string;
|
|
|
for (int i = 0; i < p_annotation->resolved_arguments.size(); i++) {
|
|
|
+ if (p_annotation->name != SNAME("@export_placeholder") && String(p_annotation->resolved_arguments[i]).contains(",")) {
|
|
|
+ push_error(vformat(R"(Argument %d of annotation "%s" contains a comma. Use separate arguments instead.)", i + 1, p_annotation->name), p_annotation->arguments[i]);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
if (i > 0) {
|
|
|
hint_string += ",";
|
|
|
}
|
|
@@ -3801,6 +3805,24 @@ bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node
|
|
|
variable->export_info.hint_string = hint_prefix + ":" + variable->export_info.hint_string;
|
|
|
variable->export_info.type = Variant::ARRAY;
|
|
|
}
|
|
|
+ } else if (p_annotation->name == SNAME("@export_enum")) {
|
|
|
+ Variant::Type enum_type = Variant::INT;
|
|
|
+
|
|
|
+ if (export_type.kind == DataType::BUILTIN && export_type.builtin_type == Variant::STRING) {
|
|
|
+ enum_type = Variant::STRING;
|
|
|
+ } else if (export_type.is_variant() && variable->initializer != nullptr) {
|
|
|
+ DataType initializer_type = variable->initializer->get_datatype();
|
|
|
+ if (initializer_type.kind == DataType::BUILTIN && initializer_type.builtin_type == Variant::STRING) {
|
|
|
+ enum_type = Variant::STRING;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ variable->export_info.type = enum_type;
|
|
|
+
|
|
|
+ if (!export_type.is_variant() && (export_type.kind != DataType::BUILTIN || export_type.builtin_type != enum_type)) {
|
|
|
+ push_error(vformat(R"("@export_enum" annotation requires a variable of type "int" or "String" but type "%s" was given instead.)", export_type.to_string()), variable);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
} else {
|
|
|
// Validate variable type with export.
|
|
|
if (!export_type.is_variant() && (export_type.kind != DataType::BUILTIN || export_type.builtin_type != t_type)) {
|