2015-02-05 15:32 GMT+03:00 Dmitry Stogov <[email protected]>:
> Hi Alexander,
>
> Defining contracts through doc-comments is also possible, but this way is
> not native.
> On the other hand, if you already have this implemented, we may just reuse
> it.
>
Thanks, Dmitry! This would be a really nice feature on engine-level.
Ideally, for PHP7-8, I would like to see a hook system from compile-level
to userland, to define a language extension. This feature is highly
required for custom DSLs and much more. DbC technique can be also
implemented as parse-time weaver. E.g. we define a parser-extension:
register_parser_extension(ContractExtension::class);
this class will receive an AST of PHP file and check interesting nodes.
This node can be annotation or something else:
[Contract::Invariant => $this->value > 0]
class Test {
public $value = 100;
public function foo($newValue) {
$this->value = $newValue;
}
}
and parser extension change the compiled source code by inserting this
check into methods:
[Contract::Invariant => $this->value > 0]
class Test {
public $value = 100;
public function foo($newValue) {
$this->value = $newValue;
assert($this->value > 0); // Inserted by parser extension (via
opcodes)
}
}
Is it possible to do this?