Skip to content

Commit ed4ebbb

Browse files
lookymanondrejmirtes
authored andcommitted
Added possibility to override rule error file
1 parent df62026 commit ed4ebbb

File tree

6 files changed

+134
-2
lines changed

6 files changed

+134
-2
lines changed

src/Analyser/Analyser.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Nette\Utils\Json;
66
use PHPStan\File\FileHelper;
77
use PHPStan\Parser\Parser;
8+
use PHPStan\Rules\FileRuleError;
89
use PHPStan\Rules\LineRuleError;
910
use PHPStan\Rules\Registry;
1011

@@ -164,6 +165,7 @@ function (\PhpParser\Node $node, Scope $scope) use (&$fileErrors, $file, &$scope
164165

165166
foreach ($ruleErrors as $ruleError) {
166167
$line = $node->getLine();
168+
$fileName = $scope->getFileDescription();
167169
if (is_string($ruleError)) {
168170
$message = $ruleError;
169171
} else {
@@ -174,8 +176,14 @@ function (\PhpParser\Node $node, Scope $scope) use (&$fileErrors, $file, &$scope
174176
) {
175177
$line = $ruleError->getLine();
176178
}
179+
if (
180+
$ruleError instanceof FileRuleError
181+
&& $ruleError->getFile() !== ''
182+
) {
183+
$fileName = $ruleError->getFile();
184+
}
177185
}
178-
$fileErrors[] = new Error($message, $scope->getFileDescription(), $line);
186+
$fileErrors[] = new Error($message, $fileName, $line);
179187
}
180188
}
181189

src/Rules/FileRuleError.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules;
4+
5+
interface FileRuleError extends RuleError
6+
{
7+
8+
public function getFile(): string;
9+
10+
}

src/Rules/RuleErrorBuilder.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
namespace PHPStan\Rules;
44

55
use PHPStan\Rules\RuleErrors\RuleErrorWithMessage;
6+
use PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndFile;
67
use PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndLine;
8+
use PHPStan\Rules\RuleErrors\RuleErrorWithMessageAndLineAndFile;
79

810
class RuleErrorBuilder
911
{
@@ -14,6 +16,9 @@ class RuleErrorBuilder
1416
/** @var int|null */
1517
private $line;
1618

19+
/** @var string|null */
20+
private $file;
21+
1722
private function __construct()
1823
{
1924
}
@@ -33,11 +38,24 @@ public function line(int $line): self
3338
return $this;
3439
}
3540

41+
public function file(string $file): self
42+
{
43+
$this->file = $file;
44+
45+
return $this;
46+
}
47+
3648
public function build(): RuleError
3749
{
38-
if ($this->line !== null) {
50+
if ($this->line !== null && $this->file !== null) {
51+
return new RuleErrorWithMessageAndLineAndFile($this->message, $this->line, $this->file);
52+
}
53+
if ($this->line !== null && $this->file === null) {
3954
return new RuleErrorWithMessageAndLine($this->message, $this->line);
4055
}
56+
if ($this->line === null && $this->file !== null) {
57+
return new RuleErrorWithMessageAndFile($this->message, $this->file);
58+
}
4159

4260
return new RuleErrorWithMessage($this->message);
4361
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules\RuleErrors;
4+
5+
use PHPStan\Rules\FileRuleError;
6+
7+
class RuleErrorWithMessageAndFile implements FileRuleError
8+
{
9+
10+
/** @var string */
11+
private $message;
12+
13+
/** @var string */
14+
private $file;
15+
16+
public function __construct(string $message, string $file)
17+
{
18+
$this->message = $message;
19+
$this->file = $file;
20+
}
21+
22+
public function getMessage(): string
23+
{
24+
return $this->message;
25+
}
26+
27+
public function getFile(): string
28+
{
29+
return $this->file;
30+
}
31+
32+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules\RuleErrors;
4+
5+
use PHPStan\Rules\FileRuleError;
6+
use PHPStan\Rules\LineRuleError;
7+
8+
class RuleErrorWithMessageAndLineAndFile implements LineRuleError, FileRuleError
9+
{
10+
11+
/** @var string */
12+
private $message;
13+
14+
/** @var int */
15+
private $line;
16+
17+
/** @var string */
18+
private $file;
19+
20+
public function __construct(string $message, int $line, string $file)
21+
{
22+
$this->message = $message;
23+
$this->line = $line;
24+
$this->file = $file;
25+
}
26+
27+
public function getMessage(): string
28+
{
29+
return $this->message;
30+
}
31+
32+
public function getLine(): int
33+
{
34+
return $this->line;
35+
}
36+
37+
public function getFile(): string
38+
{
39+
return $this->file;
40+
}
41+
42+
}

tests/PHPStan/Rules/RuleErrorBuilderTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,26 @@ public function testMessageAndLineAndBuild(): void
2424
$this->assertSame(25, $ruleError->getLine());
2525
}
2626

27+
public function testMessageAndFileAndBuild(): void
28+
{
29+
$builder = RuleErrorBuilder::message('Foo')->file('Bar.php');
30+
$ruleError = $builder->build();
31+
$this->assertSame('Foo', $ruleError->getMessage());
32+
33+
$this->assertInstanceOf(FileRuleError::class, $ruleError);
34+
$this->assertSame('Bar.php', $ruleError->getFile());
35+
}
36+
37+
public function testMessageAndLineAndFileAndBuild(): void
38+
{
39+
$builder = RuleErrorBuilder::message('Foo')->line(25)->file('Bar.php');
40+
$ruleError = $builder->build();
41+
$this->assertSame('Foo', $ruleError->getMessage());
42+
43+
$this->assertInstanceOf(LineRuleError::class, $ruleError);
44+
$this->assertInstanceOf(FileRuleError::class, $ruleError);
45+
$this->assertSame(25, $ruleError->getLine());
46+
$this->assertSame('Bar.php', $ruleError->getFile());
47+
}
48+
2749
}

0 commit comments

Comments
 (0)