Skip to content

Commit 52861f1

Browse files
committed
refactor(render_state) offset for add_action, rename types
1 parent 7065b69 commit 52861f1

File tree

2 files changed

+72
-101
lines changed

2 files changed

+72
-101
lines changed

lua/opencode/ui/render_state.lua

Lines changed: 42 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
local state = require('opencode.state')
22

3-
---@class MessageRenderData
4-
---@field message_ref OpencodeMessage Direct reference to message in state.messages
3+
---@class RenderedMessage
4+
---@field message OpencodeMessage Direct reference to message in state.messages
55
---@field line_start integer? Line where message header starts
66
---@field line_end integer? Line where message header ends
77

8-
---@class PartRenderData
9-
---@field part_ref MessagePart Direct reference to part in state.messages
8+
---@class RenderedPart
9+
---@field part MessagePart Direct reference to part in state.messages
1010
---@field message_id string ID of parent message
1111
---@field line_start integer? Line where part starts
1212
---@field line_end integer? Line where part ends
@@ -17,8 +17,8 @@ local state = require('opencode.state')
1717
---@field line_to_message table<integer, string> Maps line number to message ID
1818

1919
---@class RenderState
20-
---@field _messages table<string, MessageRenderData> Message ID to render data
21-
---@field _parts table<string, PartRenderData> Part ID to render data
20+
---@field _messages table<string, RenderedMessage> Message ID to render data
21+
---@field _parts table<string, RenderedPart> Part ID to render data
2222
---@field _line_index LineIndex Line number to ID mappings
2323
local RenderState = {}
2424
RenderState.__index = RenderState
@@ -41,14 +41,14 @@ end
4141

4242
---Get message render data by ID
4343
---@param message_id string Message ID
44-
---@return MessageRenderData?
44+
---@return RenderedMessage?
4545
function RenderState:get_message(message_id)
4646
return self._messages[message_id]
4747
end
4848

4949
---Get part render data by ID
5050
---@param part_id string Part ID
51-
---@return PartRenderData?
51+
---@return RenderedPart?
5252
function RenderState:get_part(part_id)
5353
return self._parts[part_id]
5454
end
@@ -58,26 +58,11 @@ end
5858
---@param message_id? string Optional message ID to limit search scope
5959
---@return string? part_id Part ID if found
6060
function RenderState:get_part_by_call_id(call_id, message_id)
61-
if message_id then
62-
local msg_data = self._messages[message_id]
63-
if msg_data and msg_data.message_ref and msg_data.message_ref.parts then
64-
for _, part in ipairs(msg_data.message_ref.parts) do
65-
if part.callID == call_id then
66-
return part.id
67-
end
68-
end
69-
end
70-
return nil
71-
end
72-
73-
for i = #state.messages, 1, -1 do
74-
local msg_wrapper = state.messages[i]
75-
if msg_wrapper.parts then
76-
for j = #msg_wrapper.parts, 1, -1 do
77-
local part = msg_wrapper.parts[j]
78-
if part.callID == call_id then
79-
return part.id
80-
end
61+
local rendered_message = self._messages[message_id]
62+
if rendered_message and rendered_message.message and rendered_message.message.parts then
63+
for _, part in ipairs(rendered_message.message.parts) do
64+
if part.callID == call_id then
65+
return part.id
8166
end
8267
end
8368
end
@@ -86,24 +71,24 @@ end
8671

8772
---Get part at specific line
8873
---@param line integer Line number (1-indexed)
89-
---@return PartRenderData?, string? part_data, part_id
74+
---@return RenderedPart?
9075
function RenderState:get_part_at_line(line)
9176
local part_id = self._line_index.line_to_part[line]
9277
if not part_id then
93-
return nil, nil
78+
return nil
9479
end
95-
return self._parts[part_id], part_id
80+
return self._parts[part_id]
9681
end
9782

9883
---Get message at specific line
9984
---@param line integer Line number (1-indexed)
100-
---@return MessageRenderData?, string? message_data, message_id
85+
---@return RenderedMessage?
10186
function RenderState:get_message_at_line(line)
10287
local message_id = self._line_index.line_to_message[line]
10388
if not message_id then
104-
return nil, nil
89+
return nil
10590
end
106-
return self._messages[message_id], message_id
91+
return self._messages[message_id]
10792
end
10893

10994
---Get actions at specific line
@@ -137,13 +122,13 @@ end
137122
function RenderState:set_message(message_id, message_ref, line_start, line_end)
138123
if not self._messages[message_id] then
139124
self._messages[message_id] = {
140-
message_ref = message_ref,
125+
message = message_ref,
141126
line_start = line_start,
142127
line_end = line_end,
143128
}
144129
else
145130
local msg_data = self._messages[message_id]
146-
msg_data.message_ref = message_ref
131+
msg_data.message = message_ref
147132
if line_start then
148133
msg_data.line_start = line_start
149134
end
@@ -161,28 +146,28 @@ end
161146

162147
---Set or update part render data
163148
---@param part_id string Part ID
164-
---@param part_ref MessagePart Direct reference to part
149+
---@param part MessagePart Direct reference to part
165150
---@param message_id string Parent message ID
166151
---@param line_start integer? Line where part starts
167152
---@param line_end integer? Line where part ends
168-
function RenderState:set_part(part_id, part_ref, message_id, line_start, line_end)
153+
function RenderState:set_part(part_id, part, message_id, line_start, line_end)
169154
if not self._parts[part_id] then
170155
self._parts[part_id] = {
171-
part_ref = part_ref,
156+
part = part,
172157
message_id = message_id,
173158
line_start = line_start,
174159
line_end = line_end,
175160
actions = {},
176161
}
177162
else
178-
local part_data = self._parts[part_id]
179-
part_data.part_ref = part_ref
180-
part_data.message_id = message_id
163+
local render_part = self._parts[part_id]
164+
render_part.part = part
165+
render_part.message_id = message_id
181166
if line_start then
182-
part_data.line_start = line_start
167+
render_part.line_start = line_start
183168
end
184169
if line_end then
185-
part_data.line_end = line_end
170+
render_part.line_end = line_end
186171
end
187172
end
188173

@@ -231,29 +216,35 @@ end
231216
---Update part data reference
232217
---@param part_id string Part ID
233218
---@param part_ref MessagePart New part reference
234-
---@param text string? New text content
235-
function RenderState:update_part_data(part_id, part_ref, text)
219+
function RenderState:update_part_data(part_id, part_ref)
236220
local part_data = self._parts[part_id]
237221
if not part_data then
238222
return
239223
end
240224

241-
part_data.part_ref = part_ref
242-
if text then
243-
part_data.text = text
244-
end
225+
part_data.part = part_ref
245226
end
246227

247228
---Add actions to a part
248229
---@param part_id string Part ID
249230
---@param actions table[] Actions to add
250-
function RenderState:add_actions(part_id, actions)
231+
---@param offset? integer Optional line offset to apply to actions
232+
function RenderState:add_actions(part_id, actions, offset)
251233
local part_data = self._parts[part_id]
252234
if not part_data then
253235
return
254236
end
255237

238+
offset = offset or 0
239+
256240
for _, action in ipairs(actions) do
241+
if offset ~= 0 then
242+
action.display_line = action.display_line + offset
243+
if action.range then
244+
action.range.from = action.range.from + offset
245+
action.range.to = action.range.to + offset
246+
end
247+
end
257248
table.insert(part_data.actions, action)
258249
end
259250
end

0 commit comments

Comments
 (0)