protected function execute(ConduitAPIRequest $request) { $name = $request->getValue('name'); $name_prefix = $request->getValue('namePrefix'); $language = $request->getValue('language'); $type = $request->getValue('type'); $query = new DiffusionSymbolQuery(); if ($name !== null) { $query->setName($name); } if ($name_prefix !== null) { $query->setNamePrefix($name_prefix); } if ($language !== null) { $query->setLanguage($language); } if ($type !== null) { $query->setType($type); } $query->needPaths(true); $query->needArcanistProjects(true); $query->needRepositories(true); $results = $query->execute(); $response = array(); foreach ($results as $result) { $response[] = array('name' => $result->getSymbolName(), 'type' => $result->getSymbolType(), 'language' => $result->getSymbolLanguage(), 'path' => $result->getPath(), 'line' => $result->getLineNumber(), 'uri' => PhabricatorEnv::getProductionURI($result->getURI())); } return $response; }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $query = new DiffusionSymbolQuery(); $query->setName($this->name); if ($request->getStr('type')) { $query->setType($request->getStr('type')); } if ($request->getStr('lang')) { $query->setLanguage($request->getStr('lang')); } if ($request->getStr('projects')) { $phids = $request->getStr('projects'); $phids = explode(',', $phids); $phids = array_filter($phids); if ($phids) { $projects = id(new PhabricatorRepositoryArcanistProject())->loadAllWhere('phid IN (%Ls)', $phids); $projects = mpull($projects, 'getID'); if ($projects) { $query->setProjectIDs($projects); } } } $query->needPaths(true); $query->needArcanistProjects(true); $query->needRepositories(true); $symbols = $query->execute(); // For PHP builtins, jump to php.net documentation. if ($request->getBool('jump') && count($symbols) == 0) { if ($request->getStr('lang') == 'php') { if ($request->getStr('type') == 'function') { if (in_array($this->name, idx(get_defined_functions(), 'internal'))) { return id(new AphrontRedirectResponse())->setURI('http://www.php.net/' . $this->name); } } } } $rows = array(); foreach ($symbols as $symbol) { $project = $symbol->getArcanistProject(); if ($project) { $project_name = $project->getName(); } else { $project_name = '-'; } $file = phutil_escape_html($symbol->getPath()); $line = phutil_escape_html($symbol->getLineNumber()); $repo = $symbol->getRepository(); if ($repo) { $href = $symbol->getURI(); if ($request->getBool('jump') && count($symbols) == 1) { // If this is a clickthrough from Differential, just jump them // straight to the target if we got a single hit. return id(new AphrontRedirectResponse())->setURI($href); } $location = phutil_render_tag('a', array('href' => $href), phutil_escape_html($file . ':' . $line)); } else { if ($file) { $location = phutil_escape_html($file . ':' . $line); } else { $location = '?'; } } $rows[] = array(phutil_escape_html($symbol->getSymbolType()), phutil_escape_html($symbol->getSymbolName()), phutil_escape_html($symbol->getSymbolLanguage()), phutil_escape_html($project_name), $location); } $table = new AphrontTableView($rows); $table->setHeaders(array('Type', 'Name', 'Language', 'Project', 'File')); $table->setColumnClasses(array('', 'pri', '', '', '', 'n')); $table->setNoDataString("No matching symbol could be found in any indexed project."); $panel = new AphrontPanelView(); $panel->setHeader('Similar Symbols'); $panel->appendChild($table); return $this->buildStandardPageResponse(array($panel), array('title' => 'Find Symbol')); }