diff --git a/phpinspect.el b/phpinspect.el index 7423ca5..f81d668 100644 --- a/phpinspect.el +++ b/phpinspect.el @@ -659,17 +659,8 @@ resolve types of function argument variables." resolvecontext concat-pattern php-block type-resolver function-arg-list)))) - ;; Detect array access - (if (and last-assignment-value result - (< 1 (length last-assignment-value)) - (phpinspect-array-p (car (last last-assignment-value)))) - (progn - (phpinspect--log (concat - "Detected array access in last assignment of pattern %s" - ", collection type: %s") - pattern-code result) - (phpinspect--type-contains result)) - result))) + ; return + result)) (defun phpinspect--interpret-expression-type-in-context @@ -708,7 +699,10 @@ EXPRESSION." (funcall type-resolver (phpinspect--make-type :name (cadadr expression)))) ((and (> (length expression) 1) - (seq-find #'phpinspect-attrib-p expression)) + (or (seq-find #'phpinspect-attrib-p expression) + (and (= 2 (length expression)) + (phpinspect-variable-p (car expression)) + (phpinspect-array-p (car (last 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 75f149f..d8a120f 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];")) + (let* ((tokens (phpinspect-parse-string "class Foo { function a(\\Thing $baz) { $foo = []; $foo[] = $baz; $bar = $foo[0]; $bork = [$foo[0]]; $bark = $bork[0];")) (context (phpinspect--get-resolvecontext tokens)) (project-root "could never be a real project root") (phpinspect-project-root-function @@ -118,13 +118,22 @@ (puthash project-root project (phpinspect--cache-projects phpinspect-cache)) (let* ((function-token (car (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)))) + (result1 (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))) + (result2 (phpinspect-get-variable-type-in-block + context "bark" + (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))))) + result1)) + (should (phpinspect--type= (phpinspect--make-type :name "\\Thing") + result2))))) + (ert-deftest phpinspect-get-variable-type-in-block-array-foreach () (let* ((tokens (phpinspect-parse-string "class Foo { function a(\\Thing $baz) { $foo = []; $foo[] = $baz; foreach ($foo as $bar) {$bar->"))