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.
master
Hugo Thunnissen 12 months ago
parent 6627f6f76f
commit 91e24b97d4

@ -305,6 +305,9 @@
(phpinspect-bmap-token-meta (phpinspect-overlay-bmap overlay) token)) (phpinspect-bmap-token-meta (phpinspect-overlay-bmap overlay) token))
(cl-defmethod phpinspect-bmap-token-meta ((bmap phpinspect-bmap) 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)) (or (gethash token (phpinspect-bmap-meta bmap))
(let ((found?)) (let ((found?))
(catch 'found (catch 'found
@ -314,13 +317,14 @@
(defsubst phpinspect-probably-token-p (token) (defsubst phpinspect-probably-token-p (token)
(and (listp 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)) (let* ((ends (phpinspect-bmap-ends bmap))
(ending)) (ending))
(unless (hash-table-empty-p ends) (unless (hash-table-empty-p ends)
(while (not (or (<= point 0) (setq ending (phpinspect-bmap-tokens-ending-at bmap point)))) (while (not (or (<= point 0) (setq ending (phpinspect-bmap-tokens-ending-at bmap point))))
(phpinspect--log "Checking point %d" point)
(setq point (- point 1))) (setq point (- point 1)))
(car (last ending))))) (car (last ending)))))

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

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

Loading…
Cancel
Save