[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phpinspect 5fab07b426 082/126: Keep track of multi-call
From: |
ELPA Syncer |
Subject: |
[elpa] externals/phpinspect 5fab07b426 082/126: Keep track of multi-call edits of the same region |
Date: |
Sat, 12 Aug 2023 00:58:46 -0400 (EDT) |
branch: externals/phpinspect
commit 5fab07b426d8f2b54621a2d7b989f8b76239d5b3
Author: Hugo Thunnissen <devel@hugot.nl>
Commit: Hugo Thunnissen <devel@hugot.nl>
Keep track of multi-call edits of the same region
---
phpinspect-edtrack.el | 70 ++++++++++++++++++++++++++++++++++-----------------
test/test-edtrack.el | 23 +++++++++++++++++
2 files changed, 70 insertions(+), 23 deletions(-)
diff --git a/phpinspect-edtrack.el b/phpinspect-edtrack.el
index ae28dfc546..b7b899c949 100644
--- a/phpinspect-edtrack.el
+++ b/phpinspect-edtrack.el
@@ -27,7 +27,13 @@
(edits nil
:type list)
(taint-pool nil
- :type list))
+ :type list)
+ (last-edit nil
+ :type cons
+ :documentation "Last registered edit")
+ (last-edit-start -1
+ :type integer
+ :documentation "Last registered edit start position"))
(defsubst phpinspect-edtrack-make-taint-iterator (track)
(cons (car (phpinspect-edtrack-taint-pool track))
@@ -105,34 +111,52 @@
"Edtrack registered change: [start: %d, end: %d, pre-change-length: %d]"
start end pre-change-length)
- (phpinspect-edtrack-register-taint
- track
- (phpinspect-edtrack-original-position-at-point track start)
- (phpinspect-edtrack-original-position-at-point track (+ start
pre-change-length)))
+ (let ((original-start (phpinspect-edtrack-original-position-at-point track
start)))
+ (phpinspect-edtrack-register-taint
+ track original-start (+ original-start pre-change-length)))
(let ((edit-before (phpinspect-edtrack-edits track)))
(while (and edit-before (< end (phpinspect-edit-end edit-before)))
(setq edit-before (cdr edit-before)))
- (let* ((new-edit (cons
- ;; The end location of the edited region, before being
- ;; edited, with the delta edits that happened at
preceding
- ;; points in the buffer subtratted. This corresponds with
- ;; the original position of the region end before the
- ;; buffer was ever edited.
- (phpinspect-edtrack-original-position-at-point
- track (+ start pre-change-length))
-
-
- ;; The delta of this edit.
- (- (- end start) pre-change-length))))
- (if edit-before
+ (let ((delta ;; The delta of this edit.
+ (- (- end start) pre-change-length))
+ new-edit)
+ (if (= (phpinspect-edtrack-last-edit-start track) start)
+ ;; `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:
+ ;; [start: 1243, end: 1244, pre-change-length: 0]
+ ;; [start: 1243, end: 1245, pre-change-length: 0]
+ ;; [start: 1243, end: 1246, pre-change-length: 0]
+ ;; [start: 1243, end: 1247, pre-change-length: 0]
+ ;;
+ ;; The code below accounts for this scenario by altering the last
+ ;; registered edit when subsequent calls have the same start point.
(progn
- (setcdr edit-before (cons (car edit-before) (cdr edit-before)))
- (setcar edit-before new-edit))
- (if (phpinspect-edtrack-edits track)
- (push new-edit (cdr (last (phpinspect-edtrack-edits track))))
- (push new-edit (phpinspect-edtrack-edits track)))))))
+ (setq new-edit (phpinspect-edtrack-last-edit track))
+ (phpinspect--log "Edtrack: updating growing edit: [%s]" new-edit)
+ (setcdr new-edit delta))
+ ;; Else
+ (setq new-edit (cons
+ ;; The end location of the edited region, before being
+ ;; edited, with the delta edits that happened at
preceding
+ ;; points in the buffer subtratted. This corresponds
with
+ ;; the original position of the region end before the
+ ;; buffer was ever edited.
+ (phpinspect-edtrack-original-position-at-point
+ track (+ start pre-change-length))
+ delta))
+ (if edit-before
+ (progn
+ (setcdr edit-before (cons (car edit-before) (cdr edit-before)))
+ (setcar edit-before new-edit))
+ (if (phpinspect-edtrack-edits track)
+ (push new-edit (cdr (last (phpinspect-edtrack-edits track))))
+ (push new-edit (phpinspect-edtrack-edits track)))))
+
+ (setf (phpinspect-edtrack-last-edit track) new-edit)
+ (setf (phpinspect-edtrack-last-edit-start track) start))))
(defsubst phpinspect-taint-start (taint)
(car taint))
diff --git a/test/test-edtrack.el b/test/test-edtrack.el
index 4391598f33..e4e9e03613 100644
--- a/test/test-edtrack.el
+++ b/test/test-edtrack.el
@@ -88,3 +88,26 @@
(should (phpinspect-taint-iterator-token-is-tainted-p
iterator (phpinspect-make-meta nil 100 130 nil nil)))))
+
+(ert-deftest phpinspect-edtrack-edit-derived-taint-iterator ()
+ (let ((track (phpinspect-make-edtrack))
+ iterator)
+ (phpinspect-edtrack-register-edit track 10 20 5)
+ (phpinspect-edtrack-register-edit track 15 30 0)
+ (phpinspect-edtrack-register-edit track 20 25 10)
+
+ (setq iterator (phpinspect-edtrack-make-taint-iterator track))
+
+ (should (phpinspect-taint-iterator-region-is-tainted-p iterator 15 20))
+ (should (phpinspect-taint-iterator-region-is-tainted-p iterator 25 30))
+ (should-not (phpinspect-taint-iterator-region-is-tainted-p iterator 30
35))))
+
+(ert-deftest phpinspect-edtrack-taint-overlapping-edits ()
+ (let ((track (phpinspect-make-edtrack))
+ iterator)
+ (phpinspect-edtrack-register-edit track 10 20 5)
+
+ (should (equal (list (cons 10 15)) (phpinspect-edtrack-taint-pool track)))
+
+ (phpinspect-edtrack-register-edit track 15 0 1)
+ (should (equal (list (cons 10 16)) (phpinspect-edtrack-taint-pool
track)))))
- [elpa] externals/phpinspect d1d34a4249 084/126: Move more functionalities from main file to separate modules, (continued)
- [elpa] externals/phpinspect d1d34a4249 084/126: Move more functionalities from main file to separate modules, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 05ca0ace20 116/126: Fix all remaining byte compiler warnings, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 2d2f9912c1 102/126: Wrap queue items in a queue object, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f5cc681105 113/126: Fix let parenthesis in test-buffer.el, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect e57edab86e 025/126: Index new files when no FQN can be found for a type, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f8bf0b611a 035/126: WIP: List static methods when requested, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect faa936a4f0 024/126: Test type-resolver + make type resolving work for "blocked" namespaces, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 43ab1bd99b 047/126: Make sure that the worker is running during tests, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 7e7914befa 062/126: Convert CI definition to new (woodpecker) format, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect c2b06fe265 063/126: Another attempt at fixing CI, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 5fab07b426 082/126: Keep track of multi-call edits of the same region,
ELPA Syncer <=
- [elpa] externals/phpinspect 111fa2f4b5 093/126: Fix bugs in splay tree "find" functions, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 4c5a70d4af 096/126: Make buffer re-parse non-interruptible + add interactive function to view tree, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect b68baaec83 094/126: Make parse context cancellable and restore state after interrupt, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 55a24065a6 087/126: Remove obsolete comment (incremental parsing has been implemented), ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect c35c00ceff 086/126: Implement strategy pattern for completion backend, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 2fd91898a3 104/126: Add tests for pipeline and make API more ergonomic, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 55413ea9fb 117/126: Implement basic support for function indexation and include dirs, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect fbfcf4f928 119/126: Fix byte compilation warnings, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect e4b62c0230 120/126: Implement completion-at-point function, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect df821c4039 023/126: Add ticket tracker link to README, ELPA Syncer, 2023/08/12