diff --git a/src/Parser/ArrayOffsetNormalizingVisitor.php b/src/Parser/ArrayOffsetNormalizingVisitor.php new file mode 100644 index 00000000000..40c525a142f --- /dev/null +++ b/src/Parser/ArrayOffsetNormalizingVisitor.php @@ -0,0 +1,61 @@ +dim === null) { + return null; + } + + $dim = $node->dim; + if ($dim instanceof String_) { + // Single quotes normally, double quotes when the value holds control + // characters - the same canonical form as ConstantStringType::export(), + // and the one that keeps the expression key free of newlines. + $dim->setAttribute( + 'kind', + preg_match('/[\x00-\x1f]/', $dim->value) === 1 + ? String_::KIND_DOUBLE_QUOTED + : String_::KIND_SINGLE_QUOTED, + ); + } elseif ($dim instanceof InterpolatedString) { + $dim->setAttribute('kind', String_::KIND_DOUBLE_QUOTED); + } elseif ($dim instanceof Int_) { + $dim->setAttribute('kind', Int_::KIND_DEC); + } + + return null; + } + +} diff --git a/tests/PHPStan/Analyser/nsrt/bug-15060.php b/tests/PHPStan/Analyser/nsrt/bug-15060.php new file mode 100644 index 00000000000..eac694598f7 --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-15060.php @@ -0,0 +1,63 @@ +', $searchParams['test']); + assertType('array', $searchParams["test"]); + } + + if (is_array($searchParams["test"]) && $searchParams["test"]) { + assertType('non-empty-array', $searchParams['test']); + assertType('non-empty-array', $searchParams["test"]); + } + } +} + +function otherStringSpellings($m): void +{ + if (is_array($m['test']) && $m['test']) { + assertType('non-empty-array', $m['test']); + assertType('non-empty-array', $m["test"]); + assertType('non-empty-array', $m["\x74est"]); + assertType('non-empty-array', $m[<<<'NOWDOC' + test + NOWDOC]); + assertType('non-empty-array', $m[<<', $m[1]); + assertType('non-empty-array', $m[0x1]); + assertType('non-empty-array', $m[01]); + assertType('non-empty-array', $m[0b1]); + assertType('mixed', $m[10]); + } +} + +function interpolatedSpellings($m, string $k): void +{ + if (is_array($m["x$k"]) && $m["x$k"]) { + assertType('non-empty-array', $m["x$k"]); + assertType('non-empty-array', $m["x{$k}"]); + assertType('non-empty-array', $m[<<