From c719cbee6996dcad9068fb5abcc107d5b9037d40 Mon Sep 17 00:00:00 2001 From: Daniel Eliasinski Date: Thu, 10 Jan 2019 19:25:32 -0500 Subject: [PATCH] Added autoloads as a potential type. --- modules/gdscript/gdscript_editor.cpp | 9 ++++ modules/gdscript/gdscript_parser.cpp | 69 +++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 64678c72405..662f93a2be8 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -2727,6 +2727,15 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_base for (int i = 0; i < Variant::VARIANT_MAX; i++) { options.insert(Variant::get_type_name((Variant::Type)i)); } + List props; + ProjectSettings::get_singleton()->get_property_list(&props); + for (List::Element *E = props.front(); E; E = E->next()) { + String s = E->get().name; + if (!s.begins_with("autoload/")) { + continue; + } + options.insert(s.get_slice("/", 1)); + } } List native_classes; diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index b0743af1b4c..d7c438ed0e2 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -5062,6 +5062,31 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class) { return; } p = NULL; + } else { + List props; + ProjectSettings::get_singleton()->get_property_list(&props); + for (List::Element *E = props.front(); E; E = E->next()) { + String s = E->get().name; + if (!s.begins_with("autoload/")) { + continue; + } + String name = s.get_slice("/", 1); + if (name == base) { + String singleton_path = ProjectSettings::get_singleton()->get(s); + if (singleton_path.begins_with("*")) { + singleton_path = singleton_path.right(1); + } + if (!singleton_path.begins_with("res://")) { + singleton_path = "res://" + singleton_path; + } + base_script = ResourceLoader::load(singleton_path); + if (!base_script.is_valid()) { + _set_error("Class '" + base + "' could not be fully loaded (script error or cyclic inheritance).", p_class->line); + return; + } + p = NULL; + } + } } while (p) { @@ -5402,9 +5427,49 @@ GDScriptParser::DataType GDScriptParser::_resolve_type(const DataType &p_source, } name_part++; continue; - } else { - p = current_class; } + List props; + ProjectSettings::get_singleton()->get_property_list(&props); + String singleton_path; + for (List::Element *E = props.front(); E; E = E->next()) { + String s = E->get().name; + if (!s.begins_with("autoload/")) { + continue; + } + String name = s.get_slice("/", 1); + if (name == id) { + singleton_path = ProjectSettings::get_singleton()->get(s); + if (singleton_path.begins_with("*")) { + singleton_path = singleton_path.right(1); + } + if (!singleton_path.begins_with("res://")) { + singleton_path = "res://" + singleton_path; + } + break; + } + } + if (!singleton_path.empty()) { + Ref