mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-10-19 04:15:04 +00:00
Ban foreach(arrayWithStringKeys as k => v)
this is not as good as phpstan/phpstan-src#769 (e.g. array_key_first()/array_key_last() aren't covered by this, nor is array_rand()) but it does eliminate the most infuriating cases where this usually crops up.
This commit is contained in:
@@ -425,7 +425,7 @@ class Config{
|
||||
public function set($k, $v = true) : void{
|
||||
$this->config[$k] = $v;
|
||||
$this->changed = true;
|
||||
foreach($this->nestedCache as $nestedKey => $nvalue){
|
||||
foreach(Utils::stringifyKeys($this->nestedCache) as $nestedKey => $nvalue){
|
||||
if(substr($nestedKey, 0, strlen($k) + 1) === ($k . ".")){
|
||||
unset($this->nestedCache[$nestedKey]);
|
||||
}
|
||||
@@ -487,7 +487,7 @@ class Config{
|
||||
*/
|
||||
private function fillDefaults(array $default, &$data) : int{
|
||||
$changed = 0;
|
||||
foreach($default as $k => $v){
|
||||
foreach(Utils::stringifyKeys($default) as $k => $v){
|
||||
if(is_array($v)){
|
||||
if(!isset($data[$k]) or !is_array($data[$k])){
|
||||
$data[$k] = [];
|
||||
@@ -536,7 +536,7 @@ class Config{
|
||||
*/
|
||||
public static function writeProperties(array $config) : string{
|
||||
$content = "#Properties Config file\r\n#" . date("D M j H:i:s T Y") . "\r\n";
|
||||
foreach($config as $k => $v){
|
||||
foreach(Utils::stringifyKeys($config) as $k => $v){
|
||||
if(is_bool($v)){
|
||||
$v = $v ? "on" : "off";
|
||||
}
|
||||
|
@@ -163,7 +163,8 @@ final class Filesystem{
|
||||
$result = str_replace([DIRECTORY_SEPARATOR, ".php", "phar://"], ["/", "", ""], $path);
|
||||
|
||||
//remove relative paths
|
||||
foreach(self::$cleanedPaths as $cleanPath => $replacement){
|
||||
//this should probably never have integer keys, but it's safer than making PHPStan ignore it
|
||||
foreach(Utils::stringifyKeys(self::$cleanedPaths) as $cleanPath => $replacement){
|
||||
$cleanPath = rtrim(str_replace([DIRECTORY_SEPARATOR, "phar://"], ["/", ""], $cleanPath), "/");
|
||||
if(strpos($result, $cleanPath) === 0){
|
||||
$result = ltrim(str_replace($cleanPath, $replacement, $result), "/");
|
||||
|
@@ -75,7 +75,7 @@ abstract class StringToTParser{
|
||||
return strtolower(str_replace([" ", "minecraft:"], ["_", ""], trim($input)));
|
||||
}
|
||||
|
||||
/** @return string[] */
|
||||
/** @return string[]|int[] */
|
||||
public function getKnownAliases() : array{
|
||||
return array_keys($this->callbackMap);
|
||||
}
|
||||
|
@@ -571,6 +571,22 @@ final class Utils{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generator which forces array keys to string during iteration.
|
||||
* This is necessary because PHP has an anti-feature where it casts numeric string keys to integers, leading to
|
||||
* various crashes.
|
||||
*
|
||||
* @phpstan-template TKeyType of string
|
||||
* @phpstan-template TValueType
|
||||
* @phpstan-param array<TKeyType, TValueType> $array
|
||||
* @phpstan-return \Generator<TKeyType, TValueType, void, void>
|
||||
*/
|
||||
public static function stringifyKeys(array $array) : \Generator{
|
||||
foreach($array as $key => $value){ // @phpstan-ignore-line - this is where we fix the stupid bullshit with array keys :)
|
||||
yield (string) $key => $value;
|
||||
}
|
||||
}
|
||||
|
||||
public static function checkUTF8(string $string) : void{
|
||||
if(!mb_check_encoding($string, 'UTF-8')){
|
||||
throw new \InvalidArgumentException("Text must be valid UTF-8");
|
||||
|
Reference in New Issue
Block a user