Server IP : 127.0.0.2 / Your IP : 3.141.19.32 Web Server : Apache/2.4.18 (Ubuntu) System : User : www-data ( ) PHP Version : 7.0.33-0ubuntu0.16.04.16 Disable Function : disk_free_space,disk_total_space,diskfreespace,dl,exec,fpaththru,getmyuid,getmypid,highlight_file,ignore_user_abord,leak,listen,link,opcache_get_configuration,opcache_get_status,passthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,php_uname,phpinfo,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_times,posix_ttyname,posix_uname,pclose,popen,proc_open,proc_close,proc_get_status,proc_nice,proc_terminate,shell_exec,source,show_source,system,virtual MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /var/www/html/vendor/jeremeamia/superclosure/src/Analyzer/ |
Upload File : |
<?php namespace SuperClosure\Analyzer; use SuperClosure\Exception\ClosureAnalysisException; /** * This is the token based analyzer. * * We're using Uses reflection and tokenization to analyze a closure and * determine its code and context. This is much faster than the AST based * implementation. */ class TokenAnalyzer extends ClosureAnalyzer { public function determineCode(array &$data) { $this->determineTokens($data); $data['code'] = implode('', $data['tokens']); $data['hasThis'] = (strpos($data['code'], '$this') !== false); } private function determineTokens(array &$data) { $potential = $this->determinePotentialTokens($data['reflection']); $braceLevel = $index = $step = $insideUse = 0; $data['tokens'] = $data['context'] = []; foreach ($potential as $token) { $token = new Token($token); switch ($step) { // Handle tokens before the function declaration. case 0: if ($token->is(T_FUNCTION)) { $data['tokens'][] = $token; $step++; } break; // Handle tokens inside the function signature. case 1: $data['tokens'][] = $token; if ($insideUse) { if ($token->is(T_VARIABLE)) { $varName = trim($token, '$ '); $data['context'][$varName] = null; } elseif ($token->is('&')) { $data['hasRefs'] = true; } } elseif ($token->is(T_USE)) { $insideUse++; } if ($token->is('{')) { $step++; $braceLevel++; } break; // Handle tokens inside the function body. case 2: $data['tokens'][] = $token; if ($token->is('{')) { $braceLevel++; } elseif ($token->is('}')) { $braceLevel--; if ($braceLevel === 0) { $step++; } } break; // Handle tokens after the function declaration. case 3: if ($token->is(T_FUNCTION)) { throw new ClosureAnalysisException('Multiple closures ' . 'were declared on the same line of code. Could not ' . 'determine which closure was the intended target.' ); } break; } } } private function determinePotentialTokens(\ReflectionFunction $reflection) { // Load the file containing the code for the function. $fileName = $reflection->getFileName(); if (!is_readable($fileName)) { throw new ClosureAnalysisException( "Cannot read the file containing the closure: \"{$fileName}\"." ); } $code = ''; $file = new \SplFileObject($fileName); $file->seek($reflection->getStartLine() - 1); while ($file->key() < $reflection->getEndLine()) { $code .= $file->current(); $file->next(); } $code = trim($code); if (strpos($code, '<?php') !== 0) { $code = "<?php\n" . $code; } return token_get_all($code); } protected function determineContext(array &$data) { // Get the values of the variables that are closed upon in "use". $values = $data['reflection']->getStaticVariables(); // Construct the context by combining the variable names and values. foreach ($data['context'] as $name => &$value) { if (isset($values[$name])) { $value = $values[$name]; } } } }