diff --git a/phpinspect.el b/phpinspect.el index f81d668..d758ea6 100644 --- a/phpinspect.el +++ b/phpinspect.el @@ -699,10 +699,9 @@ EXPRESSION." (funcall type-resolver (phpinspect--make-type :name (cadadr expression)))) ((and (> (length expression) 1) - (or (seq-find #'phpinspect-attrib-p expression) - (and (= 2 (length expression)) - (phpinspect-variable-p (car expression)) - (phpinspect-array-p (car (last expression)))))) + (seq-find (lambda (part) (or (phpinspect-attrib-p part) + (phpinspect-array-p part))) + expression)) (phpinspect--log "Variable was assigned with a derived statement") (phpinspect-get-derived-statement-type-in-block resolvecontext expression php-block diff --git a/test/phpinspect-test.el b/test/phpinspect-test.el index d8a120f..754f6a8 100644 --- a/test/phpinspect-test.el +++ b/test/phpinspect-test.el @@ -105,7 +105,7 @@ result))))) (ert-deftest phpinspect-get-variable-type-in-block-array-access () - (let* ((tokens (phpinspect-parse-string "class Foo { function a(\\Thing $baz) { $foo = []; $foo[] = $baz; $bar = $foo[0]; $bork = [$foo[0]]; $bark = $bork[0];")) + (let* ((tokens (phpinspect-parse-string "class Foo { function a(\\Thing $baz) { $foo = []; $foo[] = $baz; $bar = $foo[0]; $bork = [$foo[0]]; $bark = $bork[0]; $borknest = [$bork]; $barknest = $borknest[0][0]")) (context (phpinspect--get-resolvecontext tokens)) (project-root "could never be a real project root") (phpinspect-project-root-function @@ -159,6 +159,32 @@ (should (phpinspect--type= (phpinspect--make-type :name "\\Thing") result))))) + +(ert-deftest phpinspect-get-variable-type-in-block-nested-array () + (let* ((tokens (phpinspect-parse-string "class Foo { function a(\\Thing $baz) { $foo = [[$baz]]; foreach ($foo[0] as $bar) {$bar->")) + (context (phpinspect--get-resolvecontext tokens)) + (project-root "could never be a real project root") + (phpinspect-project-root-function + (lambda (&rest _ignored) project-root)) + (project (phpinspect--make-project + :fs (phpinspect-make-virtual-fs) + :root project-root + :worker (phpinspect-make-worker)))) + + (puthash project-root project (phpinspect--cache-projects phpinspect-cache)) + + (let* ((function-token (seq-find #'phpinspect-function-p + (phpinspect--resolvecontext-enclosing-tokens context))) + (result (phpinspect-get-variable-type-in-block + context "bar" + (phpinspect-function-block function-token) + (phpinspect--make-type-resolver-for-resolvecontext context) + (phpinspect-function-argument-list function-token)))) + + (should (phpinspect--type= (phpinspect--make-type :name "\\Thing") + result))))) + + (ert-deftest phpinspect--find-assignments-in-token () (let* ((tokens (cadr (phpinspect-parse-string "{ $foo = ['nr 1']; $bar = $nr2; if (true === ($foo = $nr3)) { $foo = $nr4; $notfoo = $nr5; if ([] === ($foo = [ $nr6 ])){ $foo = [ $nr7 ];}}}")))