From 06d69ba5f35885f594c0e071f4fcc2e1fe86bc36 Mon Sep 17 00:00:00 2001 From: Matt Brown Date: Tue, 1 Dec 2020 17:25:45 -0500 Subject: [PATCH] Break out RedundantCast issues --- config.xsd | 2 + docs/running_psalm/issues/RedundantCast.md | 10 ++++ .../issues/RedundantCastGivenDocblockType.md | 13 +++++ .../InstancePropertyAssignmentAnalyzer.php | 2 +- .../Call/NamedFunctionCallHandler.php | 10 ++-- .../Statements/Expression/CastAnalyzer.php | 54 ++++++++----------- src/Psalm/Issue/RedundantCast.php | 8 +++ .../Issue/RedundantCastGivenDocblockType.php | 8 +++ tests/ArrayAssignmentTest.php | 6 ++- tests/PropertyTypeTest.php | 10 ++++ .../RedundantConditionTest.php | 5 +- 11 files changed, 84 insertions(+), 44 deletions(-) create mode 100644 docs/running_psalm/issues/RedundantCast.md create mode 100644 docs/running_psalm/issues/RedundantCastGivenDocblockType.md create mode 100644 src/Psalm/Issue/RedundantCast.php create mode 100644 src/Psalm/Issue/RedundantCastGivenDocblockType.php diff --git a/config.xsd b/config.xsd index 474d9af06..0f21145cc 100644 --- a/config.xsd +++ b/config.xsd @@ -369,6 +369,8 @@ + + diff --git a/docs/running_psalm/issues/RedundantCast.md b/docs/running_psalm/issues/RedundantCast.md new file mode 100644 index 000000000..81ef724b1 --- /dev/null +++ b/docs/running_psalm/issues/RedundantCast.md @@ -0,0 +1,10 @@ +# RedundantCast + +Emitted when a cast (string, int, float etc.) is redundant + +```php +collect_initializations && $lhs_var_id === '$this' ) { diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php b/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php index 95f693ced..caff33f5d 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php @@ -377,10 +377,9 @@ class NamedFunctionCallHandler ) { if ($first_arg_type->from_docblock) { if (IssueBuffer::accepts( - new \Psalm\Issue\RedundantConditionGivenDocblockType( + new \Psalm\Issue\RedundantCastGivenDocblockType( 'The call to strtolower is unnecessary given the docblock type', - new CodeLocation($statements_analyzer, $function_name), - null + new CodeLocation($statements_analyzer, $function_name) ), $statements_analyzer->getSuppressedIssues() )) { @@ -388,10 +387,9 @@ class NamedFunctionCallHandler } } else { if (IssueBuffer::accepts( - new \Psalm\Issue\RedundantCondition( + new \Psalm\Issue\RedundantCast( 'The call to strtolower is unnecessary', - new CodeLocation($statements_analyzer, $function_name), - null + new CodeLocation($statements_analyzer, $function_name) ), $statements_analyzer->getSuppressedIssues() )) { diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php index 05fecd581..82450144c 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php @@ -9,8 +9,8 @@ use Psalm\CodeLocation; use Psalm\Context; use Psalm\Issue\InvalidCast; use Psalm\Issue\PossiblyInvalidCast; -use Psalm\Issue\RedundantCondition; -use Psalm\Issue\RedundantConditionGivenDocblockType; +use Psalm\Issue\RedundantCast; +use Psalm\Issue\RedundantCastGivenDocblockType; use Psalm\Issue\UnrecognizedExpression; use Psalm\IssueBuffer; use Psalm\Type; @@ -49,16 +49,14 @@ class CastAnalyzer if ($maybe_type) { if ($maybe_type->isInt()) { if ($maybe_type->from_docblock) { - $issue = new RedundantConditionGivenDocblockType( + $issue = new RedundantCastGivenDocblockType( 'Redundant cast to ' . $maybe_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $maybe_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } else { - $issue = new RedundantCondition( + $issue = new RedundantCast( 'Redundant cast to ' . $maybe_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $maybe_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } @@ -103,16 +101,14 @@ class CastAnalyzer if ($maybe_type) { if ($maybe_type->isFloat()) { if ($maybe_type->from_docblock) { - $issue = new RedundantConditionGivenDocblockType( + $issue = new RedundantCastGivenDocblockType( 'Redundant cast to ' . $maybe_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $maybe_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } else { - $issue = new RedundantCondition( + $issue = new RedundantCast( 'Redundant cast to ' . $maybe_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $maybe_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } @@ -145,16 +141,14 @@ class CastAnalyzer if ($maybe_type) { if ($maybe_type->isBool()) { if ($maybe_type->from_docblock) { - $issue = new RedundantConditionGivenDocblockType( + $issue = new RedundantCastGivenDocblockType( 'Redundant cast to ' . $maybe_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $maybe_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } else { - $issue = new RedundantCondition( + $issue = new RedundantCast( 'Redundant cast to ' . $maybe_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $maybe_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } @@ -187,16 +181,14 @@ class CastAnalyzer if ($stmt_expr_type) { if ($stmt_expr_type->isString()) { if ($stmt_expr_type->from_docblock) { - $issue = new RedundantConditionGivenDocblockType( + $issue = new RedundantCastGivenDocblockType( 'Redundant cast to ' . $stmt_expr_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $stmt_expr_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } else { - $issue = new RedundantCondition( + $issue = new RedundantCast( 'Redundant cast to ' . $stmt_expr_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $stmt_expr_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } @@ -258,16 +250,14 @@ class CastAnalyzer if ($stmt_expr_type = $statements_analyzer->node_data->getType($stmt->expr)) { if ($stmt_expr_type->isArray()) { if ($stmt_expr_type->from_docblock) { - $issue = new RedundantConditionGivenDocblockType( + $issue = new RedundantCastGivenDocblockType( 'Redundant cast to ' . $stmt_expr_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $stmt_expr_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } else { - $issue = new RedundantCondition( + $issue = new RedundantCast( 'Redundant cast to ' . $stmt_expr_type->getKey(), - new CodeLocation($statements_analyzer->getSource(), $stmt), - $stmt_expr_type->getKey() + new CodeLocation($statements_analyzer->getSource(), $stmt) ); } diff --git a/src/Psalm/Issue/RedundantCast.php b/src/Psalm/Issue/RedundantCast.php new file mode 100644 index 000000000..f924855e1 --- /dev/null +++ b/src/Psalm/Issue/RedundantCast.php @@ -0,0 +1,8 @@ + $bar */ - function baz(array $bar) : void { foo((array) $bar); }', - 'error_message' => 'RedundantCondition', + function baz(array $bar) : void { + foo((array) $bar); + }', + 'error_message' => 'RedundantCast', ], ]; } diff --git a/tests/PropertyTypeTest.php b/tests/PropertyTypeTest.php index 78b66cf79..719ec08e9 100644 --- a/tests/PropertyTypeTest.php +++ b/tests/PropertyTypeTest.php @@ -2169,6 +2169,16 @@ class PropertyTypeTest extends TestCase } }', ], + 'memoizePropertyAfterSetting' => [ + 'b = "c"; + echo strlen($this->b); + } + }' + ], ]; } diff --git a/tests/TypeReconciliation/RedundantConditionTest.php b/tests/TypeReconciliation/RedundantConditionTest.php index 2c3d14846..e62a6d161 100644 --- a/tests/TypeReconciliation/RedundantConditionTest.php +++ b/tests/TypeReconciliation/RedundantConditionTest.php @@ -69,16 +69,15 @@ class RedundantConditionTest extends \Psalm\Tests\TestCase ' [], - 'error_levels' => [ - 'RedundantConditionGivenDocblockType', - ], ], 'noRedundantConditionAfterDocblockTypeNullCheck' => [ '