Browse Source

LibCore+LibGUI: Make ObjectClassRegistration::construct() nullable

This lays the groundwork for allowing the registration of abstract
core objects, which will be needed for improved GML autocomplete.
thislooksfun 3 năm trước cách đây
mục cha
commit
c3b0b9057e

+ 1 - 1
Userland/Libraries/LibCore/Object.cpp

@@ -258,7 +258,7 @@ static HashMap<StringView, ObjectClassRegistration*>& object_classes()
     return *map;
 }
 
-ObjectClassRegistration::ObjectClassRegistration(StringView class_name, Function<NonnullRefPtr<Object>()> factory, ObjectClassRegistration* parent_class)
+ObjectClassRegistration::ObjectClassRegistration(StringView class_name, Function<RefPtr<Object>()> factory, ObjectClassRegistration* parent_class)
     : m_class_name(class_name)
     , m_factory(move(factory))
     , m_parent_class(parent_class)

+ 3 - 3
Userland/Libraries/LibCore/Object.h

@@ -32,12 +32,12 @@ class ObjectClassRegistration {
     AK_MAKE_NONMOVABLE(ObjectClassRegistration);
 
 public:
-    ObjectClassRegistration(StringView class_name, Function<NonnullRefPtr<Object>()> factory, ObjectClassRegistration* parent_class = nullptr);
+    ObjectClassRegistration(StringView class_name, Function<RefPtr<Object>()> factory, ObjectClassRegistration* parent_class = nullptr);
     ~ObjectClassRegistration();
 
     String class_name() const { return m_class_name; }
     const ObjectClassRegistration* parent_class() const { return m_parent_class; }
-    NonnullRefPtr<Object> construct() const { return m_factory(); }
+    RefPtr<Object> construct() const { return m_factory(); }
     bool is_derived_from(const ObjectClassRegistration& base_class) const;
 
     static void for_each(Function<void(const ObjectClassRegistration&)>);
@@ -45,7 +45,7 @@ public:
 
 private:
     StringView m_class_name;
-    Function<NonnullRefPtr<Object>()> m_factory;
+    Function<RefPtr<Object>()> m_factory;
     ObjectClassRegistration* m_parent_class { nullptr };
 };
 

+ 10 - 8
Userland/Libraries/LibGUI/GMLAutocompleteProvider.cpp

@@ -145,10 +145,11 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
         }
         auto registration = Core::ObjectClassRegistration::find(class_names.last());
         if (registration && registration->is_derived_from(widget_class)) {
-            auto instance = registration->construct();
-            for (auto& it : instance->properties()) {
-                if (it.key.starts_with(identifier_string))
-                    identifier_entries.empend(it.key, identifier_string.length());
+            if (auto instance = registration->construct()) {
+                for (auto& it : instance->properties()) {
+                    if (it.key.starts_with(identifier_string))
+                        identifier_entries.empend(it.key, identifier_string.length());
+                }
             }
         }
         if (can_have_declared_layout(class_names.last()) && "layout"sv.starts_with(identifier_string))
@@ -169,10 +170,11 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
         if (!class_names.is_empty()) {
             auto registration = Core::ObjectClassRegistration::find(class_names.last());
             if (registration && registration->is_derived_from(widget_class)) {
-                auto instance = registration->construct();
-                for (auto& it : instance->properties()) {
-                    if (!it.value->is_readonly())
-                        identifier_entries.empend(it.key, 0u);
+                if (auto instance = registration->construct()) {
+                    for (auto& it : instance->properties()) {
+                        if (!it.value->is_readonly())
+                            identifier_entries.empend(it.key, 0u);
+                    }
                 }
             }
         }