Skip to content

Commit

Permalink
checkImplicitMixed
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinMystikJonas authored and ondrejmirtes committed Aug 24, 2022
1 parent cf5eb16 commit 21ca601
Show file tree
Hide file tree
Showing 57 changed files with 89 additions and 55 deletions.
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
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Methods/CallMethodsRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class CallMethodsRuleTest extends RuleTestCase
protected function getRule(): Rule
{
$reflectionProvider = $this->createReflectionProvider();
$ruleLevelHelper = new RuleLevelHelper($reflectionProvider, $this->checkNullables, $this->checkThisOnly, $this->checkUnionTypes, $this->checkExplicitMixed);
$ruleLevelHelper = new RuleLevelHelper($reflectionProvider, $this->checkNullables, $this->checkThisOnly, $this->checkUnionTypes, $this->checkExplicitMixed, false);
return new CallMethodsRule(
new MethodCallCheck($reflectionProvider, $ruleLevelHelper, true, true),
new FunctionCallParametersCheck($ruleLevelHelper, new NullsafeCheck(), new PhpVersion($this->phpVersion), new UnresolvableTypeHelper(), new PropertyReflectionFinder(), true, true, true, true, true),
Expand Down
2 changes: 1 addition & 1 deletion tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class CallStaticMethodsRuleTest extends RuleTestCase
protected function getRule(): Rule
{
$reflectionProvider = $this->createReflectionProvider();
$ruleLevelHelper = new RuleLevelHelper($reflectionProvider, true, $this->checkThisOnly, true, $this->checkExplicitMixed);
$ruleLevelHelper = new RuleLevelHelper($reflectionProvider, true, $this->checkThisOnly, true, $this->checkExplicitMixed, false);
return new CallStaticMethodsRule(
new StaticMethodCallCheck($reflectionProvider, $ruleLevelHelper, new ClassCaseSensitivityCheck($reflectionProvider, true), true, true),
new FunctionCallParametersCheck($ruleLevelHelper, 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 @@ -14,7 +14,7 @@ class CallToMethodStatementWithoutSideEffectsRuleTest extends RuleTestCase

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

public function testRule(): void
Expand Down
Loading

0 comments on commit 21ca601

Please sign in to comment.