- WIP on the exception handler

This commit is contained in:
Dave M. 2020-10-22 13:19:26 +00:00
parent 69db3efdce
commit 082bdd4ad3
3 changed files with 67 additions and 12 deletions

View File

@ -5,7 +5,6 @@ namespace %NAMESPACE%;
%USE%
# %PATHNAME%
if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) {
class %CLASSNAME% %EXTENDS% {
@ -28,6 +27,8 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) {
$this->exportFunctions();
static::$context = $picea->context;
$picea->declareLoadedTemplate(static::class, __FILE__);
}
public function output(array $variablesList = []) : void
@ -61,14 +62,14 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) {
%FUNCTIONS%
}
public function getSourceLineFromException(\Throwable $ex) : ? int
public static function getSourceLineFromException(int $sourceLine) : ? int
{
$sourceFile = file_get_contents("%TEMPLATE%");
if ( $sourceFile ) {
foreach(explode(PHP_EOL, $sourceFile) as $line => $content) {
if ( strpos($content, str_replace('$', '%', '$CONTENT$')) !== false ) {
return $ex->getLine() - $line;
return $sourceLine - $line;
}
}
}
@ -76,6 +77,16 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) {
return null;
}
public static function getParam(string $param) : ? string
{
return [
'classname' => "%CLASSNAME%",
'namespace' => "%NAMESPACE%",
'extends' => "%EXTENDS_TEMPLATE%",
'view' => "%FULLPATH%",
][$param] ?? null;
}
public function __invoke(array $variablesList = []) : string
{
ob_start();
@ -86,4 +97,5 @@ if (! class_exists("%NAMESPACE%\%CLASSNAME%", false) ) {
}
return [ 'classname' => "%CLASSNAME%", 'namespace' => "%NAMESPACE%", 'extends' => "%EXTENDS_TEMPLATE%", 'view' => "%FULLPATH%" ];
return [ 'classname' => %CLASSNAME%::getParam('classname'), 'namespace' => %CLASSNAME%::getParam('namespace'), 'extends' => %CLASSNAME%::getParam('extends'), 'view' => %CLASSNAME%::getParam('view') ];

View File

@ -79,6 +79,7 @@ class Compiler
public function registerSyntax(Syntax\Syntax $syntaxObject) : self
{
$this->syntaxObjectList[get_class($syntaxObject)] = $syntaxObject;
return $this;
}

View File

@ -28,6 +28,8 @@ class Picea implements LanguageRegistration
public bool $debug;
public array $loadedTemplateFile = [];
public function __construct(
? Closure $responseHtml = null,
? Compiler\Context $context = null,
@ -62,18 +64,54 @@ class Picea implements LanguageRegistration
}
catch(\Throwable $ex) {
# Temporary class for an experiment
throw new class($object, "An error occurred trying to render HTML view `$viewPath` : " . $ex->getMessage(), 911, $ex) extends \Exception {
public function __construct(object $compiledObject, string $message, int $code, \Throwable $previous)
throw new class($object, $this, "An error occurred trying to render HTML view `$viewPath` : " . $ex->getMessage(), 911, $ex) extends \Exception {
protected Picea $picea;
public function __construct(object $compiledObject, Picea $picea, string $message, int $code, \Throwable $previous)
{
parent::__construct($message, $code, $previous);
$classContent = include( $previous->getFile() );
$this->picea = $picea;
if ( is_array($classContent) ) {
$this->file = $classContent['view'];
$this->line = $compiledObject->getSourceLineFromException($previous);
}
# $template = $this->getTemplateFile( $previous->getFile() );
$this->fromPrevious($previous, $compiledObject);
}
protected function fromPrevious(\Throwable $previous, object $compiledObject) : void
{
$loadedTemplates = array_flip($this->picea->loadedTemplateFile);
foreach($previous->getTrace() as $trace) {
if ( isset($trace['file'], $loadedTemplates[$trace['file']]) ) {
$class = $loadedTemplates[ $trace['file'] ];
$content = include($trace['file']);
$this->file = $content['view'];
$this->line = $compiledObject->getSourceLineFromException($trace['line']);
return;
}
}
#if ( $template ) {
# $this->redefineErrorState($classContent);
#}
}
protected function getTemplateFile(string $filePath) : ? array
{
$content = null;
if ( is_array($content) && isset($content['classname'], $content['namespace'], $content['view'], $content['extends']) ) {
return $content;
}
return null;
}
};
}
}
@ -223,6 +261,11 @@ class Picea implements LanguageRegistration
$this->languageRegistration->registerExtension($compiler);
}
public function declareLoadedTemplate(string $className, string $filePath) : void
{
$this->loadedTemplateFile[$className] = $filePath;
}
protected function compileView(string $viewPath) : Compiler\Context
{
$tmpFolder = sys_get_temp_dir();
@ -233,7 +276,6 @@ class Picea implements LanguageRegistration
$context->filePath = $this->fileFetcher->getFilePath($viewPath);
$context = $builder->build($compiled['context'], $compiled['source']) ;
$context->classPath = $tmpFolder . DIRECTORY_SEPARATOR . $context->className . ".php";
if ( $context->extendFrom ) {
$this->compileView($context->extendFrom);