From 2c764932302cf0843153e5f2885e7a8dbad3d010 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Sun, 18 May 2025 17:19:13 +0200 Subject: [PATCH 1/3] Handle class without namespace --- .../RestrictedInternalUsageHelper.php | 6 ++- ...nternalClassConstantUsageExtensionTest.php | 10 +++++ ...rictedInternalMethodUsageExtensionTest.php | 10 +++++ ...InternalStaticMethodUsageExtensionTest.php | 10 +++++ .../Rules/InternalTag/data/no-namespace.php | 43 +++++++++++++++++++ 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 tests/PHPStan/Rules/InternalTag/data/no-namespace.php diff --git a/src/Rules/InternalTag/RestrictedInternalUsageHelper.php b/src/Rules/InternalTag/RestrictedInternalUsageHelper.php index 1767c02fbb..d2a19f78ef 100644 --- a/src/Rules/InternalTag/RestrictedInternalUsageHelper.php +++ b/src/Rules/InternalTag/RestrictedInternalUsageHelper.php @@ -13,12 +13,14 @@ final class RestrictedInternalUsageHelper public function shouldBeReported(Scope $scope, string $name): bool { $currentNamespace = $scope->getNamespace(); - $namespace = array_slice(explode('\\', $name), 0, -1)[0] ?? null; if ($currentNamespace === null) { - return true; + $currentClass = $scope->getClassReflection()?->getName(); + + return $currentClass !== $name; } $currentNamespace = explode('\\', $currentNamespace)[0]; + $namespace = array_slice(explode('\\', $name), 0, -1)[0] ?? null; return !str_starts_with($namespace . '\\', $currentNamespace . '\\'); } diff --git a/tests/PHPStan/Rules/InternalTag/RestrictedInternalClassConstantUsageExtensionTest.php b/tests/PHPStan/Rules/InternalTag/RestrictedInternalClassConstantUsageExtensionTest.php index 209c7304e1..a9e89567ca 100644 --- a/tests/PHPStan/Rules/InternalTag/RestrictedInternalClassConstantUsageExtensionTest.php +++ b/tests/PHPStan/Rules/InternalTag/RestrictedInternalClassConstantUsageExtensionTest.php @@ -77,4 +77,14 @@ public function testBug12951(): void ]); } + public function testNoNamespace(): void + { + $this->analyse([__DIR__ . '/data/no-namespace.php'], [ + [ + 'Access to internal constant ClassInternal::INTERNAL_CONSTANT.', + 41, + ], + ]); + } + } diff --git a/tests/PHPStan/Rules/InternalTag/RestrictedInternalMethodUsageExtensionTest.php b/tests/PHPStan/Rules/InternalTag/RestrictedInternalMethodUsageExtensionTest.php index 8605c44c9b..e93244e845 100644 --- a/tests/PHPStan/Rules/InternalTag/RestrictedInternalMethodUsageExtensionTest.php +++ b/tests/PHPStan/Rules/InternalTag/RestrictedInternalMethodUsageExtensionTest.php @@ -56,4 +56,14 @@ public function testRule(): void ]); } + public function testNoNamespace(): void + { + $this->analyse([__DIR__ . '/data/no-namespace.php'], [ + [ + 'Call to internal method ClassInternal::internalMethod().', + 38, + ], + ]); + } + } diff --git a/tests/PHPStan/Rules/InternalTag/RestrictedInternalStaticMethodUsageExtensionTest.php b/tests/PHPStan/Rules/InternalTag/RestrictedInternalStaticMethodUsageExtensionTest.php index 0f73bf967a..72f38a688c 100644 --- a/tests/PHPStan/Rules/InternalTag/RestrictedInternalStaticMethodUsageExtensionTest.php +++ b/tests/PHPStan/Rules/InternalTag/RestrictedInternalStaticMethodUsageExtensionTest.php @@ -66,4 +66,14 @@ public function testStaticMethodCallOnInternalSubclass(): void ]); } + public function testNoNamespace(): void + { + $this->analyse([__DIR__ . '/data/no-namespace.php'], [ + [ + 'Call to internal static method ClassInternal::internalStaticMethod().', + 39, + ], + ]); + } + } diff --git a/tests/PHPStan/Rules/InternalTag/data/no-namespace.php b/tests/PHPStan/Rules/InternalTag/data/no-namespace.php new file mode 100644 index 0000000000..bad1525561 --- /dev/null +++ b/tests/PHPStan/Rules/InternalTag/data/no-namespace.php @@ -0,0 +1,43 @@ +internalMethod(); + self::internalStaticMethod(); + + return self::INTERNAL_CONSTANT; + } +} + +class ClassAccessOnInternal { + protected function getFoo(): string + { + $classInternal = new ClassInternal(); + $classInternal->internalMethod(); + ClassInternal::internalStaticMethod(); + + return ClassInternal::INTERNAL_CONSTANT; + } +} From 6d9a964dce32dbd3fb7d4f938873685902586ade Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Sun, 18 May 2025 17:29:26 +0200 Subject: [PATCH 2/3] PHP 7.4 compatibility --- src/Rules/InternalTag/RestrictedInternalUsageHelper.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Rules/InternalTag/RestrictedInternalUsageHelper.php b/src/Rules/InternalTag/RestrictedInternalUsageHelper.php index d2a19f78ef..80e317c2a8 100644 --- a/src/Rules/InternalTag/RestrictedInternalUsageHelper.php +++ b/src/Rules/InternalTag/RestrictedInternalUsageHelper.php @@ -14,9 +14,12 @@ public function shouldBeReported(Scope $scope, string $name): bool { $currentNamespace = $scope->getNamespace(); if ($currentNamespace === null) { - $currentClass = $scope->getClassReflection()?->getName(); + $classReflection = $scope->getClassReflection(); + if (null === $classReflection) { + return true; + } - return $currentClass !== $name; + return $classReflection->getName() !== $name; } $currentNamespace = explode('\\', $currentNamespace)[0]; From 019efe7208dae7ce8c0c7695d179304587ba8b4e Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Sun, 18 May 2025 17:36:38 +0200 Subject: [PATCH 3/3] Fix cs --- src/Rules/InternalTag/RestrictedInternalUsageHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Rules/InternalTag/RestrictedInternalUsageHelper.php b/src/Rules/InternalTag/RestrictedInternalUsageHelper.php index 80e317c2a8..280debfe70 100644 --- a/src/Rules/InternalTag/RestrictedInternalUsageHelper.php +++ b/src/Rules/InternalTag/RestrictedInternalUsageHelper.php @@ -15,7 +15,7 @@ public function shouldBeReported(Scope $scope, string $name): bool $currentNamespace = $scope->getNamespace(); if ($currentNamespace === null) { $classReflection = $scope->getClassReflection(); - if (null === $classReflection) { + if ($classReflection === null) { return true; }