eventDispatcher = $eventDispatcher; } /** * @param array $flatConstants */ public function build(LineStream $lineStream, RootNode $ast, array $flatConstants = []): RootNode { $this->flatConstants = $flatConstants; $currentObjectPath = new CurrentObjectPath($ast); $currentObjectPathStack = new CurrentObjectPathStack(); $currentObjectPathStack->push($currentObjectPath); foreach ($lineStream->getNextLine() as $line) { if ($line instanceof IdentifierAssignmentLine) { // "foo = bar" and "foo ( bar )": Single and multi line assignments $this->handleIdentifierAssignmentLine($line, $currentObjectPath); } elseif ($line instanceof IdentifierBlockOpenLine) { // "foo {": Opening a block - push to object path stack $node = $this->getOrAddNodeFromIdentifierStream($currentObjectPath, $line->getIdentifierTokenStream()); $currentObjectPath = (new CurrentObjectPath($node)); $currentObjectPathStack->push($currentObjectPath); } elseif ($line instanceof BlockCloseLine) { // "}": Closing a block - pop from object path stack $currentObjectPath = $currentObjectPathStack->pop(); } elseif ($line instanceof IdentifierUnsetLine) { // "foo >": Remove a path $this->handleIdentifierUnsetLine($line, $currentObjectPath); } elseif ($line instanceof IdentifierCopyLine) { // "foo < bar": Copy a node source path to a target path $this->handleIdentifierCopyLine($line, $ast, $currentObjectPath); } elseif ($line instanceof IdentifierFunctionLine) { // "foo := addToList(42)": Evaluate functions $node = $this->getOrAddNodeFromIdentifierStream($currentObjectPath, $line->getIdentifierTokenStream()); $node->setValue($this->evaluateValueModifier($line->getFunctionNameToken(), $line->getFunctionValueTokenStream(), $node->getValue())); } elseif ($line instanceof IdentifierReferenceLine) { // "foo =< bar": Prepare a reference resolving $this->handleIdentifierReferenceLine($line, $currentObjectPath); } } return $ast; } private function handleIdentifierAssignmentLine(IdentifierAssignmentLine $line, CurrentObjectPath $currentObjectPath): void { $node = $this->getOrAddNodeFromIdentifierStream($currentObjectPath, $line->getIdentifierTokenStream()); $valueTokenStream = $line->getValueTokenStream(); if ($valueTokenStream instanceof ConstantAwareTokenStream) { $valueTokenStream = clone $valueTokenStream; $valueTokenStream->setFlatConstants($this->flatConstants); $node->setValue((string)$valueTokenStream); return; } $node->setValue((string)$valueTokenStream); } }