emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-25 a4d882c: Correct old cell name unbinding when ren


From: Vincent Belaïche
Subject: [Emacs-diffs] emacs-25 a4d882c: Correct old cell name unbinding when renaming cell.
Date: Thu, 26 May 2016 09:03:45 +0000 (UTC)

branch: emacs-25
commit a4d882cd09507fa1f891984fc7435923de3566fe
Author: Vincent Belaïche <address@hidden>
Commit: Vincent Belaïche <address@hidden>

    Correct old cell name unbinding when renaming cell.
    
    Bug is to unbind old cell names when renaming a cell with
    'makunbound'. when the old cell name is of A1 type, then
    'kill-local-variable' must be used instead, so that only the current
    spreadsheet is affected. When the old cell name is a renamed cell,
    then 'ses--unbind-cell-name' must be used in order to remove the old
    name from the name hashmap.
    
    * ses.el (ses-rename-cell): check consistency of cell symbol from
    text-property and from array object. Instead of 'makunbound', use
    either 'ses--unbind-cell-name' or 'kill-local-variable' depending on
    whether the cell old name is a named cell or an A1 type cell
---
 lisp/ses.el |   20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/lisp/ses.el b/lisp/ses.el
index 5010194..ab9f071 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -3454,9 +3454,18 @@ highlighted range in the spreadsheet."
     (setq cell (or cell (ses-get-cell row col))
          old-name (ses-cell-symbol cell)
          new-rowcol (ses-decode-cell-symbol (symbol-name new-name)))
+    ;; when ses-rename-cell is called interactively, then 'sym' is the
+    ;; 'cursor-intangible' property of text at cursor position, while
+    ;; 'old-name' is the symbol stored in array cell at coordinate
+    ;; 'rowcol' corresponding to 'ses-cell' property of symbol
+    ;; 'sym'. Both must be the same.
+    (unless (eq sym old-name)
+      (error "Spreadsheet is broken, both symbols %S and %S refering to cell 
(%d,%d)" sym old-name row col))
     (if new-rowcol
+        ;; the new name is of A1 type, so we test that the coordinate
+        ;; inferred from new name 
        (if (equal new-rowcol rowcol)
-         (put new-name 'ses-cell rowcol)
+            (put new-name 'ses-cell rowcol)
          (error "Not a valid name for this cell location"))
       (setq ses--named-cell-hashmap
             (or ses--named-cell-hashmap (make-hash-table :test 'eq)))
@@ -3470,7 +3479,7 @@ highlighted range in the spreadsheet."
        (setf (ses-cell-formula xcell)
               (ses-replace-name-in-formula
                (ses-cell-formula xcell)
-               sym
+               old-name
                new-name))))
     ;; Replace name by new name in reference list of cells to which renamed
     ;; cell refers to.
@@ -3478,11 +3487,14 @@ highlighted range in the spreadsheet."
       (let* ((x (ses-sym-rowcol ref))
             (xcell (ses-get-cell (car x) (cdr x))))
        (setf (ses-cell-references xcell)
-              (cons new-name (delq sym
+              (cons new-name (delq old-name
                                    (ses-cell-references xcell))))))
     (set (make-local-variable new-name) (symbol-value sym))
     (setf (ses-cell--symbol cell) new-name)
-    (makunbound sym)
+    ;; Unbind old name
+    (if (eq (get old-name 'ses-cell) :ses-named)
+        (ses--unbind-cell-name old-name)
+      (kill-local-variable old-name))
     (and curcell (setq ses--curcell new-name))
     (save-excursion
       (or curcell (ses-goto-print row col))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]