Alter interpret-expression-type to interpret array-member assignment
continuous-integration/drone/push Build was killed Details

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.
WIP-incremental-parsing
Hugo Thunnissen 1 year ago
parent 0c0c1ca381
commit f030a685d2

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

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

Loading…
Cancel
Save