diff --git a/src/Writers/FunctionWriter.php b/src/Writers/FunctionWriter.php index ee1e669..a8ab6ed 100644 --- a/src/Writers/FunctionWriter.php +++ b/src/Writers/FunctionWriter.php @@ -6,6 +6,8 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; +use PhpParser\Node\Scalar\Float_; +use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; class FunctionWriter @@ -85,7 +87,7 @@ private function convertToArgs($args) { return collect($args) ->reject(fn ($arg) => $arg === null || mb_strlen($arg) === 0) - ->map(fn (string $arg) => new Arg(new String_($arg))) + ->map(fn (mixed $arg) => $this->arg($arg)) ->all(); } @@ -93,4 +95,20 @@ private function convertToName(string $name) { return new Name($name); } + + private function scalarClass(string $type): string + { + return match ($type) { + 'integer' => Int_::class, + 'double' => Float_::class, + default => String_::class, + }; + } + + private function arg(mixed $arg): Arg + { + $scalarClass = $this->scalarClass(gettype($arg)); + + return new Arg(new $scalarClass($arg)); + } } diff --git a/tests/LaravelFunctionCallTest.php b/tests/LaravelFunctionCallTest.php index ef78d26..7e1692f 100644 --- a/tests/LaravelFunctionCallTest.php +++ b/tests/LaravelFunctionCallTest.php @@ -60,7 +60,20 @@ public function testCustomCallsCanBeWritten() ); } + public function testTypesAreMaintained() + { + $f = new FunctionWriter; + $this->assertChangeEquals( + __DIR__.'/configs/empty.php', + __DIR__.'/expected/typesenv.php', + [ + 'int_type' => $f->env('INTEGER_TYPE', 5), + 'double_type' => $f->env('DOUBLE_TYPE', 5.0), + 'string_type' => $f->env('STRING_TYPE', '5'), + ] + ); + } public function testWritingNewClosuresOrArrowFunctions() { diff --git a/tests/expected/typesenv.php b/tests/expected/typesenv.php new file mode 100644 index 0000000..6fd4e77 --- /dev/null +++ b/tests/expected/typesenv.php @@ -0,0 +1,7 @@ + env('INTEGER_TYPE', 5), + 'double_type' => env('DOUBLE_TYPE', 5.0), + 'string_type' => env('STRING_TYPE', '5'), +];