Explicitly test and implement the resolving of function call return types

master
Hugo Thunnissen 4 weeks ago
parent de248b0901
commit 1ab4a3b1f5

@ -134,17 +134,24 @@ serious performance hits. Enable at your own risk (:")
(puthash (phpinspect--function-name-symbol func) func
(phpinspect-project-function-index project))))
(cl-defmethod phpinspect-project-get-function
((project phpinspect-project) (name string))
(phpinspect-project-get-function project (phpinspect-intern-name name)))
(cl-defmethod phpinspect-project-get-function
((project phpinspect-project) (name (head phpinspect-name)))
(gethash name (phpinspect-project-function-index project)))
(cl-defmethod phpinspect-project-get-function-or-extra
((project phpinspect-project) (name (head phpinspect-name)))
(cl-defmethod phpinspect-project-get-function-or-extra ((project phpinspect-project) name)
(or (phpinspect-project-get-function project name)
(and (phpinspect-project-extra-function-retriever project)
(funcall (phpinspect-project-extra-function-retriever project)
name))))
(defun phpinspect-project-get-function-return-type (project function-name)
(when-let ((fn (phpinspect-project-get-function-or-extra project function-name)))
(phpinspect--function-return-type fn)))
(cl-defmethod phpinspect-project-delete-function
((project phpinspect-project) (name (head phpinspect-name)))
(phpinspect-project-edit project

@ -500,6 +500,11 @@ value/type."
(funcall
type-resolver (phpinspect--make-type :name (cadadr expression))))
((phpinspect--match-sequence expression
:f #'phpinspect-word-p
:f #'phpinspect-list-p)
(phpinspect-rctx-get-function-return-type resolvecontext (cadar expression)))
((and (phpinspect-list-p (car expression))
(= 1 (length (cdar expression)))
(phpinspect-word-p (cadar expression)))

@ -221,6 +221,11 @@ accompanied by all of its enclosing tokens."
(let ((project (phpinspect--resolvecontext-project rctx)))
(phpinspect-project-get-class-extra-or-create project class-fqn no-enqueue)))
(defun phpinspect-rctx-get-function-return-type (rctx function-name)
(cl-assert (phpinspect--resolvecontext-p rctx))
(let ((project (phpinspect--resolvecontext-project rctx)))
(phpinspect-project-get-function-return-type project function-name)))
(defun phpinspect--make-type-resolver-for-resolvecontext
(resolvecontext)
(let ((namespace-or-root

@ -167,3 +167,25 @@
(should result)
(should (phpinspect--type= (phpinspect--make-type :name "\\string")
result))))))
(ert-deftest phpinspect-get-variable-type-in-block-function-return ()
(let ((base-code "$bar = foo();")
(paths (list (cons "$bar" "Foo")
(cons "$bar->baz" "string")))
(project (phpinspect--make-dummy-project)))
(phpinspect-project-add-index
project
(phpinspect--index-tokens
(phpinspect-parse-string "class Foo { public string $baz; } function foo(): Foo { return 'bla'; }")))
(dolist (path paths)
(let* ((code (concat base-code (car path)))
(bmap (phpinspect-parse-string-to-bmap code))
(context (phpinspect-get-resolvecontext project bmap (length code)))
(result (phpinspect-resolve-type-from-context context)))
(should result)
(should (phpinspect--type= (phpinspect--make-type :name (concat "\\" (cdr path)))
result))))))

Loading…
Cancel
Save