1
1
#! /usr/bin/php
2
2
3
3
<?php
4
+
4
5
$ stdin = file_get_contents ('php://stdin ' , 'r ' );
5
6
6
7
$ lines = explode ("\n" , $ stdin );
@@ -11,10 +12,13 @@ $lines = array_map('trim', $lines);
11
12
12
13
$ output = '' ;
13
14
$ currentFile = '' ;
15
+ $ errorMessages = [];
16
+ $ lineNumber = null ;
14
17
foreach ($ lines as $ line ) {
15
18
$ file = [];
16
19
$ lineNumberError = [];
17
20
$ error = [];
21
+ $ configError = [];
18
22
$ isFileLine = preg_match ('~^Line(.+)~ ' , $ line , $ file );
19
23
$ isNumberErrorLine = preg_match ('~^(\d+)(.*)~ ' , $ line , $ lineNumberError );
20
24
$ isErrorLine = preg_match ('~^([a-zA-Z].+)~ ' , $ line , $ error );
@@ -24,17 +28,37 @@ foreach ($lines as $line) {
24
28
}
25
29
26
30
if ($ isFileLine ) {
31
+ flushBuffer ($ errorMessages , $ currentFile , $ lineNumber , $ output );
32
+ $ lineNumber = null ;
27
33
$ currentFile = trim (array_pop ($ file ));
28
34
continue ;
29
35
} else if ($ isNumberErrorLine && !$ isErrorLine ) {
30
- $ errorMessage = trim (array_pop ($ lineNumberError ));
36
+ // flush if not the first error in this file
37
+ flushBuffer ($ errorMessages , $ currentFile , $ lineNumber , $ output );
38
+ $ errorMessages [] = trim (array_pop ($ lineNumberError ));
31
39
$ lineNumber = trim (array_pop ($ lineNumberError ));
32
40
} else if ($ isErrorLine && !$ isNumberErrorLine ) {
33
- $ errorMessage = trim (array_pop ($ error ));
34
- $ lineNumber = 0 ;
41
+ $ isIgnoredPatternError = preg_match ('~Ignored error pattern~ ' , $ line , $ configError );
42
+ if (!$ isIgnoredPatternError ) {
43
+ $ errorMessages [] = trim (array_pop ($ error ));
44
+ continue ;
45
+ }
46
+ // hack to support ignored error pattern failures
47
+ flushBuffer ($ errorMessages , $ currentFile , $ lineNumber , $ output );
48
+ $ currentFile = 'phpstan.neon ' ;
49
+ $ lineNumber = 1 ;
50
+ $ errorMessages = [];
51
+ $ errorMessages [] = trim (array_pop ($ error ));
35
52
}
53
+ }
36
54
37
- $ output .= "File: " . $ currentFile . ", line: " . $ lineNumber . ", error: " . $ errorMessage . PHP_EOL ;
55
+ flushBuffer ($ errorMessages , $ currentFile , $ lineNumber , $ output );
56
+
57
+ function flushBuffer (array &$ errorMessages , $ currentFile , $ lineNumber , &$ output ){
58
+ if (!empty ($ errorMessages ) && $ lineNumber > 0 ) {
59
+ $ output .= "File: " . $ currentFile . ", line: " . $ lineNumber . ", error: " . implode (' ' , $ errorMessages ) . PHP_EOL ;
60
+ $ errorMessages = [];
61
+ }
38
62
}
39
63
40
64
echo trim ($ output );
0 commit comments