Make bmap-token-meta error on unexpected input

Searching for an object that doesn't exist as a token can be really expensive,
so it's better to error on unexpected input and fix code on the calling side.
WIP-cache
Hugo Thunnissen 10 months ago
parent 6627f6f76f
commit 91e24b97d4

@ -284,7 +284,7 @@
(cl-defmethod phpinspect-bmap-tokens-ending-at ((bmap phpinspect-bmap) point)
(let ((overlay (phpinspect-bmap-overlay-at-point bmap point)))
(if overlay
(phpinspect-bmap-tokens-ending-at overlay point)
(phpinspect-bmap-tokens-ending-at overlay point)
(gethash point (phpinspect-bmap-ends bmap)))))
(defsubst phpinspect-bmap-overlay-at-point (bmap point)
@ -305,6 +305,9 @@
(phpinspect-bmap-token-meta (phpinspect-overlay-bmap overlay) token))
(cl-defmethod phpinspect-bmap-token-meta ((bmap phpinspect-bmap) token)
(unless (phpinspect-probably-token-p token)
(error "Unexpected argument, expected `phpinspect-token-p'. Got invalid token %s" token))
(or (gethash token (phpinspect-bmap-meta bmap))
(let ((found?))
(catch 'found
@ -314,13 +317,14 @@
(defsubst phpinspect-probably-token-p (token)
(and (listp token)
(symbolp (car token))))
(keywordp (car token))))
(defsubst phpinspect-bmap-last-token-before-point (bmap point)
(cl-defmethod phpinspect-bmap-last-token-before-point ((bmap phpinspect-bmap) point)
(let* ((ends (phpinspect-bmap-ends bmap))
(ending))
(unless (hash-table-empty-p ends)
(while (not (or (<= point 0) (setq ending (phpinspect-bmap-tokens-ending-at bmap point))))
(phpinspect--log "Checking point %d" point)
(setq point (- point 1)))
(car (last ending)))))

@ -84,13 +84,15 @@
(subject (phpinspect-bmap-last-token-before-point bmap point))
(subject-token)
(siblings))
(phpinspect--log "Last token before point: %s" subject)
;; Dig down through tokens that can contain statements
(catch 'break
(while (and subject (phpinspect-enclosing-token-p (phpinspect-meta-token subject)))
(phpinspect--log "Token %s is enclosing" (phpinspect-meta-token subject))
(while (and subject
(phpinspect-enclosing-token-p (phpinspect-meta-token subject))
(cdr (phpinspect-meta-token subject)) 0)
(let ((new-subject
(phpinspect-bmap-token-meta
bmap (car (last (phpinspect-meta-token subject))))))
bmap (car (last (cdr (phpinspect-meta-token subject)))))))
(if new-subject
(setq subject new-subject)
(throw 'break nil)))))

@ -4,11 +4,15 @@
(ert-deftest phpinspect-bmap-overlay ()
(let ((bmap (phpinspect-make-bmap))
(bmap2 (phpinspect-make-bmap))
(bmap3 (phpinspect-make-bmap)))
(bmap3 (phpinspect-make-bmap))
(token '(:token))
(token1 '(:token1))
(token2 '(:token2))
(token3 '(:token3)))
(phpinspect-bmap-register bmap 10 20 'token)
(phpinspect-bmap-register bmap2 20 24 'token2)
(phpinspect-bmap-register bmap3 40 50 'token3)
(phpinspect-bmap-register bmap 10 20 token)
(phpinspect-bmap-register bmap2 20 24 token2)
(phpinspect-bmap-register bmap3 40 50 token3)
(should (phpinspect-bmap-token-starting-at bmap 10))
@ -24,74 +28,77 @@
bmap2 bmap (phpinspect-bmap-token-starting-at bmap 50) 5)
(should (eq 'token2 (phpinspect-meta-token
(phpinspect-bmap-token-starting-at bmap2 20))))
(should (eq 'token (phpinspect-meta-token
(phpinspect-bmap-token-starting-at bmap2 7))))
(should (eq token2 (phpinspect-meta-token
(phpinspect-bmap-token-starting-at bmap2 20))))
(should (eq token (phpinspect-meta-token
(phpinspect-bmap-token-starting-at bmap2 7))))
;; Nesting for token-starting-at
(should (eq 'token3 (phpinspect-meta-token
(phpinspect-bmap-token-starting-at bmap 50))))
(should (eq token3 (phpinspect-meta-token
(phpinspect-bmap-token-starting-at bmap 50))))
(should (eq 'token3 (phpinspect-meta-token
(phpinspect-bmap-token-starting-at bmap2 55))))
(should (eq token3 (phpinspect-meta-token
(phpinspect-bmap-token-starting-at bmap2 55))))
(should (phpinspect-bmap-token-meta bmap 'token))
(should (phpinspect-bmap-token-meta bmap2 'token2))
(should (phpinspect-bmap-token-meta bmap2 'token))
(should (phpinspect-bmap-token-meta bmap2 'token3))))
(should (phpinspect-bmap-token-meta bmap token))
(should (phpinspect-bmap-token-meta bmap2 token2))
(should (phpinspect-bmap-token-meta bmap2 token))
(should (phpinspect-bmap-token-meta bmap2 token3))))
(ert-deftest phpinspect-bmap-nest-parent ()
(let ((bmap (phpinspect-make-bmap)))
(phpinspect-bmap-register bmap 10 20 'child)
(phpinspect-bmap-register bmap 5 25 'parent)
(phpinspect-bmap-register bmap 2 30 'granny)
(let ((bmap (phpinspect-make-bmap))
(child '(:child))
(parent '(:parent))
(granny '(:granny)))
(phpinspect-bmap-register bmap 10 20 child)
(phpinspect-bmap-register bmap 5 25 parent)
(phpinspect-bmap-register bmap 2 30 granny)
(let ((child (phpinspect-bmap-token-meta bmap 'child))
(parent (phpinspect-bmap-token-meta bmap 'parent)))
(should (eq 'parent (phpinspect-meta-token
(phpinspect-meta-parent child))))
(should (eq 'granny (phpinspect-meta-token (phpinspect-meta-parent parent)))))))
(let ((child-meta (phpinspect-bmap-token-meta bmap child))
(parent-meta (phpinspect-bmap-token-meta bmap parent)))
(should (eq parent (phpinspect-meta-token
(phpinspect-meta-parent child-meta))))
(should (eq granny (phpinspect-meta-token (phpinspect-meta-parent parent-meta)))))))
(ert-deftest phpinspect-bmap-tokens-overlapping ()
(let ((bmap (phpinspect-make-bmap)))
(phpinspect-bmap-register bmap 9 200 'node1)
(phpinspect-bmap-register bmap 20 200 'node2)
(phpinspect-bmap-register bmap 9 20 'node3)
(phpinspect-bmap-register bmap 21 44 'node4)
(phpinspect-bmap-register bmap 9 200 '(:node1))
(phpinspect-bmap-register bmap 20 200 '(:node2))
(phpinspect-bmap-register bmap 9 20 '(:node3))
(phpinspect-bmap-register bmap 21 44 '(:node4))
(setq result (phpinspect-bmap-tokens-overlapping bmap 22))
(should (equal '(node4 node2 node1) (mapcar #'phpinspect-meta-token result)))))
(should (equal '((:node4) (:node2) (:node1)) (mapcar #'phpinspect-meta-token result)))))
(ert-deftest phpinspect-bmap-tokens-overlapping-overlayed ()
(let ((bmap (phpinspect-make-bmap))
(bmap2 (phpinspect-make-bmap))
(bmap3 (phpinspect-make-bmap)))
(phpinspect-bmap-register bmap 9 200 'token1)
(phpinspect-bmap-register bmap 20 200 'token2)
(phpinspect-bmap-register bmap 9 20 'token3)
(phpinspect-bmap-register bmap 21 44 'token4)
(phpinspect-bmap-register bmap 9 200 '(:token1))
(phpinspect-bmap-register bmap 20 200 '(:token2))
(phpinspect-bmap-register bmap 9 20 '(:token3))
(phpinspect-bmap-register bmap 21 44 '(:token4))
(phpinspect-bmap-register bmap2 200 230 'token5)
(phpinspect-bmap-register bmap3 300 305 'token6)
(phpinspect-bmap-register bmap2 200 230 '(:token5))
(phpinspect-bmap-register bmap3 300 305 '(:token6))
;; Should start at 220 of bmap2
(phpinspect-bmap-overlay
bmap2 bmap3 (phpinspect-bmap-token-starting-at bmap3 300) -80)
(setq result (phpinspect-bmap-tokens-overlapping bmap2 220))
(should (equal '(token6 token5) (mapcar #'phpinspect-meta-token result)))
(should (equal '((:token6) (:token5)) (mapcar #'phpinspect-meta-token result)))
(phpinspect-bmap-overlay
bmap bmap2 (phpinspect-bmap-token-starting-at bmap2 200) 20)
(setq result (phpinspect-bmap-tokens-overlapping bmap 240))
(should (equal '(token6 token5) (mapcar #'phpinspect-meta-token result)))
(should (equal '((:token6) (:token5)) (mapcar #'phpinspect-meta-token result)))
(setq result (phpinspect-bmap-tokens-overlapping bmap 22))
(should (equal '(token4 token2 token1) (mapcar #'phpinspect-meta-token result)))))
(should (equal '((:token4) (:token2) (:token1)) (mapcar #'phpinspect-meta-token result)))))
(ert-deftest phpinspect-bmap-register ()
(let* ((bmap (phpinspect-make-bmap))

Loading…
Cancel
Save