Position: add getLevelNonNull()

this allows assuming that a position has a valid world in places where it's never expected to not be valid. Since this is the vast majority of usages, it eliminates a lot of possible null-pointer warnings given by static analysers.
TODO: Consider whether we can make Position->getLevel/World use this behaviour out of the box in the next major version.
This commit is contained in:
Dylan K. Taylor
2020-04-14 11:08:37 +01:00
parent 6e08b622b3
commit a2543ff80d
76 changed files with 229 additions and 183 deletions

View File

@ -74,7 +74,7 @@ class Explosion{
throw new \InvalidArgumentException("Position does not have a valid world");
}
$this->source = $center;
$this->level = $center->getLevel();
$this->level = $center->getLevelNonNull();
if($size <= 0){
throw new \InvalidArgumentException("Explosion radius must be greater than 0, got $size");

View File

@ -75,7 +75,7 @@ class Location extends Position{
}
public function __toString(){
return "Location (level=" . ($this->isValid() ? $this->getLevel()->getName() : "null") . ", x=$this->x, y=$this->y, z=$this->z, yaw=$this->yaw, pitch=$this->pitch)";
return "Location (level=" . ($this->isValid() ? $this->getLevelNonNull()->getName() : "null") . ", x=$this->x, y=$this->y, z=$this->z, yaw=$this->yaw, pitch=$this->pitch)";
}
public function equals(Vector3 $v) : bool{

View File

@ -25,6 +25,7 @@ namespace pocketmine\level;
use pocketmine\math\Vector3;
use pocketmine\utils\MainLogger;
use pocketmine\utils\AssumptionFailedError;
use function assert;
class Position extends Vector3{
@ -71,6 +72,19 @@ class Position extends Vector3{
return $this->level;
}
/**
* Returns the position's world if valid. Throws an error if the world is unexpectedly null.
*
* @throws AssumptionFailedError
*/
public function getLevelNonNull() : Level{
$world = $this->getLevel();
if($world === null){
throw new AssumptionFailedError("Position world is null");
}
return $world;
}
/**
* Sets the target Level of the position.
*
@ -112,7 +126,7 @@ class Position extends Vector3{
}
public function __toString(){
return "Position(level=" . ($this->isValid() ? $this->getLevel()->getName() : "null") . ",x=" . $this->x . ",y=" . $this->y . ",z=" . $this->z . ")";
return "Position(level=" . ($this->isValid() ? $this->getLevelNonNull()->getName() : "null") . ",x=" . $this->x . ",y=" . $this->y . ",z=" . $this->z . ")";
}
public function equals(Vector3 $v) : bool{