branch: externals/phpinspect commit 75562aab35f403b40767c037bd12ded281efa63b Author: Hugo Thunnissen <de...@hugot.nl> Commit: Hugo Thunnissen <de...@hugot.nl>
Add some tests for edit tracker + patch newly discovered bugs --- phpinspect-buffer.el | 6 ++++-- phpinspect-edtrack.el | 10 +++++++++- test/test-edtrack.el | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/phpinspect-buffer.el b/phpinspect-buffer.el index 64e5e17e6a..f540ca33a3 100644 --- a/phpinspect-buffer.el +++ b/phpinspect-buffer.el @@ -61,6 +61,7 @@ linked with." :previous-bmap buffer-map :edtrack (phpinspect-buffer-edit-tracker buffer)))) (phpinspect-with-parse-context ctx + (phpinspect--log "Parsing buffer") (let ((parsed (phpinspect-parse-current-buffer))) (setf (phpinspect-buffer-map buffer) map) (setf (phpinspect-buffer-tree buffer) parsed) @@ -91,8 +92,9 @@ linked with." ;; they grow or shrink, so their ful regions need to be marked for a reparse). (save-excursion (goto-char start) - (when (looking-back "\\($->|::\\)?[^][)(}{[:blank:]\n;'\"]+" nil t) - (setq start (- start (length (match-string 0)))))) + (when (looking-back "\\($|->|::\\)?[^][)(}{[:blank:]\n;'\"]+" nil t) + (setq start (- start (length (match-string 0)))) + (setq pre-change-length (+ pre-change-length (length (match-string 0)))))) (phpinspect-edtrack-register-edit (phpinspect-buffer-edit-tracker buffer) start end pre-change-length)) diff --git a/phpinspect-edtrack.el b/phpinspect-edtrack.el index b7b899c949..2a7df925e3 100644 --- a/phpinspect-edtrack.el +++ b/phpinspect-edtrack.el @@ -122,7 +122,13 @@ (let ((delta ;; The delta of this edit. (- (- end start) pre-change-length)) new-edit) - (if (= (phpinspect-edtrack-last-edit-start track) start) + (if (and (= (phpinspect-edtrack-last-edit-start track) start) + ;; Confirm that this is indeed a growing edit and not an edit + ;; starting at the same place by chance + (or (and (> delta 0) (> (cdr (phpinspect-edtrack-last-edit track)) 0) + (> delta (cdr (phpinspect-edtrack-last-edit track)))) + (and (< delta 0) (< (cdr (phpinspect-edtrack-last-edit track)) 0) + (< delta (cdr (phpinspect-edtrack-last-edit track)))))) ;; `after-change-functions' can be called in succession with the same ;; start point for a continuously growing edited region. For example, ;; when typing without interruptions, subsequent calls can be: @@ -196,6 +202,8 @@ (defsubst phpinspect-edtrack-clear (track) (setf (phpinspect-edtrack-edits track) nil) + (setf (phpinspect-edtrack-last-edit track) nil) + (setf (phpinspect-edtrack-last-edit-start track) -1) (phpinspect-edtrack-clear-taint-pool track)) (defsubst phpinspect-edtrack-register-taint (track start end) diff --git a/test/test-edtrack.el b/test/test-edtrack.el index e4e9e03613..e08750c73c 100644 --- a/test/test-edtrack.el +++ b/test/test-edtrack.el @@ -111,3 +111,18 @@ (phpinspect-edtrack-register-edit track 15 0 1) (should (equal (list (cons 10 16)) (phpinspect-edtrack-taint-pool track))))) + +(ert-deftest phpinspect-edtrack-register-growing-edit () + (let ((track (phpinspect-make-edtrack))) + (phpinspect-edtrack-register-edit track 10 11 0) + (phpinspect-edtrack-register-edit track 10 12 0) + (phpinspect-edtrack-register-edit track 10 13 0) + + (should (equal (list (cons 10 3)) (phpinspect-edtrack-edits track))))) + +(ert-deftest phpinspect-edtrack-register-multi-edits-same-start () + (let ((track (phpinspect-make-edtrack))) + (phpinspect-edtrack-register-edit track 10 11 0) + (phpinspect-edtrack-register-edit track 10 10 1) + + (should (equal (list (cons 10 -1) (cons 10 1)) (phpinspect-edtrack-edits track)))))