Skip to content

Commit baa41bf

Browse files
authored
Merge pull request #14 from smeghead/fix/issue-12
fix: fix get variable name in InterpolatedString. #12
2 parents 5bcbbab + 2a10ba7 commit baa41bf

File tree

4 files changed

+48
-1
lines changed

4 files changed

+48
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* Fixed command execution to properly return error codes when failures occur
66
* Improved error handling in all command implementations
77
* fix empty scope error. #11
8+
* fix get variable name in InterpolatedString. ex: ${"Hello, {$name}!"} #12
89

910
## v0.0.4 (2025-03-20)
1011

src/Parse/VariableParser.php

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

77
use PhpParser\Node\Expr\Variable;
88
use PhpParser\Node\FunctionLike;
9+
use PhpParser\Node\Scalar\InterpolatedString;
910
use PhpParser\NodeFinder;
1011
use PhpParser\NodeTraverser;
1112
use PhpParser\NodeVisitor\NameResolver;
@@ -65,9 +66,23 @@ private function collectParseResultPerFunctionLike(array $functionLikes): array
6566
$variables = $this->nodeFinder->findInstanceOf($function, Variable::class);
6667
foreach ($variables as $variable) {
6768
$assigned = $variable->getAttribute('assigned');
68-
$func->addVariable(new VarReference($variable->name, $variable->getLine(), $assigned === true)); // @phpstan-ignore-line
69+
$func->addVariable(new VarReference($this->getVariableName($variable), $variable->getLine(), $assigned === true)); // @phpstan-ignore-line
6970
}
7071
return $func;
7172
}, $functionLikes);
7273
}
74+
75+
private function getVariableName(Variable $variable): string
76+
{
77+
if ($variable->name instanceof InterpolatedString) {
78+
$parts = $variable->name->parts;
79+
return sprintf('${"%s"}', implode('', array_map(function($part){
80+
if ($part instanceof Variable) {
81+
return sprintf('{$%s}', $part->name);
82+
}
83+
return $part->value;
84+
}, $parts)));
85+
}
86+
return $variable->name;
87+
}
7388
}

test/VariableParserTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,29 @@ public function testParseAssignOperator(): void
153153
$this->assertSame(18, $vars[13]->lineNumber);
154154
$this->assertSame(true, $vars[13]->assigned);
155155
}
156+
157+
public function testInterpolatedStringFunction(): void
158+
{
159+
$parser = new VariableParser();
160+
$content = file_get_contents($this->fixtureDir . '/interpolated_string.php');
161+
$result = $parser->parse($content);
162+
163+
$this->assertInstanceOf(ParseResult::class, $result);
164+
$functions = $result->functions;
165+
$this->assertCount(1, $functions);
166+
$this->assertSame('test', $functions[0]->name);
167+
$this->assertSame(null, $functions[0]->namespace);
168+
$this->assertCount(3, $functions[0]->getVariables());
169+
170+
$vars = $functions[0]->getVariables();
171+
$this->assertSame('name', $vars[0]->name);
172+
$this->assertSame(3, $vars[0]->lineNumber, 'first $name');
173+
$this->assertSame(false, $vars[0]->assigned, 'first $name');
174+
$this->assertSame('${"Hello, {$name}!"}', $vars[1]->name, '${"Hello, {$name}!');
175+
$this->assertSame(5, $vars[1]->lineNumber, 'interpolated_string');
176+
$this->assertSame(false, $vars[1]->assigned, 'interpolated_string not reference');
177+
$this->assertSame('name', $vars[2]->name);
178+
$this->assertSame(5, $vars[2]->lineNumber, 'second $name (10)');
179+
$this->assertSame(false, $vars[2]->assigned, 'second $name (10) not reference');
180+
}
156181
}

test/fixtures/interpolated_string.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
3+
function test(string $name): string
4+
{
5+
return ${"Hello, {$name}!"};
6+
}

0 commit comments

Comments
 (0)