Skip to content

Commit c616e92

Browse files
authored
Merge pull request #7 from smeghead/feature/assign-operator
feat: AssignOp has been added to the assignment decision in addition …
2 parents c78e1d7 + 802a9c3 commit c616e92

File tree

4 files changed

+78
-1
lines changed

4 files changed

+78
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### Features
44

55
* The base of deviation of local variable abuse has been changed from the average number of rows to the first number of rows.
6+
* AssignOp has been added to the assignment decision in addition to Assign.
67

78

89
## v0.0.2 (2025-03-19)

src/Parse/Visitor/FunctionLikeFindingVisitor.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PhpParser\Node;
88
use PhpParser\Node\Expr\Assign;
9+
use PhpParser\Node\Expr\AssignOp;
910
use PhpParser\Node\FunctionLike;
1011
use PhpParser\NodeVisitor\FindingVisitor;
1112
use PhpParser\Node\Stmt\Class_;
@@ -31,7 +32,7 @@ public function enterNode(Node $node) {
3132
$this->currentNamespace = $node->name ? $node->name->name : null;
3233
}
3334

34-
if ($node instanceof Assign) {
35+
if ($node instanceof Assign || $node instanceof AssignOp) {
3536
$node->var->setAttribute('assigned', true); // Mark as assigned
3637
}
3738
if ($node instanceof FunctionLike) {

test/VariableParserTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,60 @@ public function testParseNamespace(): void
9797
$this->assertCount(0, $functions[1]->getVariables());
9898
}
9999

100+
public function testParseAssignOperator(): void
101+
{
102+
$parser = new VariableParser();
103+
$content = file_get_contents($this->fixtureDir . '/assign_operator.php');
104+
$result = $parser->parse($content);
105+
106+
$this->assertInstanceOf(ParseResult::class, $result);
107+
$functions = $result->functions;
108+
$this->assertCount(1, $functions);
109+
$this->assertSame('assignFunction', $functions[0]->name);
110+
$this->assertCount(14, $functions[0]->getVariables());
111+
112+
$vars = $functions[0]->getVariables();
113+
$this->assertSame('num', $vars[0]->name);
114+
$this->assertSame(5, $vars[0]->lineNumber);
115+
$this->assertSame(true, $vars[0]->assigned, '$num = 1;');
116+
$this->assertSame('num', $vars[1]->name);
117+
$this->assertSame(6, $vars[1]->lineNumber);
118+
$this->assertSame(true, $vars[1]->assigned, '$num += 1;');
119+
$this->assertSame('num', $vars[2]->name);
120+
$this->assertSame(7, $vars[2]->lineNumber);
121+
$this->assertSame(true, $vars[2]->assigned, '$num -= 1;');
122+
$this->assertSame('num', $vars[3]->name);
123+
$this->assertSame(8, $vars[3]->lineNumber);
124+
$this->assertSame(true, $vars[3]->assigned, '$num *= 1;');
125+
$this->assertSame('num', $vars[4]->name);
126+
$this->assertSame(9, $vars[4]->lineNumber);
127+
$this->assertSame(true, $vars[4]->assigned);
128+
$this->assertSame('num', $vars[5]->name);
129+
$this->assertSame(10, $vars[5]->lineNumber);
130+
$this->assertSame(true, $vars[5]->assigned);
131+
$this->assertSame('num', $vars[6]->name);
132+
$this->assertSame(11, $vars[6]->lineNumber);
133+
$this->assertSame(true, $vars[6]->assigned);
134+
$this->assertSame('num', $vars[7]->name);
135+
$this->assertSame(12, $vars[7]->lineNumber);
136+
$this->assertSame(true, $vars[7]->assigned);
137+
$this->assertSame('num', $vars[8]->name);
138+
$this->assertSame(13, $vars[8]->lineNumber);
139+
$this->assertSame(true, $vars[8]->assigned);
140+
$this->assertSame('num', $vars[9]->name);
141+
$this->assertSame(14, $vars[9]->lineNumber);
142+
$this->assertSame(true, $vars[9]->assigned);
143+
$this->assertSame('num', $vars[10]->name);
144+
$this->assertSame(15, $vars[10]->lineNumber);
145+
$this->assertSame(true, $vars[10]->assigned);
146+
$this->assertSame('num', $vars[11]->name);
147+
$this->assertSame(16, $vars[11]->lineNumber);
148+
$this->assertSame(true, $vars[11]->assigned);
149+
$this->assertSame('num', $vars[12]->name);
150+
$this->assertSame(17, $vars[12]->lineNumber);
151+
$this->assertSame(true, $vars[12]->assigned);
152+
$this->assertSame('num', $vars[13]->name);
153+
$this->assertSame(18, $vars[13]->lineNumber);
154+
$this->assertSame(true, $vars[13]->assigned);
155+
}
100156
}

test/fixtures/assign_operator.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
function assignFunction(): void
4+
{
5+
$num = 1; // 5行目
6+
$num += 1; // 6行目
7+
$num -= 1; // 7行目
8+
$num *= 1; // 8行目
9+
$num /= 1; // 9行目
10+
$num %= 1; // 10行目
11+
$num **= 1; // 11行目
12+
$num &= 1; // 12行目
13+
$num |= 1; // 13行目
14+
$num ^= 1; // 14行目
15+
$num <<= 1; // 15行目
16+
$num >>= 1; // 16行目
17+
$num .= 1; // 17行目
18+
$num ??= 1; // 18行目
19+
}

0 commit comments

Comments
 (0)