mirror of
https://github.com/danog/psalm.git
synced 2024-11-30 04:39:00 +01:00
psalm-internal - prevent static call to psalm-internal class from other namespace
This commit is contained in:
parent
4415ef0dbd
commit
059d1ef177
@ -579,6 +579,24 @@ class StaticCallAnalyzer extends \Psalm\Internal\Analyzer\Statements\Expression\
|
||||
}
|
||||
}
|
||||
|
||||
if($class_storage->psalmInternal){
|
||||
xdebug_break();
|
||||
}
|
||||
if ($class_storage->psalmInternal
|
||||
&& $context->self
|
||||
&& strpos($context->self, trim($class_storage->psalmInternal, '\\') . '\\') !== 0
|
||||
) {
|
||||
if (IssueBuffer::accepts(
|
||||
new InternalClass(
|
||||
$fq_class_name . ' is marked internal to ' . $class_storage->psalmInternal,
|
||||
new CodeLocation($statements_analyzer->getSource(), $stmt)
|
||||
),
|
||||
$statements_analyzer->getSuppressedIssues()
|
||||
)) {
|
||||
// fall through
|
||||
}
|
||||
}
|
||||
|
||||
if ($class_storage->internal
|
||||
&& $context->self
|
||||
&& !$context->collect_initializations
|
||||
|
@ -16,44 +16,44 @@ class PsalmInternalAnnotationTest extends TestCase
|
||||
return [
|
||||
// 'internalMethodWithCall' => [
|
||||
// '<?php
|
||||
// namespace A {
|
||||
// namespace A\B {
|
||||
// class Foo {
|
||||
// /**
|
||||
// * @psalm-internal
|
||||
// * @psalm-internal A\B
|
||||
// */
|
||||
// public static function barBar(): void {
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// namespace A\B {
|
||||
// namespace A\B\C {
|
||||
// class Bat {
|
||||
// public function batBat() : void {
|
||||
// \A\Foo::barBar();
|
||||
// }
|
||||
// }
|
||||
// }',
|
||||
// ],
|
||||
// 'internalClassWithStaticCall' => [
|
||||
// '<?php
|
||||
// namespace A {
|
||||
// /**
|
||||
// * @psalm-internal
|
||||
// */
|
||||
// class Foo {
|
||||
// public static function barBar(): void {
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// namespace A\B {
|
||||
// class Bat {
|
||||
// public function batBat() : void {
|
||||
// \A\Foo::barBar();
|
||||
// \A\B\Foo::barBar();
|
||||
// }
|
||||
// }
|
||||
// }',
|
||||
// ],
|
||||
'internalClassWithStaticCall' => [
|
||||
'<?php
|
||||
namespace A {
|
||||
/**
|
||||
* @psalm-internal
|
||||
*/
|
||||
class Foo {
|
||||
public static function barBar(): void {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace A\B {
|
||||
class Bat {
|
||||
public function batBat() : void {
|
||||
\A\Foo::barBar();
|
||||
}
|
||||
}
|
||||
}',
|
||||
],
|
||||
// 'internalClassExtendingNamespaceWithStaticCall' => [
|
||||
// '<?php
|
||||
// namespace A {
|
||||
@ -187,46 +187,46 @@ class PsalmInternalAnnotationTest extends TestCase
|
||||
return [
|
||||
// 'internalMethodWithCall' => [
|
||||
// '<?php
|
||||
// namespace A {
|
||||
// namespace A\B {
|
||||
// class Foo {
|
||||
// /**
|
||||
// * @psalm-internal
|
||||
// * @psalm-internal A\B
|
||||
// */
|
||||
// public static function barBar(): void {
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// namespace B {
|
||||
// namespace A\C {
|
||||
// class Bat {
|
||||
// public function batBat() {
|
||||
// \A\Foo::barBar();
|
||||
// public function batBat(): void {
|
||||
// \A\B\Foo::barBar();
|
||||
// }
|
||||
// }
|
||||
// }',
|
||||
// 'error_message' => 'InternalMethod',
|
||||
// ],
|
||||
// 'internalClassWithStaticCall' => [
|
||||
// '<?php
|
||||
// namespace A {
|
||||
// /**
|
||||
// * @psalm-internal
|
||||
// */
|
||||
// class Foo {
|
||||
// public static function barBar(): void {
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// namespace B {
|
||||
// class Bat {
|
||||
// public function batBat() {
|
||||
// \A\Foo::barBar();
|
||||
// }
|
||||
// }
|
||||
// }',
|
||||
// 'error_message' => 'InternalClass',
|
||||
// ],
|
||||
'internalClassWithStaticCall' => [
|
||||
'<?php
|
||||
namespace A\B {
|
||||
/**
|
||||
* @psalm-internal A\B
|
||||
*/
|
||||
class Foo {
|
||||
public static function barBar(): void {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace A\C {
|
||||
class Bat {
|
||||
public function batBat(): void {
|
||||
\A\B\Foo::barBar();
|
||||
}
|
||||
}
|
||||
}',
|
||||
'error_message' => 'InternalClass',
|
||||
],
|
||||
// 'internalClassWithNew' => [
|
||||
// '<?php
|
||||
// namespace A {
|
||||
@ -238,7 +238,7 @@ class PsalmInternalAnnotationTest extends TestCase
|
||||
//
|
||||
// namespace B {
|
||||
// class Bat {
|
||||
// public function batBat() {
|
||||
// public function batBat(): void {
|
||||
// $a = new \A\Foo();
|
||||
// }
|
||||
// }
|
||||
|
Loading…
Reference in New Issue
Block a user