by shigemk2

当面は技術的なことしか書かない

PHPStanのCsvErrorFormatterっぽい実装

There’s JSON error formatter which is also machine readable. You can also implement your own error formatters.

phpstan analyseのerror-formatにcsvがないので、PHPStanにIssueを投げてみたら、ほぼガチャ切りのような形でIssueをクローズされた。 追加でいくつか質問したけどなんとなくそっけない印象だった。

しょうがないから、Issueなどで言われたとおり、自前で実装してみることにした。

GitHub - phpstan/phpstan: PHP Static Analysis Tool - discover bugs in your code without running it!

以下、CsvErrorFormatter.phpなる実装。自前での実装だから、RawErrorFormatterを参考にしただけ。 別に出力するだけだから。

<?php declare(strict_types = 1);

namespace PHPStan\Command\ErrorFormatter;

use PHPStan\Command\AnalysisResult;
use Symfony\Component\Console\Style\OutputStyle;

class CsvErrorFormatter implements ErrorFormatter
{
    public function formatErrors(
        AnalysisResult $analysisResult,
        OutputStyle $style
    ): int
    {
        if (!$analysisResult->hasErrors()) {
            return 0;
        }

        $style->writeln(sprintf('file_name,line,error_message'));

        foreach ($analysisResult->getNotFileSpecificErrors() as $notFileSpecificError) {
            $style->writeln(sprintf('?,?,%s', $notFileSpecificError));
        }

        foreach ($analysisResult->getFileSpecificErrors() as $fileSpecificError) {
            $style->writeln(
                sprintf(
                    '%s,%d,%s',
                    $fileSpecificError->getFile(),
                    $fileSpecificError->getLine() ?? '',
                    $fileSpecificError->getMessage()
                )
            );
        }

        return 1;
    }

}

設定はこんなふうに追加しろ、ってりどみには書かれているけど、どこに実装していいかわからなかった。 Appってどこやねん

services:
    errorFormatter.awesome:
        class: App\PHPStan\AwesomeErrorFormatter

なので、neonファイルの末尾にこいつを追加して、

services:
  errorFormatter.csv:
      class: PHPStan\Command\ErrorFormatter\CsvErrorFormatter

なので、すっごい適当に、 vendor/phpstan/phpstan/src/Command/ErrorFormatter の下にCsvErrorFormatter.phpをおいて、

vendor/bin/phpstan analyse -c phpstan.neon -l 4 --error-format csv src tests

みたいなコマンドを実行したら、CSVっぽい出力がされた。