24
24
use const E_USER_NOTICE ;
25
25
use const E_USER_WARNING ;
26
26
use const E_WARNING ;
27
+ use function debug_backtrace ;
27
28
use function error_reporting ;
28
29
use function restore_error_handler ;
29
30
use function set_error_handler ;
30
31
use PHPUnit \Event ;
31
32
use PHPUnit \Event \Code \NoTestCaseObjectOnCallStackException ;
32
33
use PHPUnit \Runner \Baseline \Baseline ;
33
34
use PHPUnit \Runner \Baseline \Issue ;
35
+ use PHPUnit \TextUI \Configuration \Registry ;
36
+ use PHPUnit \TextUI \Configuration \Source ;
37
+ use PHPUnit \TextUI \Configuration \SourceFilter ;
34
38
use PHPUnit \Util \ExcludeList ;
35
39
36
40
/**
@@ -44,10 +48,18 @@ final class ErrorHandler
44
48
private ?Baseline $ baseline = null ;
45
49
private bool $ enabled = false ;
46
50
private ?int $ originalErrorReportingLevel = null ;
51
+ private readonly Source $ source ;
52
+ private readonly SourceFilter $ sourceFilter ;
47
53
48
54
public static function instance (): self
49
55
{
50
- return self ::$ instance ?? self ::$ instance = new self ;
56
+ return self ::$ instance ?? self ::$ instance = new self (Registry::get ()->source ());
57
+ }
58
+
59
+ private function __construct (Source $ source )
60
+ {
61
+ $ this ->source = $ source ;
62
+ $ this ->sourceFilter = new SourceFilter ;
51
63
}
52
64
53
65
/**
@@ -61,11 +73,35 @@ public function __invoke(int $errorNumber, string $errorString, string $errorFil
61
73
return false ;
62
74
}
63
75
64
- $ test = Event \Code \TestMethodBuilder::fromCallStack ();
76
+ $ trace = debug_backtrace (0 );
77
+ $ test = Event \Code \TestMethodBuilder::fromCallStack ();
65
78
66
79
$ ignoredByBaseline = $ this ->ignoredByBaseline ($ errorFile , $ errorLine , $ errorString );
67
80
$ ignoredByTest = $ test ->metadata ()->isIgnoreDeprecations ()->isNotEmpty ();
68
81
82
+ $ triggeredInTestCode = false ;
83
+ $ triggeredInFirstPartyCode = false ;
84
+ $ triggeredInThirdPartyCode = false ;
85
+ $ triggerCalledFromTestCode = false ;
86
+ $ triggerCalledFromFirstPartyCode = false ;
87
+ $ triggerCalledFromThirdPartyCode = false ;
88
+
89
+ if ($ trace [1 ]['file ' ] === $ test ->file ()) {
90
+ $ triggeredInTestCode = true ;
91
+ } elseif ($ this ->sourceFilter ->includes ($ this ->source , $ trace [1 ]['file ' ])) {
92
+ $ triggeredInFirstPartyCode = true ;
93
+ } else {
94
+ $ triggeredInThirdPartyCode = true ;
95
+ }
96
+
97
+ if ($ trace [2 ]['file ' ] === $ test ->file ()) {
98
+ $ triggerCalledFromTestCode = true ;
99
+ } elseif ($ this ->sourceFilter ->includes ($ this ->source , $ trace [2 ]['file ' ])) {
100
+ $ triggerCalledFromFirstPartyCode = true ;
101
+ } else {
102
+ $ triggerCalledFromThirdPartyCode = true ;
103
+ }
104
+
69
105
switch ($ errorNumber ) {
70
106
case E_NOTICE :
71
107
case E_STRICT :
0 commit comments