1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 18:17:34 +00:00

LibGUI: Abstract out widget and layout class matching

This commit is contained in:
thislooksfun 2021-10-27 19:38:30 -05:00 committed by Andreas Kling
parent e1e856132c
commit 22a955b2d7

View file

@ -123,6 +123,20 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
Vector<GUI::AutocompleteProvider::Entry> class_entries, identifier_entries; Vector<GUI::AutocompleteProvider::Entry> class_entries, identifier_entries;
auto register_layouts_matching_pattern = [&](String pattern, size_t partial_input_length) {
Core::ObjectClassRegistration::for_each([&](const Core::ObjectClassRegistration& registration) {
if (registration.is_derived_from(layout_class) && &registration != &layout_class && registration.class_name().matches(pattern))
class_entries.empend(String::formatted("@{}", registration.class_name()), partial_input_length);
});
};
auto register_widgets_matching_pattern = [&](String pattern, size_t partial_input_length) {
Core::ObjectClassRegistration::for_each([&](const Core::ObjectClassRegistration& registration) {
if (registration.is_derived_from(widget_class) && registration.class_name().matches(pattern))
class_entries.empend(String::formatted("@{}", registration.class_name()), partial_input_length);
});
};
auto register_class_properties_matching_pattern = [&](String pattern, size_t partial_input_length) { auto register_class_properties_matching_pattern = [&](String pattern, size_t partial_input_length) {
auto class_name = class_names.last(); auto class_name = class_names.last();
@ -148,11 +162,8 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
// Nothing to put here. // Nothing to put here.
break; break;
} }
Core::ObjectClassRegistration::for_each([&](const Core::ObjectClassRegistration& registration) {
if (!registration.is_derived_from(widget_class)) register_widgets_matching_pattern("*", 0u);
return;
class_entries.empend(String::formatted("@{}", registration.class_name()), 0u);
});
break; break;
case InClassName: { case InClassName: {
if (class_names.is_empty()) if (class_names.is_empty())
@ -163,23 +174,13 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
break; break;
} }
auto fuzzy_class = make_fuzzy(class_names.last()); auto class_name = class_names.last();
if (last_identifier_token && last_identifier_token->m_end.line == last_seen_token->m_end.line && identifier_string == "layout") { auto fuzzy_class = make_fuzzy(class_name);
Core::ObjectClassRegistration::for_each([&](const Core::ObjectClassRegistration& registration) { if (last_identifier_token && last_identifier_token->m_end.line == last_seen_token->m_end.line && identifier_string == "layout")
if (&registration == &layout_class || !registration.is_derived_from(layout_class)) register_layouts_matching_pattern(fuzzy_class, class_name.length() + 1);
return; else
if (registration.class_name().matches(fuzzy_class)) register_widgets_matching_pattern(fuzzy_class, class_name.length() + 1);
identifier_entries.empend(registration.class_name(), class_names.last().length());
});
break;
}
Core::ObjectClassRegistration::for_each([&](const Core::ObjectClassRegistration& registration) {
if (!registration.is_derived_from(widget_class))
return;
if (registration.class_name().matches(fuzzy_class))
identifier_entries.empend(registration.class_name(), class_names.last().length());
});
break; break;
} }
case InIdentifier: { case InIdentifier: {
@ -212,23 +213,14 @@ void GMLAutocompleteProvider::provide_completions(Function<void(Vector<Entry>)>
} }
} }
Core::ObjectClassRegistration::for_each([&](const Core::ObjectClassRegistration& registration) { register_widgets_matching_pattern("*", 0u);
if (!registration.is_derived_from(widget_class))
return;
class_entries.empend(String::formatted("@{}", registration.class_name()), 0u);
});
break; break;
} }
case AfterIdentifier: case AfterIdentifier:
if (last_seen_token && last_seen_token->m_end.line != cursor.line()) if (last_seen_token && last_seen_token->m_end.line != cursor.line())
break; break;
if (identifier_string == "layout") { if (identifier_string == "layout")
Core::ObjectClassRegistration::for_each([&](const Core::ObjectClassRegistration& registration) { register_layouts_matching_pattern("*", 0u);
if (&registration == &layout_class || !registration.is_derived_from(layout_class))
return;
class_entries.empend(String::formatted("@{}", registration.class_name()), 0u);
});
}
break; break;
default: default:
break; break;