11#! /usr/bin/php
22
33<?php
4+
45$ stdin = file_get_contents ('php://stdin ' , 'r ' );
56
67$ lines = explode ("\n" , $ stdin );
@@ -11,10 +12,13 @@ $lines = array_map('trim', $lines);
1112
1213$ output = '' ;
1314$ currentFile = '' ;
15+ $ errorMessages = [];
16+ $ lineNumber = null ;
1417foreach ($ lines as $ line ) {
1518 $ file = [];
1619 $ lineNumberError = [];
1720 $ error = [];
21+ $ configError = [];
1822 $ isFileLine = preg_match ('~^Line(.+)~ ' , $ line , $ file );
1923 $ isNumberErrorLine = preg_match ('~^(\d+)(.*)~ ' , $ line , $ lineNumberError );
2024 $ isErrorLine = preg_match ('~^([a-zA-Z].+)~ ' , $ line , $ error );
@@ -24,17 +28,37 @@ foreach ($lines as $line) {
2428 }
2529
2630 if ($ isFileLine ) {
31+ flushBuffer ($ errorMessages , $ currentFile , $ lineNumber , $ output );
32+ $ lineNumber = null ;
2733 $ currentFile = trim (array_pop ($ file ));
2834 continue ;
2935 } 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 ));
3139 $ lineNumber = trim (array_pop ($ lineNumberError ));
3240 } 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 ));
3552 }
53+ }
3654
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+ }
3862}
3963
4064echo trim ($ output );
0 commit comments