final public static closure ( boolean $returnsReference, boolean $isStatic, array $parameterExpressions, array $usedVariables, array $bodyExpressions ) : |
||
$returnsReference | boolean | |
$isStatic | boolean | |
$parameterExpressions | array | |
$usedVariables | array | |
$bodyExpressions | array | |
Résultat |
private function recompile(Parsing\IFunctionReflection $reflection, Parsing\IFunctionStructure $structure, &$closureExpression = null) { $signature = $reflection->getSignature(); $usedVariables = array_map(function ($name) { return O\Expression::closureUsedVariable($name); }, $signature->getScopedVariableNames() ?: []); $closureExpression = O\Expression::closure($signature->returnsReference(), $reflection->getInnerReflection()->getClosureScopeClass() === null, $signature->getParameterExpressions(), $usedVariables, $structure->getBodyExpressions()); return $closureExpression->evaluate($reflection->asEvaluationContext()); }
/** * @dataProvider parsers */ public function testOnlyArraysByRef() { $this->assertParsedAs([$this->parameters, 'onlyArraysByRef'], [O\Expression::closure(false, false, [O\Expression::parameter('arguments', 'array', null, true, true)], [], [])]); }
private function parseClosureNode(Node\Expr\Closure $node) { $parameterExpressions = []; foreach ($node->params as $parameterNode) { $parameterExpressions[] = $this->parseParameterNode($parameterNode); } $usedVariables = []; foreach ($node->uses as $usedVariable) { $usedVariables[] = Expression::closureUsedVariable($usedVariable->var, $usedVariable->byRef); } $bodyExpressions = $this->parseNodes($node->stmts); return Expression::closure($node->byRef, $node->static, $parameterExpressions, $usedVariables, $bodyExpressions); }
public function expressions() { return [[O\Expression::arrayExpression([])], [O\Expression::arrayItem(null, O\Expression::value(0), false)], [O\Expression::assign(O\Expression::value(0), O\Operators\Assignment::EQUAL, O\Expression::value(0))], [O\Expression::binaryOperation(O\Expression::value(0), O\Operators\Binary::ADDITION, O\Expression::value(0))], [O\Expression::unaryOperation(O\Operators\Unary::PLUS, O\Expression::value(0))], [O\Expression::cast(O\Operators\Cast::STRING, O\Expression::value(0))], [O\Expression::closure(false, false, [], [], [])], [O\Expression::closureUsedVariable('var')], [O\Expression::emptyExpression(O\Expression::value(0))], [O\Expression::field(O\Expression::value(0), O\Expression::value(0))], [O\Expression::functionCall(O\Expression::value(0))], [O\Expression::index(O\Expression::value(0), O\Expression::value(0))], [O\Expression::invocation(O\Expression::value(0))], [O\Expression::issetExpression([O\Expression::value(0)])], [O\Expression::unsetExpression([O\Expression::value(0)])], [O\Expression::methodCall(O\Expression::value(0), O\Expression::value(0))], [O\Expression::newExpression(O\Expression::value(0))], [O\Expression::parameter('')], [O\Expression::argument(O\Expression::value(0))], [O\Expression::returnExpression()], [O\Expression::staticMethodCall(O\Expression::value(0), O\Expression::value(0))], [O\Expression::staticField(O\Expression::value(0), O\Expression::value(0))], [O\Expression::ternary(O\Expression::value(0), null, O\Expression::value(0))], [O\Expression::throwExpression(O\Expression::value(0))], [O\Expression::value(0)], [O\Expression::variable(O\Expression::value(0))], [O\Expression::constant('foo')], [O\Expression::classConstant(O\Expression::value(0), 'foo')]]; }
/** * @dataProvider parsers */ public function testThatChainedMethodCalls() { $this->assertReturn(function (\Pinq\ITraversable $traversable) { return $traversable->asArray(); }, O\Expression::methodCall(O\Expression::variable(O\Expression::value('traversable')), O\Expression::value('asArray'))); $this->assertReturn(function (\Pinq\ITraversable $traversable) { return $traversable->where(function ($i) { return $i > 0; })->all(function ($i) { return $i % 2 === 0; }); }, O\Expression::methodCall(O\Expression::methodCall(O\Expression::variable(O\Expression::value('traversable')), O\Expression::value('where'), [O\Expression::argument(O\Expression::closure(false, false, [O\Expression::parameter('i')], [], [O\Expression::returnExpression(O\Expression::binaryOperation(O\Expression::variable(O\Expression::value('i')), O\Operators\Binary::GREATER_THAN, O\Expression::value(0)))]))]), O\Expression::value('all'), [O\Expression::argument(O\Expression::closure(false, false, [O\Expression::parameter('i')], [], [O\Expression::returnExpression(O\Expression::binaryOperation(O\Expression::binaryOperation(O\Expression::variable(O\Expression::value('i')), O\Operators\Binary::MODULUS, O\Expression::value(2)), O\Operators\Binary::IDENTITY, O\Expression::value(0)))]))])); }