[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phpinspect 389e77eb8b 092/126: Expand existing overlay
From: |
ELPA Syncer |
Subject: |
[elpa] externals/phpinspect 389e77eb8b 092/126: Expand existing overlay when possible |
Date: |
Sat, 12 Aug 2023 00:58:47 -0400 (EDT) |
branch: externals/phpinspect
commit 389e77eb8b41d25e66516f8ac4fffe0a005597e0
Author: Hugo Thunnissen <devel@hugot.nl>
Commit: Hugo Thunnissen <devel@hugot.nl>
Expand existing overlay when possible
---
phpinspect-bmap.el | 23 ++++++++++++++++++-----
phpinspect-splayt.el | 43 +++++++++++++++++++++++++++++++++++++++++++
test/test-splayt.el | 16 ++++++++++++++++
3 files changed, 77 insertions(+), 5 deletions(-)
diff --git a/phpinspect-bmap.el b/phpinspect-bmap.el
index 2b0221128f..44494ca366 100644
--- a/phpinspect-bmap.el
+++ b/phpinspect-bmap.el
@@ -187,7 +187,7 @@
(gethash point (phpinspect-bmap-ends bmap)))))
(defsubst phpinspect-bmap-overlay-at-point (bmap point)
- (let ((overlay (phpinspect-splayt-find-smallest-after
(phpinspect-bmap-overlays bmap) point)))
+ (let ((overlay (phpinspect-splayt-find-largest-before
(phpinspect-bmap-overlays bmap) point)))
(when (and overlay (phpinspect-overlay-overlaps-point overlay point))
overlay)))
@@ -252,12 +252,25 @@ giving up. If not provided, this is 100."
(let* ((overlays (phpinspect-bmap-overlays bmap))
(start (+ (phpinspect-meta-start token-meta) pos-delta))
(end (+ (phpinspect-meta-end token-meta) pos-delta))
- (overlay `(overlay ,start ,end ,pos-delta ,bmap-overlay ,token-meta)))
+ (overlay)
+ (last-overlay (phpinspect-splayt-node-value
(phpinspect-splayt-root-node overlays))))
+
(phpinspect-meta-detach-parent token-meta)
(phpinspect-meta-shift token-meta pos-delta)
- (setf (phpinspect-meta-overlay token-meta) overlay)
- (phpinspect-bmap-register bmap start end (phpinspect-meta-token
token-meta) whitespace-before token-meta)
- (phpinspect-splayt-insert (phpinspect-bmap-overlays bmap)
(phpinspect-overlay-end overlay) overlay)))
+
+ (if (and last-overlay (= (- start (length whitespace-before))
(phpinspect-overlay-end last-overlay))
+ (= pos-delta (phpinspect-overlay-delta last-overlay)))
+ (progn
+ (phpinspect--log "Expanding previous overlay from (%d,%d) to (%d,%d)"
+ (phpinspect-overlay-start last-overlay)
(phpinspect-overlay-end last-overlay)
+ (phpinspect-overlay-start last-overlay) end)
+ (setf (phpinspect-overlay-end last-overlay) end)
+ (setf (phpinspect-meta-overlay token-meta) last-overlay))
+ (phpinspect--log "Inserting new overlay at (%d,%d)" start end)
+ (setq overlay `(overlay ,start ,end ,pos-delta ,bmap-overlay
,token-meta))
+ (setf (phpinspect-meta-overlay token-meta) overlay)
+ (phpinspect-splayt-insert (phpinspect-bmap-overlays bmap)
(phpinspect-overlay-start overlay) overlay))
+ (phpinspect-bmap-register bmap start end (phpinspect-meta-token
token-meta) whitespace-before token-meta)))
(defun phpinspect-bmap-make-location-resolver (bmap)
(lambda (token)
diff --git a/phpinspect-splayt.el b/phpinspect-splayt.el
index a6e7475212..fd8433ed42 100644
--- a/phpinspect-splayt.el
+++ b/phpinspect-splayt.el
@@ -355,6 +355,41 @@ near the top of the tee."
(throw 'return smallest)))
(t (throw 'return smallest)))))))))
+(define-inline phpinspect-splayt-find-largest-node-before (splayt key)
+ (inline-letevals (splayt key)
+ (inline-quote
+ (let ((current (phpinspect-splayt-root-node ,splayt))
+ largest)
+
+ (catch 'break
+ (while current
+ (if (<= ,key (phpinspect-splayt-node-key current))
+ (setf current (phpinspect-splayt-node-left current)
+ largest current)
+ (throw 'break nil))))
+
+ (catch 'return
+ (while current
+ (when (= (+ ,key 1) (phpinspect-splayt-node-key current))
+ (throw 'return current))
+
+ (cond ((and (phpinspect-splayt-node-parent current)
+ (> ,key (phpinspect-splayt-node-key
(phpinspect-splayt-node-parent current)))
+ (eq (phpinspect-splayt-node-left
(phpinspect-splayt-node-parent current))
+ current))
+ (setf current (phpinspect-splayt-node-parent current)
+ largest current))
+ ((phpinspect-splayt-node-right current)
+ (setf current (phpinspect-splayt-node-right current))
+ (when (> ,key (phpinspect-splayt-node-key current))
+ (setf largest current)))
+ ((<= ,key (phpinspect-splayt-node-key current))
+ (if (phpinspect-splayt-node-left current)
+ (setf current (phpinspect-splayt-node-left current))
+ (throw 'return largest)))
+ (t (throw 'return largest)))))))))
+
+
(defsubst phpinspect-splayt-find-all-after (splayt key)
"Find all values in SPLAYT with a key higher than KEY."
(let ((first (phpinspect-splayt-find-smallest-node-after splayt key))
@@ -378,6 +413,14 @@ near the top of the tee."
(phpinspect-splay
,splayt (phpinspect-splayt-find-smallest-node-after ,splayt ,key)))))
+(define-inline phpinspect-splayt-find-largest-before (splayt key)
+ "Find value of node with smallest key that is higher than KEY in SPLAYT."
+ (inline-quote
+ (phpinspect-splayt-node-value
+ (phpinspect-splay
+ ,splayt (phpinspect-splayt-find-largest-node-before ,splayt ,key)))))
+
+
(defsubst phpinspect-splayt-find (splayt key)
(phpinspect-splayt-node-value (phpinspect-splayt-find-node splayt key)))
diff --git a/test/test-splayt.el b/test/test-splayt.el
index 8bc9829136..292fe964e0 100644
--- a/test/test-splayt.el
+++ b/test/test-splayt.el
@@ -115,6 +115,22 @@
(should (string= "nine" (phpinspect-splayt-find-smallest-after tree 8)))
(should (string= "three" (phpinspect-splayt-find-smallest-after tree 1)))))
+
+(ert-deftest phpinspect-splayt-find-largest-before ()
+ (let ((tree (phpinspect-make-splayt)))
+ (phpinspect-splayt-insert tree 9 "nine")
+ (phpinspect-splayt-insert tree 3 "three")
+ (phpinspect-splayt-insert tree 11 "eleven")
+ (phpinspect-splayt-insert tree 8 "eight")
+ (phpinspect-splayt-insert tree 12 "twelve")
+ (phpinspect-splayt-insert tree 4 "four")
+ (phpinspect-splayt-insert tree 1 "one")
+
+
+ (should (string= "four" (phpinspect-splayt-find-largest-before tree 8)))
+ (should (string= "eleven" (phpinspect-splayt-find-largest-before tree
12)))))
+
+
(ert-deftest phpinspect-splayt-find-all-after ()
(let ((tree (phpinspect-make-splayt)))
(phpinspect-splayt-insert tree 9 "nine")
- [elpa] externals/phpinspect c0786db131 040/126: WIP: Index every possibly required type ahead of time., (continued)
- [elpa] externals/phpinspect c0786db131 040/126: WIP: Index every possibly required type ahead of time., ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 2e487e7810 039/126: Fix resolving of function argument types, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 2fd575dbf5 044/126: Add drone.yml, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f013b3c709 036/126: WIP: Support ambiguous typehints, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect ef9a7336cf 049/126: Replace virtual-directory with more general virtual-fs implementation, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect dbf0ec0390 051/126: Transition from index script to autoloader, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 97377c2922 055/126: Fix bugs in phpinspect-fix-imports, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 281c5e4ae6 077/126: Remove some overly verbose logging, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 0596bc52bf 091/126: Optimize splay tree and use it to store token's children, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect ab6954faf5 090/126: Retrieve and wrap metadata using the correct overlay for region, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 389e77eb8b 092/126: Expand existing overlay when possible,
ELPA Syncer <=
- [elpa] externals/phpinspect 23245d0158 098/126: Fix some compilation warnings, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect db370623da 108/126: Implement "files" autoload strategy, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 6678ba20c6 103/126: Implement async processing pipeline, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 2099abced8 099/126: Add Cask configuration and fix some compilation warnings, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 3175d9a6ac 126/126: Fix typo, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect d86ef5756b 115/126: Remove `phpinspect-define-pipeline-step' in favor of direct fun call, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f003b6a279 105/126: Make project indexation asynchronous using `phpinspect-pipeline', ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect ce995f2bc4 101/126: Remove unused variables, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f2ece03f2a 109/126: Add factilities to filter logs from different modules, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 59a098a4cd 015/126: Add note about parser cache to defhandler + add config example, ELPA Syncer, 2023/08/12