Skip to content

Commit

Permalink
Merge pull request #90487 from preslavnpetrov/export-script-typed-nod…
Browse files Browse the repository at this point in the history
…e-variables

Register the export info correctly when a script is used as the variable type for Node
  • Loading branch information
akien-mga committed Jun 3, 2024
2 parents 0d11108 + 653a8b1 commit ef065d2
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 10 deletions.
36 changes: 26 additions & 10 deletions modules/gdscript/gdscript_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4315,39 +4315,55 @@ bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node
return false;
}
break;
case GDScriptParser::DataType::CLASS:
case GDScriptParser::DataType::CLASS: {
StringName class_name;
if (export_type.class_type) {
class_name = export_type.class_type->get_global_name();
}
if (class_name == StringName()) {
push_error(R"(Script export type must be a global class.)", p_annotation);
return false;
}
if (ClassDB::is_parent_class(export_type.native_type, SNAME("Resource"))) {
variable->export_info.type = Variant::OBJECT;
variable->export_info.hint = PROPERTY_HINT_RESOURCE_TYPE;
variable->export_info.hint_string = export_type.to_string();
variable->export_info.hint_string = class_name;
} else if (ClassDB::is_parent_class(export_type.native_type, SNAME("Node"))) {
variable->export_info.type = Variant::OBJECT;
variable->export_info.hint = PROPERTY_HINT_NODE_TYPE;
variable->export_info.hint_string = export_type.to_string();
variable->export_info.hint_string = class_name;
} else {
push_error(R"(Export type can only be built-in, a resource, a node, or an enum.)", p_annotation);
return false;
}
} break;

break;
case GDScriptParser::DataType::SCRIPT: {
StringName class_name;
StringName native_base;
if (export_type.script_type.is_valid()) {
class_name = export_type.script_type->get_language()->get_global_class_name(export_type.script_type->get_path());
native_base = export_type.script_type->get_instance_base_type();
class_name = export_type.script_type->get_global_name();
}
if (class_name == StringName()) {
Ref<Script> script = ResourceLoader::load(export_type.script_path, SNAME("Script"));
if (script.is_valid()) {
class_name = script->get_language()->get_global_class_name(export_type.script_path);
native_base = script->get_instance_base_type();
class_name = script->get_global_name();
}
}
if (class_name != StringName() && native_base != StringName() && ClassDB::is_parent_class(native_base, SNAME("Resource"))) {
if (class_name == StringName()) {
push_error(R"(Script export type must be a global class.)", p_annotation);
return false;
}
if (ClassDB::is_parent_class(export_type.native_type, SNAME("Resource"))) {
variable->export_info.type = Variant::OBJECT;
variable->export_info.hint = PROPERTY_HINT_RESOURCE_TYPE;
variable->export_info.hint_string = class_name;
} else if (ClassDB::is_parent_class(export_type.native_type, SNAME("Node"))) {
variable->export_info.type = Variant::OBJECT;
variable->export_info.hint = PROPERTY_HINT_NODE_TYPE;
variable->export_info.hint_string = class_name;
} else {
push_error(R"(Export type can only be built-in, a resource, a node, or an enum.)", p_annotation);
return false;
}
} break;
case GDScriptParser::DataType::ENUM: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
class_name ExportVariableTest
extends Node

const Utils = preload("../../utils.notest.gd")
const PreloadedScript = preload("./export_variable.notest.gd")

# Built-in types.
@export var test_weak_int = 1
Expand All @@ -20,6 +22,10 @@ const Utils = preload("../../utils.notest.gd")
@export var test_image: Image
@export var test_timer: Timer

# Global custom classes.
@export var test_global_class: ExportVariableTest
@export var test_preloaded_script: PreloadedScript

# Arrays.
@export var test_array: Array
@export var test_array_bool: Array[bool]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class_name ExportPreloadedClassTest
extends Node
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ var test_image: Image = null
hint=RESOURCE_TYPE hint_string="Image" usage=DEFAULT|SCRIPT_VARIABLE class_name=&"Image"
var test_timer: Timer = null
hint=NODE_TYPE hint_string="Timer" usage=DEFAULT|SCRIPT_VARIABLE class_name=&"Timer"
var test_global_class: ExportVariableTest = null
hint=NODE_TYPE hint_string="ExportVariableTest" usage=DEFAULT|SCRIPT_VARIABLE class_name=&"ExportVariableTest"
var test_preloaded_script: ExportPreloadedClassTest = null
hint=NODE_TYPE hint_string="ExportPreloadedClassTest" usage=DEFAULT|SCRIPT_VARIABLE class_name=&"ExportPreloadedClassTest"
var test_array: Array = []
hint=NONE hint_string="" usage=DEFAULT|SCRIPT_VARIABLE class_name=&""
var test_array_bool: Array = Array[bool]([])
Expand Down

0 comments on commit ef065d2

Please sign in to comment.