summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua/clever_f/feedback_service.lua26
-rw-r--r--tests/run.lua26
2 files changed, 50 insertions, 2 deletions
diff --git a/lua/clever_f/feedback_service.lua b/lua/clever_f/feedback_service.lua
index 72ee1dc..3575f27 100644
--- a/lua/clever_f/feedback_service.lua
+++ b/lua/clever_f/feedback_service.lua
@@ -61,6 +61,11 @@ local DIRECT_FINALIZER_EVENTS = {
TextChanged = true,
}
+local EAGER_EVENT_SET = {}
+for _, event_name in ipairs(M.EAGER_EVENTS) do
+ EAGER_EVENT_SET[event_name] = true
+end
+
local DEFAULT_LABEL_DEFINITION = {
guifg = "red",
guibg = "NONE",
@@ -191,6 +196,7 @@ function FeedbackService.new(options)
owned_finalizer = nil,
activation = nil,
eager_registration = nil,
+ last_eager_decision = nil,
}
return service
end
@@ -819,8 +825,24 @@ function FeedbackService:refresh_primary(resolved_target, window)
return self:start_highlight_timer(window)
end
-function FeedbackService:handle_eager_event()
- return false
+function FeedbackService:handle_eager_event(name, payload)
+ if not EAGER_EVENT_SET[name] then
+ return false
+ end
+ local record = service_records[self]
+ local decision = {
+ event = name,
+ payload = payload,
+ mark_char = record.policy:sample_markers().mark_char,
+ cleaned = false,
+ }
+ record.last_eager_decision = decision
+ return decision
+end
+
+function FeedbackService:last_eager_decision()
+ local decision = service_records[self].last_eager_decision
+ return decision and copy(decision) or nil
end
function FeedbackService:activate()
diff --git a/tests/run.lua b/tests/run.lua
index 7947ab1..4290460 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -6929,6 +6929,32 @@ test("Activation installs eager hooks from sampled setup policy", function()
same(0, map_size(disabled_host:event_registrations()))
end)
+test("Every eager event samples live character-marker policy", function()
+ fresh_sequence_state()
+ local host = MemoryHost.new({
+ configuration = {
+ clean_labels_eagerly = true,
+ mark_char = false,
+ },
+ })
+ local feedback = feedback_service.new(host)
+ feedback:activate()
+
+ for _, event_name in ipairs(feedback_service.EAGER_EVENTS) do
+ host:set_configuration("mark_char", false)
+ host:deliver_event(event_name, { window = "window-1" })
+ local disabled = feedback:last_eager_decision()
+ same(event_name, disabled.event)
+ falsy(disabled.mark_char)
+
+ host:set_configuration("mark_char", true)
+ host:deliver_event(event_name, { window = "window-1" })
+ local enabled = feedback:last_eager_decision()
+ same(event_name, enabled.event)
+ truthy(enabled.mark_char)
+ end
+end)
+
for _, item in ipairs(tests) do
local ok, failure = xpcall(item.body, debug.traceback)
if not ok then