summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/clever_f/direct_preview_planner.lua37
-rw-r--r--lua/clever_f/feedback_service.lua55
2 files changed, 91 insertions, 1 deletions
diff --git a/lua/clever_f/direct_preview_planner.lua b/lua/clever_f/direct_preview_planner.lua
index e771b15..6735924 100644
--- a/lua/clever_f/direct_preview_planner.lua
+++ b/lua/clever_f/direct_preview_planner.lua
@@ -149,6 +149,41 @@ function M.case_grouping_settings(settings)
}
end
+function M.validate_marker_positions(view, positions)
+ require_view(view)
+ if type(positions) ~= "table" then
+ fail("direct preview markers must be a list of positions", 2)
+ end
+
+ local result = {}
+ local seen = {}
+ local item_count = 0
+ for key, position in pairs(positions) do
+ if type(key) ~= "number"
+ or key ~= math.floor(key)
+ or key < 1
+ or key > #positions
+ then
+ fail("direct preview markers must be a list of positions", 2)
+ end
+ position = domain.Position.coerce(position)
+ if not view:is_character_start(position) then
+ fail("direct preview marker must start an editor character", 2)
+ end
+ local identity = tostring(position.line) .. ":" .. tostring(position.byte_column)
+ if seen[identity] then
+ fail("direct preview marker positions must be unique", 2)
+ end
+ seen[identity] = true
+ result[key] = position
+ item_count = item_count + 1
+ end
+ if item_count ~= #positions then
+ fail("direct preview markers must be a list of positions", 2)
+ end
+ return result
+end
+
function DirectPreviewPlanner:plan(view, origin, descriptor, count, settings)
local grouping = M.case_grouping_settings(settings)
local ignore_case = grouping.ignore_case
@@ -181,7 +216,7 @@ function DirectPreviewPlanner:plan(view, origin, descriptor, count, settings)
positions[#positions + 1] = M.marker_position(descriptor, record.position)
end
end
- return positions
+ return M.validate_marker_positions(view, positions)
end
function M.new(options)
diff --git a/lua/clever_f/feedback_service.lua b/lua/clever_f/feedback_service.lua
index e8c387d..b1a4233 100644
--- a/lua/clever_f/feedback_service.lua
+++ b/lua/clever_f/feedback_service.lua
@@ -201,6 +201,54 @@ function FeedbackService:create_cursor_presentation_lease(enabled)
return new_cursor_presentation_lease(record.host, supported == true)
end
+local function position_list(positions)
+ if type(positions) ~= "table" then
+ fail("direct marker positions must be a list", 3)
+ end
+ local result = {}
+ local item_count = 0
+ for key, position in pairs(positions) do
+ if type(key) ~= "number"
+ or key ~= math.floor(key)
+ or key < 1
+ or key > #positions
+ then
+ fail("direct marker positions must be a list", 3)
+ end
+ result[key] = domain.Position.coerce(position)
+ item_count = item_count + 1
+ end
+ if item_count ~= #positions then
+ fail("direct marker positions must be a list", 3)
+ end
+ return result
+end
+
+function FeedbackService:create_direct_markers(positions, window)
+ positions = position_list(positions)
+ if #positions == 0 then
+ return nil
+ end
+ if window == nil then
+ fail("direct marker window must identify its host window", 2)
+ end
+
+ local record = service_records[self]
+ local identity = record.host:create_highlight({
+ group = "CleverFDirect",
+ window = window,
+ positions = positions,
+ priority = M.overlay_priority("CleverFDirect"),
+ })
+ record.transitions:AddTemporaryOverlay(identity, window, "CleverFDirect")
+ return {
+ identity = identity,
+ window = window,
+ group = "CleverFDirect",
+ positions = positions,
+ }
+end
+
function FeedbackService:create_cursor_marker(position, window)
position = domain.Position.coerce(position)
if window == nil then
@@ -307,6 +355,13 @@ function FeedbackService:ensure_default_label()
}
end
+function FeedbackService:evaluate_highlights()
+ return {
+ default_label = self:ensure_default_label(),
+ feature_links = self:evaluate_feature_links(),
+ }
+end
+
function M.new(options)
return FeedbackService.new(options)
end