Fix property merging when combining custom layers with built-in properties

Co-authored-by: Kinneyzhang <38454496+Kinneyzhang@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-01-01 17:09:37 +00:00
parent 04feef0433
commit 9a65f85fe8

17
tp.el
View File

@ -1066,8 +1066,8 @@ Supports multiple calling conventions:
(setq props (car props)))
;; Merge duplicate keys in the plist (for single-call property setting)
;; This must happen before tp--resolve-props to properly handle face merging
;; Use (cddr props) for O(1) check instead of (> (length props) 2)
(when (and (listp props) (cddr props))
;; Use (cdddr props) for O(1) check - need at least 4 elements (2 key-value pairs) for possible duplicates
(when (and (listp props) (cdddr props))
(setq props (tp--merge-duplicate-keys props)))
;; Resolve props: handles layer/group names and anonymous reactive plists
(when props
@ -2868,8 +2868,8 @@ Returns the expanded plist."
(setq result (append result (list key val)))))
(setq remaining (cddr remaining))))
;; Merge duplicate keys in the expanded result
;; Use (cddr result) for O(1) check instead of (> (length result) 2)
(if (cddr result)
;; Use (cdddr result) for O(1) check - need at least 4 elements (2 key-value pairs) for possible duplicates
(if (cdddr result)
(tp--merge-duplicate-keys result)
result)))
@ -2938,8 +2938,13 @@ For group names, includes `tp-layers' property with the full layer stack."
;; Recursively resolve extra properties (they may also contain layer names)
(let ((expanded-props
(if (and layer-props extra-props)
(let ((resolved-extra (tp--expand-layer-in-plist extra-props)))
(append layer-props resolved-extra))
(let* ((resolved-extra (tp--expand-layer-in-plist extra-props))
(combined (append layer-props resolved-extra)))
;; Merge duplicate keys after combining layer props with extra props
;; Need at least 4 elements (2 key-value pairs) for possible duplicates
(if (cdddr combined)
(tp--merge-duplicate-keys combined)
combined))
layer-props)))
;; After expansion, check for reactive symbols in the merged props
;; (original props may contain $vars that need reactive tracking)