コード例 #1
0
 public function generateNewInstance($domainName, CodeWriter $writer)
 {
     $type = $this->reflection->get($domainName);
     $ctor = $type->getConstructor();
     $writer->write('return self::bind(');
     $writer->indent();
     $writer->writeln('$d, ');
     $writer->write('new ', $domainName, "(");
     if ($ctor && $ctor->getParameters()) {
         $parameters = $ctor->getParameters();
         if ($parameters) {
             $writer->indent();
             $this->writeParameter(array_shift($parameters), $writer);
             foreach ($parameters as $parameter) {
                 $writer->writeln(", ");
                 $this->writeParameter($parameter, $writer);
             }
             $writer->outdent();
         }
     }
     $writer->writeln('), ');
     $writer->write('$b');
     $writer->outdent();
     $writer->write(');');
 }
コード例 #2
0
 public function generate(CodeWriter $writer)
 {
     $actions = $names = $methods = $staticPaths = $regexPaths = $prefixPaths = [];
     $ajax = [true => [], false => []];
     foreach ($this->scanner->scan() as $i => $mapping) {
         $route = $mapping->route;
         $action = $mapping->action;
         if ($this->compiler->checkSymbol($route->value)) {
             $pattern = $this->compiler->compile($route->value);
             $regexPaths[$i] = $pattern;
             $prefix = strtok($route->value, "*{(");
             $prefixPaths[$prefix][$i] = 1;
         } else {
             $staticPaths[$route->value][$i] = 1;
         }
         $actions[$i] = $action;
         foreach ((array) $route->method as $method) {
             $methods[$method][$i] = 1;
         }
         if ($route->ajax === null) {
             $ajax[true][$i] = $ajax[false][$i] = 1;
         } else {
             $ajax[$route->ajax][$i] = 1;
         }
         if ($route->name) {
             $name = ["params" => array_values($this->compiler->parse($route->value)), "uri" => preg_replace('/\\{\\$(.*?)\\}/', '$1', $route->value)];
             $names[$route->name] = $name;
         }
     }
     $writer->write("function __construct() {");
     $writer->indent();
     $writer->write("parent::__construct(");
     $writer->indent();
     $writer->writeln(var_export($names, true), ", ");
     $writer->writeln(var_export($actions, true), ", ");
     $writer->writeln("new MethodIndex(", var_export($methods, true), "), ");
     $writer->writeln("new AjaxIndex(", var_export($ajax, true), "), ");
     $writer->writeln("new StaticPathIndex(", var_export($staticPaths, true), "), ");
     $writer->writeln("new PrefixPathIndex(", var_export($prefixPaths, true), "), ");
     $writer->write("new RegexPathIndex(", var_export($regexPaths, true), ")");
     $writer->outdent();
     $writer->write(");");
     $writer->outdent();
     $writer->writeln("}");
 }
コード例 #3
0
ファイル: LazyGenerator.php プロジェクト: spotframework/spot
 public function generate(Type $type, CodeWriter $writer)
 {
     $writer->writeln('public $i, $k, $d;');
     $writer->write('function __construct(Spot\\Inject\\Injector $i, Spot\\Inject\\Key $k) {');
     $writer->indent();
     $writer->write('$this->i = $i;');
     $writer->write('$this->k = $k;');
     $writer->outdent();
     $writer->writeln('}');
     $writer->write("function __() {");
     $writer->indent();
     $writer->write('return $this->d ?: $this->d = $this->i->get($this->k);');
     $writer->outdent();
     $writer->write("}");
     foreach ($type->getMethods(Method::IS_PUBLIC) as $method) {
         if (!$method->isConstructor()) {
             $this->generateMethod($method, $writer);
         }
     }
 }
コード例 #4
0
ファイル: BinderFactory.php プロジェクト: spotframework/spot
 public function getBinder($domainName)
 {
     $binder = "DomainBinder__" . md5($domainName);
     if ($this->storage->load($binder)) {
         return $binder;
     }
     $writer = new CodeWriter();
     $writer->write("class ", $binder, "{");
     $writer->indent();
     $writer->write('static function newInstance($d, $n, $b) {');
     $writer->indent();
     $this->gen->generateNewInstance($domainName, $writer);
     $writer->outdent();
     $writer->writeln("}");
     $writer->write('static function bind($d, $i, $b) {');
     $writer->indent();
     $this->gen->generateBind($domainName, $writer);
     $writer->outdent();
     $writer->writeln("}");
     $writer->outdent();
     $writer->write("}");
     $this->storage->store($binder, $writer);
     return $binder;
 }
