diff --git a/phpinspect-bmap.el b/phpinspect-bmap.el index 1fed8a3..4aa9fd3 100644 --- a/phpinspect-bmap.el +++ b/phpinspect-bmap.el @@ -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))))) diff --git a/phpinspect-resolvecontext.el b/phpinspect-resolvecontext.el index a12525b..8073431 100644 --- a/phpinspect-resolvecontext.el +++ b/phpinspect-resolvecontext.el @@ -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))))) diff --git a/test/test-bmap.el b/test/test-bmap.el index f3d1bdf..700564a 100644 --- a/test/test-bmap.el +++ b/test/test-bmap.el @@ -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))