diff --git a/src/Type/Constant/OversizedArrayBuilder.php b/src/Type/Constant/OversizedArrayBuilder.php index b2200fd7c1..b9a10876ec 100644 --- a/src/Type/Constant/OversizedArrayBuilder.php +++ b/src/Type/Constant/OversizedArrayBuilder.php @@ -81,7 +81,7 @@ public function build(Array_ $expr, callable $getTypeCallback): Type $nextAutoIndex++; } - $generalizedKeyType = $itemKeyType->generalize(GeneralizePrecision::moreSpecific()); + $generalizedKeyType = $itemKeyType->generalize(GeneralizePrecision::lessSpecific()); $keyTypes[$generalizedKeyType->describe(VerbosityLevel::precise())] = $generalizedKeyType; $itemValueType = $getTypeCallback($item->value); diff --git a/tests/PHPStan/Analyser/nsrt/bug-8636.php b/tests/PHPStan/Analyser/nsrt/bug-8636.php new file mode 100644 index 0000000000..7fac3a4feb --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-8636.php @@ -0,0 +1,553 @@ + 'value_0', + 'item_1' => 'value_1', + 'item_2' => 'value_2', + 'item_3' => 'value_3', + 'item_4' => 'value_4', + 'item_5' => 'value_5', + 'item_6' => 'value_6', + 'item_7' => 'value_7', + 'item_8' => 'value_8', + 'item_9' => 'value_9', + 'item_10' => 'value_10', + 'item_11' => 'value_11', + 'item_12' => 'value_12', + 'item_13' => 'value_13', + 'item_14' => 'value_14', + 'item_15' => 'value_15', + 'item_16' => 'value_16', + 'item_17' => 'value_17', + 'item_18' => 'value_18', + 'item_19' => 'value_19', + 'item_20' => 'value_20', + 'item_21' => 'value_21', + 'item_22' => 'value_22', + 'item_23' => 'value_23', + 'item_24' => 'value_24', + 'item_25' => 'value_25', + 'item_26' => 'value_26', + 'item_27' => 'value_27', + 'item_28' => 'value_28', + 'item_29' => 'value_29', + 'item_30' => 'value_30', + 'item_31' => 'value_31', + 'item_32' => 'value_32', + 'item_33' => 'value_33', + 'item_34' => 'value_34', + 'item_35' => 'value_35', + 'item_36' => 'value_36', + 'item_37' => 'value_37', + 'item_38' => 'value_38', + 'item_39' => 'value_39', + 'item_40' => 'value_40', + 'item_41' => 'value_41', + 'item_42' => 'value_42', + 'item_43' => 'value_43', + 'item_44' => 'value_44', + 'item_45' => 'value_45', + 'item_46' => 'value_46', + 'item_47' => 'value_47', + 'item_48' => 'value_48', + 'item_49' => 'value_49', + 'item_50' => 'value_50', + 'item_51' => 'value_51', + 'item_52' => 'value_52', + 'item_53' => 'value_53', + 'item_54' => 'value_54', + 'item_55' => 'value_55', + 'item_56' => 'value_56', + 'item_57' => 'value_57', + 'item_58' => 'value_58', + 'item_59' => 'value_59', + 'item_60' => 'value_60', + 'item_61' => 'value_61', + 'item_62' => 'value_62', + 'item_63' => 'value_63', + 'item_64' => 'value_64', + 'item_65' => 'value_65', + 'item_66' => 'value_66', + 'item_67' => 'value_67', + 'item_68' => 'value_68', + 'item_69' => 'value_69', + 'item_70' => 'value_70', + 'item_71' => 'value_71', + 'item_72' => 'value_72', + 'item_73' => 'value_73', + 'item_74' => 'value_74', + 'item_75' => 'value_75', + 'item_76' => 'value_76', + 'item_77' => 'value_77', + 'item_78' => 'value_78', + 'item_79' => 'value_79', + 'item_80' => 'value_80', + 'item_81' => 'value_81', + 'item_82' => 'value_82', + 'item_83' => 'value_83', + 'item_84' => 'value_84', + 'item_85' => 'value_85', + 'item_86' => 'value_86', + 'item_87' => 'value_87', + 'item_88' => 'value_88', + 'item_89' => 'value_89', + 'item_90' => 'value_90', + 'item_91' => 'value_91', + 'item_92' => 'value_92', + 'item_93' => 'value_93', + 'item_94' => 'value_94', + 'item_95' => 'value_95', + 'item_96' => 'value_96', + 'item_97' => 'value_97', + 'item_98' => 'value_98', + 'item_99' => 'value_99', + 'item_100' => 'value_100', + 'item_101' => 'value_101', + 'item_102' => 'value_102', + 'item_103' => 'value_103', + 'item_104' => 'value_104', + 'item_105' => 'value_105', + 'item_106' => 'value_106', + 'item_107' => 'value_107', + 'item_108' => 'value_108', + 'item_109' => 'value_109', + 'item_110' => 'value_110', + 'item_111' => 'value_111', + 'item_112' => 'value_112', + 'item_113' => 'value_113', + 'item_114' => 'value_114', + 'item_115' => 'value_115', + 'item_116' => 'value_116', + 'item_117' => 'value_117', + 'item_118' => 'value_118', + 'item_119' => 'value_119', + 'item_120' => 'value_120', + 'item_121' => 'value_121', + 'item_122' => 'value_122', + 'item_123' => 'value_123', + 'item_124' => 'value_124', + 'item_125' => 'value_125', + 'item_126' => 'value_126', + 'item_127' => 'value_127', + 'item_128' => 'value_128', + 'item_129' => 'value_129', + 'item_130' => 'value_130', + 'item_131' => 'value_131', + 'item_132' => 'value_132', + 'item_133' => 'value_133', + 'item_134' => 'value_134', + 'item_135' => 'value_135', + 'item_136' => 'value_136', + 'item_137' => 'value_137', + 'item_138' => 'value_138', + 'item_139' => 'value_139', + 'item_140' => 'value_140', + 'item_141' => 'value_141', + 'item_142' => 'value_142', + 'item_143' => 'value_143', + 'item_144' => 'value_144', + 'item_145' => 'value_145', + 'item_146' => 'value_146', + 'item_147' => 'value_147', + 'item_148' => 'value_148', + 'item_149' => 'value_149', + 'item_150' => 'value_150', + 'item_151' => 'value_151', + 'item_152' => 'value_152', + 'item_153' => 'value_153', + 'item_154' => 'value_154', + 'item_155' => 'value_155', + 'item_156' => 'value_156', + 'item_157' => 'value_157', + 'item_158' => 'value_158', + 'item_159' => 'value_159', + 'item_160' => 'value_160', + 'item_161' => 'value_161', + 'item_162' => 'value_162', + 'item_163' => 'value_163', + 'item_164' => 'value_164', + 'item_165' => 'value_165', + 'item_166' => 'value_166', + 'item_167' => 'value_167', + 'item_168' => 'value_168', + 'item_169' => 'value_169', + 'item_170' => 'value_170', + 'item_171' => 'value_171', + 'item_172' => 'value_172', + 'item_173' => 'value_173', + 'item_174' => 'value_174', + 'item_175' => 'value_175', + 'item_176' => 'value_176', + 'item_177' => 'value_177', + 'item_178' => 'value_178', + 'item_179' => 'value_179', + 'item_180' => 'value_180', + 'item_181' => 'value_181', + 'item_182' => 'value_182', + 'item_183' => 'value_183', + 'item_184' => 'value_184', + 'item_185' => 'value_185', + 'item_186' => 'value_186', + 'item_187' => 'value_187', + 'item_188' => 'value_188', + 'item_189' => 'value_189', + 'item_190' => 'value_190', + 'item_191' => 'value_191', + 'item_192' => 'value_192', + 'item_193' => 'value_193', + 'item_194' => 'value_194', + 'item_195' => 'value_195', + 'item_196' => 'value_196', + 'item_197' => 'value_197', + 'item_198' => 'value_198', + 'item_199' => 'value_199', + 'item_200' => 'value_200', + 'item_201' => 'value_201', + 'item_202' => 'value_202', + 'item_203' => 'value_203', + 'item_204' => 'value_204', + 'item_205' => 'value_205', + 'item_206' => 'value_206', + 'item_207' => 'value_207', + 'item_208' => 'value_208', + 'item_209' => 'value_209', + 'item_210' => 'value_210', + 'item_211' => 'value_211', + 'item_212' => 'value_212', + 'item_213' => 'value_213', + 'item_214' => 'value_214', + 'item_215' => 'value_215', + 'item_216' => 'value_216', + 'item_217' => 'value_217', + 'item_218' => 'value_218', + 'item_219' => 'value_219', + 'item_220' => 'value_220', + 'item_221' => 'value_221', + 'item_222' => 'value_222', + 'item_223' => 'value_223', + 'item_224' => 'value_224', + 'item_225' => 'value_225', + 'item_226' => 'value_226', + 'item_227' => 'value_227', + 'item_228' => 'value_228', + 'item_229' => 'value_229', + 'item_230' => 'value_230', + 'item_231' => 'value_231', + 'item_232' => 'value_232', + 'item_233' => 'value_233', + 'item_234' => 'value_234', + 'item_235' => 'value_235', + 'item_236' => 'value_236', + 'item_237' => 'value_237', + 'item_238' => 'value_238', + 'item_239' => 'value_239', + 'item_240' => 'value_240', + 'item_241' => 'value_241', + 'item_242' => 'value_242', + 'item_243' => 'value_243', + 'item_244' => 'value_244', + 'item_245' => 'value_245', + 'item_246' => 'value_246', + 'item_247' => 'value_247', + 'item_248' => 'value_248', + 'item_249' => 'value_249', + 'item_250' => 'value_250', + 'item_251' => 'value_251', + 'item_252' => 'value_252', + 'item_253' => 'value_253', + 'item_254' => 'value_254', + 'item_255' => 'value_255', + 'item_256' => 'value_256', + 'item_257' => 'value_257', + ]; + + public function testAccess(): void + { + // The oversized array type should use lessSpecific generalization for keys + // so string keys generalize to 'string' not 'literal-string&...' + // Value types use moreSpecific generalization to preserve detail + assertType('non-empty-array&oversized-array', self::HUGE); + + // Accessing a specific key should return the moreSpecific generalized value type + assertType('literal-string&lowercase-string&non-falsy-string', self::HUGE['item_0']); + } +} + +class MixedConfig +{ + const HUGE_MIXED = [ + 0 => 'string_value', + 1 => 'string_value', + 2 => 'string_value', + 3 => 'string_value', + 4 => 'string_value', + 5 => 'string_value', + 6 => 'string_value', + 7 => 'string_value', + 8 => 'string_value', + 9 => 'string_value', + 10 => 'string_value', + 11 => 'string_value', + 12 => 'string_value', + 13 => 'string_value', + 14 => 'string_value', + 15 => 'string_value', + 16 => 'string_value', + 17 => 'string_value', + 18 => 'string_value', + 19 => 'string_value', + 20 => 'string_value', + 21 => 'string_value', + 22 => 'string_value', + 23 => 'string_value', + 24 => 'string_value', + 25 => 'string_value', + 26 => 'string_value', + 27 => 'string_value', + 28 => 'string_value', + 29 => 'string_value', + 30 => 'string_value', + 31 => 'string_value', + 32 => 'string_value', + 33 => 'string_value', + 34 => 'string_value', + 35 => 'string_value', + 36 => 'string_value', + 37 => 'string_value', + 38 => 'string_value', + 39 => 'string_value', + 40 => 'string_value', + 41 => 'string_value', + 42 => 'string_value', + 43 => 'string_value', + 44 => 'string_value', + 45 => 'string_value', + 46 => 'string_value', + 47 => 'string_value', + 48 => 'string_value', + 49 => 'string_value', + 50 => 'string_value', + 51 => 'string_value', + 52 => 'string_value', + 53 => 'string_value', + 54 => 'string_value', + 55 => 'string_value', + 56 => 'string_value', + 57 => 'string_value', + 58 => 'string_value', + 59 => 'string_value', + 60 => 'string_value', + 61 => 'string_value', + 62 => 'string_value', + 63 => 'string_value', + 64 => 'string_value', + 65 => 'string_value', + 66 => 'string_value', + 67 => 'string_value', + 68 => 'string_value', + 69 => 'string_value', + 70 => 'string_value', + 71 => 'string_value', + 72 => 'string_value', + 73 => 'string_value', + 74 => 'string_value', + 75 => 'string_value', + 76 => 'string_value', + 77 => 'string_value', + 78 => 'string_value', + 79 => 'string_value', + 80 => 'string_value', + 81 => 'string_value', + 82 => 'string_value', + 83 => 'string_value', + 84 => 'string_value', + 85 => 'string_value', + 86 => 'string_value', + 87 => 'string_value', + 88 => 'string_value', + 89 => 'string_value', + 90 => 'string_value', + 91 => 'string_value', + 92 => 'string_value', + 93 => 'string_value', + 94 => 'string_value', + 95 => 'string_value', + 96 => 'string_value', + 97 => 'string_value', + 98 => 'string_value', + 99 => 'string_value', + 100 => 'string_value', + 101 => 'string_value', + 102 => 'string_value', + 103 => 'string_value', + 104 => 'string_value', + 105 => 'string_value', + 106 => 'string_value', + 107 => 'string_value', + 108 => 'string_value', + 109 => 'string_value', + 110 => 'string_value', + 111 => 'string_value', + 112 => 'string_value', + 113 => 'string_value', + 114 => 'string_value', + 115 => 'string_value', + 116 => 'string_value', + 117 => 'string_value', + 118 => 'string_value', + 119 => 'string_value', + 120 => 'string_value', + 121 => 'string_value', + 122 => 'string_value', + 123 => 'string_value', + 124 => 'string_value', + 125 => 'string_value', + 126 => 'string_value', + 127 => 'string_value', + 128 => 'string_value', + 129 => 'string_value', + 130 => 'string_value', + 131 => 'string_value', + 132 => 'string_value', + 133 => 'string_value', + 134 => 'string_value', + 135 => 'string_value', + 136 => 'string_value', + 137 => 'string_value', + 138 => 'string_value', + 139 => 'string_value', + 140 => 'string_value', + 141 => 'string_value', + 142 => 'string_value', + 143 => 'string_value', + 144 => 'string_value', + 145 => 'string_value', + 146 => 'string_value', + 147 => 'string_value', + 148 => 'string_value', + 149 => 'string_value', + 150 => 'string_value', + 151 => 'string_value', + 152 => 'string_value', + 153 => 'string_value', + 154 => 'string_value', + 155 => 'string_value', + 156 => 'string_value', + 157 => 'string_value', + 158 => 'string_value', + 159 => 'string_value', + 160 => 'string_value', + 161 => 'string_value', + 162 => 'string_value', + 163 => 'string_value', + 164 => 'string_value', + 165 => 'string_value', + 166 => 'string_value', + 167 => 'string_value', + 168 => 'string_value', + 169 => 'string_value', + 170 => 'string_value', + 171 => 'string_value', + 172 => 'string_value', + 173 => 'string_value', + 174 => 'string_value', + 175 => 'string_value', + 176 => 'string_value', + 177 => 'string_value', + 178 => 'string_value', + 179 => 'string_value', + 180 => 'string_value', + 181 => 'string_value', + 182 => 'string_value', + 183 => 'string_value', + 184 => 'string_value', + 185 => 'string_value', + 186 => 'string_value', + 187 => 'string_value', + 188 => 'string_value', + 189 => 'string_value', + 190 => 'string_value', + 191 => 'string_value', + 192 => 'string_value', + 193 => 'string_value', + 194 => 'string_value', + 195 => 'string_value', + 196 => 'string_value', + 197 => 'string_value', + 198 => 'string_value', + 199 => 'string_value', + 200 => 'string_value', + 201 => 'string_value', + 202 => 'string_value', + 203 => 'string_value', + 204 => 'string_value', + 205 => 'string_value', + 206 => 'string_value', + 207 => 'string_value', + 208 => 'string_value', + 209 => 'string_value', + 210 => 'string_value', + 211 => 'string_value', + 212 => 'string_value', + 213 => 'string_value', + 214 => 'string_value', + 215 => 'string_value', + 216 => 'string_value', + 217 => 'string_value', + 218 => 'string_value', + 219 => 'string_value', + 220 => 'string_value', + 221 => 'string_value', + 222 => 'string_value', + 223 => 'string_value', + 224 => 'string_value', + 225 => 'string_value', + 226 => 'string_value', + 227 => 'string_value', + 228 => 'string_value', + 229 => 'string_value', + 230 => 'string_value', + 231 => 'string_value', + 232 => 'string_value', + 233 => 'string_value', + 234 => 'string_value', + 235 => 'string_value', + 236 => 'string_value', + 237 => 'string_value', + 238 => 'string_value', + 239 => 'string_value', + 240 => 'string_value', + 241 => 'string_value', + 242 => 'string_value', + 243 => 'string_value', + 244 => 'string_value', + 245 => 'string_value', + 246 => 'string_value', + 247 => 'string_value', + 248 => 'string_value', + 249 => 'string_value', + 250 => 'string_value', + 251 => 'string_value', + 252 => 'string_value', + 253 => 'string_value', + 254 => 'string_value', + 255 => 'string_value', + 256 => 'string_value', + 257 => 42, + ]; + + public function testMixedAccess(): void + { + // With int keys and mixed values, accessing by key should return general value type + assertType('(int|(literal-string&lowercase-string&non-falsy-string))', self::HUGE_MIXED[0]); + + // Whole array type + assertType('non-empty-list&oversized-array', self::HUGE_MIXED); + } +} diff --git a/tests/PHPStan/Rules/Methods/ReturnTypeRuleTest.php b/tests/PHPStan/Rules/Methods/ReturnTypeRuleTest.php index 84e81f0f33..5ed2f10379 100644 --- a/tests/PHPStan/Rules/Methods/ReturnTypeRuleTest.php +++ b/tests/PHPStan/Rules/Methods/ReturnTypeRuleTest.php @@ -860,7 +860,7 @@ public function testBug8146bErrors(): void $this->checkBenevolentUnionTypes = true; $this->analyse([__DIR__ . '/data/bug-8146b-errors.php'], [ [ - "Method Bug8146bError\LocationFixtures::getData() should return array, coordinates: array{lat: float, lng: float}}>> but returns array{Bács-Kiskun: array{Ágasegyháza: array{constituencies: array{'Bács-Kiskun 4.', true, false, Bug8146bError\X, null}, coordinates: array{lat: 46.8386043, lng: 19.4502899}}, Akasztó: array{constituencies: array{'Bács-Kiskun 3.'}, coordinates: array{lat: 46.6898175, lng: 19.205086}}, Apostag: array{constituencies: array{'Bács-Kiskun 3.'}, coordinates: array{lat: 46.8812652, lng: 18.9648478}}, Bácsalmás: array{constituencies: array{'Bács-Kiskun 5.'}, coordinates: array{lat: 46.1250396, lng: 19.3357509}}, Bácsbokod: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 46.1234737, lng: 19.155708}}, Bácsborsód: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 46.0989373, lng: 19.1566725}}, Bácsszentgyörgy: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 45.9746039, lng: 19.0398066}}, Bácsszőlős: array{constituencies: array{'Bács-Kiskun 5.'}, coordinates: array{lat: 46.1352003, lng: 19.4215997}}, ...}, Baranya: non-empty-array|(literal-string&non-falsy-string), float|(literal-string&non-falsy-string)>>>, Békés: array{Almáskamarás: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.4617785, lng: 21.092448}}, Battonya: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.2902462, lng: 21.0199215}}, Békés: array{constituencies: array{'Békés 2.'}, coordinates: array{lat: 46.6704899, lng: 21.0434996}}, Békéscsaba: array{constituencies: array{'Békés 1.'}, coordinates: array{lat: 46.6735939, lng: 21.0877309}}, Békéssámson: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.4208677, lng: 20.6176498}}, Békésszentandrás: array{constituencies: array{'Békés 2.'}, coordinates: array{lat: 46.8715996, lng: 20.48336}}, Bélmegyer: array{constituencies: array{'Békés 3.'}, coordinates: array{lat: 46.8726019, lng: 21.1832832}}, Biharugra: array{constituencies: array{'Békés 3.'}, coordinates: array{lat: 46.9691009, lng: 21.5987651}}, ...}, Borsod-Abaúj-Zemplén: non-empty-array|(literal-string&non-falsy-string), float|(literal-string&non-falsy-string)>>>, Budapest: array{'Budapest I. ker.': array{constituencies: array{'Budapest 01.'}, coordinates: array{lat: 47.4968219, lng: 19.037458}}, 'Budapest II. ker.': array{constituencies: array{'Budapest 03.', 'Budapest 04.'}, coordinates: array{lat: 47.5393329, lng: 18.986934}}, 'Budapest III. ker.': array{constituencies: array{'Budapest 04.', 'Budapest 10.'}, coordinates: array{lat: 47.5671768, lng: 19.0368517}}, 'Budapest IV. ker.': array{constituencies: array{'Budapest 11.', 'Budapest 12.'}, coordinates: array{lat: 47.5648915, lng: 19.0913149}}, 'Budapest V. ker.': array{constituencies: array{'Budapest 01.'}, coordinates: array{lat: 47.5002319, lng: 19.0520181}}, 'Budapest VI. ker.': array{constituencies: array{'Budapest 05.'}, coordinates: array{lat: 47.509863, lng: 19.0625813}}, 'Budapest VII. ker.': array{constituencies: array{'Budapest 05.'}, coordinates: array{lat: 47.5027289, lng: 19.073376}}, 'Budapest VIII. ker.': array{constituencies: array{'Budapest 01.', 'Budapest 06.'}, coordinates: array{lat: 47.4894184, lng: 19.070668}}, ...}, Csongrád-Csanád: array{Algyő: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.3329625, lng: 20.207889}}, Ambrózfalva: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.3501417, lng: 20.7313995}}, Apátfalva: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.173317, lng: 20.5800472}}, Árpádhalom: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.6158286, lng: 20.547733}}, Ásotthalom: array{constituencies: array{'Csongrád-Csanád 2.'}, coordinates: array{lat: 46.1995983, lng: 19.7833756}}, Baks: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.5518708, lng: 20.1064166}}, Balástya: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.4261828, lng: 20.004933}}, Bordány: array{constituencies: array{'Csongrád-Csanád 2.'}, coordinates: array{lat: 46.3194213, lng: 19.9227063}}, ...}, Fejér: array{Aba: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 47.0328193, lng: 18.522359}}, Adony: array{constituencies: array{'Fejér 4.'}, coordinates: array{lat: 47.119831, lng: 18.8612469}}, Alap: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 46.8075763, lng: 18.684028}}, Alcsútdoboz: array{constituencies: array{'Fejér 3.'}, coordinates: array{lat: 47.4277067, lng: 18.6030325}}, Alsószentiván: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 46.7910573, lng: 18.732161}}, Bakonycsernye: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.321719, lng: 18.0907379}}, Bakonykúti: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.2458464, lng: 18.195769}}, Balinka: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.3135736, lng: 18.1907168}}, ...}, Győr-Moson-Sopron: array{Abda: array{constituencies: array{'Győr-Moson-Sopron 5.'}, coordinates: array{lat: 47.6962149, lng: 17.5445786}}, Acsalag: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.676095, lng: 17.1977771}}, Ágfalva: array{constituencies: array{'Győr-Moson-Sopron 4.'}, coordinates: array{lat: 47.688862, lng: 16.5110233}}, Agyagosszergény: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.608545, lng: 16.9409912}}, Árpás: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5134127, lng: 17.3931579}}, Ásványráró: array{constituencies: array{'Győr-Moson-Sopron 5.'}, coordinates: array{lat: 47.8287695, lng: 17.499195}}, Babót: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5752269, lng: 17.0758604}}, Bágyogszovát: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5866036, lng: 17.3617273}}, ...}, ...}.", + "Method Bug8146bError\LocationFixtures::getData() should return array, coordinates: array{lat: float, lng: float}}>> but returns array{Bács-Kiskun: array{Ágasegyháza: array{constituencies: array{'Bács-Kiskun 4.', true, false, Bug8146bError\X, null}, coordinates: array{lat: 46.8386043, lng: 19.4502899}}, Akasztó: array{constituencies: array{'Bács-Kiskun 3.'}, coordinates: array{lat: 46.6898175, lng: 19.205086}}, Apostag: array{constituencies: array{'Bács-Kiskun 3.'}, coordinates: array{lat: 46.8812652, lng: 18.9648478}}, Bácsalmás: array{constituencies: array{'Bács-Kiskun 5.'}, coordinates: array{lat: 46.1250396, lng: 19.3357509}}, Bácsbokod: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 46.1234737, lng: 19.155708}}, Bácsborsód: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 46.0989373, lng: 19.1566725}}, Bácsszentgyörgy: array{constituencies: array{'Bács-Kiskun 6.'}, coordinates: array{lat: 45.9746039, lng: 19.0398066}}, Bácsszőlős: array{constituencies: array{'Bács-Kiskun 5.'}, coordinates: array{lat: 46.1352003, lng: 19.4215997}}, ...}, Baranya: non-empty-array|(literal-string&non-falsy-string), float|(literal-string&non-falsy-string)>>>, Békés: array{Almáskamarás: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.4617785, lng: 21.092448}}, Battonya: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.2902462, lng: 21.0199215}}, Békés: array{constituencies: array{'Békés 2.'}, coordinates: array{lat: 46.6704899, lng: 21.0434996}}, Békéscsaba: array{constituencies: array{'Békés 1.'}, coordinates: array{lat: 46.6735939, lng: 21.0877309}}, Békéssámson: array{constituencies: array{'Békés 4.'}, coordinates: array{lat: 46.4208677, lng: 20.6176498}}, Békésszentandrás: array{constituencies: array{'Békés 2.'}, coordinates: array{lat: 46.8715996, lng: 20.48336}}, Bélmegyer: array{constituencies: array{'Békés 3.'}, coordinates: array{lat: 46.8726019, lng: 21.1832832}}, Biharugra: array{constituencies: array{'Békés 3.'}, coordinates: array{lat: 46.9691009, lng: 21.5987651}}, ...}, Borsod-Abaúj-Zemplén: non-empty-array|(literal-string&non-falsy-string), float|(literal-string&non-falsy-string)>>>, Budapest: array{'Budapest I. ker.': array{constituencies: array{'Budapest 01.'}, coordinates: array{lat: 47.4968219, lng: 19.037458}}, 'Budapest II. ker.': array{constituencies: array{'Budapest 03.', 'Budapest 04.'}, coordinates: array{lat: 47.5393329, lng: 18.986934}}, 'Budapest III. ker.': array{constituencies: array{'Budapest 04.', 'Budapest 10.'}, coordinates: array{lat: 47.5671768, lng: 19.0368517}}, 'Budapest IV. ker.': array{constituencies: array{'Budapest 11.', 'Budapest 12.'}, coordinates: array{lat: 47.5648915, lng: 19.0913149}}, 'Budapest V. ker.': array{constituencies: array{'Budapest 01.'}, coordinates: array{lat: 47.5002319, lng: 19.0520181}}, 'Budapest VI. ker.': array{constituencies: array{'Budapest 05.'}, coordinates: array{lat: 47.509863, lng: 19.0625813}}, 'Budapest VII. ker.': array{constituencies: array{'Budapest 05.'}, coordinates: array{lat: 47.5027289, lng: 19.073376}}, 'Budapest VIII. ker.': array{constituencies: array{'Budapest 01.', 'Budapest 06.'}, coordinates: array{lat: 47.4894184, lng: 19.070668}}, ...}, Csongrád-Csanád: array{Algyő: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.3329625, lng: 20.207889}}, Ambrózfalva: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.3501417, lng: 20.7313995}}, Apátfalva: array{constituencies: array{'Csongrád-Csanád 4.'}, coordinates: array{lat: 46.173317, lng: 20.5800472}}, Árpádhalom: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.6158286, lng: 20.547733}}, Ásotthalom: array{constituencies: array{'Csongrád-Csanád 2.'}, coordinates: array{lat: 46.1995983, lng: 19.7833756}}, Baks: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.5518708, lng: 20.1064166}}, Balástya: array{constituencies: array{'Csongrád-Csanád 3.'}, coordinates: array{lat: 46.4261828, lng: 20.004933}}, Bordány: array{constituencies: array{'Csongrád-Csanád 2.'}, coordinates: array{lat: 46.3194213, lng: 19.9227063}}, ...}, Fejér: array{Aba: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 47.0328193, lng: 18.522359}}, Adony: array{constituencies: array{'Fejér 4.'}, coordinates: array{lat: 47.119831, lng: 18.8612469}}, Alap: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 46.8075763, lng: 18.684028}}, Alcsútdoboz: array{constituencies: array{'Fejér 3.'}, coordinates: array{lat: 47.4277067, lng: 18.6030325}}, Alsószentiván: array{constituencies: array{'Fejér 5.'}, coordinates: array{lat: 46.7910573, lng: 18.732161}}, Bakonycsernye: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.321719, lng: 18.0907379}}, Bakonykúti: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.2458464, lng: 18.195769}}, Balinka: array{constituencies: array{'Fejér 2.'}, coordinates: array{lat: 47.3135736, lng: 18.1907168}}, ...}, Győr-Moson-Sopron: array{Abda: array{constituencies: array{'Győr-Moson-Sopron 5.'}, coordinates: array{lat: 47.6962149, lng: 17.5445786}}, Acsalag: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.676095, lng: 17.1977771}}, Ágfalva: array{constituencies: array{'Győr-Moson-Sopron 4.'}, coordinates: array{lat: 47.688862, lng: 16.5110233}}, Agyagosszergény: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.608545, lng: 16.9409912}}, Árpás: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5134127, lng: 17.3931579}}, Ásványráró: array{constituencies: array{'Győr-Moson-Sopron 5.'}, coordinates: array{lat: 47.8287695, lng: 17.499195}}, Babót: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5752269, lng: 17.0758604}}, Bágyogszovát: array{constituencies: array{'Győr-Moson-Sopron 3.'}, coordinates: array{lat: 47.5866036, lng: 17.3617273}}, ...}, ...}.", 12, "Offset 'constituencies' (non-empty-list) does not accept type array{'Bács-Kiskun 4.', true, false, Bug8146bError\X, null}.", ], diff --git a/tests/PHPStan/Type/Constant/OversizedArrayBuilderTest.php b/tests/PHPStan/Type/Constant/OversizedArrayBuilderTest.php index 185127d984..52d028df14 100644 --- a/tests/PHPStan/Type/Constant/OversizedArrayBuilderTest.php +++ b/tests/PHPStan/Type/Constant/OversizedArrayBuilderTest.php @@ -29,12 +29,12 @@ public static function dataBuild(): iterable yield [ '[1, 2, 3, ...[1, \'foo\' => 2, 3]]', - 'non-empty-array&oversized-array', + 'non-empty-array&oversized-array', ]; yield [ '[1, 2, 3, ...[1, \'FOO\' => 2, 3]]', - 'non-empty-array&oversized-array', + 'non-empty-array&oversized-array', ]; yield [ @@ -55,11 +55,11 @@ public static function dataBuild(): iterable ]; yield [ '[1, \'foo\' => 2, 3]', - 'non-empty-array&oversized-array', + 'non-empty-array&oversized-array', ]; yield [ '[1, \'FOO\' => 2, 3]', - 'non-empty-array&oversized-array', + 'non-empty-array&oversized-array', ]; }