diff --git a/src/Rules/InternalTag/RestrictedInternalUsageHelper.php b/src/Rules/InternalTag/RestrictedInternalUsageHelper.php index 1767c02fbb..280debfe70 100644 --- a/src/Rules/InternalTag/RestrictedInternalUsageHelper.php +++ b/src/Rules/InternalTag/RestrictedInternalUsageHelper.php @@ -13,12 +13,17 @@ 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; + $classReflection = $scope->getClassReflection(); + if ($classReflection === null) { + return true; + } + + return $classReflection->getName() !== $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; + } +}