@@ -390,9 +390,9 @@ function Headline:get_title_with_priority()
390390 return title
391391end
392392
393- memoize (' get_properties ' )
393+ memoize (' get_own_properties ' )
394394--- @return table<string , string> , TSNode | nil
395- function Headline :get_properties ()
395+ function Headline :get_own_properties ()
396396 local section = self :node ():parent ()
397397 local properties_node = section and section :field (' property_drawer' )[1 ]
398398
@@ -416,6 +416,33 @@ function Headline:get_properties()
416416 return properties , properties_node
417417end
418418
419+ memoize (' get_properties' )
420+ --- @return table<string , string> , TSNode | nil
421+ function Headline :get_properties ()
422+ local properties , own_properties_node = self :get_own_properties ()
423+
424+ if not config .org_use_property_inheritance then
425+ -- TODO: Do we have to filter non-inherited properties here? (see `Headline:get_tags()`)
426+ return properties , own_properties_node
427+ end
428+
429+ local parent_section = self :node ():parent ():parent ()
430+ while parent_section do
431+ local headline_node = parent_section :field (' headline' )[1 ]
432+ if headline_node then
433+ local headline = Headline :new (headline_node , self .file )
434+ for name , value in pairs (headline :get_own_properties ()) do
435+ if properties [name ] == nil and config :use_property_inheritance (name ) then
436+ properties [name ] = value
437+ end
438+ end
439+ end
440+ parent_section = parent_section :parent ()
441+ end
442+
443+ return properties , own_properties_node
444+ end
445+
419446--- @param name string
420447--- @param value ? string
421448--- @return OrgHeadline
@@ -427,19 +454,19 @@ function Headline:set_property(name, value)
427454 vim .fn .deletebufline (bufnr , property_node :start () + 1 )
428455 end
429456 self :refresh ()
430- local properties , properties_node = self :get_properties ()
457+ local properties , properties_node = self :get_own_properties ()
431458 if vim .tbl_isempty (properties ) then
432459 self :_set_node_lines (properties_node , {})
433460 end
434461 return self :refresh ()
435462 end
436463
437- local _ , properties = self :get_properties ()
464+ local _ , properties = self :get_own_properties ()
438465 if not properties then
439466 local append_line = self :get_append_line ()
440467 local property_drawer = self :_apply_indent ({ ' :PROPERTIES:' , ' :END:' }) --[[ @as string[] ]]
441468 vim .api .nvim_buf_set_lines (bufnr , append_line , append_line , false , property_drawer )
442- _ , properties = self :refresh ():get_properties ()
469+ _ , properties = self :refresh ():get_own_properties ()
443470 end
444471
445472 local property = (' :%s: %s' ):format (name , value )
478505--- `org_use_property_inheritance`
479506--- @return string | nil , TSNode | nil
480507function Headline :get_property (property_name , search_parents )
481- local _ , properties = self :get_properties ()
508+ local _ , properties = self :get_own_properties ()
482509 if properties then
483510 for _ , node in ipairs (ts_utils .get_named_children (properties )) do
484511 local name = node :field (' name' )[1 ]
@@ -550,6 +577,7 @@ memoize('get_tags')
550577function Headline :get_tags ()
551578 local tags , own_tags_node = self :get_own_tags ()
552579 if not config .org_use_tag_inheritance then
580+ -- TODO: Why exclude the headline's own tags here?
553581 return config :exclude_tags (tags ), own_tags_node
554582 end
555583
636664
637665--- @return number
638666function Headline :get_append_line ()
639- local _ , properties = self :get_properties ()
667+ local _ , properties = self :get_own_properties ()
640668 if properties then
641669 local row = properties :end_ ()
642670 return row
0 commit comments