diff --git a/src/applications/search/engine/PhabricatorDatasourceEngine.php b/src/applications/search/engine/PhabricatorDatasourceEngine.php --- a/src/applications/search/engine/PhabricatorDatasourceEngine.php +++ b/src/applications/search/engine/PhabricatorDatasourceEngine.php @@ -34,4 +34,22 @@ return null; } + public function newDatasourcesForCompositeDatasource( + PhabricatorTypeaheadCompositeDatasource $datasource) { + $viewer = $this->getViewer(); + $extensions = PhabricatorDatasourceEngineExtension::getAllExtensions(); + + $sources = array(); + foreach ($extensions as $extension) { + $extension_sources = id(clone $extension) + ->setViewer($viewer) + ->newDatasourcesForCompositeDatasource($datasource); + foreach ($extension_sources as $extension_source) { + $sources[] = $extension_source; + } + } + + return $sources; + } + } diff --git a/src/applications/search/engineextension/PhabricatorDatasourceEngineExtension.php b/src/applications/search/engineextension/PhabricatorDatasourceEngineExtension.php --- a/src/applications/search/engineextension/PhabricatorDatasourceEngineExtension.php +++ b/src/applications/search/engineextension/PhabricatorDatasourceEngineExtension.php @@ -21,6 +21,11 @@ return null; } + public function newDatasourcesForCompositeDatasource( + PhabricatorTypeaheadCompositeDatasource $datasource) { + return array(); + } + final public static function getAllExtensions() { return id(new PhutilClassMapQuery()) ->setAncestorClass(__CLASS__) diff --git a/src/applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php b/src/applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php --- a/src/applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php +++ b/src/applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php @@ -223,8 +223,17 @@ private function getUsableDatasources() { if ($this->usable === null) { + $viewer = $this->getViewer(); + $sources = $this->getComponentDatasources(); + $extension_sources = id(new PhabricatorDatasourceEngine()) + ->setViewer($viewer) + ->newDatasourcesForCompositeDatasource($this); + foreach ($extension_sources as $extension_source) { + $sources[] = $extension_source; + } + $usable = array(); foreach ($sources as $source) { $application_class = $source->getDatasourceApplicationClass(); @@ -239,7 +248,7 @@ } } - $source->setViewer($this->getViewer()); + $source->setViewer($viewer); $usable[] = $source; } $this->usable = $usable;