From 5c61d4b2935bb59f4c7ef0892a98b4ce1fdb50d1 Mon Sep 17 00:00:00 2001 From: Hugo Thunnissen Date: Sun, 18 Aug 2024 22:21:46 +0200 Subject: [PATCH] Implement resolving types from typecasted statements --- phpinspect-resolve.el | 12 ++++++++++-- test/test-resolve.el | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/phpinspect-resolve.el b/phpinspect-resolve.el index 785a8bb..a2263b6 100644 --- a/phpinspect-resolve.el +++ b/phpinspect-resolve.el @@ -503,6 +503,14 @@ value/type." (string= (cadar expression) "new")) (funcall type-resolver (phpinspect--make-type :name (cadadr expression)))) + + ((and (phpinspect-list-p (car expression)) + (= 1 (length (cdar expression))) + (phpinspect-word-p (cadar expression))) + ;; expression starts with "(word)", so it is a type cast. Return the + ;; type of the cast. + (funcall type-resolver (phpinspect--make-type :name (car (cdadar expression))))) + ((and (> (length expression) 1) (seq-find (lambda (part) (or (phpinspect-attrib-p part) (phpinspect-array-p part))) @@ -514,8 +522,8 @@ value/type." ((phpinspect-list-p (car expression)) (phpinspect--interpret-expression-type-in-context - resolvecontext php-block type-resolver (cdar expression) function-arg-list assignments)) - + resolvecontext php-block type-resolver (cdar expression) + function-arg-list assignments)) ;; Expression is a (chain of) assignments. The right-most subexpression ;; is the type it evaluates to. ((seq-find #'phpinspect-assignment-p expression) diff --git a/test/test-resolve.el b/test/test-resolve.el index 7acdd45..4db7892 100644 --- a/test/test-resolve.el +++ b/test/test-resolve.el @@ -143,3 +143,27 @@ (should result) (should (phpinspect--type= (phpinspect--make-type :name "\\string") result)))))) + + +(ert-deftest phpinspect-get-variable-type-in-block-typecast () + (let ((base-code "$foo = new \\DateTime();") + (paths (list "$foo = (string) $foo; $foo" + "((Foo) $foo)->bar" + "$baz = (string) $foo; $baz" + "if ($baz = (string) $banana->bar) { $baz")) + (project (phpinspect--make-dummy-project))) + + (phpinspect-project-add-index + project + (phpinspect--index-tokens + (phpinspect-parse-string "class Foo { public string $bar; }"))) + + (dolist (path paths) + (let* ((code (concat base-code 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 "\\string") + result))))))