Skip to content

Commit

Permalink
Introduce oversized-array type to enfore max number of HasOffsetValue…
Browse files Browse the repository at this point in the history
…Type accessory types
  • Loading branch information
Richard van Velzen authored and ondrejmirtes committed Sep 22, 2022
1 parent ec28678 commit 81de3eb
Show file tree
Hide file tree
Showing 30 changed files with 385 additions and 28 deletions.
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryLiteralStringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function toNumber(): Type
{
return new ErrorType();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryNonEmptyStringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function toNumber(): Type
{
return new ErrorType();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryNonFalsyStringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function toNumber(): Type
{
return new ErrorType();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryNumericStringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function toNumber(): Type
{
return new UnionType([
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/HasOffsetType.php
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createMaybe();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isString(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/HasOffsetValueType.php
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createMaybe();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isString(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/NonEmptyArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createYes();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isString(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
208 changes: 208 additions & 0 deletions src/Type/Accessory/OversizedArrayType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
<?php declare(strict_types = 1);

namespace PHPStan\Type\Accessory;

use PHPStan\TrinaryLogic;
use PHPStan\Type\CompoundType;
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\ErrorType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Traits\MaybeCallableTypeTrait;
use PHPStan\Type\Traits\NonGeneralizableTypeTrait;
use PHPStan\Type\Traits\NonGenericTypeTrait;
use PHPStan\Type\Traits\NonObjectTypeTrait;
use PHPStan\Type\Traits\NonRemoveableTypeTrait;
use PHPStan\Type\Traits\TruthyBooleanTypeTrait;
use PHPStan\Type\Traits\UndecidedComparisonCompoundTypeTrait;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
use PHPStan\Type\VerbosityLevel;

class OversizedArrayType implements CompoundType, AccessoryType
{

use MaybeCallableTypeTrait;
use NonObjectTypeTrait;
use TruthyBooleanTypeTrait;
use NonGenericTypeTrait;
use UndecidedComparisonCompoundTypeTrait;
use NonRemoveableTypeTrait;
use NonGeneralizableTypeTrait;

public function __construct()
{
}

public function getReferencedClasses(): array
{
return [];
}

public function accepts(Type $type, bool $strictTypes): TrinaryLogic
{
if ($type instanceof CompoundType) {
return $type->isAcceptedBy($this, $strictTypes);
}

return $type->isArray()
->and($type->isIterableAtLeastOnce());
}

public function isSuperTypeOf(Type $type): TrinaryLogic
{
if ($this->equals($type)) {
return TrinaryLogic::createYes();
}

if ($type instanceof CompoundType) {
return $type->isSubTypeOf($this);
}

return $type->isArray()
->and($type->isOversizedArray());
}

public function isSubTypeOf(Type $otherType): TrinaryLogic
{
if ($otherType instanceof UnionType || $otherType instanceof IntersectionType) {
return $otherType->isSuperTypeOf($this);
}

return $otherType->isArray()
->and($otherType->isOversizedArray())
->and($otherType instanceof self ? TrinaryLogic::createYes() : TrinaryLogic::createMaybe());
}

public function isAcceptedBy(Type $acceptingType, bool $strictTypes): TrinaryLogic
{
return $this->isSubTypeOf($acceptingType);
}

public function equals(Type $type): bool
{
return $type instanceof self;
}

public function describe(VerbosityLevel $level): string
{
return 'oversized-array';
}

public function isOffsetAccessible(): TrinaryLogic
{
return TrinaryLogic::createYes();
}

public function hasOffsetValueType(Type $offsetType): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function getOffsetValueType(Type $offsetType): Type
{
return new MixedType();
}

public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $unionValues = true): Type
{
return $this;
}

public function unsetOffset(Type $offsetType): Type
{
return new ErrorType();
}

public function isIterable(): TrinaryLogic
{
return TrinaryLogic::createYes();
}

public function isIterableAtLeastOnce(): TrinaryLogic
{
return TrinaryLogic::createYes();
}

public function getIterableKeyType(): Type
{
return new MixedType();
}

public function getIterableValueType(): Type
{
return new MixedType();
}

public function isArray(): TrinaryLogic
{
return TrinaryLogic::createYes();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createYes();
}

public function isString(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isNumericString(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isNonEmptyString(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isNonFalsyString(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isLiteralString(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function toNumber(): Type
{
return new ErrorType();
}

public function toInteger(): Type
{
return new ConstantIntegerType(1);
}

public function toFloat(): Type
{
return new ConstantFloatType(1.0);
}

public function toString(): Type
{
return new ErrorType();
}

public function toArray(): Type
{
return new MixedType();
}

public function traverse(callable $cb): Type
{
return $this;
}

public static function __set_state(array $properties): Type
{
return new self();
}

}
5 changes: 5 additions & 0 deletions src/Type/ArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createYes();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isString(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/CallableType.php
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createMaybe();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isString(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/ClosureType.php
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isString(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/FloatType.php
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ public function isArray(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isOversizedArray(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isString(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
Loading

0 comments on commit 81de3eb

Please sign in to comment.