From fe0594c575de199aa6b021f0c645b98868db22a0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 7 Jan 2026 03:00:25 +0000 Subject: [PATCH] Fix: tp-match-set and tp-regexp-set now create a copy instead of modifying original string Co-authored-by: Kinneyzhang <38454496+Kinneyzhang@users.noreply.github.com> --- tp-tests.el | 40 ++++++++++++++++++++++++++-------------- tp.el | 6 ++++-- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/tp-tests.el b/tp-tests.el index 8691526..1ab636d 100644 --- a/tp-tests.el +++ b/tp-tests.el @@ -1323,12 +1323,16 @@ Later values should override earlier values for the same sub-property." (should (eq (get-text-property 12 'face result) 'bold)))) (ert-deftest tp-test-regexp-add-on-string () - "Test tp-regexp-add on string." + "Test tp-regexp-add on string. +For strings, returns a NEW string (original is not modified)." (let ((str (copy-sequence "abc 123 def 456"))) (tp-set 4 7 '(help-echo "original") str) - (tp-regexp-add "[0-9]+" '(face bold) str) - (should (eq (get-text-property 4 'face str) 'bold)) - (should (equal (get-text-property 4 'help-echo str) "original")))) + (let ((result (tp-regexp-add "[0-9]+" '(face bold) str))) + ;; Result should have both properties (face added, help-echo preserved) + (should (eq (get-text-property 4 'face result) 'bold)) + (should (equal (get-text-property 4 'help-echo result) "original")) + ;; Original should NOT have face property added by tp-regexp-add + (should (null (get-text-property 4 'face str)))))) (ert-deftest tp-test-match-set-string-as-last-arg () "Test tp-match-set with string as last argument." @@ -2053,16 +2057,20 @@ When using tp-match-set (direct property setting), tp-name is NOT added." (ert-deftest tp-test-match-set-with-layer-name-on-string () "Test tp-match-set accepts a layer name on string. -When using tp-match-set (direct property setting), tp-name is NOT added." +When using tp-match-set (direct property setting), tp-name is NOT added. +For strings, returns a NEW string (original is not modified)." (let ((str (copy-sequence "Hello World Hello"))) (setq tp-layer-alist nil) (setq tp-layer-groups nil) (define-tp match-style () '(face italic)) - (tp-match-set "Hello" 'match-style str) - (should (eq (get-text-property 0 'face str) 'italic)) - (should (eq (get-text-property 12 'face str) 'italic)) - ;; tp-name should NOT be set for direct property setting - (should-not (get-text-property 0 'tp-name str)))) + (let ((result (tp-match-set "Hello" 'match-style str))) + ;; Result should have the properties + (should (eq (get-text-property 0 'face result) 'italic)) + (should (eq (get-text-property 12 'face result) 'italic)) + ;; tp-name should NOT be set for direct property setting + (should-not (get-text-property 0 'tp-name result)) + ;; Original should NOT be modified + (should (null (get-text-property 0 'face str)))))) (ert-deftest tp-test-match-reset-with-layer-name () "Test tp-match-reset accepts a layer name." @@ -2095,14 +2103,18 @@ When using tp-match-set (direct property setting), tp-name is NOT added." (should (eq (tp-at 13 'face) 'bold)))) (ert-deftest tp-test-regexp-set-with-layer-name-on-string () - "Test tp-regexp-set accepts a layer name on string." + "Test tp-regexp-set accepts a layer name on string. +For strings, returns a NEW string (original is not modified)." (let ((str (copy-sequence "abc 123 def 456"))) (setq tp-layer-alist nil) (setq tp-layer-groups nil) (define-tp number-style () '(face italic)) - (tp-regexp-set "[0-9]+" 'number-style str) - (should (eq (get-text-property 4 'face str) 'italic)) - (should (eq (get-text-property 12 'face str) 'italic)))) + (let ((result (tp-regexp-set "[0-9]+" 'number-style str))) + ;; Result should have the properties + (should (eq (get-text-property 4 'face result) 'italic)) + (should (eq (get-text-property 12 'face result) 'italic)) + ;; Original should NOT be modified + (should (null (get-text-property 4 'face str)))))) (ert-deftest tp-test-regexp-reset-with-layer-name () "Test tp-regexp-reset accepts a layer name." diff --git a/tp.el b/tp.el index c36303a..e2d85b2 100644 --- a/tp.el +++ b/tp.el @@ -2275,7 +2275,8 @@ For buffers, modifies in-place and returns list of regions." (push (cons beg end) matches) (setq pos (if (= beg end) (1+ beg) end)))) ;; Apply function to each match in order (reverse to get correct order) - (let ((result object)) + ;; Make a copy to ensure original string is not modified + (let ((result (copy-sequence object))) (dolist (match (nreverse matches)) (when properties (setq result (funcall apply-fn (car match) (cdr match) properties result)))) @@ -2335,7 +2336,8 @@ For buffers, modifies in-place and returns list of regions." (push (cons beg end) matches) (setq pos (if (= beg end) (1+ beg) end)))) ;; Apply function to each match in order (reverse to get correct order) - (let ((result object)) + ;; Make a copy to ensure original string is not modified + (let ((result (copy-sequence object))) (dolist (match (nreverse matches)) (when properties (setq result (funcall apply-fn