Skip to content

Commit 312b167

Browse files
lisachenkoDavertMik
authored andcommitted
Update AspectMock tranfsformer to the new version of GoAOP, fixes #146 (#150)
1 parent 69020c3 commit 312b167

File tree

2 files changed

+21
-28
lines changed

2 files changed

+21
-28
lines changed

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
},
1515
"require": {
1616
"php": ">=5.6.0",
17-
"goaop/framework": "^2.0.0",
17+
"goaop/framework": "^2.2.0",
1818
"symfony/finder": "~2.4|~3.0|~4.0"
1919
},
2020
"require-dev": {
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
<?php
22
namespace AspectMock\Intercept;
3+
use Go\Aop\Aspect;
34
use Go\Instrument\Transformer\StreamMetaData;
45
use Go\Instrument\Transformer\WeavingTransformer;
56
use Go\ParserReflection\ReflectionFile;
7+
use Go\ParserReflection\ReflectionMethod;
68

79
class 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

Comments
 (0)