Merge pull request #70331 from anvilfolk/run-weird

Unify GDScriptAnalyzer in-editor and runtime autoload checks
This commit is contained in:
Rémi Verschelde 2022-12-21 09:20:56 +01:00
commit 2becec34cd
No known key found for this signature in database
GPG key ID: C3336907360768E1
3 changed files with 17 additions and 13 deletions

View file

@ -1966,6 +1966,16 @@ void GDScriptLanguage::add_named_global_constant(const StringName &p_name, const
named_globals[p_name] = p_value; named_globals[p_name] = p_value;
} }
Variant GDScriptLanguage::get_any_global_constant(const StringName &p_name) {
if (named_globals.has(p_name)) {
return named_globals[p_name];
}
if (globals.has(p_name)) {
return _global_array[globals[p_name]];
}
ERR_FAIL_V_MSG(Variant(), vformat("Could not find any global constant with name: %s.", p_name));
}
void GDScriptLanguage::remove_named_global_constant(const StringName &p_name) { void GDScriptLanguage::remove_named_global_constant(const StringName &p_name) {
ERR_FAIL_COND(!named_globals.has(p_name)); ERR_FAIL_COND(!named_globals.has(p_name));
named_globals.erase(p_name); named_globals.erase(p_name);

View file

@ -455,6 +455,9 @@ public:
_FORCE_INLINE_ Variant *get_global_array() { return _global_array; } _FORCE_INLINE_ Variant *get_global_array() { return _global_array; }
_FORCE_INLINE_ const HashMap<StringName, int> &get_global_map() const { return globals; } _FORCE_INLINE_ const HashMap<StringName, int> &get_global_map() const { return globals; }
_FORCE_INLINE_ const HashMap<StringName, Variant> &get_named_globals_map() const { return named_globals; } _FORCE_INLINE_ const HashMap<StringName, Variant> &get_named_globals_map() const { return named_globals; }
// These two functions should be used when behavior needs to be consistent between in-editor and running the scene
bool has_any_global_constant(const StringName &p_name) { return named_globals.has(p_name) || globals.has(p_name); }
Variant get_any_global_constant(const StringName &p_name);
_FORCE_INLINE_ static GDScriptLanguage *get_singleton() { return singleton; } _FORCE_INLINE_ static GDScriptLanguage *get_singleton() { return singleton; }

View file

@ -3403,8 +3403,8 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
} }
} }
} else if (ResourceLoader::get_resource_type(autoload.path) == "PackedScene") { } else if (ResourceLoader::get_resource_type(autoload.path) == "PackedScene") {
if (GDScriptLanguage::get_singleton()->get_named_globals_map().has(name)) { if (GDScriptLanguage::get_singleton()->has_any_global_constant(name)) {
Variant constant = GDScriptLanguage::get_singleton()->get_named_globals_map()[name]; Variant constant = GDScriptLanguage::get_singleton()->get_any_global_constant(name);
Node *node = Object::cast_to<Node>(constant); Node *node = Object::cast_to<Node>(constant);
if (node != nullptr) { if (node != nullptr) {
Ref<GDScript> scr = node->get_script(); Ref<GDScript> scr = node->get_script();
@ -3426,17 +3426,8 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
} }
} }
if (GDScriptLanguage::get_singleton()->get_global_map().has(name)) { if (GDScriptLanguage::get_singleton()->has_any_global_constant(name)) {
int idx = GDScriptLanguage::get_singleton()->get_global_map()[name]; Variant constant = GDScriptLanguage::get_singleton()->get_any_global_constant(name);
Variant constant = GDScriptLanguage::get_singleton()->get_global_array()[idx];
p_identifier->set_datatype(type_from_variant(constant, p_identifier));
p_identifier->is_constant = true;
p_identifier->reduced_value = constant;
return;
}
if (GDScriptLanguage::get_singleton()->get_named_globals_map().has(name)) {
Variant constant = GDScriptLanguage::get_singleton()->get_named_globals_map()[name];
p_identifier->set_datatype(type_from_variant(constant, p_identifier)); p_identifier->set_datatype(type_from_variant(constant, p_identifier));
p_identifier->is_constant = true; p_identifier->is_constant = true;
p_identifier->reduced_value = constant; p_identifier->reduced_value = constant;