44
55use Generator ;
66use PhpParser \Node \Expr ;
7+ use PhpParser \Node \Scalar \Int_ ;
78use PhpParser \Node \Stmt ;
89use PHPStan \Analyser \ExpressionContext ;
910use PHPStan \Analyser \Generator \ExprAnalysisRequest ;
1011use PHPStan \Analyser \Generator \ExprAnalysisResult ;
1112use PHPStan \Analyser \Generator \ExprHandler ;
1213use PHPStan \Analyser \Generator \GeneratorScope ;
14+ use PHPStan \Analyser \Generator \NoopNodeCallback ;
1315use PHPStan \Analyser \SpecifiedTypes ;
1416use PHPStan \DependencyInjection \AutowiredService ;
1517use PHPStan \Reflection \InitializerExprTypeResolver ;
18+ use PHPStan \Type \IntegerRangeType ;
19+ use function PHPStan \dumpType ;
1620
1721/**
1822 * @implements ExprHandler<Expr\UnaryMinus>
@@ -34,9 +38,17 @@ public function analyseExpr(Stmt $stmt, Expr $expr, GeneratorScope $scope, Expre
3438 {
3539 $ result = yield new ExprAnalysisRequest ($ stmt , $ expr ->expr , $ scope , $ context ->enterDeep (), $ alternativeNodeCallback );
3640
41+ $ type = $ this ->initializerExprTypeResolver ->getUnaryMinusTypeFromType ($ expr ->expr , $ result ->type );
42+ $ nativeType = $ this ->initializerExprTypeResolver ->getUnaryMinusTypeFromType ($ expr ->expr , $ result ->nativeType );
43+ if ($ type instanceof IntegerRangeType) {
44+ $ mulResult = yield new ExprAnalysisRequest ($ stmt , new Expr \BinaryOp \Mul ($ expr , new Int_ (-1 )), $ scope , $ context ->enterDeep (), new NoopNodeCallback ());
45+ $ type = $ mulResult ->result ;
46+ $ nativeType = $ mulResult ->nativeType ;
47+ }
48+
3749 return new ExprAnalysisResult (
38- $ this -> initializerExprTypeResolver -> getUnaryMinusTypeFromType ( $ expr -> expr , $ result -> type ) ,
39- $ this -> initializerExprTypeResolver -> getUnaryMinusTypeFromType ( $ expr -> expr , $ result -> nativeType ) ,
50+ $ type ,
51+ $ nativeType ,
4052 $ result ->scope ,
4153 hasYield: $ result ->hasYield ,
4254 isAlwaysTerminating: $ result ->isAlwaysTerminating ,
0 commit comments