1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-30 04:39:00 +01:00

document that @psalm-internal works for namespace + class too

as used in https://github.com/vimeo/psalm/issues/9584
This commit is contained in:
kkmuffme 2024-03-27 23:44:34 +01:00
parent 4b01704558
commit c8f0671b33
2 changed files with 158 additions and 5 deletions

View File

@ -252,9 +252,10 @@ $b = $a->bar(); // this call fails
### `@psalm-internal` ### `@psalm-internal`
Used to mark a class, property or function as internal to a given namespace. Psalm treats this slightly differently to Used to mark a class, property or function as internal to a given namespace or class or even method.
the PHPDoc `@internal` tag. For `@internal`, an issue is raised if the calling code is in a namespace completely Psalm treats this slightly differently to the PHPDoc `@internal` tag. For `@internal`,
unrelated to the namespace of the calling code, i.e. not sharing the first element of the namespace. an issue is raised if the calling code is in a namespace completely unrelated to the namespace of the calling code,
i.e. not sharing the first element of the namespace.
In contrast for `@psalm-internal`, the docblock line must specify a namespace. An issue is raised if the calling code In contrast for `@psalm-internal`, the docblock line must specify a namespace. An issue is raised if the calling code
is not within the given namespace. is not within the given namespace.
@ -272,7 +273,15 @@ namespace A\B {
namespace A\B\C { namespace A\B\C {
class Bat { class Bat {
public function batBat(): void { public function batBat(): void {
$a = new \A\B\Foo(); // this is fine $a = new \A\B\Foo(); // this is fine
}
}
}
namespace A {
class B {
public function batBat(): void {
$a = new \A\B\Foo(); // this is fine
} }
} }
} }
@ -280,7 +289,28 @@ namespace A\B\C {
namespace A\C { namespace A\C {
class Bat { class Bat {
public function batBat(): void { public function batBat(): void {
$a = new \A\B\Foo(); // error $a = new \A\B\Foo(); // error
}
}
}
namespace X {
class Foo {
/**
* @psalm-internal Y\Bat::batBat
*/
public static function barBar(): void {
}
}
}
namespace Y {
class Bat {
public function batBat() : void {
\X\Foo::barBar(); // this is fine
}
public function fooFoo(): void {
\X\Foo::barBar(); // error
} }
} }
} }

View File

@ -606,6 +606,66 @@ class InternalAnnotationTest extends TestCase
} }
', ',
], ],
'psalmInternalClassWithCallClass' => [
'code' => '<?php
namespace A {
/**
* @psalm-internal B\Bat
*/
class Foo {
public static function barBar(): void {
}
}
}
namespace B {
class Bat {
public function batBat() : void {
\A\Foo::barBar();
}
}
}',
],
'psalmInternalMethodWithCallClass' => [
'code' => '<?php
namespace A {
class Foo {
/**
* @psalm-internal B\Bat
*/
public static function barBar(): void {
}
}
}
namespace B {
class Bat {
public function batBat() : void {
\A\Foo::barBar();
}
}
}',
],
'psalmInternalMethodWithMethod' => [
'code' => '<?php
namespace X {
class Foo {
/**
* @psalm-internal Y\Bat::batBat
*/
public static function barBar(): void {
}
}
}
namespace Y {
class Bat {
public function batBat() : void {
\X\Foo::barBar();
}
}
}',
],
'callToInternalMethodFromAnonymousClass' => [ 'callToInternalMethodFromAnonymousClass' => [
'code' => <<<'PHP' 'code' => <<<'PHP'
<?php <?php
@ -1118,6 +1178,69 @@ class InternalAnnotationTest extends TestCase
', ',
'error_message' => 'InternalMethod', 'error_message' => 'InternalMethod',
], ],
'psalmInternalClassWithCallClass' => [
'code' => '<?php
namespace A {
/**
* @psalm-internal B\Bar
*/
class Foo {
public static function barBar(): void {
}
}
}
namespace B {
class Bat {
public function batBat() : void {
\A\Foo::barBar();
}
}
}',
'error_message' => 'InternalClass',
],
'psalmInternalMethodWithCallClass' => [
'code' => '<?php
namespace A {
class Foo {
/**
* @psalm-internal B\Bar
*/
public static function barBar(): void {
}
}
}
namespace B {
class Bat {
public function batBat() : void {
\A\Foo::barBar();
}
}
}',
'error_message' => 'InternalMethod',
],
'psalmInternalMethodWithMethod' => [
'code' => '<?php
namespace X {
class Foo {
/**
* @psalm-internal Y\Bat::batBat
*/
public static function barBar(): void {
}
}
}
namespace Y {
class Bat {
public function fooFoo(): void {
\X\Foo::barBar();
}
}
}',
'error_message' => 'InternalMethod',
],
]; ];
} }
} }