@@ -92,39 +92,25 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
9292 $ startConstant = $ endConstant ;
9393 $ endConstant = $ tmp ;
9494 }
95- return new IntersectionType ([
96- new ArrayType (
97- IntegerRangeType:: createAllGreaterThanOrEqualTo ( 0 ),
98- IntegerRangeType:: fromInterval ( $ startConstant -> getValue (), $ endConstant ->getValue () ),
95+ return self :: getNonEmptyListOfType (
96+ IntegerRangeType:: fromInterval (
97+ $ startConstant -> getValue ( ),
98+ $ endConstant ->getValue (),
9999 ),
100- new NonEmptyArrayType (),
101- new AccessoryArrayListType (),
102- ]);
100+ );
103101 }
104102
105103 if ($ stepType ->isFloat ()->yes ()) {
106- return new IntersectionType ([
107- new ArrayType (
108- IntegerRangeType::createAllGreaterThanOrEqualTo (0 ),
109- new FloatType (),
110- ),
111- new NonEmptyArrayType (),
112- new AccessoryArrayListType (),
113- ]);
104+ return self ::getNonEmptyListOfType (new FloatType ());
114105 }
115106
116- return new IntersectionType ([
117- new ArrayType (
118- IntegerRangeType::createAllGreaterThanOrEqualTo (0 ),
119- TypeCombinator::union (
120- $ startConstant ->generalize (GeneralizePrecision::moreSpecific ()),
121- $ endConstant ->generalize (GeneralizePrecision::moreSpecific ()),
122- $ stepType ->generalize (GeneralizePrecision::moreSpecific ()),
123- ),
107+ return self ::getNonEmptyListOfType (
108+ TypeCombinator::union (
109+ $ startConstant ->generalize (GeneralizePrecision::moreSpecific ()),
110+ $ endConstant ->generalize (GeneralizePrecision::moreSpecific ()),
111+ $ stepType ->generalize (GeneralizePrecision::moreSpecific ()),
124112 ),
125- new NonEmptyArrayType (),
126- new AccessoryArrayListType (),
127- ]);
113+ );
128114 }
129115 $ arrayBuilder = ConstantArrayTypeBuilder::createEmpty ();
130116 foreach ($ rangeValues as $ value ) {
@@ -146,30 +132,45 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
146132
147133 if ($ isInteger && $ isStepInteger ) {
148134 if ($ argType instanceof IntegerRangeType) {
149- return new IntersectionType ([ new ArrayType (IntegerRangeType:: createAllGreaterThanOrEqualTo ( 0 ), $ argType), new AccessoryArrayListType ()] );
135+ return self :: getNonEmptyListOfType ( $ argType );
150136 }
151- return new IntersectionType ([ new ArrayType (IntegerRangeType:: createAllGreaterThanOrEqualTo ( 0 ), new IntegerType ()), new AccessoryArrayListType ()] );
137+ return self :: getNonEmptyListOfType ( new IntegerType ());
152138 }
153139
154140 if ($ argType ->isFloat ()->yes ()) {
155- return new IntersectionType ([ new ArrayType (IntegerRangeType:: createAllGreaterThanOrEqualTo ( 0 ), new FloatType ()), new AccessoryArrayListType ()] );
141+ return self :: getNonEmptyListOfType ( new FloatType ());
156142 }
157143
158144 $ numberType = new UnionType ([new IntegerType (), new FloatType ()]);
159145 $ isNumber = $ numberType ->isSuperTypeOf ($ argType )->yes ();
160146 $ isNumericString = $ argType ->isNumericString ()->yes ();
161147 if ($ isNumber || $ isNumericString ) {
162- return new IntersectionType ([ new ArrayType (IntegerRangeType:: createAllGreaterThanOrEqualTo ( 0 ), $ numberType), new AccessoryArrayListType ()] );
148+ return self :: getNonEmptyListOfType ( $ numberType );
163149 }
164150
165151 if ($ argType ->isString ()->yes ()) {
166- return new IntersectionType ([ new ArrayType (IntegerRangeType:: createAllGreaterThanOrEqualTo ( 0 ), new StringType ()), new AccessoryArrayListType ()] );
152+ return self :: getNonEmptyListOfType ( new StringType ());
167153 }
168154
169- return new IntersectionType ([new ArrayType (
170- IntegerRangeType::createAllGreaterThanOrEqualTo (0 ),
171- new BenevolentUnionType ([new IntegerType (), new FloatType (), new StringType ()]),
172- ), new AccessoryArrayListType ()]);
155+ return self ::getNonEmptyListOfType (
156+ new BenevolentUnionType ([
157+ new IntegerType (),
158+ new FloatType (),
159+ new StringType (),
160+ ]),
161+ );
162+ }
163+
164+ private static function getNonEmptyListOfType (Type $ type ): IntersectionType
165+ {
166+ return new IntersectionType ([
167+ new ArrayType (
168+ IntegerRangeType::createAllGreaterThanOrEqualTo (0 ),
169+ $ type ,
170+ ),
171+ new NonEmptyArrayType (),
172+ new AccessoryArrayListType (),
173+ ]);
173174 }
174175
175176}
0 commit comments