Skip to content

Commit 54d5575

Browse files
committed
Support for non-falsy-string, list and non-empty-list type hints
1 parent abd58da commit 54d5575

10 files changed

+49
-6
lines changed

SlevomatCodingStandard/Helpers/AnnotationHelper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ public static function isAnnotationUseless(
497497

498498
if (in_array(
499499
strtolower($annotationTypeNode->name),
500-
['class-string', 'trait-string', 'callable-string', 'numeric-string', 'non-empty-string', 'literal-string', 'positive-int', 'negative-int'],
500+
['class-string', 'trait-string', 'callable-string', 'numeric-string', 'non-empty-string', 'non-falsy-string', 'literal-string', 'positive-int', 'negative-int'],
501501
true
502502
)) {
503503
return false;

SlevomatCodingStandard/Helpers/AnnotationTypeHelper.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ public static function getTypeHintFromOneType(
733733
if ($typeNode instanceof GenericTypeNode) {
734734
$genericName = $typeNode->type->name;
735735

736-
if (strtolower($genericName) === 'non-empty-array') {
736+
if (in_array(strtolower($genericName), ['non-empty-array', 'list', 'non-empty-list'], true)) {
737737
return 'array';
738738
}
739739

@@ -755,7 +755,7 @@ public static function getTypeHintFromOneType(
755755

756756
if (in_array(
757757
strtolower($typeNode->name),
758-
['class-string', 'trait-string', 'callable-string', 'numeric-string', 'non-empty-string', 'literal-string'],
758+
['class-string', 'trait-string', 'callable-string', 'numeric-string', 'non-empty-string', 'non-falsy-string', 'literal-string'],
759759
true
760760
)) {
761761
return 'string';

SlevomatCodingStandard/Helpers/TypeHintHelper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ public static function isSimpleUnofficialTypeHints(string $typeHint): bool
185185
'callable-string',
186186
'numeric-string',
187187
'non-empty-string',
188+
'non-falsy-string',
188189
'literal-string',
189190
'array-key',
190191
'list',

SlevomatCodingStandard/Sniffs/PHP/RequireExplicitAssertionSniff.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,12 +442,14 @@ private function createConditions(string $variableName, TypeNode $typeNode): arr
442442

443443
if (
444444
$this->enableAdvancedStringTypes
445-
&& in_array($typeNode->name, ['non-empty-string', 'callable-string', 'numeric-string'], true)
445+
&& in_array($typeNode->name, ['non-empty-string', 'non-falsy-string', 'callable-string', 'numeric-string'], true)
446446
) {
447447
$conditions = [sprintf('\is_string(%s)', $variableName)];
448448

449449
if ($typeNode->name === 'non-empty-string') {
450450
$conditions[] = sprintf("%s !== ''", $variableName);
451+
} elseif ($typeNode->name === 'non-falsy-string') {
452+
$conditions[] = sprintf('(bool) %s === true', $variableName);
451453
} elseif ($typeNode->name === 'callable-string') {
452454
$conditions[] = sprintf('\is_callable(%s)', $variableName);
453455
} else {

tests/Sniffs/PHP/RequireExplicitAssertionSniffTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,13 @@ public function testAdvancedStringTypesErrors(): void
9999
'enableAdvancedStringTypes' => true,
100100
]);
101101

102-
self::assertSame(4, $report->getErrorCount());
102+
self::assertSame(5, $report->getErrorCount());
103103

104104
self::assertSniffError($report, 3, RequireExplicitAssertionSniff::CODE_REQUIRED_EXPLICIT_ASSERTION);
105105
self::assertSniffError($report, 6, RequireExplicitAssertionSniff::CODE_REQUIRED_EXPLICIT_ASSERTION);
106106
self::assertSniffError($report, 9, RequireExplicitAssertionSniff::CODE_REQUIRED_EXPLICIT_ASSERTION);
107107
self::assertSniffError($report, 12, RequireExplicitAssertionSniff::CODE_REQUIRED_EXPLICIT_ASSERTION);
108+
self::assertSniffError($report, 15, RequireExplicitAssertionSniff::CODE_REQUIRED_EXPLICIT_ASSERTION);
108109

109110
self::assertAllFixedInFile($report);
110111
}

tests/Sniffs/PHP/data/requireExplicitAssertionAdvancedStringTypesErrors.fixed.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
$a = 'string';
44
\assert(\is_string($a) && $a !== '');
55

6+
$a = 'string';
7+
\assert(\is_string($a) && (bool) $a === true);
8+
69
$b = 'MyClass::myCallbackMethod';
710
\assert(\is_string($b) && \is_callable($b));
811

tests/Sniffs/PHP/data/requireExplicitAssertionAdvancedStringTypesErrors.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
/** @var non-empty-string $a */
44
$a = 'string';
55

6+
/** @var non-falsy-string $a */
7+
$a = 'string';
8+
69
/** @var callable-string $b */
710
$b = 'MyClass::myCallbackMethod';
811

tests/Sniffs/TypeHints/ReturnTypeHintSniffTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public function testErrors(): void
3333
'traversableTypeHints' => ['Traversable', '\ArrayIterator'],
3434
]);
3535

36-
self::assertSame(57, $report->getErrorCount());
36+
self::assertSame(60, $report->getErrorCount());
3737

3838
self::assertSniffError($report, 6, ReturnTypeHintSniff::CODE_MISSING_ANY_TYPE_HINT);
3939
self::assertSniffError($report, 14, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT);
@@ -98,6 +98,9 @@ public function testErrors(): void
9898
self::assertSniffError($report, 343, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT);
9999
self::assertSniffError($report, 348, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT);
100100
self::assertSniffError($report, 353, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT);
101+
self::assertSniffError($report, 358, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT);
102+
self::assertSniffError($report, 363, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT);
103+
self::assertSniffError($report, 368, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT);
101104

102105
self::assertAllFixedInFile($report);
103106
}

tests/Sniffs/TypeHints/data/returnTypeHintErrors.fixed.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,11 +332,26 @@ public function returnsNonEmptyArray(): array
332332
{
333333
}
334334

335+
/** @return list<int> */
336+
public function returnsList(): array
337+
{
338+
}
339+
340+
/** @return non-empty-list<int> */
341+
public function returnsNonEmptyList(): array
342+
{
343+
}
344+
335345
/** @return non-empty-string */
336346
public function returnsNonEmptyString(): string
337347
{
338348
}
339349

350+
/** @return non-falsy-string */
351+
public function returnsNonFalseString(): string
352+
{
353+
}
354+
340355
/** @return literal-string */
341356
public function returnsLiteralString(): string
342357
{

tests/Sniffs/TypeHints/data/returnTypeHintErrors.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,11 +344,26 @@ public function returnsNonEmptyArray()
344344
{
345345
}
346346

347+
/** @return list<int> */
348+
public function returnsList()
349+
{
350+
}
351+
352+
/** @return non-empty-list<int> */
353+
public function returnsNonEmptyList()
354+
{
355+
}
356+
347357
/** @return non-empty-string */
348358
public function returnsNonEmptyString()
349359
{
350360
}
351361

362+
/** @return non-falsy-string */
363+
public function returnsNonFalseString()
364+
{
365+
}
366+
352367
/** @return literal-string */
353368
public function returnsLiteralString()
354369
{

0 commit comments

Comments
 (0)