11<?php
22namespace AspectMock \Intercept ;
3+ use Go \Aop \Aspect ;
34use Go \Instrument \Transformer \StreamMetaData ;
45use Go \Instrument \Transformer \WeavingTransformer ;
56use Go \ParserReflection \ReflectionFile ;
7+ use Go \ParserReflection \ReflectionMethod ;
68
79class BeforeMockTransformer extends WeavingTransformer
810{
@@ -11,12 +13,9 @@ class BeforeMockTransformer extends WeavingTransformer
1113
1214 public function transform (StreamMetaData $ metadata )
1315 {
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 ();
2019
2120 foreach ($ namespaces as $ namespace ) {
2221
@@ -29,10 +28,11 @@ public function transform(StreamMetaData $metadata)
2928 }
3029
3130 // Look for aspects
32- if (in_array (' Go\Aop\ Aspect' , $ class ->getInterfaceNames ())) {
31+ if (in_array (Aspect::class , $ class ->getInterfaceNames ())) {
3332 continue ;
3433 }
3534
35+ /** @var ReflectionMethod[] $methods */
3636 $ methods = $ class ->getMethods ();
3737 foreach ($ methods as $ method ) {
3838 if ($ method ->getDeclaringClass ()->name != $ class ->getName ()) {
@@ -49,8 +49,8 @@ public function transform(StreamMetaData $metadata)
4949 ? $ this ->beforeStatic
5050 : $ this ->before ;
5151
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 ( )) {
5454 $ beforeDefinition = str_replace ('return ' , 'yield ' , $ beforeDefinition );
5555 }
5656 if (method_exists ($ method , 'getReturnType ' ) && $ method ->getReturnType () == 'void ' ) {
@@ -65,28 +65,21 @@ public function transform(StreamMetaData $metadata)
6565 foreach ($ reflectedParams as $ reflectedParam ) {
6666 $ params [] = ($ reflectedParam ->isPassedByReference () ? '&$ ' : '$ ' ) . $ reflectedParam ->getName ();
6767 }
68- $ params = implode (", " , $ params );
68+ $ params = implode (", " , $ params );
6969 $ 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 ;
8376 }
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 ]));
8779 }
8880 }
8981 }
90- $ metadata ->source = implode ("\n" , $ dataArray );
82+
83+ return $ result ;
9184 }
9285}
0 commit comments