Skip to content

Commit a12e321

Browse files
committed
Return Chain instead of FormatterBuilder in mixin interfaces
The Builder and Chain mixin interfaces were declaring return types as FormatterBuilder, which is the concrete class. Since FormatterBuilder implements Chain, and Chain extends Formatter, returning Chain is more accurate for the mixin type declarations. Without this change, static analysis tools (e.g., PHPStan, Psalm) interpret calls like `Sf::date()->uppercase()` as invoking a static method (`Builder::uppercase()`) as a non-static method on a FormatterBuilder instance. By returning Chain—which declares instance methods—static analysis correctly resolves chained calls as non-static method invocations. Assisted-by: Claude Code (claude-opus-4-6)
1 parent 7d0aa0d commit a12e321

2 files changed

Lines changed: 33 additions & 33 deletions

File tree

src/Mixin/Builder.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,40 @@
1616
/** @mixin FormatterBuilder */
1717
interface Builder
1818
{
19-
public static function area(string $unit): FormatterBuilder;
19+
public static function area(string $unit): Chain;
2020

21-
public static function creditCard(): FormatterBuilder;
21+
public static function creditCard(): Chain;
2222

23-
public static function secureCreditCard(string $maskChar = '*'): FormatterBuilder;
23+
public static function secureCreditCard(string $maskChar = '*'): Chain;
2424

25-
public static function imperialArea(string $unit): FormatterBuilder;
25+
public static function imperialArea(string $unit): Chain;
2626

27-
public static function imperialLength(string $unit): FormatterBuilder;
27+
public static function imperialLength(string $unit): Chain;
2828

29-
public static function imperialMass(string $unit): FormatterBuilder;
29+
public static function imperialMass(string $unit): Chain;
3030

31-
public static function date(string $format = 'Y-m-d H:i:s'): FormatterBuilder;
31+
public static function date(string $format = 'Y-m-d H:i:s'): Chain;
3232

33-
public static function lowercase(): FormatterBuilder;
33+
public static function lowercase(): Chain;
3434

35-
public static function mask(string $range, string $replacement = '*'): FormatterBuilder;
35+
public static function mask(string $range, string $replacement = '*'): Chain;
3636

37-
public static function metric(string $unit): FormatterBuilder;
37+
public static function metric(string $unit): Chain;
3838

3939
public static function number(
4040
int $decimals = 0,
4141
string $decimalSeparator = '.',
4242
string $thousandsSeparator = ',',
43-
): FormatterBuilder;
43+
): Chain;
4444

45-
public static function metricMass(string $unit): FormatterBuilder;
45+
public static function metricMass(string $unit): Chain;
4646

47-
public static function pattern(string $pattern): FormatterBuilder;
47+
public static function pattern(string $pattern): Chain;
4848

4949
/** @param array<string, mixed> $parameters */
50-
public static function placeholder(array $parameters): FormatterBuilder;
50+
public static function placeholder(array $parameters): Chain;
5151

52-
public static function time(string $unit): FormatterBuilder;
52+
public static function time(string $unit): Chain;
5353

54-
public static function uppercase(): FormatterBuilder;
54+
public static function uppercase(): Chain;
5555
}

src/Mixin/Chain.php

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,44 +12,44 @@
1212
namespace Respect\StringFormatter\Mixin;
1313

1414
use Respect\StringFormatter\Formatter;
15-
use Respect\StringFormatter\FormatterBuilder;
15+
use Respect\StringFormatter\Chain;
1616

1717
interface Chain extends Formatter
1818
{
19-
public function area(string $unit): FormatterBuilder;
19+
public function area(string $unit): Chain;
2020

21-
public function creditCard(): FormatterBuilder;
21+
public function creditCard(): Chain;
2222

23-
public function secureCreditCard(string $maskChar = '*'): FormatterBuilder;
23+
public function secureCreditCard(string $maskChar = '*'): Chain;
2424

25-
public function imperialArea(string $unit): FormatterBuilder;
25+
public function imperialArea(string $unit): Chain;
2626

27-
public function imperialLength(string $unit): FormatterBuilder;
27+
public function imperialLength(string $unit): Chain;
2828

29-
public function imperialMass(string $unit): FormatterBuilder;
29+
public function imperialMass(string $unit): Chain;
3030

31-
public function date(string $format = 'Y-m-d H:i:s'): FormatterBuilder;
31+
public function date(string $format = 'Y-m-d H:i:s'): Chain;
3232

33-
public function lowercase(): FormatterBuilder;
33+
public function lowercase(): Chain;
3434

35-
public function mask(string $range, string $replacement = '*'): FormatterBuilder;
35+
public function mask(string $range, string $replacement = '*'): Chain;
3636

37-
public function metric(string $unit): FormatterBuilder;
37+
public function metric(string $unit): Chain;
3838

3939
public function number(
4040
int $decimals = 0,
4141
string $decimalSeparator = '.',
4242
string $thousandsSeparator = ',',
43-
): FormatterBuilder;
43+
): Chain;
4444

45-
public function metricMass(string $unit): FormatterBuilder;
45+
public function metricMass(string $unit): Chain;
4646

47-
public function pattern(string $pattern): FormatterBuilder;
47+
public function pattern(string $pattern): Chain;
4848

4949
/** @param array<string, mixed> $parameters */
50-
public function placeholder(array $parameters): FormatterBuilder;
50+
public function placeholder(array $parameters): Chain;
5151

52-
public function time(string $unit): FormatterBuilder;
52+
public function time(string $unit): Chain;
5353

54-
public function uppercase(): FormatterBuilder;
54+
public function uppercase(): Chain;
5555
}

0 commit comments

Comments
 (0)