mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 21:07:34 +00:00
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.
This commit is contained in:
parent
0e537e2e1f
commit
c3b0b9057e
3 changed files with 14 additions and 12 deletions
|
@ -258,7 +258,7 @@ static HashMap<StringView, ObjectClassRegistration*>& object_classes()
|
||||||
return *map;
|
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_class_name(class_name)
|
||||||
, m_factory(move(factory))
|
, m_factory(move(factory))
|
||||||
, m_parent_class(parent_class)
|
, m_parent_class(parent_class)
|
||||||
|
|
|
@ -32,12 +32,12 @@ class ObjectClassRegistration {
|
||||||
AK_MAKE_NONMOVABLE(ObjectClassRegistration);
|
AK_MAKE_NONMOVABLE(ObjectClassRegistration);
|
||||||
|
|
||||||
public:
|
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();
|
~ObjectClassRegistration();
|
||||||
|
|
||||||
String class_name() const { return m_class_name; }
|
String class_name() const { return m_class_name; }
|
||||||
const ObjectClassRegistration* parent_class() const { return m_parent_class; }
|
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;
|
bool is_derived_from(const ObjectClassRegistration& base_class) const;
|
||||||
|
|
||||||
static void for_each(Function<void(const ObjectClassRegistration&)>);
|
static void for_each(Function<void(const ObjectClassRegistration&)>);
|
||||||
|
@ -45,7 +45,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
StringView m_class_name;
|
StringView m_class_name;
|
||||||
Function<NonnullRefPtr<Object>()> m_factory;
|
Function<RefPtr<Object>()> m_factory;
|
||||||
ObjectClassRegistration* m_parent_class { nullptr };
|
ObjectClassRegistration* m_parent_class { nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -145,10 +145,11 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
|
||||||
}
|
}
|
||||||
auto registration = Core::ObjectClassRegistration::find(class_names.last());
|
auto registration = Core::ObjectClassRegistration::find(class_names.last());
|
||||||
if (registration && registration->is_derived_from(widget_class)) {
|
if (registration && registration->is_derived_from(widget_class)) {
|
||||||
auto instance = registration->construct();
|
if (auto instance = registration->construct()) {
|
||||||
for (auto& it : instance->properties()) {
|
for (auto& it : instance->properties()) {
|
||||||
if (it.key.starts_with(identifier_string))
|
if (it.key.starts_with(identifier_string))
|
||||||
identifier_entries.empend(it.key, identifier_string.length());
|
identifier_entries.empend(it.key, identifier_string.length());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (can_have_declared_layout(class_names.last()) && "layout"sv.starts_with(identifier_string))
|
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()) {
|
if (!class_names.is_empty()) {
|
||||||
auto registration = Core::ObjectClassRegistration::find(class_names.last());
|
auto registration = Core::ObjectClassRegistration::find(class_names.last());
|
||||||
if (registration && registration->is_derived_from(widget_class)) {
|
if (registration && registration->is_derived_from(widget_class)) {
|
||||||
auto instance = registration->construct();
|
if (auto instance = registration->construct()) {
|
||||||
for (auto& it : instance->properties()) {
|
for (auto& it : instance->properties()) {
|
||||||
if (!it.value->is_readonly())
|
if (!it.value->is_readonly())
|
||||||
identifier_entries.empend(it.key, 0u);
|
identifier_entries.empend(it.key, 0u);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue