Implement resolving types from typecasted statements

master
Hugo Thunnissen 1 month ago
parent 8a96383407
commit 5c61d4b293

@ -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)

@ -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))))))

Loading…
Cancel
Save