` operator. */ class PropertySource implements SourceInterface { /** * {@inheritdoc} */ public function appliesToKind(int $kinds): bool { return ($kinds & CompletionKind::OBJECT_PROPERTY) !== 0; } /** * {@inheritdoc} */ public function getCompletions(AnalysisResult $analysis): array { if (empty($analysis->leftSideTypes)) { return []; } $allCompletions = []; foreach ($analysis->leftSideTypes as $type) { try { $reflection = new \ReflectionClass($type); } catch (\ReflectionException $e) { continue; } $properties = $reflection->getProperties(\ReflectionProperty::IS_PUBLIC); foreach ($properties as $property) { $allCompletions[] = $property->getName(); } } // Return all properties (fuzzy matching in CompletionEngine will filter) $allCompletions = \array_unique($allCompletions); \sort($allCompletions); return $allCompletions; } }