public function visitClosure(O\ClosureExpression $expression)
{
$originalContext = $this->analysisContext;
$this->analysisContext = $originalContext->inNewScope();
foreach ($expression->getParameters() as $parameter) {
$this->walk($parameter);
$typeHintType = $this->typeSystem->getTypeFromTypeHint($parameter->getTypeHint());
if (!$parameter->hasDefaultValue() || $this->analysis[$parameter->getDefaultValue()]->isEqualTo($typeHintType)) {
$this->analysisContext->setExpressionType($parameter->asVariable(), $typeHintType);
} else {
$this->analysisContext->setExpressionType($parameter->asVariable(), $this->typeSystem->getNativeType(INativeType::TYPE_MIXED));
}
}
foreach ($expression->getUsedVariables() as $usedVariable) {
$variable = $usedVariable->asVariable();
//TODO: handle references with used variables. Probably impossible though.
$this->analysisContext->setExpressionType($variable, $originalContext->getExpressionType($variable));
}
$this->walkAll($expression->getBodyExpressions());
$this->analysis[$expression] = $this->typeSystem->getObjectType('Closure');
$this->analysisContext = $originalContext;
}