Bmap approach mostly working now

WIP-incremental-parsing
Hugo Thunnissen 10 months ago
parent fc46349bfe
commit 67fd01e68d

@ -15,32 +15,50 @@
(insert-file-contents (concat here "/Response.php"))
(message "Bmap warmup parse:")
(message "Incremental parse (warmup):")
(phpinspect-with-parse-context (phpinspect-make-pctx :incremental t)
(benchmark 1 '(phpinspect-parse-current-buffer)))
(let ((bmap (phpinspect-make-bmap))
(bmap2 (phpinspect-make-bmap)))
(message "Bmap parse:")
(message "Incremental parse:")
(phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :bmap bmap)
(benchmark 1 '(phpinspect-parse-current-buffer)))
(message "Bmap parse incremental:")
(message "Incremental parse (no edits):")
(phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :bmap bmap2 :previous-bmap bmap :edtrack (phpinspect-make-edtrack))
(benchmark 1 '(phpinspect-parse-current-buffer)))
(message "Bmap parse incremental repeat:")
(message "Incremental parse repeat (no edits):")
(phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :previous-bmap bmap2 :edtrack (phpinspect-make-edtrack))
(benchmark 1 '(phpinspect-parse-current-buffer))))
(benchmark 1 '(phpinspect-parse-current-buffer)))
(let ((edtrack (phpinspect-make-edtrack))
(bmap (phpinspect-make-bmap)))
;; Fresh
(phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :bmap bmap)
(phpinspect-parse-current-buffer))
(message "Incremental parse after buffer edit:")
;; Removes closing curly brace of __construct
(goto-char 9062)
(delete-backward-char 1)
(phpinspect-edtrack-register-edit edtrack 9061 9061 1)
(phpinspect-with-parse-context (phpinspect-make-pctx :incremental t :previous-bmap bmap :edtrack edtrack)
(benchmark 1 '(phpinspect-parse-current-buffer)))))
;; (message "Metadata parse:")
;; (benchmark 1 '(phpinspect-buffer-parse phpinspect-current-buffer))
(message "Bare warmup parse:")
(message "Bare (no token reuse) parse (warmup):")
(benchmark 1 '(phpinspect-parse-current-buffer))
(message "Bare parse:")
(message "Bare (no token reuse) parse:")
(benchmark 1 '(phpinspect-parse-current-buffer))))

@ -33,14 +33,12 @@
(meta (make-hash-table :test #'eq
:size (floor (/ (point-max) 4))
:rehash-size 1.5))
(token-stack nil
:type list)
(overlays nil
:type list)
(current-row nil
:type list)
(current-row-start nil
:type integer)
(current-row-end nil
:type integer))
(last-token-start nil
:type integer))
(defsubst phpinspect-make-region (start end)
(list start end))
@ -82,7 +80,6 @@
(gv-define-setter phpinspect-meta-overlay (overlay meta) `(setcar (nthcdr 6 ,meta) ,overlay))
(gv-define-setter phpinspect-meta-parent (parent meta) `(setcar (cdr ,meta) ,parent))
(defsubst phpinspect-meta-overlay (meta)
(car (nthcdr 6 meta)))
@ -130,6 +127,9 @@
(defsubst phpinspect-overlay-end (overlay)
(caddr overlay))
(defsubst phpinspect-overlay-token-meta (overlay)
(car (nthcdr 5 overlay)))
(defsubst phpinspect-overlay-overlaps-point (overlay point)
(and (> (phpinspect-overlay-end overlay) point)
(<= (phpinspect-overlay-start overlay) point)))
@ -183,12 +183,11 @@
,@body))
(phpinspect-bmap-meta ,bmap)))))))
(defsubst phpinspect-bmap-register (bmap start end token &optional whitespace-before overlay parent)
(defsubst phpinspect-bmap-register (bmap start end token &optional whitespace-before overlay)
(let* ((starts (phpinspect-bmap-starts bmap))
(ends (phpinspect-bmap-ends bmap))
(meta (phpinspect-bmap-meta bmap))
(current-row (phpinspect-bmap-current-row bmap))
(current-row-start (phpinspect-bmap-current-row-start bmap))
(last-token-start (phpinspect-bmap-last-token-start bmap))
(existing-end (gethash end ends))
(token-meta (phpinspect-make-meta nil start end whitespace-before token overlay)))
(unless whitespace-before
@ -202,13 +201,25 @@
(puthash token token-meta meta)
(when parent
(dolist (child current-row)
;; Set parent
(setf (phpinspect-meta-parent child) token-meta))
(setf (phpinspect-bmap-current-row bmap) nil))
(when (and last-token-start
(<= start last-token-start))
(let ((child)
(stack (phpinspect-bmap-token-stack bmap)))
(while (and (car stack) (>= (phpinspect-meta-start (car stack))
start))
(setq child (pop stack))
(setf (phpinspect-meta-parent child) token-meta)
(when (phpinspect-meta-overlay child)
(setf (phpinspect-meta-parent
(phpinspect-overlay-token-meta
(phpinspect-meta-overlay child)))
token-meta)))
(push token-meta (phpinspect-bmap-current-row bmap))))
(setf (phpinspect-bmap-token-stack bmap) stack)))
(setf (phpinspect-bmap-last-token-start bmap) start)
(push token-meta (phpinspect-bmap-token-stack bmap))))
(defsubst phpinspect-overlay-p (overlay)
(and (listp overlay)
@ -249,6 +260,17 @@
(phpinspect-bmap-token-starting-at overlay point)
(gethash point (phpinspect-bmap-starts bmap)))))
(cl-defmethod phpinspect-bmap-tokens-ending-at ((overlay (head overlay)) point)
(mapcar (lambda (meta) (phpinspect-overlay-wrap-meta overlay meta))
(phpinspect-bmap-tokens-ending-at
(phpinspect-overlay-bmap overlay) (- point (phpinspect-overlay-delta overlay)))))
(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)
(gethash point (phpinspect-bmap-ends bmap)))))
(defsubst phpinspect-bmap-overlay-at-point (bmap point)
(catch 'found
(dolist (overlay (phpinspect-bmap-overlays bmap))
@ -282,7 +304,7 @@
(let* ((ends (phpinspect-bmap-ends bmap))
(ending))
(unless (hash-table-empty-p ends)
(while (not (or (<= point 0) (setq ending (gethash point ends))))
(while (not (or (<= point 0) (setq ending (phpinspect-bmap-tokens-ending-at bmap point))))
(setq point (- point 1)))
(car (last ending)))))
@ -290,7 +312,7 @@
(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))
(overlay `(overlay ,start ,end ,pos-delta ,bmap-overlay ,token-meta))
(before))
(phpinspect-bmap-register bmap start end (phpinspect-meta-token token-meta) whitespace-before overlay)
@ -305,13 +327,11 @@
(if (and before (cdr overlays))
;; Append after
(progn
;;(message "appending in the middle")
(setcdr overlays (cons overlay (cdr overlays))))
;; Append at end of overlay list
;;(message "appending at the end")
(nconc (phpinspect-bmap-overlays bmap) (list overlay))))
;;(message "appending at the start")
;; No exising overlays, overwrite
(push overlay (phpinspect-bmap-overlays bmap)))))
(defun phpinspect-bmap-make-location-resolver (bmap)

@ -49,22 +49,27 @@ emacs buffer."
(cl-defmethod phpinspect-buffer-parse ((buffer phpinspect-buffer))
"Parse the PHP code in the the emacs buffer that this object is
linked with."
(with-current-buffer (phpinspect-buffer-buffer buffer)
(let* ((map (phpinspect-make-bmap))
(buffer-map (phpinspect-buffer-map buffer))
(ctx (phpinspect-make-pctx
:bmap map
:incremental t
:previous-bmap buffer-map
:edtrack (phpinspect-buffer-edit-tracker buffer))))
(phpinspect-with-parse-context ctx
(let ((parsed (phpinspect-parse-current-buffer)))
(setf (phpinspect-buffer-map buffer) map)
(setf (phpinspect-buffer-tree buffer) parsed)
(phpinspect-edtrack-clear (phpinspect-buffer-edit-tracker buffer))
;; return
parsed)))))
(if (or (not (phpinspect-buffer-tree buffer))
(phpinspect-edtrack-taint-pool (phpinspect-buffer-edit-tracker buffer)))
(with-current-buffer (phpinspect-buffer-buffer buffer)
(let* ((map (phpinspect-make-bmap))
(buffer-map (phpinspect-buffer-map buffer))
(ctx (phpinspect-make-pctx
:bmap map
:incremental t
:previous-bmap buffer-map
:edtrack (phpinspect-buffer-edit-tracker buffer))))
(phpinspect-with-parse-context ctx
(let ((parsed (phpinspect-parse-current-buffer)))
(setf (phpinspect-buffer-map buffer) map)
(setf (phpinspect-buffer-tree buffer) parsed)
(phpinspect-edtrack-clear (phpinspect-buffer-edit-tracker buffer))
;; return
parsed))))
;; Else: Just return last parse result
(phpinspect-buffer-tree buffer)))
(cl-defmethod phpinspect-buffer-reparse ((buffer phpinspect-buffer))
(setf (phpinspect-buffer-map buffer) (phpinspect-make-bmap))

@ -82,15 +82,29 @@
(+ point (phpinspect-edit-delta edit))))
(defsubst phpinspect-edtrack-register-edit (track start end pre-change-length)
(let ((edit (phpinspect-edtrack-edits track)))
(while (and edit (< end (phpinspect-edit-end edit)))
(setq edit (cdr edit)))
(let* ((new-edit (cons (- (+ start pre-change-length) (phpinspect-edit-delta edit)) (- (- end start) pre-change-length))))
(if edit
(let ((edit-before (phpinspect-edtrack-edits track)))
(while (and edit-before (< end (phpinspect-edit-end edit-before)))
(setq edit-before (cdr edit-before)))
(phpinspect-edtrack-register-taint
track
(phpinspect-edtrack-original-position-at-point track start)
(phpinspect-edtrack-original-position-at-point track end))
(let* ((new-edit (cons
;; The end location of the edited region, before being
;; edited, with the delta edits that happened at preceding
;; points in the buffer subtratted. This corresponds with
;; the original position of the region end before the
;; buffer was ever edited.
(- (+ start pre-change-length) (or (phpinspect-edit-delta edit-before) 0))
;; The delta of this edit.
(- (- end start) pre-change-length))))
(if edit-before
(progn
(setcdr edit (cons (car edit) (cdr edit)))
(setcar edit new-edit))
(setcdr edit-before (cons (car edit-before) (cdr edit-before)))
(setcar edit-before new-edit))
(if (phpinspect-edtrack-edits track)
(push new-edit (cdr (last (phpinspect-edtrack-edits track))))
(push new-edit (phpinspect-edtrack-edits track)))))))

@ -480,16 +480,14 @@ parsing. Usually used in combination with
(whitespace-before ""
:type string))
(cl-defmethod phpinspect-pctx-register-token
((pctx phpinspect-pctx) token start end)
(defsubst phpinspect-pctx-register-token (pctx token start end)
(phpinspect-bmap-register
(phpinspect-pctx-bmap pctx) start end token (phpinspect-pctx-consume-whitespace pctx)))
(cl-defmethod phpinspect-pctx-register-whitespace
((pctx phpinspect-pctx) (whitespace string))
(defsubst phpinspect-pctx-register-whitespace (pctx whitespace)
(setf (phpinspect-pctx-whitespace-before pctx) whitespace))
(cl-defmethod phpinspect-pctx-consume-whitespace ((pctx phpinspect-pctx))
(defsubst phpinspect-pctx-consume-whitespace (pctx)
(let ((whitespace (phpinspect-pctx-whitespace-before pctx)))
(setf (phpinspect-pctx-whitespace-before pctx) "")
whitespace))
@ -571,6 +569,93 @@ parsing. Usually used in combination with
;; Return
tokens)))))
(defun phpinspect-make-incremental-parser-function (tree-type handler-list &optional delimiter-predicate)
"Like `phpinspect-make-parser-function', but returned function is able to reuse an already parsed tree."
(let ((handlers (mapcar
(lambda (handler-name)
(let* ((handler-name (symbol-name handler-name))
(handler (intern-soft handler-name phpinspect-handler-obarray)))
(if handler
handler
(error "No handler found by name \"%s\"" handler-name))))
handler-list))
(delimiter-predicate (if (symbolp delimiter-predicate)
`(quote ,delimiter-predicate)
delimiter-predicate)))
`(lambda (context buffer max-point &optional continue-condition root)
(with-current-buffer buffer
(let* ((tokens)
(root-start (point))
(bmap (phpinspect-pctx-bmap context))
(previous-bmap (phpinspect-pctx-previous-bmap context))
(edtrack (phpinspect-pctx-edtrack context))
(taint-iterator (when edtrack (phpinspect-edtrack-make-taint-iterator edtrack)))
;; Loop variables
(start-position)
(original-position)
(current-end-position)
(existing-meta)
(token)
(delimiter-predicate (when (functionp ,delimiter-predicate) ,delimiter-predicate)))
(phpinspect-pctx-save-whitespace context
(while (and (< (point) max-point)
(if continue-condition (funcall continue-condition) t)
(not (if delimiter-predicate
(funcall delimiter-predicate (car (last tokens)))
nil)))
(setq start-position (point))
(cond ((and previous-bmap edtrack
(setq existing-meta
(phpinspect-bmap-token-starting-at
previous-bmap
(setq original-position
(phpinspect-edtrack-original-position-at-point edtrack start-position))))
(not (or (phpinspect-root-p (phpinspect-meta-token existing-meta))
(phpinspect-taint-iterator-token-is-tainted-p taint-iterator existing-meta))))
(setq current-end-position (phpinspect-edtrack-current-position-at-point
edtrack (phpinspect-meta-end existing-meta)))
(setq token (phpinspect-meta-token existing-meta))
;;(message "reusing token %s" token)
;; Re-register existing token
(let ((delta (- start-position original-position)))
(phpinspect-bmap-overlay
bmap previous-bmap existing-meta delta
(phpinspect-pctx-consume-whitespace context)))
;;(message "Current pos: %d, end pos: %d" (point) current-end-position)
(goto-char current-end-position)
;; Skip over whitespace after so that we don't do a full
;; run down all of the handlers during the next iteration
(when (looking-at (phpinspect-handler-regexp 'whitespace))
(funcall (phpinspect-handler 'whitespace) (match-string 0))))
,@(mapcar
(lambda (handler)
`((looking-at ,(plist-get (symbol-value handler) 'regexp))
(setq token (funcall ,(symbol-function handler) (match-string 0) max-point))
(when token
(phpinspect-pctx-register-token context token start-position (point)))))
handlers)
(t (forward-char)))
(when token
(if (null tokens)
(setq tokens (list token))
(progn
(nconc tokens (list token))))
(setq token nil))))
(push ,tree-type tokens)
(when root
(phpinspect-pctx-register-token context tokens root-start (point)))
;; Return
tokens)))))
(cl-defstruct (phpinspect-parser (:constructor phpinspect-make-parser))
(tree-keyword "root"
@ -616,7 +701,7 @@ executing.")
(or (phpinspect-parser-incremental-func parser)
(setf (phpinspect-parser-incremental-func parser)
(byte-compile
(phpinspect-make-bmap-parser-function
(phpinspect-make-incremental-parser-function
(intern (concat ":" (phpinspect-parser-tree-keyword parser)))
(phpinspect-parser-handlers parser)
(phpinspect-parser-delimiter-predicate parser))))))

@ -135,22 +135,22 @@ candidate. Candidates can be indexed functions and variables.")
(phpinspect-namespace-p token)))
(defun phpinspect-find-statement-before-point (bmap meta point)
(message "going through %s" (phpinspect-meta-token meta))
(let ((children (seq-reverse (cdr (phpinspect-meta-token meta)))))
(phpinspect--log "going through %s" (phpinspect-meta-token meta))
(let ((children (reverse (cdr (phpinspect-meta-token meta)))))
(let ((previous-siblings))
(catch 'return
(dolist (child children)
(when (phpinspect-probably-token-p child)
(message "probably token: %s" child)
;; (message "Child: %s" child)
(phpinspect--log "probably token: %s" child)
;; (phpinspect--log "Child: %s" child)
(setq child (phpinspect-bmap-token-meta bmap child))
(when (< (phpinspect-meta-start child) point)
(if (phpinspect-blocklike-p (phpinspect-meta-token child))
(if (and (not previous-siblings) (phpinspect-blocklike-p (phpinspect-meta-token child)))
(progn
(message "recursing into %s" (phpinspect-meta-token child))
(phpinspect--log "recursing into %s" (phpinspect-meta-token child))
(throw 'return (phpinspect-find-statement-before-point bmap child point)))
(when (phpinspect-end-of-statement-p (phpinspect-meta-token child))
(message "returning %s, end of statement: %s" previous-siblings (phpinspect-meta-token child))
(phpinspect--log "returning %s, end of statement: %s" previous-siblings (phpinspect-meta-token child))
(throw 'return previous-siblings))
(push (phpinspect-meta-token child) previous-siblings)))))
previous-siblings))))
@ -158,16 +158,16 @@ candidate. Candidates can be indexed functions and variables.")
(cl-defmethod phpinspect-get-resolvecontext
((bmap phpinspect-bmap) (point integer))
(let* ((enclosing (phpinspect-bmap-tokens-overlapping bmap point))
(enclosing-tokens)
(let* ((enclosing-tokens)
;; When there are no enclosing tokens, point is probably at the absolute
;; end of the buffer, so we find the last child before point.
(subject (or (car enclosing) (phpinspect-bmap-last-token-before-point bmap point)))
(subject (phpinspect-bmap-last-token-before-point bmap point))
(subject-token)
(siblings))
;; 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))
(let ((new-subject
(phpinspect-bmap-token-meta
bmap (car (last (phpinspect-meta-token subject))))))
@ -422,7 +422,7 @@ TODO:
resolvecontext))
(static))
(message "Eldoc statement before checking outside list: %s" statement)
(phpinspect--log "Eldoc statement before checking outside list: %s" statement)
(when (and (phpinspect-list-p parent-token) enclosing-token)
(setq statement
(phpinspect-find-statement-before-point
@ -430,8 +430,8 @@ TODO:
(phpinspect-meta-end
(phpinspect-bmap-token-meta token-map parent-token)))))
(message "Enclosing token: %s" enclosing-token)
(message "Eldoc statement: %s" statement)
(phpinspect--log "Enclosing token: %s" enclosing-token)
(phpinspect--log "Eldoc statement: %s" statement)
(setq arg-list (seq-find #'phpinspect-list-p (reverse statement)))
@ -831,7 +831,7 @@ EXPRESSION."
(enclosing-token)
(type))
(while (and enclosing-tokens (not type))
;;(message "Trying to find type in %s" enclosing-token)
;;(phpinspect--log "Trying to find type in %s" enclosing-token)
(setq enclosing-token (pop enclosing-tokens))
(setq type
@ -1099,7 +1099,7 @@ level of a token. Nested variables are ignored."
strings))
(defun phpinspect--suggest-attributes-at-point
(token-tree resolvecontext &optional static)
(resolvecontext &optional static)
"Suggest object or class attributes at point.
TOKEN-TREE must be a syntax tree containing enough context to
@ -1205,7 +1205,7 @@ static variables and static methods."
(point)))
(defun phpinspect--suggest-at-point ()
(phpinspect--log "Entering suggest at point." )
(phpinspect--log "Entering suggest at point. Point: %d" (point))
(let* ((bmap (phpinspect-buffer-parse-map phpinspect-current-buffer))
(resolvecontext (phpinspect-get-resolvecontext bmap (point)))
(last-tokens (last (phpinspect--resolvecontext-subject resolvecontext) 2)))
@ -1215,11 +1215,10 @@ static variables and static methods."
(cond ((and (phpinspect-object-attrib-p (car last-tokens))
(phpinspect-word-p (cadr last-tokens)))
(phpinspect--log "word-attributes")
(phpinspect--suggest-attributes-at-point token-tree
resolvecontext))
(phpinspect--suggest-attributes-at-point resolvecontext))
((phpinspect-object-attrib-p (cadr last-tokens))
(phpinspect--log "object-attributes")
(phpinspect--suggest-attributes-at-point token-tree resolvecontext))
(phpinspect--suggest-attributes-at-point resolvecontext))
((phpinspect-static-attrib-p (cadr last-tokens))
(phpinspect--log "static-attributes")
(phpinspect--suggest-attributes-at-point token-tree resolvecontext t))

@ -99,7 +99,7 @@
(project-root "could never be a real project root")
(phpinspect-project-root-function
(lambda (&rest _ignored) project-root))
(project (phpinspect--make-projectb
(project (phpinspect--make-project
:fs (phpinspect-make-virtual-fs)
:root project-root
:worker (phpinspect-make-worker))))
@ -414,7 +414,8 @@
:name "Dupuis\\GastonLagaffe"))))))
(ert-deftest phpinspect-resolve-type-from-context ()
(let* ((token-tree (phpinspect-parse-string "
(let* ((pctx (phpinspect-make-pctx :incremental t))
(code "
namespace Amazing;
class FluffBall
@ -431,8 +432,18 @@ class FluffBall
$ball = $this->fluffer;
if ($ball) {
if(isset($ball->fluff()->poof->upFluff->"))
(fluffer (phpinspect-parse-string "
if(isset($ball->fluff()->poof->upFluff->)) {
$this->beFluffy();
}
}
$ball->fluff()->poof->
}
}")
(token-tree (phpinspect-with-parse-context pctx
(phpinspect-parse-string code)))
(bmap (phpinspect-pctx-bmap pctx))
(fluffer (phpinspect-parse-string "
namespace Amazing;
use Vendor\\FluffLib\\Fluff;
@ -463,7 +474,7 @@ class FlufferUpper
}
}"))
(phpinspect-project-root-function (lambda () "phpinspect-test"))
(context (phpinspect--get-resolvecontext token-tree)))
(context (phpinspect-get-resolvecontext bmap 310)))
(setf (phpinspect--resolvecontext-project-root context)
"phpinspect-test")
@ -476,6 +487,14 @@ class FlufferUpper
(should (phpinspect--type=
(phpinspect--make-type :name "\\Vendor\\FluffLib\\DoubleFluffer")
(phpinspect-resolve-type-from-context
context
(phpinspect--make-type-resolver-for-resolvecontext
context))))
(setq context (phpinspect-get-resolvecontext bmap 405))
(should (phpinspect--type=
(phpinspect--make-type :name "\\Vendor\\FluffLib\\FlufferUpper")
(phpinspect-resolve-type-from-context
context
(phpinspect--make-type-resolver-for-resolvecontext
@ -568,6 +587,8 @@ class Thing
(phpinspect--make-type-resolver-for-resolvecontext
context))))))
(ert-deftest phpinspect-resolve-type-from-context-static-method-with-preceding-words ()
(let* ((php-code "
class Thing

@ -37,8 +37,8 @@
(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 nil nil t)
(phpinspect-bmap-register bmap 2 30 'granny nil nil t)
(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)))

@ -91,32 +91,46 @@
:buffer (phpinspect-document-buffer document)))
(parsed))
;; TODO: write tests for more complicated cases (multiple edits, etc.)
(phpinspect-document-set-contents document "<?php function Hello() { echo 'Hello World!'; if ($name) { echo 'Hello ' . $name . '!';} }")
(phpinspect-document-set-contents document "<?php function Bello() { echo 'Hello World!'; if ($name) { echo 'Hello ' . $name . '!';} }")
(setq parsed (phpinspect-buffer-parse buffer))
(should parsed)
(let ((hello (car (phpinspect-buffer-tokens-enclosing-point buffer 18)))
(hello1)
(hello2))
(should (equal '(:word "Hello") (phpinspect-meta-token hello)))
(let* ((enclosing-bello (phpinspect-buffer-tokens-enclosing-point buffer 18))
(bello (car enclosing-bello))
(enclosing-bello1)
(bello1)
(bello2))
(should (equal '(:word "Bello") (phpinspect-meta-token bello)))
(should parsed)
;; Delete function block opening brace
(phpinspect-document-apply-edit document 24 24 -1 "")
(should (string= "<?php function Hello() echo 'Hello World!'; if ($name) { echo 'Hello ' . $name . '!';} }"
(should (string= "<?php function Bello() echo 'Hello World!'; if ($name) { echo 'Hello ' . $name . '!';} }"
(phpinspect-document-contents document)))
(phpinspect-buffer-register-edit buffer 24 24 1)
(setq parsed (phpinspect-buffer-parse buffer))
(should parsed)
(setq hello1 (car (phpinspect-buffer-tokens-enclosing-point buffer 18)))
(should (eq (phpinspect-meta-token hello) (phpinspect-meta-token hello1)))
(setq enclosing-bello1 (phpinspect-buffer-tokens-enclosing-point buffer 18))
(setq bello1 (car enclosing-bello1))
(should (eq (phpinspect-meta-token bello) (phpinspect-meta-token bello1)))
(should (phpinspect-declaration-p (phpinspect-meta-token (phpinspect-meta-parent bello))))
(should (phpinspect-declaration-p (phpinspect-meta-token (phpinspect-meta-parent bello1))))
(should (phpinspect-function-p (phpinspect-meta-token (phpinspect-meta-parent (phpinspect-meta-parent bello)))))
(should (phpinspect-function-p (phpinspect-meta-token (phpinspect-meta-parent (phpinspect-meta-parent bello1)))))
(let ((function (phpinspect-meta-token (phpinspect-meta-parent (phpinspect-meta-parent bello1)))))
(should (= 2 (length function)))
(should (phpinspect-declaration-p (cadr function)))
(should (member '(:word "Bello") (cadr function))))
(phpinspect-document-apply-edit document 24 25 1 "{")
(should (string= "<?php function Hello() { echo 'Hello World!'; if ($name) { echo 'Hello ' . $name . '!';} }"
(should (string= "<?php function Bello() { echo 'Hello World!'; if ($name) { echo 'Hello ' . $name . '!';} }"
(phpinspect-document-contents document)))
(phpinspect-buffer-register-edit buffer 24 25 0)
(setq parsed (phpinspect-buffer-parse buffer))
(should parsed)
(setq hello2 (car (phpinspect-buffer-tokens-enclosing-point buffer 18)))
(should (eq (phpinspect-meta-token hello) (phpinspect-meta-token hello2))))))
(setq bello2 (car (phpinspect-buffer-tokens-enclosing-point buffer 18)))
(should (eq (phpinspect-meta-token bello) (phpinspect-meta-token bello2))))))

@ -0,0 +1,32 @@
(require 'phpinspect-parser)
(ert-deftest phpinspect-parse-bmap ()
(let* ((ctx (phpinspect-make-pctx :incremental t))
(code "
class TestClass {
public function getCurrentStatisticAction(): JsonResponse
{
$statistic = $this->repository->getCurrentStatistic();
if (!$this->authorization->isGranted(EntityAction::VIEW, $statistic)) {
return $this->responder->respondUnauthorized();
}
return $this->responder->respond($statistic);
}
}")
(bmap))
(phpinspect-with-parse-context ctx
(phpinspect-parse-string code))
(setq bmap (phpinspect-pctx-bmap ctx))
(let ((enclosing (phpinspect-bmap-tokens-overlapping bmap 350))
(parent))
(should enclosing)
(should (phpinspect-variable-p (phpinspect-meta-token (car enclosing))))
(should (string= "statistic" (cadr (phpinspect-meta-token (car enclosing)))))
(should (phpinspect-meta-parent (car enclosing)))
(setq parent (phpinspect-meta-parent (car enclosing)))
(should (phpinspect-list-p (phpinspect-meta-token parent)))
(should (phpinspect-block-p (phpinspect-meta-token (phpinspect-meta-parent parent)))))))

@ -0,0 +1,27 @@
(require 'phpinspect)
(ert-deftest phinspect-get-resolvecontext ()
(let* ((ctx (phpinspect-make-pctx :incremental t))
(code "
class TestClass {
public function getCurrentStatisticAction(): JsonResponse
{
$statistic = $this->repository->getCurrentStatistic();
if (!$this->authorization->isGranted(EntityAction::VIEW, $statistic)) {
return $this->responder->respondUnauthorized();
}
$this->
return $this->responder->respond($statistic);
}
}")
(bmap))
(phpinspect-with-parse-context ctx
(phpinspect-parse-string code))
(setq bmap (phpinspect-pctx-bmap ctx))
(let ((rctx (phpinspect-get-resolvecontext bmap 317)))
(should (phpinspect--resolvecontext-subject rctx))
(should (phpinspect--resolvecontext-enclosing-tokens rctx)))))
Loading…
Cancel
Save