|
5 | 5 | namespace Psalm\Internal\Codebase; |
6 | 6 |
|
7 | 7 | use BackedEnum; |
8 | | -use Exception; |
9 | 8 | use InvalidArgumentException; |
10 | 9 | use Psalm\Internal\Analyzer\ClassLikeAnalyzer; |
11 | 10 | use Psalm\Internal\MethodIdentifier; |
12 | 11 | use Psalm\Internal\Provider\ClassLikeStorageProvider; |
13 | 12 | use Psalm\Internal\Provider\FileReferenceProvider; |
14 | 13 | use Psalm\Internal\Provider\FileStorageProvider; |
15 | 14 | use Psalm\Issue\CircularReference; |
| 15 | +use Psalm\Issue\UndefinedTrait; |
16 | 16 | use Psalm\IssueBuffer; |
17 | 17 | use Psalm\Progress\Progress; |
18 | 18 | use Psalm\Storage\ClassConstantStorage; |
@@ -440,7 +440,7 @@ private function populateDataFromTrait( |
440 | 440 | $storage->pseudo_property_set_types += $trait_storage->pseudo_property_set_types; |
441 | 441 |
|
442 | 442 | $storage->pseudo_static_methods += $trait_storage->pseudo_static_methods; |
443 | | - |
| 443 | + |
444 | 444 | $storage->pseudo_methods += $trait_storage->pseudo_methods; |
445 | 445 | $storage->declaring_pseudo_method_ids += $trait_storage->declaring_pseudo_method_ids; |
446 | 446 | } |
@@ -876,8 +876,29 @@ private function inheritConstantsFromTrait( |
876 | 876 | ClassLikeStorage $trait_storage, |
877 | 877 | ): void { |
878 | 878 | if (!$trait_storage->is_trait) { |
879 | | - throw new Exception('Class like storage is not for a trait.'); |
| 879 | + $location = $storage->location ?? $storage->stmt_location; |
| 880 | + if (!$location) { |
| 881 | + return; |
| 882 | + } |
| 883 | + |
| 884 | + $trait_real_type = 'Class'; |
| 885 | + if ($trait_storage->is_enum) { |
| 886 | + $trait_real_type = 'Enum'; |
| 887 | + } elseif ($trait_storage->is_interface) { |
| 888 | + $trait_real_type = 'Interface'; |
| 889 | + } |
| 890 | + |
| 891 | + IssueBuffer::maybeAdd( |
| 892 | + new UndefinedTrait( |
| 893 | + $trait_real_type . ' ' . $trait_storage->name . ' is not a trait', |
| 894 | + $location, |
| 895 | + ), |
| 896 | + $storage->suppressed_issues, |
| 897 | + ); |
| 898 | + |
| 899 | + return; |
880 | 900 | } |
| 901 | + |
881 | 902 | foreach ($trait_storage->constants as $constant_name => $class_constant_storage) { |
882 | 903 | $trait_alias_map_cased = array_flip($storage->trait_alias_map_cased); |
883 | 904 | if (isset($trait_alias_map_cased[$constant_name])) { |
|
0 commit comments