From 802a9c37ee6f1c29d6625bd04a98379fef38b830 Mon Sep 17 00:00:00 2001 From: smeghead Date: Thu, 20 Mar 2025 15:54:05 +0900 Subject: [PATCH] feat: AssignOp has been added to the assignment decision in addition to Assign. --- CHANGELOG.md | 1 + .../Visitor/FunctionLikeFindingVisitor.php | 3 +- test/VariableParserTest.php | 56 +++++++++++++++++++ test/fixtures/assign_operator.php | 19 +++++++ 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/assign_operator.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 03748a2..b1b6248 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Features * The base of deviation of local variable abuse has been changed from the average number of rows to the first number of rows. + * AssignOp has been added to the assignment decision in addition to Assign. ## v0.0.2 (2025-03-19) diff --git a/src/Parse/Visitor/FunctionLikeFindingVisitor.php b/src/Parse/Visitor/FunctionLikeFindingVisitor.php index bc9fd8d..6ec1512 100644 --- a/src/Parse/Visitor/FunctionLikeFindingVisitor.php +++ b/src/Parse/Visitor/FunctionLikeFindingVisitor.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\AssignOp; use PhpParser\Node\FunctionLike; use PhpParser\NodeVisitor\FindingVisitor; use PhpParser\Node\Stmt\Class_; @@ -31,7 +32,7 @@ public function enterNode(Node $node) { $this->currentNamespace = $node->name ? $node->name->name : null; } - if ($node instanceof Assign) { + if ($node instanceof Assign || $node instanceof AssignOp) { $node->var->setAttribute('assigned', true); // Mark as assigned } if ($node instanceof FunctionLike) { diff --git a/test/VariableParserTest.php b/test/VariableParserTest.php index 46115f2..94fe23c 100644 --- a/test/VariableParserTest.php +++ b/test/VariableParserTest.php @@ -97,4 +97,60 @@ public function testParseNamespace(): void $this->assertCount(0, $functions[1]->getVariables()); } + public function testParseAssignOperator(): void + { + $parser = new VariableParser(); + $content = file_get_contents($this->fixtureDir . '/assign_operator.php'); + $result = $parser->parse($content); + + $this->assertInstanceOf(ParseResult::class, $result); + $functions = $result->functions; + $this->assertCount(1, $functions); + $this->assertSame('assignFunction', $functions[0]->name); + $this->assertCount(14, $functions[0]->getVariables()); + + $vars = $functions[0]->getVariables(); + $this->assertSame('num', $vars[0]->name); + $this->assertSame(5, $vars[0]->lineNumber); + $this->assertSame(true, $vars[0]->assigned, '$num = 1;'); + $this->assertSame('num', $vars[1]->name); + $this->assertSame(6, $vars[1]->lineNumber); + $this->assertSame(true, $vars[1]->assigned, '$num += 1;'); + $this->assertSame('num', $vars[2]->name); + $this->assertSame(7, $vars[2]->lineNumber); + $this->assertSame(true, $vars[2]->assigned, '$num -= 1;'); + $this->assertSame('num', $vars[3]->name); + $this->assertSame(8, $vars[3]->lineNumber); + $this->assertSame(true, $vars[3]->assigned, '$num *= 1;'); + $this->assertSame('num', $vars[4]->name); + $this->assertSame(9, $vars[4]->lineNumber); + $this->assertSame(true, $vars[4]->assigned); + $this->assertSame('num', $vars[5]->name); + $this->assertSame(10, $vars[5]->lineNumber); + $this->assertSame(true, $vars[5]->assigned); + $this->assertSame('num', $vars[6]->name); + $this->assertSame(11, $vars[6]->lineNumber); + $this->assertSame(true, $vars[6]->assigned); + $this->assertSame('num', $vars[7]->name); + $this->assertSame(12, $vars[7]->lineNumber); + $this->assertSame(true, $vars[7]->assigned); + $this->assertSame('num', $vars[8]->name); + $this->assertSame(13, $vars[8]->lineNumber); + $this->assertSame(true, $vars[8]->assigned); + $this->assertSame('num', $vars[9]->name); + $this->assertSame(14, $vars[9]->lineNumber); + $this->assertSame(true, $vars[9]->assigned); + $this->assertSame('num', $vars[10]->name); + $this->assertSame(15, $vars[10]->lineNumber); + $this->assertSame(true, $vars[10]->assigned); + $this->assertSame('num', $vars[11]->name); + $this->assertSame(16, $vars[11]->lineNumber); + $this->assertSame(true, $vars[11]->assigned); + $this->assertSame('num', $vars[12]->name); + $this->assertSame(17, $vars[12]->lineNumber); + $this->assertSame(true, $vars[12]->assigned); + $this->assertSame('num', $vars[13]->name); + $this->assertSame(18, $vars[13]->lineNumber); + $this->assertSame(true, $vars[13]->assigned); + } } \ No newline at end of file diff --git a/test/fixtures/assign_operator.php b/test/fixtures/assign_operator.php new file mode 100644 index 0000000..dea25bc --- /dev/null +++ b/test/fixtures/assign_operator.php @@ -0,0 +1,19 @@ +>= 1; // 16行目 + $num .= 1; // 17行目 + $num ??= 1; // 18行目 +} \ No newline at end of file