diff vendor/psy/psysh/src/CodeCleaner/ListPass.php @ 17:129ea1e6d783

Update, including to Drupal core 8.6.10
author Chris Cannam
date Thu, 28 Feb 2019 13:21:36 +0000
parents c2387f117808
children
line wrap: on
line diff
--- a/vendor/psy/psysh/src/CodeCleaner/ListPass.php	Tue Jul 10 15:07:59 2018 +0100
+++ b/vendor/psy/psysh/src/CodeCleaner/ListPass.php	Thu Feb 28 13:21:36 2019 +0000
@@ -12,10 +12,15 @@
 namespace Psy\CodeCleaner;
 
 use PhpParser\Node;
+use PhpParser\Node\Expr;
 use PhpParser\Node\Expr\Array_;
+use PhpParser\Node\Expr\ArrayDimFetch;
 use PhpParser\Node\Expr\ArrayItem;
 use PhpParser\Node\Expr\Assign;
+use PhpParser\Node\Expr\FuncCall;
 use PhpParser\Node\Expr\List_;
+use PhpParser\Node\Expr\MethodCall;
+use PhpParser\Node\Expr\PropertyFetch;
 use PhpParser\Node\Expr\Variable;
 use Psy\Exception\ParseErrorException;
 
@@ -28,7 +33,7 @@
 
     public function __construct()
     {
-        $this->atLeastPhp71 = version_compare(PHP_VERSION, '7.1', '>=');
+        $this->atLeastPhp71 = \version_compare(PHP_VERSION, '7.1', '>=');
     }
 
     /**
@@ -74,9 +79,7 @@
                 throw new ParseErrorException($msg, $item->key->getLine());
             }
 
-            $value = ($item instanceof ArrayItem) ? $item->value : $item;
-
-            if (!$value instanceof Variable) {
+            if (!self::isValidArrayItem($item)) {
                 $msg = 'Assignments can only happen to writable values';
                 throw new ParseErrorException($msg, $item->getLine());
             }
@@ -86,4 +89,24 @@
             throw new ParseErrorException('Cannot use empty list');
         }
     }
+
+    /**
+     * Validate whether a given item in an array is valid for short assignment.
+     *
+     * @param Expr $item
+     *
+     * @return bool
+     */
+    private static function isValidArrayItem(Expr $item)
+    {
+        $value = ($item instanceof ArrayItem) ? $item->value : $item;
+
+        while ($value instanceof ArrayDimFetch || $value instanceof PropertyFetch) {
+            $value = $value->var;
+        }
+
+        // We just kind of give up if it's a method call. We can't tell if it's
+        // valid via static analysis.
+        return $value instanceof Variable || $value instanceof MethodCall || $value instanceof FuncCall;
+    }
 }