Browse Source

Add an `addCondition` method to compiler for calling from functions

master
Adam Pippin 3 years ago
parent
commit
f58cd9129d
  1. 36
      app/Cfnpp/Compiler.php

36
app/Cfnpp/Compiler.php

@ -41,6 +41,13 @@ class Compiler implements \App\Engine\ICompile
*/ */
protected $merge_functions; protected $merge_functions;
/**
* Stores current state of the document so it can be mutated mid-pass.
*
* @var Document
*/
protected $document;
/** /**
* Register a function that can be called by the document. * Register a function that can be called by the document.
* *
@ -66,6 +73,19 @@ class Compiler implements \App\Engine\ICompile
$this->merge_functions[$name] = $callback; $this->merge_functions[$name] = $callback;
} }
public function addCondition(string $name, Node $node): void
{
$conditions = $this->document->getChildByName('Conditions');
if (!isset($conditions))
{
$conditions = new Node($this->document, 'Conditions');
$this->document->addChild($conditions);
}
$node->setName($name);
$conditions->addChild($node);
}
/** /**
* Compile a set of documents and return the result. * Compile a set of documents and return the result.
* *
@ -81,7 +101,7 @@ class Compiler implements \App\Engine\ICompile
} }
// Initialize state // Initialize state
$document = null; $this->document = null;
$this->functions = []; $this->functions = [];
$this->merge_functions = []; $this->merge_functions = [];
@ -89,11 +109,11 @@ class Compiler implements \App\Engine\ICompile
$cfnpp_functions = new Functions($this, $options); $cfnpp_functions = new Functions($this, $options);
$cfnpp_functions->register($this); $cfnpp_functions->register($this);
$document = $this->pass_0($documents, $options); $this->document = $this->pass_0($documents, $options);
$this->pass_1($document, $options); $this->pass_1($this->document, $options);
$this->pass_2($document, $options); $this->pass_2($this->document, $options);
return $document; return $this->document;
// Process each passed document // Process each passed document
/* /*
@ -207,7 +227,7 @@ class Compiler implements \App\Engine\ICompile
{ {
if (isset($nodes[$variable_node->getName()])) if (isset($nodes[$variable_node->getName()]))
{ {
throw new \Exception("Variables and parameters cannot share the same name."); throw new \Exception('Variables and parameters cannot share the same name.');
} }
$nodes[$variable_node->getName()] = $variable_node; $nodes[$variable_node->getName()] = $variable_node;
$graph->add($variable_node->getName(), $this->pass_1_getDependencies($variable_node)); $graph->add($variable_node->getName(), $this->pass_1_getDependencies($variable_node));
@ -230,7 +250,7 @@ class Compiler implements \App\Engine\ICompile
$options->setParameter($parameter_node->getName(), Node::toPhp($parameter_node)); $options->setParameter($parameter_node->getName(), Node::toPhp($parameter_node));
} }
} }
else if ($type == 'variables') elseif ($type == 'variables')
{ {
$variable_node = $variables_node->getChildByName($node_name); $variable_node = $variables_node->getChildByName($node_name);
if (isset($variable_node)) if (isset($variable_node))
@ -269,7 +289,7 @@ class Compiler implements \App\Engine\ICompile
{ {
$variables[] = $node->getValue(); $variables[] = $node->getValue();
} }
else if ($node instanceof NodeFunctionValue && elseif ($node instanceof NodeFunctionValue &&
$node->getName() == 'param') $node->getName() == 'param')
{ {
$variables[] = $node->getValue(); $variables[] = $node->getValue();

Loading…
Cancel
Save