@@ -41,25 +41,41 @@ public function process(File $phpcsFile, $stackPtr)
41
41
{
42
42
$ tokens = $ phpcsFile ->getTokens ();
43
43
44
- $ function = $ phpcsFile ->getCondition ($ stackPtr , T_FUNCTION );
45
- if ($ function === false ) {
46
- $ function = $ phpcsFile ->getCondition ($ stackPtr , T_CLOSURE );
47
- if ($ function === false ) {
48
- // Not a nested function.
49
- return ;
44
+ if (isset ($ tokens [$ stackPtr ]['conditions ' ]) === false ) {
45
+ return ;
46
+ }
47
+
48
+ $ conditions = $ tokens [$ stackPtr ]['conditions ' ];
49
+
50
+ $ outerFuncToken = null ;
51
+ foreach ($ conditions as $ condToken => $ condition ) {
52
+ if ($ condition === T_FUNCTION || $ condition === T_CLOSURE ) {
53
+ $ outerFuncToken = $ condToken ;
54
+ break ;
50
55
}
51
56
}
52
57
53
- $ class = $ phpcsFile ->getCondition ($ stackPtr , T_ANON_CLASS , false );
54
- if ($ class !== false && $ class > $ function ) {
55
- // Ignore methods in anon classes.
58
+ if ($ outerFuncToken === null ) {
59
+ // Not a nested function.
56
60
return ;
57
61
}
58
62
59
- $ prev = $ phpcsFile ->findPrevious (T_WHITESPACE , ($ stackPtr - 1 ), null , true );
60
- if ($ tokens [$ prev ]['code ' ] === T_EQUAL ) {
61
- // Ignore closures.
62
- return ;
63
+ $ reversedConditions = array_reverse ($ conditions , true );
64
+ $ allowedOOPConditions = [
65
+ T_ANON_CLASS => true ,
66
+ T_CLASS => true ,
67
+ T_TRAIT => true ,
68
+ T_INTERFACE => true ,
69
+ ];
70
+ foreach ($ reversedConditions as $ condToken => $ condition ) {
71
+ if ($ condToken <= $ outerFuncToken ) {
72
+ break ;
73
+ }
74
+
75
+ if (\array_key_exists ($ condition , $ allowedOOPConditions ) === true ) {
76
+ // Ignore methods in OOP structures defined within functions.
77
+ return ;
78
+ }
63
79
}
64
80
65
81
$ error = 'The use of inner functions is forbidden ' ;
0 commit comments