Backups Created:
/home/japatmex/public_html/wp-content/edit-wolf.php
Savvy
W
olf -
MANAGER
Edit File: IntersectionType.php
<?php declare(strict_types = 1); namespace PHPStan\Type; use PHPStan\Reflection\ClassMemberAccessAnswerer; use PHPStan\Reflection\ConstantReflection; use PHPStan\Reflection\MethodReflection; use PHPStan\Reflection\PropertyReflection; use PHPStan\Reflection\TrivialParametersAcceptor; use PHPStan\TrinaryLogic; use PHPStan\Type\Accessory\AccessoryType; use PHPStan\Type\Generic\TemplateTypeMap; class IntersectionType implements CompoundType, StaticResolvableType { /** @var \PHPStan\Type\Type[] */ private $types; /** * @param Type[] $types */ public function __construct(array $types) { $this->types = UnionTypeHelper::sortTypes($types); } /** * @return Type[] */ public function getTypes(): array { return $this->types; } /** * @return string[] */ public function getReferencedClasses(): array { return UnionTypeHelper::getReferencedClasses($this->types); } public function accepts(Type $otherType, bool $strictTypes): TrinaryLogic { foreach ($this->types as $type) { if (!$type->accepts($otherType, $strictTypes)->yes()) { return TrinaryLogic::createNo(); } } return TrinaryLogic::createYes(); } public function isSuperTypeOf(Type $otherType): TrinaryLogic { $results = []; foreach ($this->getTypes() as $innerType) { $results[] = $innerType->isSuperTypeOf($otherType); } return TrinaryLogic::createYes()->and(...$results); } public function isSubTypeOf(Type $otherType): TrinaryLogic { if ($otherType instanceof self || $otherType instanceof UnionType) { return $otherType->isSuperTypeOf($this); } $results = []; foreach ($this->getTypes() as $innerType) { $results[] = $otherType->isSuperTypeOf($innerType); } return TrinaryLogic::maxMin(...$results); } public function isAcceptedBy(Type $acceptingType, bool $strictTypes): TrinaryLogic { return $this->isSubTypeOf($acceptingType); } public function equals(Type $type): bool { if (!$type instanceof self) { return false; } if (count($this->types) !== count($type->types)) { return false; } foreach ($this->types as $i => $innerType) { if (!$innerType->equals($type->types[$i])) { return false; } } return true; } public function describe(VerbosityLevel $level): string { return $level->handle( function () use ($level): string { $typeNames = []; foreach ($this->types as $type) { if ($type instanceof AccessoryType) { continue; } $typeNames[] = TypeUtils::generalizeType($type)->describe($level); } return implode('&', $typeNames); }, function () use ($level): string { $typeNames = []; foreach ($this->types as $type) { if ($type instanceof AccessoryType) { continue; } $typeNames[] = $type->describe($level); } return implode('&', $typeNames); }, function () use ($level): string { $typeNames = []; foreach ($this->types as $type) { $typeNames[] = $type->describe($level); } return implode('&', $typeNames); } ); } public function canAccessProperties(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->canAccessProperties(); }); } public function hasProperty(string $propertyName): TrinaryLogic { return $this->intersectResults(static function (Type $type) use ($propertyName): TrinaryLogic { return $type->hasProperty($propertyName); }); } public function getProperty(string $propertyName, ClassMemberAccessAnswerer $scope): PropertyReflection { foreach ($this->types as $type) { if ($type->hasProperty($propertyName)->yes()) { return $type->getProperty($propertyName, $scope); } } throw new \PHPStan\ShouldNotHappenException(); } public function canCallMethods(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->canCallMethods(); }); } public function hasMethod(string $methodName): TrinaryLogic { return $this->intersectResults(static function (Type $type) use ($methodName): TrinaryLogic { return $type->hasMethod($methodName); }); } public function getMethod(string $methodName, ClassMemberAccessAnswerer $scope): MethodReflection { foreach ($this->types as $type) { if ($type->hasMethod($methodName)->yes()) { return $type->getMethod($methodName, $scope); } } throw new \PHPStan\ShouldNotHappenException(); } public function canAccessConstants(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->canAccessConstants(); }); } public function hasConstant(string $constantName): TrinaryLogic { return $this->intersectResults(static function (Type $type) use ($constantName): TrinaryLogic { return $type->hasConstant($constantName); }); } public function getConstant(string $constantName): ConstantReflection { foreach ($this->types as $type) { if ($type->hasConstant($constantName)->yes()) { return $type->getConstant($constantName); } } throw new \PHPStan\ShouldNotHappenException(); } public function isIterable(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->isIterable(); }); } public function isIterableAtLeastOnce(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->isIterableAtLeastOnce(); }); } public function getIterableKeyType(): Type { return $this->intersectTypes(static function (Type $type): Type { return $type->getIterableKeyType(); }); } public function getIterableValueType(): Type { return $this->intersectTypes(static function (Type $type): Type { return $type->getIterableValueType(); }); } public function isArray(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->isArray(); }); } public function isOffsetAccessible(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->isOffsetAccessible(); }); } public function hasOffsetValueType(Type $offsetType): TrinaryLogic { return $this->intersectResults(static function (Type $type) use ($offsetType): TrinaryLogic { return $type->hasOffsetValueType($offsetType); }); } public function getOffsetValueType(Type $offsetType): Type { return $this->intersectTypes(static function (Type $type) use ($offsetType): Type { return $type->getOffsetValueType($offsetType); }); } public function setOffsetValueType(?Type $offsetType, Type $valueType): Type { return $this->intersectTypes(static function (Type $type) use ($offsetType, $valueType): Type { return $type->setOffsetValueType($offsetType, $valueType); }); } public function isCallable(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->isCallable(); }); } /** * @param \PHPStan\Reflection\ClassMemberAccessAnswerer $scope * @return \PHPStan\Reflection\ParametersAcceptor[] */ public function getCallableParametersAcceptors(ClassMemberAccessAnswerer $scope): array { if ($this->isCallable()->no()) { throw new \PHPStan\ShouldNotHappenException(); } return [new TrivialParametersAcceptor()]; } public function isCloneable(): TrinaryLogic { return $this->intersectResults(static function (Type $type): TrinaryLogic { return $type->isCloneable(); }); } public function toBoolean(): BooleanType { /** @var BooleanType $type */ $type = $this->intersectTypes(static function (Type $type): BooleanType { return $type->toBoolean(); }); return $type; } public function toNumber(): Type { $type = $this->intersectTypes(static function (Type $type): Type { return $type->toNumber(); }); return $type; } public function toString(): Type { $type = $this->intersectTypes(static function (Type $type): Type { return $type->toString(); }); return $type; } public function toInteger(): Type { $type = $this->intersectTypes(static function (Type $type): Type { return $type->toInteger(); }); return $type; } public function toFloat(): Type { $type = $this->intersectTypes(static function (Type $type): Type { return $type->toFloat(); }); return $type; } public function toArray(): Type { $type = $this->intersectTypes(static function (Type $type): Type { return $type->toArray(); }); return $type; } public function resolveStatic(string $className): Type { return new self(UnionTypeHelper::resolveStatic($className, $this->getTypes())); } public function changeBaseClass(string $className): StaticResolvableType { return new self(UnionTypeHelper::changeBaseClass($className, $this->getTypes())); } public function inferTemplateTypes(Type $receivedType): TemplateTypeMap { $types = TemplateTypeMap::empty(); foreach ($this->types as $type) { $receive = $type->isSuperTypeOf($receivedType)->yes() ? $receivedType : new NeverType(); $types = $types->intersect($type->inferTemplateTypes($receive)); } return $types; } public function inferTemplateTypesOn(Type $templateType): TemplateTypeMap { $types = TemplateTypeMap::empty(); foreach ($this->types as $type) { $types = $types->intersect($templateType->inferTemplateTypes($type)); } return $types; } public function traverse(callable $cb): Type { $types = []; $changed = false; foreach ($this->types as $type) { $newType = $cb($type); if ($type !== $newType) { $changed = true; } $types[] = $newType; } if ($changed) { return TypeCombinator::intersect(...$types); } return $this; } /** * @param mixed[] $properties * @return Type */ public static function __set_state(array $properties): Type { return new self($properties['types']); } /** * @param callable(Type $type): TrinaryLogic $getResult * @return TrinaryLogic */ private function intersectResults(callable $getResult): TrinaryLogic { $operands = array_map($getResult, $this->types); return TrinaryLogic::maxMin(...$operands); } /** * @param callable(Type $type): Type $getType * @return Type */ private function intersectTypes(callable $getType): Type { $operands = array_map($getType, $this->types); return TypeCombinator::intersect(...$operands); } }