private function buildSymbolIndexes(PhabricatorRepository $repository, array $visible_changesets)
 {
     assert_instances_of($visible_changesets, 'DifferentialChangeset');
     $engine = PhabricatorSyntaxHighlighter::newEngine();
     $langs = $repository->getSymbolLanguages();
     $langs = nonempty($langs, array());
     $sources = $repository->getSymbolSources();
     $sources = nonempty($sources, array());
     $symbol_indexes = array();
     if ($langs && $sources) {
         $have_symbols = id(new DiffusionSymbolQuery())->existsSymbolsInRepository($repository->getPHID());
         if (!$have_symbols) {
             return $symbol_indexes;
         }
     }
     $repository_phids = array_merge(array($repository->getPHID()), $sources);
     $indexed_langs = array_fill_keys($langs, true);
     foreach ($visible_changesets as $key => $changeset) {
         $lang = $engine->getLanguageFromFilename($changeset->getFilename());
         if (empty($indexed_langs) || isset($indexed_langs[$lang])) {
             $symbol_indexes[$key] = array('lang' => $lang, 'repositories' => $repository_phids);
         }
     }
     return $symbol_indexes;
 }
 private function buildSymbolsProperties(PhabricatorRepository $repository, PhabricatorActionListView $actions)
 {
     $viewer = $this->getRequest()->getUser();
     $view = id(new PHUIPropertyListView())->setUser($viewer)->setActionList($actions);
     $languages = $repository->getSymbolLanguages();
     if ($languages) {
         $languages = implode(', ', $languages);
     } else {
         $languages = phutil_tag('em', array(), pht('Any'));
     }
     $view->addProperty(pht('Languages'), $languages);
     $sources = $repository->getSymbolSources();
     if ($sources) {
         $handles = $viewer->loadHandles($sources);
         $sources = $handles->renderList();
     } else {
         $sources = phutil_tag('em', array(), pht('This Repository Only'));
     }
     $view->addProperty(pht('Use Symbols From'), $sources);
     return $view;
 }