1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-26 20:34:47 +01:00

psalm-internal - prevent static call to psalm-internal class from other namespace

This commit is contained in:
Barney Laurance 2019-05-11 14:58:53 +01:00 committed by Matthew Brown
parent 4415ef0dbd
commit 059d1ef177
2 changed files with 69 additions and 51 deletions

View File

@ -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

View File

@ -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();
// }
// }