From 5f8dabebe2ade11b5a1e7da8286954e4c13bacac Mon Sep 17 00:00:00 2001 From: Jitendra Adhikari Date: Sat, 25 Aug 2018 08:39:53 +0700 Subject: [PATCH] feat(util.meta): add method metadata util --- src/Util/Metadata.php | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/Util/Metadata.php b/src/Util/Metadata.php index 003358c..8699ac5 100644 --- a/src/Util/Metadata.php +++ b/src/Util/Metadata.php @@ -51,4 +51,43 @@ public function forReflectionClass(\ReflectionClass $class, bool $docblock = fal return $metadata; } + + public function forMethod(string $classFqcn, string $method, bool $docblock = false): array + { + $reflMethod = (new \ReflectionClass($classFqcn))->getMethod($method); + + return $this->forReflectionMethod($reflMethod); + } + + public function forReflectionMethod(\ReflectionMethod $method, bool $docblock = false): array + { + $params = []; + $parser = new DocBlock($method); + + foreach ($parser->find('param') as $param) { + $params[] = \preg_replace(['/(.*\$\w+)(.*)/', '/ +/'], ['$1', ' '], $param->getValue()); + } + + if (null !== $return = $parser->first('return')) { + $return = \preg_replace('/(\S+)(.*)/', '$1', $return->getValue()); + } + + $metadata = [ + 'isStatic' => $method->isStatic(), + 'isFinal' => $method->isFinal(), + 'isPublic' => $method->isPublic(), + 'isAbstract' => $method->isAbstract(), + 'params' => $params, + 'return' => $return, + ]; + + if ($docblock) { + $texts = $parser->texts(); + $title = \array_shift($texts); + + $metadata += \compact('title', 'texts'); + } + + return $metadata; + } }