Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;

final class SkipLiteralStringNarrowing
{
/**
* @return literal-string
*/
public function getTableAlias(): string
{
return 'n';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;

final class SkipLowercaseStringNarrowing
{
/**
* @return lowercase-string
*/
public function run(): string
{
return 'x';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;

final class SkipNonEmptyStringNarrowing
{
/**
* @return non-empty-string
*/
public function getName(): string
{
return 'name';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;

final class SkipNonFalsyStringNarrowing
{
/**
* @return non-falsy-string
*/
public function run(): string
{
return 'x';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;

final class SkipNonNegativeIntNarrowing
{
/**
* @return non-negative-int
*/
public function run(): int
{
return 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;

final class SkipNonPositiveIntNarrowing
{
/**
* @return non-positive-int
*/
public function run(): int
{
return 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;

final class SkipNumericStringNarrowing
{
/**
* @return numeric-string
*/
public function run(): string
{
return '1';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;

final class SkipUppercaseStringNarrowing
{
/**
* @return uppercase-string
*/
public function run(): string
{
return 'X';
}
}
23 changes: 23 additions & 0 deletions src/StaticTypeMapper/Mapper/ScalarStringToTypeMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@

use Nette\Utils\Strings;
use PHPStan\Type\Accessory\AccessoryArrayListType;
use PHPStan\Type\Accessory\AccessoryLiteralStringType;
use PHPStan\Type\Accessory\AccessoryLowercaseStringType;
use PHPStan\Type\Accessory\AccessoryNonEmptyStringType;
use PHPStan\Type\Accessory\AccessoryNonFalsyStringType;
use PHPStan\Type\Accessory\AccessoryNumericStringType;
use PHPStan\Type\Accessory\AccessoryUppercaseStringType;
use PHPStan\Type\Accessory\NonEmptyArrayType;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BooleanType;
Expand All @@ -25,6 +30,7 @@
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use PHPStan\Type\UnionType;
use PHPStan\Type\VoidType;

final class ScalarStringToTypeMapper
Expand All @@ -35,6 +41,11 @@ final class ScalarStringToTypeMapper
private const array SCALAR_NAME_BY_TYPE = [
StringType::class => ['string'],
AccessoryNonEmptyStringType::class => ['non-empty-string'],
AccessoryLiteralStringType::class => ['literal-string'],
AccessoryNumericStringType::class => ['numeric-string'],
AccessoryNonFalsyStringType::class => ['non-falsy-string', 'truthy-string'],
AccessoryLowercaseStringType::class => ['lowercase-string'],
AccessoryUppercaseStringType::class => ['uppercase-string'],
NonEmptyArrayType::class => ['non-empty-array'],
ClassStringType::class => ['class-string'],
FloatType::class => ['float', 'real', 'double'],
Expand Down Expand Up @@ -68,6 +79,18 @@ public function mapScalarStringToType(string $scalarName): Type
return IntegerRangeType::createAllSmallerThan(0);
}

if ($loweredScalarName === 'non-negative-int') {
return IntegerRangeType::fromInterval(0, null);
}

if ($loweredScalarName === 'non-positive-int') {
return IntegerRangeType::fromInterval(null, 0);
}

if ($loweredScalarName === 'array-key') {
return new UnionType([new IntegerType(), new StringType()]);
}

foreach (self::SCALAR_NAME_BY_TYPE as $objectType => $scalarNames) {
if (! in_array($loweredScalarName, $scalarNames, true)) {
continue;
Expand Down
Loading