Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / vendor / psy / psysh / src / CodeCleaner / ListPass.php
index 0b44082cdb017c8bdbccf3c42a51435d159687de..b0d1d73e408fec1043e9145a2cafb730d977afe4 100644 (file)
 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 @@ class ListPass extends CodeCleanerPass
 
     public function __construct()
     {
-        $this->atLeastPhp71 = version_compare(PHP_VERSION, '7.1', '>=');
+        $this->atLeastPhp71 = \version_compare(PHP_VERSION, '7.1', '>=');
     }
 
     /**
@@ -60,23 +65,48 @@ class ListPass extends CodeCleanerPass
             throw new ParseErrorException('Cannot use empty list', $node->var->getLine());
         }
 
+        $itemFound = false;
         foreach ($items as $item) {
             if ($item === null) {
-                throw new ParseErrorException('Cannot use empty list', $item->getLine());
+                continue;
             }
 
+            $itemFound = true;
+
             // List_->$vars in PHP-Parser 2.x is Variable instead of ArrayItem.
             if (!$this->atLeastPhp71 && $item instanceof ArrayItem && $item->key !== null) {
                 $msg = 'Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting \',\' or \')\'';
                 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());
             }
         }
+
+        if (!$itemFound) {
+            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;
     }
 }