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
3 changes: 3 additions & 0 deletions conf/config.neon
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ parameters:
checkAlwaysTrueLooseComparison: false
checkClassCaseSensitivity: false
checkExplicitMixed: false
checkImplicitMixed: false
checkFunctionArgumentTypes: false
checkFunctionNameCase: false
checkGenericClassInNonGenericObjectType: false
Expand Down Expand Up @@ -262,6 +263,7 @@ parametersSchema:
checkAlwaysTrueLooseComparison: bool()
checkClassCaseSensitivity: bool()
checkExplicitMixed: bool()
checkImplicitMixed: bool()
checkFunctionArgumentTypes: bool()
checkFunctionNameCase: bool()
checkGenericClassInNonGenericObjectType: bool()
Expand Down Expand Up @@ -1015,6 +1017,7 @@ services:
checkThisOnly: %checkThisOnly%
checkUnionTypes: %checkUnionTypes%
checkExplicitMixed: %checkExplicitMixed%
checkImplicitMixed: %checkImplicitMixed%

-
class: PHPStan\Rules\UnusedFunctionParametersCheck
Expand Down
30 changes: 30 additions & 0 deletions src/Rules/RuleLevelHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public function __construct(
private bool $checkThisOnly,
private bool $checkUnionTypes,
private bool $checkExplicitMixed,
private bool $checkImplicitMixed,
)
{
}
Expand Down Expand Up @@ -67,6 +68,26 @@ public function accepts(Type $acceptingType, Type $acceptedType, bool $strictTyp
$acceptedType = TypeTraverser::map($acceptedType, $traverse);
}

if (
$this->checkImplicitMixed
) {
$traverse = static function (Type $type, callable $traverse): Type {
if ($type instanceof TemplateMixedType) {
return $type->toStrictMixedType();
}
if (
$type instanceof MixedType
&& !$type->isExplicitMixed()
) {
return new StrictMixedType();
}

return $traverse($type);
};
$acceptingType = TypeTraverser::map($acceptingType, $traverse);
$acceptedType = TypeTraverser::map($acceptedType, $traverse);
}

if (
!$this->checkNullables
&& !$acceptingType instanceof NullType
Expand Down Expand Up @@ -136,6 +157,15 @@ public function findTypeToCheck(
return new FoundTypeResult(new StrictMixedType(), [], [], null);
}

if (
$this->checkImplicitMixed
&& $type instanceof MixedType
&& !$type instanceof TemplateMixedType
&& !$type->isExplicitMixed()
) {
return new FoundTypeResult(new StrictMixedType(), [], [], null);
}

if ($type instanceof MixedType || $type instanceof NeverType) {
return new FoundTypeResult(new ErrorType(), [], [], null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ protected function getRule(): Rule
{
return new AppendedArrayItemTypeRule(
new PropertyReflectionFinder(),
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false),
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false),
);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Arrays/ArrayDestructuringRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class ArrayDestructuringRuleTest extends RuleTestCase

protected function getRule(): Rule
{
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false);
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false);

return new ArrayDestructuringRule(
$ruleLevelHelper,
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Arrays/ArrayUnpackingRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ protected function getRule(): Rule
{
return new ArrayUnpackingRule(
self::getContainer()->getByType(PhpVersion::class),
new RuleLevelHelper($this->createReflectionProvider(), true, false, $this->checkUnions, false),
new RuleLevelHelper($this->createReflectionProvider(), true, false, $this->checkUnions, false, false),
);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Arrays/IterableInForeachRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class IterableInForeachRuleTest extends RuleTestCase

protected function getRule(): Rule
{
return new IterableInForeachRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed));
return new IterableInForeachRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed, false));
}

public function testCheckWithMaybes(): void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class NonexistentOffsetInArrayDimFetchRuleTest extends RuleTestCase

protected function getRule(): Rule
{
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed);
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed, false);

return new NonexistentOffsetInArrayDimFetchRule(
$ruleLevelHelper,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class OffsetAccessAssignOpRuleTest extends RuleTestCase

protected function getRule(): Rule
{
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, $this->checkUnions, false);
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, $this->checkUnions, false, false);
return new OffsetAccessAssignOpRule($ruleLevelHelper);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class OffsetAccessAssignmentRuleTest extends RuleTestCase

protected function getRule(): Rule
{
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, $this->checkUnionTypes, false);
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, $this->checkUnionTypes, false, false);
return new OffsetAccessAssignmentRule($ruleLevelHelper);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class OffsetAccessValueAssignmentRuleTest extends RuleTestCase

