PropertyAst.php
<?php
namespace Tlf\Lexer\Ast;
class PropertyAst extends \Tlf\Lexer\Ast {
public function getTree($sourceTree = null){
$val = $this->get('value') ?? [];
foreach ($val as $i=>$v){
if (is_object($v)){
$val[$i] = $v->getTree();
}
}
return $val;
}
public function getCode(string $language): string{
//var_dump($this);
//exit;
$code = '';
switch($language){
case 'php':
$code = $this->get_php_code();
break;
case 'javascript':
$code = $this->get_javascript_code();
break;
default:
throw new \Exception("Language '$language' is not valid");
}
return $code;
}
public function get_php_code(): string {
$t = (object)$this->_tree;
//var_dump($t);
//exit;
//$definition = <<<PHP
//$modifiers $type \$$name $set $value;
//PHP;
$parts = [];
foreach ($t->modifiers as $m){
$parts[] = $m;
}
if (!empty($m->datatype))$parts[] = $m->datatype;
$parts[] = "\${$t->name}";
if (isset($t->value))$parts[] = "= ".var_export($t->value,true);
$statement = implode(" ",$parts);
$docblock = "";
if (!empty($t->docblock)&&$t->docblock!=[]){
$docblock = new DocblockAst($t->docblock['type'], $t->docblock);
$statement = $docblock->get_php_code() . "\n" . $statement;
}
$statement .= ";";
return $statement;
}
public function get_javascript_code(): string {
$t = (object)$this->_tree;
//var_dump($t);
//exit;
//$definition = <<<PHP
//$modifiers $type \$$name $set $value;
//PHP;
$statement = "";
$errors = [];
$parts = [];
foreach ($t->modifiers as $m){
$errors[] = "\n//ERROR, TODO: property modifier '{$m}' cannot be output as javascript code on property {$t->name}.";
}
if (!empty($m->datatype))$errors[] = "\n//ERROR, TODO: datatype '{$t->datatype}' cannot be output in javascript on property {$t->name}";
$parts[] = "{$t->name}";
if (isset($t->value))$parts[] = "= ".var_export($t->value, true);
$docbloc_code = "";
if (!empty($t->docblock)&&$t->docblock!=[]){
$docblock = new DocblockAst($t->docblock['type'], $t->docblock);
$docbloc_code = $docblock->get_javascript_code();
}
$statement =
implode("\n", $errors)."\n"
.$docbloc_code."\n"
.implode(" ",$parts)
.';';
return $statement;
}
}