コード例 #5
0
 public function get(Modules $modules)
 {
     $adapter = "ModulesAdapter__" . $modules->hash();
     if ($this->storage->load($adapter)) {
         return $adapter;
     }
     $this->builder->build();
     $writer = new CodeWriter();
     $writer->write("class ", $adapter, " {");
     $writer->indent();
     $writer->write("const SINGLETONS_SIZE = ", $this->singletons->getSize(), ";");
     $writer->outdent();
     $writer->write("}");
     $this->storage->store($adapter, $writer);
     return $adapter;
 }
コード例 #6
0
ファイル: MethodFactory.php プロジェクト: spotframework/spot
 public function get(array $action)
 {
     $adapter = "ActionAdapter__" . md5("{$action[0]}::{$action[1]}");
     if ($this->storage->load($adapter)) {
         return $adapter;
     }
     $method = $this->reflection->get($action[0])->getMethod($action[1]);
     $writer = new CodeWriter();
     $writer->write("class ", $adapter, " {");
     $writer->indent();
     $method->isStatic() ? $this->static->generate($method, $writer) : $this->instance->generate($method, $writer);
     $writer->outdent();
     $writer->writeln("}");
     $this->storage->store($adapter, $writer);
     return $adapter;
 }
コード例 #7
0
 public function generate(Method $method, CodeWriter $writer)
 {
     $writer->write('static function invoke($i, $d, $rq, $rp) {');
     $writer->indent();
     $writer->write("return ");
     $this->generateMethodCall($method, $writer);
     $writer->write("(");
     $parameters = $method->getParameters();
     if ($parameters) {
         $this->generateParameter(array_shift($parameters), $writer);
         foreach ($parameters as $parameter) {
             $writer->writeln(', ');
             $this->generateParameter($parameter, $writer);
         }
     }
     $writer->write(");");
     $writer->outdent();
     $writer->write("}");
 }
コード例 #8
0
 public function get()
 {
     $router = "InvertedIndex__{$this->hash}";
     if ($this->storage->load($router)) {
         return new $router();
     }
     $writer = new CodeWriter();
     $writer->writeln("use Spot\\App\\Web\\Impl\\Router\\InvertedIndexRouter;");
     $writer->writeln("use Spot\\App\\Web\\Impl\\Router\\InvertedIndex\\MethodIndex;");
     $writer->writeln("use Spot\\App\\Web\\Impl\\Router\\InvertedIndex\\AjaxIndex;");
     $writer->writeln("use Spot\\App\\Web\\Impl\\Router\\InvertedIndex\\StaticPathIndex;");
     $writer->writeln("use Spot\\App\\Web\\Impl\\Router\\InvertedIndex\\PrefixPathIndex;");
     $writer->writeln("use Spot\\App\\Web\\Impl\\Router\\InvertedIndex\\RegexPathIndex;");
     $writer->write("class ", $router, " extends InvertedIndexRouter {");
     $writer->indent();
     $this->gen->generate($writer);
     $writer->outdent();
     $writer->writeln("}");
     $this->storage->store($router, $writer);
     return new $router();
 }
コード例 #9
0
ファイル: ProxyGenerator.php プロジェクト: spotframework/spot
 public function generate(Type $type, CodeWriter $writer)
 {
     $writer->write('function __construct($s, $m, $i, $r, $d) {');
     $writer->indent();
     $writer->writeln('$this->s = $s;');
     $writer->writeln('$this->m = $m;');
     $writer->writeln('$this->i = $i;');
     $writer->writeln('$this->r = $r;');
     $writer->write('$this->d = $d;');
     $writer->outdent();
     $writer->writeln("}");
     foreach ($type->getMethods(Method::IS_PUBLIC) as $method) {
         if ($method->isConstructor()) {
             continue;
         }
         if ($this->pointCuts->matches($method)) {
             $this->generateMethod($method, $this->pointCuts->getAdvices($method), $writer);
         } else {
             $this->generateDelegateMethod($method, $writer);
         }
     }
 }