diff --git a/src/__phutil_library_init__.php b/src/__phutil_library_init__.php --- a/src/__phutil_library_init__.php +++ b/src/__phutil_library_init__.php @@ -17,7 +17,6 @@ try { $loader = new PhutilSymbolLoader(); $symbols = $loader - ->setType('class') ->setName($class_name) ->selectAndLoadSymbols(); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -253,7 +253,6 @@ 'PhutilParserGeneratorException' => 'parser/generator/exception/PhutilParserGeneratorException.php', 'PhutilParserGeneratorTestCase' => 'parser/__tests__/PhutilParserGeneratorTestCase.php', 'PhutilPayPalAPIFuture' => 'future/paypal/PhutilPayPalAPIFuture.php', - 'PhutilPerson' => 'internationalization/PhutilPerson.php', 'PhutilPersonTest' => 'internationalization/__tests__/PhutilPersonTest.php', 'PhutilPersonaAuthAdapter' => 'auth/PhutilPersonaAuthAdapter.php', 'PhutilPhabricatorAuthAdapter' => 'auth/PhutilPhabricatorAuthAdapter.php', @@ -264,7 +263,6 @@ 'PhutilProxyException' => 'error/PhutilProxyException.php', 'PhutilPygmentsSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilPygmentsSyntaxHighlighter.php', 'PhutilPythonFragmentLexer' => 'lexer/PhutilPythonFragmentLexer.php', - 'PhutilQsprintfInterface' => 'xsprintf/PhutilQsprintfInterface.php', 'PhutilQueryStringParser' => 'parser/PhutilQueryStringParser.php', 'PhutilQueryStringParserTestCase' => 'parser/__tests__/PhutilQueryStringParserTestCase.php', 'PhutilRainbowSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilRainbowSyntaxHighlighter.php', @@ -304,7 +302,6 @@ 'PhutilRope' => 'utils/PhutilRope.php', 'PhutilRopeTestCase' => 'utils/__tests__/PhutilRopeTestCase.php', 'PhutilSafeHTML' => 'markup/PhutilSafeHTML.php', - 'PhutilSafeHTMLProducerInterface' => 'markup/PhutilSafeHTMLProducerInterface.php', 'PhutilSafeHTMLTestCase' => 'markup/__tests__/PhutilSafeHTMLTestCase.php', 'PhutilSaturateStdoutDaemon' => 'daemon/torture/PhutilSaturateStdoutDaemon.php', 'PhutilServiceProfiler' => 'serviceprofiler/PhutilServiceProfiler.php', @@ -486,6 +483,11 @@ 'xsprintf_terminal' => 'xsprintf/tsprintf.php', 'xsprintf_uri' => 'xsprintf/urisprintf.php', ), + 'interface' => array( + 'PhutilPerson' => 'internationalization/PhutilPerson.php', + 'PhutilQsprintfInterface' => 'xsprintf/PhutilQsprintfInterface.php', + 'PhutilSafeHTMLProducerInterface' => 'markup/PhutilSafeHTMLProducerInterface.php', + ), 'xmap' => array( 'AASTNode' => 'Phobject', 'AASTNodeList' => array( diff --git a/src/moduleutils/PhutilLibraryMapBuilder.php b/src/moduleutils/PhutilLibraryMapBuilder.php --- a/src/moduleutils/PhutilLibraryMapBuilder.php +++ b/src/moduleutils/PhutilLibraryMapBuilder.php @@ -278,12 +278,15 @@ * Build a map of all source files in a library to hashes of their content. * Returns an array like this: * - * array( - * 'src/parser/ExampleParser.php' => '60b725f10c9c85c70d97880dfe8191b3', - * // ... - * ); + * ```lang=php + * array( + * 'src/parser/ExampleParser.php' => '60b725f10c9c85c70d97880dfe8191b3', + * // ... + * ); + * ``` * * @return dict Map of library-relative paths to content hashes. + * * @task source */ private function loadSourceFileMap() { @@ -335,11 +338,13 @@ * * @param dict Symbol analysis of all source files. * @return dict Library map. + * * @task source */ private function buildLibraryMap(array $symbol_map) { $library_map = array( 'class' => array(), + 'interface' => array(), 'function' => array(), 'xmap' => array(), ); @@ -348,9 +353,8 @@ foreach ($symbol_map as $file => $info) { foreach ($info['have'] as $type => $symbols) { foreach ($symbols as $symbol => $declaration) { - $lib_type = ($type == 'interface') ? 'class' : $type; - if (!empty($library_map[$lib_type][$symbol])) { - $prior = $library_map[$lib_type][$symbol]; + if (!empty($library_map[$type][$symbol])) { + $prior = $library_map[$type][$symbol]; throw new Exception( pht( "Definition of %s '%s' in file '%s' duplicates prior ". @@ -361,7 +365,7 @@ $file, $prior)); } - $library_map[$lib_type][$symbol] = $file; + $library_map[$type][$symbol] = $file; } } $library_map['xmap'] += $info['xmap']; @@ -388,7 +392,7 @@ /** * Write a finalized library map. * - * @param dict Library map structure to write. + * @param dict Library map structure to write. * @return void * * @task source diff --git a/src/symbols/PhutilSymbolLoader.php b/src/symbols/PhutilSymbolLoader.php --- a/src/symbols/PhutilSymbolLoader.php +++ b/src/symbols/PhutilSymbolLoader.php @@ -174,11 +174,12 @@ } if ($this->type) { - $types = array($this->type); + $types = (array)$this->type; } else { $types = array( 'class', 'function', + 'interface', ); } @@ -193,12 +194,6 @@ foreach ($libraries as $library) { $map = $bootloader->getLibraryMap($library); foreach ($types as $type) { - if ($type == 'interface') { - $lookup_map = $map['class']; - } else { - $lookup_map = $map[$type]; - } - // As an optimization, we filter the list of candidate symbols in // several passes, applying a name-based filter first if possible since // it is highly selective and guaranteed to match at most one symbol. @@ -210,9 +205,9 @@ if ($this->name) { // If we have a name filter, just pick the matching name out if it // exists. - if (isset($lookup_map[$this->name])) { + if (isset($map[$type][$this->name])) { $filtered_map = array( - $this->name => $lookup_map[$this->name], + $this->name => $map[$type][$this->name], ); } else { $filtered_map = array(); @@ -220,13 +215,13 @@ } else if ($names !== null) { $filtered_map = array(); foreach ($names as $name => $ignored) { - if (isset($lookup_map[$name])) { - $filtered_map[$name] = $lookup_map[$name]; + if (isset($map[$type][$name])) { + $filtered_map[$name] = $map[$type][$name]; } } } else { // Otherwise, start with everything. - $filtered_map = $lookup_map; + $filtered_map = $map[$type]; } if ($this->pathPrefix) { @@ -320,7 +315,7 @@ public function loadObjects(array $argv = array()) { $symbols = $this ->setConcreteOnly(true) - ->setType('class') + ->setType(array('class', 'interface')) ->selectAndLoadSymbols(); $objects = array();