diff --git a/src/Psalm/Internal/Analyzer/TraitAnalyzer.php b/src/Psalm/Internal/Analyzer/TraitAnalyzer.php index 815c9e11ecc..ac3222dac23 100644 --- a/src/Psalm/Internal/Analyzer/TraitAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/TraitAnalyzer.php @@ -67,7 +67,14 @@ public function getAliasedClassesFlippedReplaceable(): array public static function analyze(StatementsAnalyzer $statements_analyzer, Trait_ $stmt, Context $context): void { assert($stmt->name !== null); - $storage = $statements_analyzer->getCodebase()->classlike_storage_provider->get($stmt->name->name); + $codebase = $statements_analyzer->getCodebase(); + + if (!$codebase->classlike_storage_provider->has($stmt->name->name)) { + return; + } + + $storage = $codebase->classlike_storage_provider->get($stmt->name->name); + AttributesAnalyzer::analyze( $statements_analyzer, $context, diff --git a/tests/TraitTest.php b/tests/TraitTest.php index a4fa27e9e3a..68e61d23b65 100644 --- a/tests/TraitTest.php +++ b/tests/TraitTest.php @@ -996,6 +996,14 @@ final class A { #[Attribute] trait Foo {}', ], + 'noCrashOnConditionalTrait' => [ + 'code' => '