mirror of
https://github.com/danog/psalm.git
synced 2024-11-27 12:55:26 +01:00
Add InvalidScalarArgument issue to warn about bad casts
This commit is contained in:
parent
24300cc8f6
commit
f2a53fa463
7
src/CodeInspector/Issue/InvalidScalarArgument.php
Normal file
7
src/CodeInspector/Issue/InvalidScalarArgument.php
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace CodeInspector\Issue;
|
||||||
|
|
||||||
|
class InvalidScalarArgument extends CodeError
|
||||||
|
{
|
||||||
|
}
|
@ -16,6 +16,7 @@ use CodeInspector\Issue\PossiblyUndefinedVariable;
|
|||||||
use CodeInspector\Issue\InvalidArrayAssignment;
|
use CodeInspector\Issue\InvalidArrayAssignment;
|
||||||
use CodeInspector\Issue\InvalidArrayAccess;
|
use CodeInspector\Issue\InvalidArrayAccess;
|
||||||
use CodeInspector\Issue\InvalidPropertyAssignment;
|
use CodeInspector\Issue\InvalidPropertyAssignment;
|
||||||
|
use CodeInspector\Issue\InvalidScalarArgument;
|
||||||
use CodeInspector\Issue\InvalidScope;
|
use CodeInspector\Issue\InvalidScope;
|
||||||
use CodeInspector\Issue\InvalidStaticInvocation;
|
use CodeInspector\Issue\InvalidStaticInvocation;
|
||||||
use CodeInspector\Issue\InvalidStaticVariable;
|
use CodeInspector\Issue\InvalidStaticVariable;
|
||||||
@ -2646,6 +2647,7 @@ class StatementsChecker
|
|||||||
}
|
}
|
||||||
|
|
||||||
$type_match_found = false;
|
$type_match_found = false;
|
||||||
|
$scalar_type_match_found = false;
|
||||||
|
|
||||||
foreach ($param_type->types as $param_type_part) {
|
foreach ($param_type->types as $param_type_part) {
|
||||||
if ($param_type_part->isNull()) {
|
if ($param_type_part->isNull()) {
|
||||||
@ -2664,15 +2666,35 @@ class StatementsChecker
|
|||||||
$type_match_found = true;
|
$type_match_found = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($input_type_part->value === 'int' && $param_type_part->value === 'float') {
|
||||||
|
$type_match_found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($input_type_part->isScalar() && $param_type_part->isScalar()) {
|
||||||
|
$scalar_type_match_found = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_subclass_of($param_type_part->value, $input_type_part->value)) {
|
if (is_subclass_of($param_type_part->value, $input_type_part->value)) {
|
||||||
// @todo handle coercion
|
// @todo handle coercion
|
||||||
$type_match_found = true;
|
$type_match_found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$type_match_found) {
|
if (!$type_match_found) {
|
||||||
|
if ($scalar_type_match_found) {
|
||||||
if (IssueBuffer::accepts(
|
if (IssueBuffer::accepts(
|
||||||
|
new InvalidScalarArgument(
|
||||||
|
'Argument ' . ($argument_offset + 1) . ' of ' . $method_id . ' expects ' . $param_type . ', ' . $input_type . ' provided',
|
||||||
|
$file_name,
|
||||||
|
$line_number
|
||||||
|
)
|
||||||
|
)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (IssueBuffer::accepts(
|
||||||
new InvalidArgument(
|
new InvalidArgument(
|
||||||
'Argument ' . ($argument_offset + 1) . ' of ' . $method_id . ' expects ' . $param_type . ', ' . $input_type . ' provided',
|
'Argument ' . ($argument_offset + 1) . ' of ' . $method_id . ' expects ' . $param_type . ', ' . $input_type . ' provided',
|
||||||
$file_name,
|
$file_name,
|
||||||
|
@ -339,6 +339,21 @@ abstract class Type
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function hasGeneric()
|
||||||
|
{
|
||||||
|
if ($this instanceof Union) {
|
||||||
|
foreach ($this->types as $type) {
|
||||||
|
if ($type instanceof Generic) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this instanceof Generic;
|
||||||
|
}
|
||||||
|
|
||||||
public function isScalar()
|
public function isScalar()
|
||||||
{
|
{
|
||||||
if ($this instanceof Atomic) {
|
if ($this instanceof Atomic) {
|
||||||
@ -349,6 +364,8 @@ abstract class Type
|
|||||||
$this->value === 'bool' ||
|
$this->value === 'bool' ||
|
||||||
$this->value === 'false';
|
$this->value === 'false';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user