From 9b11614f1e0536e111b9524e14db30b282ff0f28 Mon Sep 17 00:00:00 2001 From: jens1o Date: Wed, 12 Apr 2017 09:56:59 +0200 Subject: [PATCH] :rocket: Support variable type hinting --- src/DefinitionResolver.php | 43 +++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/DefinitionResolver.php b/src/DefinitionResolver.php index bbf9076..1fde0b6 100644 --- a/src/DefinitionResolver.php +++ b/src/DefinitionResolver.php @@ -732,10 +732,12 @@ class DefinitionResolver // Use @param tag foreach ($docBlock->getTagsByName('param') as $paramTag) { if ($paramTag->getVariableName() === $node->name) { - if ($paramTag->getType() === null) { + $type = $paramTag->getType(); + + if ($type === null) { break; } - return $paramTag->getType(); + return $type; } } } @@ -759,6 +761,41 @@ class DefinitionResolver } return $type ?? new Types\Mixed; } + + if ($node instanceof Node\Var_) { + $docBlock = $node->getAttribute('docBlock'); + if ($docBlock !== null) { + // use @var tag + foreach($docBlock->getTagsByName('var') as $varTag) { + $type = $varTag->getType(); + + if($type === null) { + break; + } + return $type; + } + } + $type = null; + if ($node->type !== null) { + // Use PHP7 return type hint + if (is_string($node->type)) { + // Resolve a string like "bool" to a type object + $type = $this->typeResolver->resolve($node->type); + } else { + $type = new Types\Object_(new Fqsen('\\' . (string)$node->type)); + } + } + if ($node->default !== null) { + $defaultType = $this->resolveExpressionNodeToType($node->default); + if (isset($type) && !is_a($type, get_class($defaultType))) { + $type = new Types\Compound([$type, $defaultType]); + } else { + $type = $defaultType; + } + } + return $type ?? new Types\Mixed; + } + if ($node instanceof Node\FunctionLike) { // Functions/methods $docBlock = $node->getAttribute('docBlock'); @@ -887,6 +924,6 @@ class DefinitionResolver return null; } return (string)$node->args[0]->value->value; - } + } } }