Skip to content

Commit bc0eafe

Browse files
authored
Merge pull request #8 from permafrost-dev/add-statement-support
Add function definition support
2 parents 54fc6c8 + 2f2bad2 commit bc0eafe

20 files changed

+271
-21
lines changed

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,14 @@ foreach($results->results as $result) {
7676
}
7777
```
7878

79-
### Function calls
79+
### Functions
8080

81-
To search for function calls, use the `functions` method before calling `search`.
81+
To search for function calls or definitions, use the `functions` method. Regular expressions can be used by surrounding the name with slashes `/`, i.e. `/test\d+/`.
8282

8383
```php
84+
// this will search for references AND definitions for 'strtolower' and 'myfunc'
8485
$results = $searcher
85-
->functions(['strtolower', 'strtoupper'])
86+
->functions(['strtolower', 'myfunc'])
8687
->search('./file1.php');
8788

8889
foreach($results->results as $result) {

composer.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030
"autoload": {
3131
"psr-4": {
3232
"Permafrost\\PhpCodeSearch\\": "src/"
33-
}
33+
},
34+
"files": [
35+
"src/Support/helpers.php"
36+
]
3437
},
3538
"autoload-dev": {
3639
"psr-4": {

src/Results/Nodes/ArrayItemNode.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Permafrost\PhpCodeSearch\Code\GenericCodeLocation;
66
use Permafrost\PhpCodeSearch\Results\Nodes\Traits\HasLocation;
7-
use Permafrost\PhpCodeSearch\Support\Transformer;
7+
use Permafrost\PhpCodeSearch\Support\ExpressionTransformer;
88
use PhpParser\Node;
99

1010
class ArrayItemNode implements ValueNode, ResultNode
@@ -19,8 +19,8 @@ class ArrayItemNode implements ValueNode, ResultNode
1919

2020
public function __construct(Node $node)
2121
{
22-
$this->key = Transformer::parserNodeToResultNode($node->key);
23-
$this->value = Transformer::parserNodeToResultNode($node->value);
22+
$this->key = ExpressionTransformer::parserNodeToResultNode($node->key);
23+
$this->value = ExpressionTransformer::parserNodeToResultNode($node->value);
2424
$this->location = GenericCodeLocation::createFromNode($node);
2525
}
2626

src/Results/Nodes/AssignmentNode.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Permafrost\PhpCodeSearch\Code\GenericCodeLocation;
66
use Permafrost\PhpCodeSearch\Results\Nodes\Traits\HasLocation;
7-
use Permafrost\PhpCodeSearch\Support\Transformer;
7+
use Permafrost\PhpCodeSearch\Support\ExpressionTransformer;
88
use PhpParser\Node;
99

1010
class AssignmentNode implements ResultNode, ValueNode
@@ -23,7 +23,7 @@ class AssignmentNode implements ResultNode, ValueNode
2323
public function __construct(Node\Expr\Assign $node)
2424
{
2525
$this->variableName = $node->var->name;
26-
$this->value = Transformer::parserNodeToResultNode($node->expr);
26+
$this->value = ExpressionTransformer::parserNodeToResultNode($node->expr);
2727
$this->location = GenericCodeLocation::createFromNode($node);
2828
$this->name = $this->name();
2929
}

src/Results/Nodes/AssignmentOperationNode.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Permafrost\PhpCodeSearch\Code\GenericCodeLocation;
66
use Permafrost\PhpCodeSearch\Results\Nodes\Traits\HasLocation;
7-
use Permafrost\PhpCodeSearch\Support\Transformer;
7+
use Permafrost\PhpCodeSearch\Support\ExpressionTransformer;
88
use PhpParser\Node\Expr\AssignOp;
99

1010
class AssignmentOperationNode implements ResultNode, ValueNode
@@ -20,7 +20,7 @@ class AssignmentOperationNode implements ResultNode, ValueNode
2020
public function __construct(AssignOp $node)
2121
{
2222
$this->name = $node->var->name;
23-
$this->value = Transformer::parserNodeToResultNode($node->expr);
23+
$this->value = ExpressionTransformer::parserNodeToResultNode($node->expr);
2424
$this->location = GenericCodeLocation::createFromNode($node);
2525
}
2626

src/Results/Nodes/BinaryOperationNode.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Permafrost\PhpCodeSearch\Code\GenericCodeLocation;
66
use Permafrost\PhpCodeSearch\Results\Nodes\Traits\HasLocation;
7-
use Permafrost\PhpCodeSearch\Support\Transformer;
7+
use Permafrost\PhpCodeSearch\Support\ExpressionTransformer;
88
use PhpParser\Node\Expr\BinaryOp;
99

1010
class BinaryOperationNode implements OperationNode, ValueNode
@@ -26,15 +26,15 @@ class BinaryOperationNode implements OperationNode, ValueNode
2626
public function __construct(BinaryOp $node)
2727
{
2828
$this->symbol = $node->getOperatorSigil();
29-
$this->left = Transformer::parserNodeToResultNode($node->left);
30-
$this->right = Transformer::parserNodeToResultNode($node->right);
29+
$this->left = ExpressionTransformer::parserNodeToResultNode($node->left);
30+
$this->right = ExpressionTransformer::parserNodeToResultNode($node->right);
3131

3232
// $this->value = '';
3333
// if (property_exists($this->left, 'value') && property_exists($this->right, 'value')) {
3434
$leftValue = '';
3535
$rightValue = '';
3636

37-
$this->value = Transformer::binaryOperationNodeToValue($this);
37+
$this->value = ExpressionTransformer::binaryOperationNodeToValue($this);
3838

3939
$this->location = GenericCodeLocation::createFromNode($node);
4040
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Permafrost\PhpCodeSearch\Results\Nodes;
4+
5+
use Permafrost\PhpCodeSearch\Code\GenericCodeLocation;
6+
use Permafrost\PhpCodeSearch\Results\Nodes\Traits\HasLocation;
7+
use Permafrost\PhpCodeSearch\Results\Nodes\Traits\TransformsArguments;
8+
use Permafrost\PhpCodeSearch\Support\StatementTransformer;
9+
use PhpParser\Node;
10+
11+
class FunctionDefinitionNode implements ResultNode
12+
{
13+
use HasLocation;
14+
use TransformsArguments;
15+
16+
/** @var string */
17+
public $name;
18+
19+
/** @var array|ResultNode[]|ValueNode[] */
20+
public $args;
21+
22+
public function __construct(Node\Stmt\Function_ $node)
23+
{
24+
$this->name = $node->name->toString();
25+
$this->args = (new StatementTransformer())->parserNodesToResultNode($node->getParams());
26+
$this->location = GenericCodeLocation::createFromNode($node);
27+
}
28+
29+
public static function create(Node\Stmt\Function_ $node): self
30+
{
31+
return new static(...func_get_args());
32+
}
33+
34+
public function name(): string
35+
{
36+
return $this->name;
37+
}
38+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace Permafrost\PhpCodeSearch\Results\Nodes;
4+
5+
use Permafrost\PhpCodeSearch\Code\GenericCodeLocation;
6+
use Permafrost\PhpCodeSearch\Results\Nodes\Traits\HasLocation;
7+
use Permafrost\PhpCodeSearch\Results\Nodes\Traits\HasName;
8+
use Permafrost\PhpCodeSearch\Support\ExpressionTransformer;
9+
use PhpParser\Node;
10+
11+
class ParameterNode implements ResultNode
12+
{
13+
use HasLocation;
14+
use HasName;
15+
16+
/** @var string|null */
17+
public $type;
18+
19+
/** @var array|mixed|ArrayItemNode|ArrayNode|AssignmentNode|BinaryOperationNode|FunctionCallNode|MethodCallNode|PropertyAccessNode|Scalar\NumberNode|Scalar\StringNode|StaticMethodCallNode|StaticPropertyAccessNode|VariableNode|Node\Arg|null */
20+
public $default;
21+
22+
public function __construct(Node\Param $node)
23+
{
24+
$this->name = $node->var->name;
25+
$this->type = optional($node->type)->toString();
26+
$this->default = $node->default ? ExpressionTransformer::parserNodeToResultNode($node->default) : null;
27+
$this->location = GenericCodeLocation::createFromNode($node);
28+
}
29+
30+
public static function create(Node\Param $node): self
31+
{
32+
return new static(...func_get_args());
33+
}
34+
35+
public function defaultValue()
36+
{
37+
return $this->default;
38+
}
39+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Permafrost\PhpCodeSearch\Results\Nodes\Traits;
4+
5+
trait HasName
6+
{
7+
/** @var string */
8+
public $name;
9+
10+
public function name(): string
11+
{
12+
return $this->name;
13+
}
14+
}

src/Results/Nodes/Traits/TransformsArguments.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
namespace Permafrost\PhpCodeSearch\Results\Nodes\Traits;
44

5-
use Permafrost\PhpCodeSearch\Support\Transformer;
5+
use Permafrost\PhpCodeSearch\Support\ExpressionTransformer;
66

77
trait TransformsArguments
88
{
99
public function transformArgumentsToNodes(array $args): array
1010
{
11-
return Transformer::parserNodesToResultNodes($args);
11+
return ExpressionTransformer::parserNodesToResultNodes($args);
1212
}
1313
}

0 commit comments

Comments
 (0)