From 76d4b2c5a466fd762558133521a3de27e296dfd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ara=C3=BAjo?= Date: Sun, 28 Mar 2021 16:45:10 +0100 Subject: [PATCH] Playground: Autocomplete after empty {} Enable the oportunity to show name autocompletion after an empty class, which does not have the redundant empty {}. --- .../Playground/GMLAutocompleteProvider.cpp | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/Userland/DevTools/Playground/GMLAutocompleteProvider.cpp b/Userland/DevTools/Playground/GMLAutocompleteProvider.cpp index c32e9533be..6737b6a036 100644 --- a/Userland/DevTools/Playground/GMLAutocompleteProvider.cpp +++ b/Userland/DevTools/Playground/GMLAutocompleteProvider.cpp @@ -49,6 +49,17 @@ void GMLAutocompleteProvider::provide_completions(Function)> GUI::GMLToken* last_seen_token { nullptr }; for (auto& token : all_tokens) { + auto handle_class_child = [&] { + if (token.m_type == GUI::GMLToken::Type::Identifier) { + state = InIdentifier; + identifier_string = token.m_view; + } else if (token.m_type == GUI::GMLToken::Type::ClassMarker) { + previous_states.append(AfterClassName); + state = Free; + should_push_state = false; + } + }; + if (token.m_start.line > cursor.line() || (token.m_start.line == cursor.line() && token.m_start.column > cursor.column())) break; @@ -66,24 +77,26 @@ void GMLAutocompleteProvider::provide_completions(Function)> } break; case InClassName: + if (token.m_type != GUI::GMLToken::Type::LeftCurly) { + // Close empty class and imediately handle our parent's next child + class_names.take_last(); + state = previous_states.take_last(); + + if (state == AfterClassName) + handle_class_child(); + + break; + } state = AfterClassName; break; case AfterClassName: - if (token.m_type == GUI::GMLToken::Type::Identifier) { - state = InIdentifier; - identifier_string = token.m_view; - break; - } + handle_class_child(); + if (token.m_type == GUI::GMLToken::Type::RightCurly) { class_names.take_last(); state = previous_states.take_last(); break; } - if (token.m_type == GUI::GMLToken::Type::ClassMarker) { - previous_states.append(AfterClassName); - state = Free; - should_push_state = false; - } break; case InIdentifier: if (token.m_type == GUI::GMLToken::Type::Colon) @@ -103,6 +116,12 @@ void GMLAutocompleteProvider::provide_completions(Function)> } } + if (state == InClassName && last_seen_token && last_seen_token->m_end.line < cursor.line()) { + // Close empty class + class_names.take_last(); + state = previous_states.take_last(); + } + Vector class_entries, identifier_entries; switch (state) { case Free: