Skip to content

Commit 772c7c6

Browse files
fix(perf): Memoize few headline methods
1 parent 6c03b72 commit 772c7c6

File tree

4 files changed

+16
-14
lines changed

4 files changed

+16
-14
lines changed

lua/orgmode/api/headline.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ end
6363
---@private
6464
function OrgHeadline._build_from_internal_headline(section, index)
6565
local todo, _, type = section:get_todo()
66-
local _, properties = section:get_properties()
66+
local properties = section:get_properties()
6767
return OrgHeadline:_new({
6868
title = section:get_title(),
6969
line = section:get_headline_line_content(),

lua/orgmode/files/file.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ function OrgFile:apply_search(search, todo_only)
241241
local deadline = item:get_deadline_date()
242242
local scheduled = item:get_scheduled_date()
243243
local closed = item:get_closed_date()
244-
local _, properties = item:get_properties()
244+
local properties = item:get_properties()
245245

246246
return search:check({
247247
props = vim.tbl_extend('keep', {}, properties, {

lua/orgmode/files/headline.lua

+13-11
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,8 @@ end
186186

187187
---@return OrgDate | nil
188188
function Headline:get_closed_date()
189-
return utils.find(self:get_all_dates(), function(date)
190-
return date:is_closed()
191-
end)
189+
local dates = self:get_plan_dates()
190+
return vim.tbl_get(dates, 'CLOSED', 1)
192191
end
193192

194193
function Headline:get_priority_sort_value()
@@ -361,13 +360,14 @@ function Headline:get_title_with_priority()
361360
return title
362361
end
363362

364-
---@return TSNode | nil, table<string, string>
363+
memoize('get_properties')
364+
---@return table<string, string>, TSNode | nil
365365
function Headline:get_properties()
366366
local section = self:node():parent()
367367
local properties_node = section and section:field('property_drawer')[1]
368368

369369
if not properties_node then
370-
return nil, {}
370+
return {}, nil
371371
end
372372

373373
local properties = {}
@@ -383,7 +383,7 @@ function Headline:get_properties()
383383
end
384384
end
385385

386-
return properties_node, properties
386+
return properties, properties_node
387387
end
388388

389389
---@param name string
@@ -397,19 +397,19 @@ function Headline:set_property(name, value)
397397
vim.fn.deletebufline(bufnr, property_node:start() + 1)
398398
end
399399
self:refresh()
400-
local properties_node, properties = self:get_properties()
400+
local properties, properties_node = self:get_properties()
401401
if vim.tbl_isempty(properties) then
402402
self:_set_node_lines(properties_node, {})
403403
end
404404
return self:refresh()
405405
end
406406

407-
local properties = self:get_properties()
407+
local _, properties = self:get_properties()
408408
if not properties then
409409
local append_line = self:get_append_line()
410410
local property_drawer = self:_apply_indent({ ':PROPERTIES:', ':END:' }) --[[ @as string[] ]]
411411
vim.api.nvim_buf_set_lines(bufnr, append_line, append_line, false, property_drawer)
412-
properties = self:refresh():get_properties()
412+
_, properties = self:refresh():get_properties()
413413
end
414414

415415
local property = (':%s: %s'):format(name, value)
@@ -445,7 +445,7 @@ end
445445
---@param search_parents? boolean
446446
---@return string | nil, TSNode | nil
447447
function Headline:get_property(property_name, search_parents)
448-
local properties = self:get_properties()
448+
local _, properties = self:get_properties()
449449
if properties then
450450
for _, node in ipairs(ts_utils.get_named_children(properties)) do
451451
local name = node:field('name')[1]
@@ -598,7 +598,7 @@ end
598598

599599
---@return number
600600
function Headline:get_append_line()
601-
local properties = self:get_properties()
601+
local _, properties = self:get_properties()
602602
if properties then
603603
local row = properties:end_()
604604
return row
@@ -853,6 +853,7 @@ function Headline:get_drawer_append_line(name)
853853
return name_row + 1
854854
end
855855

856+
memoize('get_range')
856857
---@return OrgRange
857858
function Headline:get_range()
858859
return Range.from_node(self:node():parent())
@@ -863,6 +864,7 @@ function Headline:get_lines()
863864
return self.file:get_node_text_list(self:node():parent())
864865
end
865866

867+
memoize('get_headline_line_content')
866868
---@return string
867869
function Headline:get_headline_line_content()
868870
local line = self.file:get_node_text(self:node()):gsub('\n', '')

lua/orgmode/org/mappings.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ function OrgMappings:_todo_change_state(direction)
457457
)
458458

459459
if log_repeat_enabled then
460-
headline:set_property('LAST_REPEAT', Date.now():to_wrapped_string(false))
460+
item:set_property('LAST_REPEAT', Date.now():to_wrapped_string(false))
461461
end
462462

463463
if not prompt_repeat_note and not prompt_done_note then

0 commit comments

Comments
 (0)