You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
GDScript: Implement get_dependencies()
The parser and analyzer now track the dependencies of the script and return the list when the resource loader ask for them. What is considered a dependency: - Any `preload()` call. - The base script this one extends. - Any identifier, including types, that refers to global scripts. - Any autoload singleton reference.
This commit is contained in:
@@ -562,6 +562,11 @@ Error GDScriptAnalyzer::resolve_class_inheritance(GDScriptParser::ClassNode *p_c
|
||||
class_type.native_type = result.native_type;
|
||||
p_class->set_datatype(class_type);
|
||||
|
||||
// Add base class to the list of dependencies.
|
||||
if (result.kind == GDScriptParser::DataType::CLASS) {
|
||||
parser->add_dependency(result.script_path);
|
||||
}
|
||||
|
||||
// Apply annotations.
|
||||
for (GDScriptParser::AnnotationNode *&E : p_class->annotations) {
|
||||
resolve_annotation(E);
|
||||
@@ -849,6 +854,11 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type
|
||||
}
|
||||
|
||||
p_type->set_datatype(result);
|
||||
|
||||
if (result.kind == GDScriptParser::DataType::CLASS || result.kind == GDScriptParser::DataType::SCRIPT) {
|
||||
parser->add_dependency(result.script_path);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -4063,6 +4073,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
|
||||
|
||||
if (ScriptServer::is_global_class(name)) {
|
||||
p_identifier->set_datatype(make_global_class_meta_type(name, p_identifier));
|
||||
parser->add_dependency(p_identifier->get_datatype().script_path);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4105,6 +4116,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
|
||||
}
|
||||
result.is_constant = true;
|
||||
p_identifier->set_datatype(result);
|
||||
parser->add_dependency(autoload.path);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -4224,7 +4236,6 @@ void GDScriptAnalyzer::reduce_preload(GDScriptParser::PreloadNode *p_preload) {
|
||||
push_error("Preloaded path must be a constant string.", p_preload->path);
|
||||
} else {
|
||||
p_preload->resolved_path = p_preload->path->reduced_value;
|
||||
// TODO: Save this as script dependency.
|
||||
if (p_preload->resolved_path.is_relative_path()) {
|
||||
p_preload->resolved_path = parser->script_path.get_base_dir().path_join(p_preload->resolved_path);
|
||||
}
|
||||
@@ -4255,6 +4266,8 @@ void GDScriptAnalyzer::reduce_preload(GDScriptParser::PreloadNode *p_preload) {
|
||||
push_error(vformat(R"(Could not preload resource file "%s".)", p_preload->resolved_path), p_preload->path);
|
||||
}
|
||||
}
|
||||
|
||||
parser->add_dependency(p_preload->resolved_path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user