branch: externals/phpinspect
commit f030a685d21cfa6481073bfdfd3f6031aa02dd21
Author: Hugo Thunnissen <[email protected]>
Commit: Hugo Thunnissen <[email protected]>
Alter interpret-expression-type to interpret array-member assignment
interpret-expression-type now interprets assignment values provided through
array access as derived statements. This makes type inference work for cases
like `[$foo[0]]`, where it did not before.
---
phpinspect.el | 18 ++++++------------
test/phpinspect-test.el | 23 ++++++++++++++++-------
2 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/phpinspect.el b/phpinspect.el
index 7423ca5bd6..f81d6683d3 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 75f149fac0..d8a120fdb3 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->"))