Browse Source

Fix enums coming from other classes without preload

Fix #19704, fix #26001
Bojidar Marinov 6 years ago
parent
commit
9637e42705
3 changed files with 35 additions and 0 deletions
  1. 22 0
      core/script_language.cpp
  2. 1 0
      core/script_language.h
  3. 12 0
      modules/gdscript/gdscript_parser.cpp

+ 22 - 0
core/script_language.cpp

@@ -409,6 +409,11 @@ bool PlaceHolderScriptInstance::get(const StringName &p_name, Variant &r_ret) co
 		return true;
 	}
 
+	if (constants.has(p_name)) {
+		r_ret = constants[p_name];
+		return true;
+	}
+
 	if (!script->is_placeholder_fallback_enabled()) {
 		Variant defval;
 		if (script->get_property_default_value(p_name, defval)) {
@@ -444,6 +449,13 @@ Variant::Type PlaceHolderScriptInstance::get_property_type(const StringName &p_n
 			*r_is_valid = true;
 		return values[p_name].get_type();
 	}
+
+	if (constants.has(p_name)) {
+		if (r_is_valid)
+			*r_is_valid = true;
+		return constants[p_name].get_type();
+	}
+
 	if (r_is_valid)
 		*r_is_valid = false;
 
@@ -513,6 +525,9 @@ void PlaceHolderScriptInstance::update(const List<PropertyInfo> &p_properties, c
 		owner->_change_notify();
 	}
 	//change notify
+
+	constants.clear();
+	script->get_constants(&constants);
 }
 
 void PlaceHolderScriptInstance::property_set_fallback(const StringName &p_name, const Variant &p_value, bool *r_valid) {
@@ -552,6 +567,13 @@ Variant PlaceHolderScriptInstance::property_get_fallback(const StringName &p_nam
 				*r_valid = true;
 			return E->value();
 		}
+
+		E = constants.find(p_name);
+		if (E) {
+			if (r_valid)
+				*r_valid = true;
+			return E->value();
+		}
 	}
 
 	if (r_valid)

+ 1 - 0
core/script_language.h

@@ -336,6 +336,7 @@ class PlaceHolderScriptInstance : public ScriptInstance {
 	Object *owner;
 	List<PropertyInfo> properties;
 	Map<StringName, Variant> values;
+	Map<StringName, Variant> constants;
 	ScriptLanguage *language;
 	Ref<Script> script;
 

+ 12 - 0
modules/gdscript/gdscript_parser.cpp

@@ -815,6 +815,16 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
 				}
 
 				if (!dependencies_only) {
+					if (!bfn && ScriptServer::is_global_class(identifier)) {
+						Ref<Script> scr = ResourceLoader::load(ScriptServer::get_global_class_path(identifier));
+						if (scr.is_valid() && scr->is_valid()) {
+							ConstantNode *constant = alloc_node<ConstantNode>();
+							constant->value = scr;
+							expr = constant;
+							bfn = true;
+						}
+					}
+
 					// Check parents for the constant
 					if (!bfn && cln->extends_file != StringName()) {
 						Ref<GDScript> parent = ResourceLoader::load(cln->extends_file);
@@ -7247,6 +7257,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType
 				DataType result;
 				result.has_type = true;
 				result.script_type = scr;
+				result.is_constant = true;
 				result.is_meta_type = true;
 				Ref<GDScript> gds = scr;
 				if (gds.is_valid()) {
@@ -7297,6 +7308,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType
 				if (singleton.is_valid()) {
 					DataType result;
 					result.has_type = true;
+					result.is_constant = true;
 					result.script_type = singleton;
 
 					Ref<GDScript> gds = singleton;