Make interval end explicitly a delimiter
ci/woodpecker/push/woodpecker Pipeline was successful Details

WIP-incremental-parsing
Hugo Thunnissen 11 months ago
parent 08d80d3a38
commit bab8deba01

@ -23,35 +23,13 @@
;;; Code:
(require 'phpinspect-tree)
(defvar-local phpinspect-current-buffer nil
"An instance of `phpinspect-buffer' local to the active
buffer. This variable is only set for buffers where
`phpinspect-mode' is active. Also see `phpinspect-buffer'.")
(defsubst phpinspect-make-region (start end)
(list start end))
(defalias 'phpinspect-region-start #'car)
(defalias 'phpinspect-region-end #'cadr)
(defsubst phpinspect-region-size (region)
(- (phpinspect-region-end region) (phpinspect-region-start region)))
(defsubst phpinspect-region> (reg1 reg2)
(> (phpinspect-region-size reg1) (phpinspect-region-size reg2)))
(defsubst phpinspect-region< (reg1 reg2)
(< (phpinspect-region-size reg1) (phpinspect-region-size reg2)))
(defsubst phpinspect-region-overlaps-point (reg point)
(and (>= (phpinspect-region-end reg) point)
(<= (phpinspect-region-start reg) point)))
(defsubst phpinspect-region-overlaps (reg1 reg2)
(or (phpinspect-region-reg2s-point reg1 (phpinspect-region-start reg2))
(phpinspect-region-reg2s-point reg1 (phpinspect-region-end reg2))
(phpinspect-region-reg2s-point reg2 (phpinspect-region-start reg1))
(phpinspect-region-reg2s-point reg2 (phpinspect-region-end reg1))))
(cl-defstruct (phpinspect-token-metadata (:constructor phpinspect-make-token-metadata))
"An object that represents the metadata associated with a parsed token."

@ -331,26 +331,22 @@ belongs to. Return resulting linked list."
(not (phpinspect-llnode-right list)))
(cl-defmethod phpinspect-tree-overlaps ((tree phpinspect-tree) (point integer))
(and (>= (phpinspect-tree-end tree) point)
(<= (phpinspect-tree-start tree) point)))
(and (> (phpinspect-tree-end tree) point)
(<= (phpinspect-tree-start tree) point)))
(cl-defmethod phpinspect-tree-overlaps ((tree1 phpinspect-tree) (tree2 phpinspect-tree))
(and
(or (phpinspect-tree-overlaps tree1 (phpinspect-tree-start tree2))
(phpinspect-tree-overlaps tree1 (phpinspect-tree-end tree2))
(phpinspect-tree-overlaps tree1 (- (phpinspect-tree-end tree2) 1))
(phpinspect-tree-overlaps tree2 (phpinspect-tree-start tree1))
(phpinspect-tree-overlaps tree2 (phpinspect-tree-end tree1)))
(not (or (= (phpinspect-tree-start tree1) (phpinspect-tree-end tree2))
(= (phpinspect-tree-end tree1) (phpinspect-tree-start tree2))))))
(phpinspect-tree-overlaps tree2 (- (phpinspect-tree-end tree1))))))
(cl-defmethod phpinspect-tree-overlaps ((tree phpinspect-tree) region)
(and
(or (phpinspect-tree-overlaps tree (phpinspect-region-start region))
(phpinspect-tree-overlaps tree (phpinspect-region-end region))
(phpinspect-tree-overlaps tree (- (phpinspect-region-end region) 1))
(phpinspect-region-overlaps-point region (phpinspect-tree-start tree))
(phpinspect-region-overlaps-point region (phpinspect-tree-end tree)))
(not (or (= (phpinspect-tree-start tree) (phpinspect-region-end region))
(= (phpinspect-tree-end tree) (phpinspect-region-start region))))))
(phpinspect-region-overlaps-point region (- (phpinspect-tree-end tree) 1)))))
(cl-defmethod phpinspect-tree-encloses ((tree1 phpinspect-tree) (tree2 phpinspect-tree))
(and (<= (phpinspect-tree-start tree1) (phpinspect-tree-start tree2))
@ -523,8 +519,6 @@ collectively have the smallest width."
;; overlapping set (of one).
`(,(phpinspect-tree-value tree))))))
(cl-defmethod phpinspect-tree-insert
((tree phpinspect-tree) (start integer) (end integer) value)
"Insert a new interval from START to END linked to VALUE into TREE.
@ -533,4 +527,29 @@ Returns the newly created and inserted node."
(let ((node (phpinspect-make-tree :start start :end end :value value)))
(phpinspect-tree-insert-node tree node)))
(defsubst phpinspect-make-region (start end)
(list start end))
(defalias 'phpinspect-region-start #'car)
(defalias 'phpinspect-region-end #'cadr)
(defsubst phpinspect-region-size (region)
(- (phpinspect-region-end region) (phpinspect-region-start region)))
(defsubst phpinspect-region> (reg1 reg2)
(> (phpinspect-region-size reg1) (phpinspect-region-size reg2)))
(defsubst phpinspect-region< (reg1 reg2)
(< (phpinspect-region-size reg1) (phpinspect-region-size reg2)))
(defsubst phpinspect-region-overlaps-point (reg point)
(and (> (phpinspect-region-end reg) point)
(<= (phpinspect-region-start reg) point)))
(defsubst phpinspect-region-overlaps (reg1 reg2)
(or (phpinspect-region-reg2s-point reg1 (phpinspect-region-start reg2))
(phpinspect-region-reg2s-point reg1 (- (phpinspect-region-end reg2) 1))
(phpinspect-region-reg2s-point reg2 (phpinspect-region-start reg1))
(phpinspect-region-reg2s-point reg2 (- (phpinspect-region-end reg1) 1))))
(provide 'phpinspect-tree)

@ -188,6 +188,46 @@ the start of the list."
(should (= 4 (seq-length list)))))
(ert-deftest phpinspect-ll-seq-find ()
(let ((list (phpinspect-make-ll)))
(phpinspect-ll-push "target1" list)
(phpinspect-ll-push "target2" list)
(phpinspect-ll-push "target3" list)
(phpinspect-ll-push "target4" list)
(should-not (seq-find #'not list))
(should (string= "target1" (seq-find (lambda (s) (string= "target1" s))
list)))
(should (string= "target2" (seq-find (lambda (s) (string= "target2" s))
list)))
(should (string= "target3" (seq-find (lambda (s) (string= "target3" s))
list)))
(should (string= "target4" (seq-find (lambda (s) (string= "target4" s))
list)))))
(ert-deftest phpinspect-slice-seq-find ()
(let ((list (phpinspect-make-ll))
(target1 "target1")
(target4 "target4")
(slice))
(phpinspect-ll-push target1 list)
(phpinspect-ll-push "target2" list)
(phpinspect-ll-push "target3" list)
(phpinspect-ll-push target4 list)
(setq slice (phpinspect-make-slice :start (phpinspect-ll-link list target4)
:end (phpinspect-ll-link list target1)))
(should-not (seq-find #'not slice))
(should (string= "target1" (seq-find (lambda (s) (string= "target1" s))
slice)))
(should (string= "target2" (seq-find (lambda (s) (string= "target2" s))
slice)))
(should (string= "target3" (seq-find (lambda (s) (string= "target3" s))
slice)))
(should (string= "target4" (seq-find (lambda (s) (string= "target4" s))
slice)))))
(ert-deftest phpinspect-slice-detach ()
(let ((list (phpinspect-make-ll))
(val1 "c")
@ -239,10 +279,11 @@ the start of the list."
(node2 (phpinspect-make-tree :start 20 :end 200))
(node3 (phpinspect-make-tree :start 9 :end 20))
(node4 (phpinspect-make-tree :start 21 :end 44)))
(phpinspect-tree-insert-node tree node1)
(phpinspect-tree-insert-node tree node2)
(phpinspect-tree-insert-node tree node3)
(phpinspect-tree-insert-node tree node4)
(should (phpinspect-tree-parent (phpinspect-tree-insert-node tree node1)))
(should (phpinspect-tree-parent(phpinspect-tree-insert-node tree node2)))
(should (phpinspect-tree-parent (phpinspect-tree-insert-node tree node3)))
(should (phpinspect-tree-parent (phpinspect-tree-insert-node tree node4)))
(should (= 0 (phpinspect-tree-start tree)))
(should (= 500 (phpinspect-tree-end tree)))
@ -272,6 +313,7 @@ the node iteself if it has been stored intact)."
(node3-return (phpinspect-tree-insert-node tree node3))
(node4-return (phpinspect-tree-insert-node tree node4)))
(should (eq tree node1-return))
(should (= 800 (phpinspect-tree-end tree)))
(should (eq node2 node2-return))
@ -288,6 +330,7 @@ the node iteself if it has been stored intact)."
(node3 (phpinspect-make-tree :start 9 :end 20 :value "node3"))
(node4 (phpinspect-make-tree :start 21 :end 44 :value "node4"))
(result))
(phpinspect-tree-insert-node tree node1)
(phpinspect-tree-insert-node tree node2)
(phpinspect-tree-insert-node tree node3)
@ -313,3 +356,26 @@ the node iteself if it has been stored intact)."
(setq result (phpinspect-tree-find-smallest-overlapping-set
tree (phpinspect-make-region 24 55)))
(should (equal '("node4" "node3") result))))
(ert-deftest phpinspect-tree-overlaps-point ()
(let ((tree (phpinspect-make-tree :start 5 :end 10)))
(should (phpinspect-tree-overlaps tree 5))
;; An interval's end is its delimtiter and should not be regarded as part of
;; it.
(should-not (phpinspect-tree-overlaps tree 10))
(should-not (phpinspect-tree-overlaps tree 4))
(should-not (phpinspect-tree-overlaps tree 11))))
(ert-deftest phpinspect-tree-overlaps-region ()
(let ((tree (phpinspect-make-tree :start 5 :end 10)))
(should (phpinspect-tree-overlaps tree (phpinspect-make-region 0 6)))
(should-not (phpinspect-tree-overlaps tree (phpinspect-make-region 0 5)))
(should (phpinspect-tree-overlaps tree (phpinspect-make-region 9 11)))
(should-not (phpinspect-tree-overlaps tree (phpinspect-make-region 10 11)))))
(ert-deftest phpinspect-tree-encloses ()
(let ((tree (phpinspect-make-tree :start 5 :end 10)))
(should (phpinspect-tree-encloses tree (phpinspect-make-tree :start 5 :end 10)))
(should (phpinspect-tree-encloses tree (phpinspect-make-tree :start 5 :end 9)))))

Loading…
Cancel
Save