From 44c6de9e286d0de60d26bc284524994e8efd9555 Mon Sep 17 00:00:00 2001 From: Simon Podlipsky Date: Fri, 6 Mar 2026 19:37:41 +0100 Subject: [PATCH 1/3] fix: property hooks crash --- .../data/ValidVariableNameSniffTest.inc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/Sniffs/NamingConventions/data/ValidVariableNameSniffTest.inc b/tests/Sniffs/NamingConventions/data/ValidVariableNameSniffTest.inc index 53c46ba..b9ca774 100644 --- a/tests/Sniffs/NamingConventions/data/ValidVariableNameSniffTest.inc +++ b/tests/Sniffs/NamingConventions/data/ValidVariableNameSniffTest.inc @@ -146,3 +146,21 @@ $var_name . $var_name; fn($_, $__, $_x) => true; $var = Potato::new(); + +class PropertyHookClass +{ + private string $backing = ''; + + public string $hooked { + get { + return $this->backing; + } + set { + $this->backing = $value; + } + } + + public string|null $virtualHook { + get => $this->backing; + } +} From b7d4e3ecacba55fb223b0d35cdcaa3e3070ec11a Mon Sep 17 00:00:00 2001 From: Simon Podlipsky Date: Fri, 6 Mar 2026 19:52:56 +0100 Subject: [PATCH 2/3] test: add property hook fixture that reproduces crash Co-Authored-By: Claude Opus 4.6 Co-Authored-By: Simon Podlipsky --- .../data/ValidVariableNameSniffTest.inc | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/Sniffs/NamingConventions/data/ValidVariableNameSniffTest.inc b/tests/Sniffs/NamingConventions/data/ValidVariableNameSniffTest.inc index b9ca774..4f9d116 100644 --- a/tests/Sniffs/NamingConventions/data/ValidVariableNameSniffTest.inc +++ b/tests/Sniffs/NamingConventions/data/ValidVariableNameSniffTest.inc @@ -149,18 +149,22 @@ $var = Potato::new(); class PropertyHookClass { - private string $backing = ''; + private string|null $resolved = null; + private bool $isResolved = false; - public string $hooked { - get { - return $this->backing; - } - set { - $this->backing = $value; - } + public function __construct( + private readonly Closure $provider, + ) { } - public string|null $virtualHook { - get => $this->backing; + public string|null $hooked { + get { + if (! $this->isResolved) { + $this->resolved = ($this->provider)(); + $this->isResolved = true; + } + + return $this->resolved; + } } } From 6b8062af0ea48be75f4611347192593d453e6384 Mon Sep 17 00:00:00 2001 From: Simon Podlipsky Date: Sat, 7 Mar 2026 07:35:56 +0100 Subject: [PATCH 3/3] fix: handle property hooks crash in ValidVariableNameSniff Co-Authored-By: Claude Opus 4.6 Co-Authored-By: Simon Podlipsky --- .../Sniffs/NamingConventions/ValidVariableNameSniff.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Cdn77/Sniffs/NamingConventions/ValidVariableNameSniff.php b/src/Cdn77/Sniffs/NamingConventions/ValidVariableNameSniff.php index d39cca3..8795377 100644 --- a/src/Cdn77/Sniffs/NamingConventions/ValidVariableNameSniff.php +++ b/src/Cdn77/Sniffs/NamingConventions/ValidVariableNameSniff.php @@ -6,6 +6,7 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; +use RuntimeException; use function assert; use function ltrim; @@ -110,7 +111,13 @@ protected function processMemberVar(File $phpcsFile, $stackPtr): void $tokens = $phpcsFile->getTokens(); $varName = ltrim($tokens[$stackPtr]['content'], '$'); - $memberProps = $phpcsFile->getMemberProperties($stackPtr); + + try { + $memberProps = $phpcsFile->getMemberProperties($stackPtr); + } catch (RuntimeException) { + return; + } + if ($memberProps === []) { // Couldn't get any info about this variable, which // generally means it is invalid or possibly has a parse