diff --git a/src/lint/linter/ArcanistLinter.php b/src/lint/linter/ArcanistLinter.php --- a/src/lint/linter/ArcanistLinter.php +++ b/src/lint/linter/ArcanistLinter.php @@ -58,6 +58,20 @@ } /** + * Return arbitrary additional information. + * + * Linters can use this method to provide arbitrary additional information to + * be included in the output of `arc linters`. + * + * @return map A mapping of header to body content for the + * additional information sections. + * @task info + */ + public function getAdditionalInformation() { + return array(); + } + + /** * Return a human-readable linter name. * * These are used by `arc linters`, and can let you give a linter a more diff --git a/src/lint/linter/ArcanistXHPASTLinter.php b/src/lint/linter/ArcanistXHPASTLinter.php --- a/src/lint/linter/ArcanistXHPASTLinter.php +++ b/src/lint/linter/ArcanistXHPASTLinter.php @@ -46,6 +46,29 @@ return pht('Use XHPAST to enforce coding conventions on PHP source files.'); } + public function getAdditionalInformation() { + $table = id(new PhutilConsoleTable()) + ->setBorders(true) + ->addColumn('id', array('title' => pht('ID'))) + ->addColumn('class', array('title' => pht('Class'))) + ->addColumn('name', array('title' => pht('Name'))); + + $rules = $this->rules; + ksort($rules); + + foreach ($rules as $id => $rule) { + $table->addRow(array( + 'id' => $id, + 'class' => get_class($rule), + 'name' => $rule->getLintName(), + )); + } + + return array( + pht('Linter Rules') => $table->drawConsoleString(), + ); + } + public function getLinterName() { return 'XHP'; } diff --git a/src/workflow/ArcanistLintersWorkflow.php b/src/workflow/ArcanistLintersWorkflow.php --- a/src/workflow/ArcanistLintersWorkflow.php +++ b/src/workflow/ArcanistLintersWorkflow.php @@ -78,6 +78,7 @@ if ($exact) { $linter_info = $this->findExactNames($linter_info, $exact); + if (!$linter_info) { $console->writeOut( "%s\n", @@ -170,6 +171,18 @@ $print_tail = true; } + $additional = $linter['additional']; + foreach ($additional as $title => $body) { + $console->writeOut( + "\n%s**%s**\n\n", + $pad, + $title); + + // TODO: This should maybe use `tsprintf`. + // See some discussion in D14563. + echo $body; + } + if ($print_tail) { $console->writeOut("\n"); } @@ -250,6 +263,7 @@ 'description' => $linter->getInfoDescription(), 'exception' => $exception, 'options' => $linter->getLinterConfigurationOptions(), + 'additional' => $linter->getAdditionalInformation(), ); }