protected function getRule(): Rule
{
return new OffsetAccessValueAssignmentRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false));
return new OffsetAccessValueAssignmentRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false));
}

public function testRule(): void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class UnpackIterableInArrayRuleTest extends RuleTestCase

protected function getRule(): Rule
{
return new UnpackIterableInArrayRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false));
return new UnpackIterableInArrayRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false));
}

public function testRule(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Cast/EchoRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class EchoRuleTest extends RuleTestCase
protected function getRule(): Rule
{
return new EchoRule(
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false),
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false),
);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Cast/InvalidCastRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class InvalidCastRuleTest extends RuleTestCase
protected function getRule(): Rule
{
$broker = $this->createReflectionProvider();
return new InvalidCastRule($broker, new RuleLevelHelper($broker, true, false, true, false));
return new InvalidCastRule($broker, new RuleLevelHelper($broker, true, false, true, false, false));
}

public function testRule(): void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ protected function getRule(): Rule
{
return new InvalidPartOfEncapsedStringRule(
new ExprPrinter(new Printer()),
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false),
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false),
);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Cast/PrintRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class PrintRuleTest extends RuleTestCase
protected function getRule(): Rule
{
return new PrintRule(
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false),
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false),
);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Classes/ClassAttributesRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ protected function getRule(): Rule
new AttributesCheck(
$reflectionProvider,
new FunctionCallParametersCheck(
new RuleLevelHelper($reflectionProvider, true, false, true, false),
new RuleLevelHelper($reflectionProvider, true, false, true, false, false),
new NullsafeCheck(),
new PhpVersion(80000),
new UnresolvableTypeHelper(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected function getRule(): Rule
new AttributesCheck(
$reflectionProvider,
new FunctionCallParametersCheck(
new RuleLevelHelper($reflectionProvider, true, false, true, false),
new RuleLevelHelper($reflectionProvider, true, false, true, false, false),
new NullsafeCheck(),
new PhpVersion(80000),
new UnresolvableTypeHelper(),
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Classes/ClassConstantRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class ClassConstantRuleTest extends RuleTestCase
protected function getRule(): Rule
{
$broker = $this->createReflectionProvider();
return new ClassConstantRule($broker, new RuleLevelHelper($broker, true, false, true, false), new ClassCaseSensitivityCheck($broker, true), new PhpVersion($this->phpVersion));
return new ClassConstantRule($broker, new RuleLevelHelper($broker, true, false, true, false, false), new ClassCaseSensitivityCheck($broker, true), new PhpVersion($this->phpVersion));
}

public function testClassConstant(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Classes/InstantiationRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ protected function getRule(): Rule
$broker = $this->createReflectionProvider();
return new InstantiationRule(
$broker,
new FunctionCallParametersCheck(new RuleLevelHelper($broker, true, false, true, false), new NullsafeCheck(), new PhpVersion(80000), new UnresolvableTypeHelper(), new PropertyReflectionFinder(), true, true, true, true, true),
new FunctionCallParametersCheck(new RuleLevelHelper($broker, true, false, true, false, false), new NullsafeCheck(), new PhpVersion(80000), new UnresolvableTypeHelper(), new PropertyReflectionFinder(), true, true, true, true, true),
new ClassCaseSensitivityCheck($broker, true),
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected function getRule(): Rule
new AttributesCheck(
$reflectionProvider,
new FunctionCallParametersCheck(
new RuleLevelHelper($reflectionProvider, true, false, true, false),
new RuleLevelHelper($reflectionProvider, true, false, true, false, false),
new NullsafeCheck(),
new PhpVersion(80100),
new UnresolvableTypeHelper(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected function getRule(): Rule
new AttributesCheck(
$reflectionProvider,
new FunctionCallParametersCheck(
new RuleLevelHelper($reflectionProvider, true, false, true, false),
new RuleLevelHelper($reflectionProvider, true, false, true, false, false),
new NullsafeCheck(),
new PhpVersion(80000),
new UnresolvableTypeHelper(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ protected function getRule(): Rule
false,
true,
false,
false,
)));
}

Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Functions/CallCallablesRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class CallCallablesRuleTest extends RuleTestCase

protected function getRule(): Rule
{
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed);
$ruleLevelHelper = new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed, false);
return new CallCallablesRule(
new FunctionCallParametersCheck(
$ruleLevelHelper,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected function getRule(): Rule
$broker = $this->createReflectionProvider();
return new CallToFunctionParametersRule(
$broker,
new FunctionCallParametersCheck(new RuleLevelHelper($broker, true, false, true, $this->checkExplicitMixed), new NullsafeCheck(), new PhpVersion(80000), new UnresolvableTypeHelper(), new PropertyReflectionFinder(), true, true, true, true, true),
new FunctionCallParametersCheck(new RuleLevelHelper($broker, true, false, true, $this->checkExplicitMixed, false), new NullsafeCheck(), new PhpVersion(80000), new UnresolvableTypeHelper(), new PropertyReflectionFinder(), true, true, true, true, true),
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected function getRule(): Rule
new AttributesCheck(
$reflectionProvider,
new FunctionCallParametersCheck(
new RuleLevelHelper($reflectionProvider, true, false, true, false),
new RuleLevelHelper($reflectionProvider, true, false, true, false, false),
new NullsafeCheck(),
new PhpVersion(80000),
new UnresolvableTypeHelper(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class ClosureReturnTypeRuleTest extends RuleTestCase

protected function getRule(): Rule
{
return new ClosureReturnTypeRule(new FunctionReturnTypeCheck(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false)));
return new ClosureReturnTypeRule(new FunctionReturnTypeCheck(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false)));
}

public function testClosureReturnTypeRule(): void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected function getRule(): Rule
new AttributesCheck(
$reflectionProvider,
new FunctionCallParametersCheck(
new RuleLevelHelper($reflectionProvider, true, false, true, false),
new RuleLevelHelper($reflectionProvider, true, false, true, false, false),
new NullsafeCheck(),
new PhpVersion(80000),
new UnresolvableTypeHelper(),
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Functions/FunctionCallableRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ protected function getRule(): Rule

return new FunctionCallableRule(
$reflectionProvider,
new RuleLevelHelper($reflectionProvider, true, false, true, false),
new RuleLevelHelper($reflectionProvider, true, false, true, false, false),
new PhpVersion(PHP_VERSION_ID),
true,
true,
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Functions/ImplodeFunctionRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class ImplodeFunctionRuleTest extends RuleTestCase
protected function getRule(): Rule
{
$broker = $this->createReflectionProvider();
return new ImplodeFunctionRule($broker, new RuleLevelHelper($broker, true, false, true, false));
return new ImplodeFunctionRule($broker, new RuleLevelHelper($broker, true, false, true, false, false));
}

public function testFile(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Functions/ParamAttributesRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected function getRule(): Rule
new AttributesCheck(
$reflectionProvider,
new FunctionCallParametersCheck(
new RuleLevelHelper($reflectionProvider, true, false, true, false),
new RuleLevelHelper($reflectionProvider, true, false, true, false, false),
new NullsafeCheck(),
new PhpVersion(80000),
new UnresolvableTypeHelper(),
Expand Down
4 changes: 2 additions & 2 deletions tests/PHPStan/Rules/Functions/ReturnTypeRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@
class ReturnTypeRuleTest extends RuleTestCase
{

private bool $checkExplicitMixed;
private bool $checkExplicitMixed = false;

protected function getRule(): Rule
{
return new ReturnTypeRule(new FunctionReturnTypeCheck(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed)));
return new ReturnTypeRule(new FunctionReturnTypeCheck(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed, false)));
}

public function testReturnTypeRule(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Generators/YieldFromTypeRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class YieldFromTypeRuleTest extends RuleTestCase

protected function getRule(): Rule
{
return new YieldFromTypeRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false), true);
return new YieldFromTypeRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false), true);
}

public function testRule(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Generators/YieldTypeRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class YieldTypeRuleTest extends RuleTestCase

protected function getRule(): Rule
{
return new YieldTypeRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false));
return new YieldTypeRule(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false, false));
}

public function testRule(): void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class CallMethodsRuleNoBleedingEdgeTest extends RuleTestCase
protected function getRule(): Rule
{
$reflectionProvider = $this->createReflectionProvider();
$ruleLevelHelper = new RuleLevelHelper($reflectionProvider, true, false, true, $this->checkExplicitMixed);
$ruleLevelHelper = new RuleLevelHelper($reflectionProvider, true, false, true, $this->checkExplicitMixed, false);
return new CallMethodsRule(
new MethodCallCheck($reflectionProvider, $ruleLevelHelper, true, true),
new FunctionCallParametersCheck($ruleLevelHelper, new NullsafeCheck(), new PhpVersion(PHP_VERSION_ID), new UnresolvableTypeHelper(), new PropertyReflectionFinder(), true, true, true, true, false),
Expand Down
Loading