mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-20 12:30:56 +01:00
Minor tidying of DivinerAtomizer
classes
Summary: Self-explanatory. Test Plan: Eyeball it. Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin, epriestley Differential Revision: https://secure.phabricator.com/D11599
This commit is contained in:
parent
8573d5b0c1
commit
2b75b33552
2 changed files with 24 additions and 20 deletions
|
@ -10,8 +10,8 @@ abstract class DivinerAtomizer {
|
|||
private $atomContext;
|
||||
|
||||
/**
|
||||
* If you make a significant change to an atomizer, you can bump this
|
||||
* version to drop all the old atom caches.
|
||||
* If you make a significant change to an atomizer, you can bump this version
|
||||
* to drop all the old atom caches.
|
||||
*/
|
||||
public static function getAtomizerVersion() {
|
||||
return 1;
|
||||
|
@ -22,7 +22,7 @@ abstract class DivinerAtomizer {
|
|||
$this->atomContext = $context;
|
||||
$atoms = $this->executeAtomize($file_name, $file_data);
|
||||
|
||||
// Promote the "@group" special to a property. If there's no "@group" on
|
||||
// Promote the `@group` special to a property. If there's no `@group` on
|
||||
// an atom but the file it's in matches a group pattern, associate it with
|
||||
// the right group.
|
||||
foreach ($atoms as $atom) {
|
||||
|
|
|
@ -6,7 +6,6 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
return parent::newAtom($type)->setLanguage('php');
|
||||
}
|
||||
|
||||
|
||||
protected function executeAtomize($file_name, $file_data) {
|
||||
$future = xhpast_get_parser_future($file_data);
|
||||
$tree = XHPASTTree::newFromDataAndResolvedExecFuture(
|
||||
|
@ -14,12 +13,10 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
$future->resolve());
|
||||
|
||||
$atoms = array();
|
||||
|
||||
$root = $tree->getRootNode();
|
||||
|
||||
$func_decl = $root->selectDescendantsOfType('n_FUNCTION_DECLARATION');
|
||||
foreach ($func_decl as $func) {
|
||||
|
||||
$name = $func->getChildByIndex(2);
|
||||
|
||||
// Don't atomize closures
|
||||
|
@ -33,7 +30,6 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
->setFile($file_name);
|
||||
|
||||
$this->findAtomDocblock($atom, $func);
|
||||
|
||||
$this->parseParams($atom, $func);
|
||||
$this->parseReturnType($atom, $func);
|
||||
|
||||
|
@ -46,6 +42,7 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
);
|
||||
foreach ($class_types as $atom_type => $node_type) {
|
||||
$class_decls = $root->selectDescendantsOfType($node_type);
|
||||
|
||||
foreach ($class_decls as $class) {
|
||||
$name = $class->getChildByIndex(1, 'n_CLASS_NAME');
|
||||
|
||||
|
@ -54,13 +51,13 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
->setFile($file_name)
|
||||
->setLine($class->getLineNumber());
|
||||
|
||||
// This parses "final" and "abstract".
|
||||
// This parses `final` and `abstract`.
|
||||
$attributes = $class->getChildByIndex(0, 'n_CLASS_ATTRIBUTES');
|
||||
foreach ($attributes->selectDescendantsOfType('n_STRING') as $attr) {
|
||||
$atom->setProperty($attr->getConcreteString(), true);
|
||||
}
|
||||
|
||||
// If this exists, it is n_EXTENDS_LIST.
|
||||
// If this exists, it is `n_EXTENDS_LIST`.
|
||||
$extends = $class->getChildByIndex(2);
|
||||
$extends_class = $extends->selectDescendantsOfType('n_CLASS_NAME');
|
||||
foreach ($extends_class as $parent_class) {
|
||||
|
@ -70,7 +67,7 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
$parent_class->getConcreteString()));
|
||||
}
|
||||
|
||||
// If this exists, it is n_IMPLEMENTS_LIST.
|
||||
// If this exists, it is `n_IMPLEMENTS_LIST`.
|
||||
$implements = $class->getChildByIndex(3);
|
||||
$iface_names = $implements->selectDescendantsOfType('n_CLASS_NAME');
|
||||
foreach ($iface_names as $iface_name) {
|
||||
|
@ -193,7 +190,6 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
$atom->setProperty('parameters', $param_spec);
|
||||
}
|
||||
|
||||
|
||||
private function findAtomDocblock(DivinerAtom $atom, XHPASTNode $node) {
|
||||
$token = $node->getDocblockToken();
|
||||
if ($token) {
|
||||
|
@ -218,11 +214,12 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
pht(
|
||||
'Atom "%s" is preceded by a comment containing "@%s", but the '.
|
||||
'comment is not a documentation comment. Documentation '.
|
||||
'comments must begin with "/**", followed by a newline. Did '.
|
||||
'comments must begin with "%s", followed by a newline. Did '.
|
||||
'you mean to use a documentation comment? (As the comment is '.
|
||||
'not a documentation comment, it will be ignored.)',
|
||||
$atom->getName(),
|
||||
$matches[1]));
|
||||
$matches[1],
|
||||
'/**'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -234,7 +231,7 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
|
||||
protected function parseParamDoc(DivinerAtom $atom, $doc, $name) {
|
||||
$dict = array();
|
||||
$split = preg_split('/\s+/', trim($doc), $limit = 2);
|
||||
$split = preg_split('/\s+/', trim($doc), 2);
|
||||
if (!empty($split[0])) {
|
||||
$dict['doctype'] = $split[0];
|
||||
}
|
||||
|
@ -242,7 +239,7 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
if (!empty($split[1])) {
|
||||
$docs = $split[1];
|
||||
|
||||
// If the parameter is documented like "@param int $num Blah blah ..",
|
||||
// If the parameter is documented like `@param int $num Blah blah ..`,
|
||||
// get rid of the `$num` part (which Diviner considers optional). If it
|
||||
// is present and different from the declared name, raise a warning.
|
||||
$matches = null;
|
||||
|
@ -276,7 +273,10 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
$return = idx($metadata, 'returns');
|
||||
if ($return) {
|
||||
$atom->addWarning(
|
||||
pht('Documentation uses `@returns`, but should use `@return`.'));
|
||||
pht(
|
||||
'Documentation uses `%s`, but should use `%s`.',
|
||||
'@returns',
|
||||
'@return'));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -288,12 +288,16 @@ final class DivinerPHPAtomizer extends DivinerAtomizer {
|
|||
|
||||
if ($return) {
|
||||
$atom->addWarning(
|
||||
'Method __construct() has explicitly documented @return. The '.
|
||||
'__construct() method always returns $this. Diviner documents '.
|
||||
'this implicitly.');
|
||||
pht(
|
||||
'Method %s has explicitly documented %s. The %s method always '.
|
||||
'returns %s. Diviner documents this implicitly.',
|
||||
'__construct()',
|
||||
'@return',
|
||||
'__construct()',
|
||||
'$this'));
|
||||
}
|
||||
} else if ($return) {
|
||||
$split = preg_split('/(?<!,)\s+/', trim($return), $limit = 2);
|
||||
$split = preg_split('/(?<!,)\s+/', trim($return), 2);
|
||||
if (!empty($split[0])) {
|
||||
$type = $split[0];
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue