diff options
| -rw-r--r-- | lua/clever_f/feedback_service.lua | 37 | ||||
| -rw-r--r-- | tests/run.lua | 30 |
2 files changed, 67 insertions, 0 deletions
diff --git a/lua/clever_f/feedback_service.lua b/lua/clever_f/feedback_service.lua index d4fd7a7..72ee1dc 100644 --- a/lua/clever_f/feedback_service.lua +++ b/lua/clever_f/feedback_service.lua @@ -21,6 +21,11 @@ M.FINALIZER_EVENTS = { "InsertEnter", "TextChanged", } +M.EAGER_EVENTS = { + "WinEnter", + "WinLeave", + "CmdwinLeave", +} M.FinalizerAction = { PRESERVE = "preserve", FINALIZE = "finalize", @@ -156,6 +161,7 @@ local function require_policy(service, host) or type(service.sample_acquisition) ~= "function" or type(service.sample_markers) ~= "function" or type(service.sample_timeouts) ~= "function" + or type(service.capture_activation) ~= "function" then fail("FeedbackService policy must evaluate highlight links", 3) end @@ -183,6 +189,8 @@ function FeedbackService.new(options) ), persistent_requests = {}, owned_finalizer = nil, + activation = nil, + eager_registration = nil, } return service end @@ -811,6 +819,35 @@ function FeedbackService:refresh_primary(resolved_target, window) return self:start_highlight_timer(window) end +function FeedbackService:handle_eager_event() + return false +end + +function FeedbackService:activate() + local record = service_records[self] + if record.activation ~= nil then + return copy(record.activation) + end + local sampled = record.policy:capture_activation() + local activation = { + clean_labels_eagerly = sampled.clean_labels_eagerly, + eager_registration = nil, + } + if sampled.clean_labels_eagerly then + local identity = record.host:register_events( + M.EAGER_EVENTS, + function(name, payload) + self:handle_eager_event(name, payload) + end, + { owner = "clever_f", lifecycle = "eager" } + ) + record.eager_registration = identity + activation.eager_registration = identity + end + record.activation = activation + return copy(activation) +end + function FeedbackService:evaluate_feature_links() local record = service_records[self] local rules = record.policy:evaluate_highlight_links() diff --git a/tests/run.lua b/tests/run.lua index 4d512be..7947ab1 100644 --- a/tests/run.lua +++ b/tests/run.lua @@ -6899,6 +6899,36 @@ test("Explicit motion execution bypasses primary feedback operations", function( same(0, refresh_count) end) +test("Activation installs eager hooks from sampled setup policy", function() + fresh_sequence_state() + local enabled_host = MemoryHost.new({ + configuration = { clean_labels_eagerly = true }, + }) + local enabled = feedback_service.new(enabled_host) + local activation = enabled:activate() + truthy(activation.clean_labels_eagerly) + truthy(activation.eager_registration ~= nil) + local registration = enabled_host:event_registrations()[ + activation.eager_registration + ] + list_same(feedback_service.EAGER_EVENTS, registration.names) + same("eager", registration.options.lifecycle) + + enabled_host:set_configuration("clean_labels_eagerly", false) + local retained = enabled:activate() + same(activation.eager_registration, retained.eager_registration) + truthy(retained.clean_labels_eagerly) + + fresh_sequence_state() + local disabled_host = MemoryHost.new({ + configuration = { clean_labels_eagerly = false }, + }) + local disabled = feedback_service.new(disabled_host):activate() + falsy(disabled.clean_labels_eagerly) + same(nil, disabled.eager_registration) + same(0, map_size(disabled_host:event_registrations())) +end) + for _, item in ipairs(tests) do local ok, failure = xpcall(item.body, debug.traceback) if not ok then |
