1
1
<?php
2
2
namespace AspectMock \Intercept ;
3
+ use Go \Aop \Aspect ;
3
4
use Go \Instrument \Transformer \StreamMetaData ;
4
5
use Go \Instrument \Transformer \WeavingTransformer ;
5
6
use Go \ParserReflection \ReflectionFile ;
7
+ use Go \ParserReflection \ReflectionMethod ;
6
8
7
9
class BeforeMockTransformer extends WeavingTransformer
8
10
{
@@ -11,12 +13,9 @@ class BeforeMockTransformer extends WeavingTransformer
11
13
12
14
public function transform (StreamMetaData $ metadata )
13
15
{
14
- $ fileName = $ metadata ->uri ;
15
-
16
- $ reflectedFile = new ReflectionFile ($ fileName );
17
- $ namespaces = $ reflectedFile ->getFileNamespaces ();
18
-
19
- $ dataArray = explode ("\n" , $ metadata ->source );
16
+ $ result = self ::RESULT_ABSTAIN ;
17
+ $ reflectedFile = new ReflectionFile ($ metadata ->uri , $ metadata ->syntaxTree );
18
+ $ namespaces = $ reflectedFile ->getFileNamespaces ();
20
19
21
20
foreach ($ namespaces as $ namespace ) {
22
21
@@ -29,10 +28,11 @@ public function transform(StreamMetaData $metadata)
29
28
}
30
29
31
30
// Look for aspects
32
- if (in_array (' Go\Aop\ Aspect' , $ class ->getInterfaceNames ())) {
31
+ if (in_array (Aspect::class , $ class ->getInterfaceNames ())) {
33
32
continue ;
34
33
}
35
34
35
+ /** @var ReflectionMethod[] $methods */
36
36
$ methods = $ class ->getMethods ();
37
37
foreach ($ methods as $ method ) {
38
38
if ($ method ->getDeclaringClass ()->name != $ class ->getName ()) {
@@ -49,8 +49,8 @@ public function transform(StreamMetaData $metadata)
49
49
? $ this ->beforeStatic
50
50
: $ this ->before ;
51
51
52
- // replace return with yield when doccomment shows it returns a Generator
53
- if (preg_match ( ' /(\@return\s+[ \\ \]?Generator)/ ' , $ method ->getDocComment () )) {
52
+ // replace return with yield when method is Generator
53
+ if ($ method ->isGenerator ( )) {
54
54
$ beforeDefinition = str_replace ('return ' , 'yield ' , $ beforeDefinition );
55
55
}
56
56
if (method_exists ($ method , 'getReturnType ' ) && $ method ->getReturnType () == 'void ' ) {
@@ -65,28 +65,21 @@ public function transform(StreamMetaData $metadata)
65
65
foreach ($ reflectedParams as $ reflectedParam ) {
66
66
$ params [] = ($ reflectedParam ->isPassedByReference () ? '&$ ' : '$ ' ) . $ reflectedParam ->getName ();
67
67
}
68
- $ params = implode (", " , $ params );
68
+ $ params = implode (", " , $ params );
69
69
$ beforeDefinition = sprintf ($ beforeDefinition , $ params );
70
- for ($ i = $ method ->getStartLine () - 1 ; $ i < $ method ->getEndLine (); $ i ++) {
71
- $ pos = strpos ($ dataArray [$ i ], '{ ' );
72
- if ($ pos === false ) {
73
- continue ;
74
- } else {
75
- // Bug FIX for functions that have the curly bracket as default on their own parameters:
76
- // Launch a "continue" command if the bracket found have a quote (') or a double quote (")
77
- // exactly just before or after
78
- if (in_array (substr ($ dataArray [$ i ], $ pos - 1 , 1 ), ['" ' , "' " ]) ||
79
- in_array (substr ($ dataArray [$ i ], $ pos + 1 , 1 ), ['" ' , "' " ])
80
- ) {
81
- continue ;
82
- }
70
+ $ tokenPosition = $ method ->getNode ()->getAttribute ('startTokenPos ' );
71
+ do {
72
+ if ($ metadata ->tokenStream [$ tokenPosition ][1 ] === '{ ' ) {
73
+ $ metadata ->tokenStream [$ tokenPosition ][1 ] .= $ beforeDefinition ;
74
+ $ result = self ::RESULT_TRANSFORMED ;
75
+ break ;
83
76
}
84
- $ dataArray [$ i ] = substr ($ dataArray [$ i ], 0 , $ pos + 1 ) . $ beforeDefinition . substr ($ dataArray [$ i ], $ pos + 1 );
85
- break ;
86
- }
77
+ $ tokenPosition ++;
78
+ } while (isset ($ metadata ->tokenStream [$ tokenPosition ]));
87
79
}
88
80
}
89
81
}
90
- $ metadata ->source = implode ("\n" , $ dataArray );
82
+
83
+ return $ result ;
91
84
}
92
85
}
0 commit comments