From 1ab4a3b1f55aef53088d2177396f849b3625e044 Mon Sep 17 00:00:00 2001 From: Hugo Thunnissen Date: Wed, 21 Aug 2024 19:11:54 +0200 Subject: [PATCH] Explicitly test and implement the resolving of function call return types --- phpinspect-project.el | 11 +++++++++-- phpinspect-resolve.el | 5 +++++ phpinspect-resolvecontext.el | 5 +++++ test/test-resolve.el | 22 ++++++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/phpinspect-project.el b/phpinspect-project.el index 9d13f82..01538f7 100644 --- a/phpinspect-project.el +++ b/phpinspect-project.el @@ -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 diff --git a/phpinspect-resolve.el b/phpinspect-resolve.el index 3cd0732..9b1b69c 100644 --- a/phpinspect-resolve.el +++ b/phpinspect-resolve.el @@ -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))) diff --git a/phpinspect-resolvecontext.el b/phpinspect-resolvecontext.el index 9428960..f3c5713 100644 --- a/phpinspect-resolvecontext.el +++ b/phpinspect-resolvecontext.el @@ -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 diff --git a/test/test-resolve.el b/test/test-resolve.el index 4db7892..7e985ec 100644 --- a/test/test-resolve.el +++ b/test/test-resolve.el @@ -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))))))