From df8181d25f85fa32b0cd0cba2c2f8c429ade7383 Mon Sep 17 00:00:00 2001 From: kafkiansky Date: Sun, 2 Aug 2026 16:16:17 +0300 Subject: [PATCH] Fix sealed interface naming --- src/Plugin/Generator/ProtoGenerator.php | 9 +++- .../underscore_collision/test.proto | 44 +++++++++++++++++++ .../sealed_interface/PgQuery/BitString.php | 26 +++++++++++ .../sealed_interface/PgQuery/Boolean.php | 26 +++++++++++ .../sealed_interface/PgQuery/Float_.php | 26 +++++++++++ .../sealed_interface/PgQuery/Integer.php | 26 +++++++++++ .../sealed_interface/PgQuery/List_.php | 29 ++++++++++++ .../sealed_interface/PgQuery/Node.php | 33 ++++++++++++++ .../sealed_interface/PgQuery/Node/Node.php | 26 +++++++++++ .../PgQuery/Node/NodeBitString.php | 26 +++++++++++ .../PgQuery/Node/NodeBoolean.php | 26 +++++++++++ .../PgQuery/Node/NodeFloat.php | 26 +++++++++++ .../PgQuery/Node/NodeInteger.php | 26 +++++++++++ .../PgQuery/Node/NodeList.php | 26 +++++++++++ .../PgQuery/Node/NodeString.php | 26 +++++++++++ .../sealed_interface/PgQuery/String_.php | 26 +++++++++++ ...erscoreCollisionTestDescriptorRegistry.php | 42 ++++++++++++++++++ .../PgQuery/autoload.metadata.php | 14 ++++++ 18 files changed, 481 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/sealed_interface/underscore_collision/test.proto create mode 100644 tests/snapshots/sealed_interface/PgQuery/BitString.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Boolean.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Float_.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Integer.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/List_.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Node.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Node/Node.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Node/NodeBitString.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Node/NodeBoolean.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Node/NodeFloat.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Node/NodeInteger.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Node/NodeList.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/Node/NodeString.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/String_.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/UnderscoreCollisionTestDescriptorRegistry.php create mode 100644 tests/snapshots/sealed_interface/PgQuery/autoload.metadata.php diff --git a/src/Plugin/Generator/ProtoGenerator.php b/src/Plugin/Generator/ProtoGenerator.php index 8dd3b60..4b2ec9a 100644 --- a/src/Plugin/Generator/ProtoGenerator.php +++ b/src/Plugin/Generator/ProtoGenerator.php @@ -358,7 +358,7 @@ private function generateOneof( ->addComment('@api') ->addComment('@phpstan-sealed (') ->addComment(implode(" |\n", array_map( - static fn(Parser\FieldDescriptor $variant) => \sprintf(' %s%s', $interfaceName, Naming::pascalCase($variant->name)), + static fn(Parser\FieldDescriptor $variant) => \sprintf(' %s', self::oneofVariantName($oneof->name, $variant->name)), $variants, ))) ->addComment(')'); @@ -381,7 +381,7 @@ private function generateOneofVariant( Parser\FieldDescriptor $variant, ): iterable { $interfaceName = Naming::pascalCase($oneof->name); - $className = \sprintf('%s%s', $interfaceName, Naming::pascalCase($variant->name)); + $className = self::oneofVariantName($oneof->name, $variant->name); $descriptor = new Parser\MessageDescriptor( name: $className, @@ -448,4 +448,9 @@ private function parseDefaultValue( default => null, }; } + + private static function oneofVariantName(string $oneof, string $variant): string + { + return Naming::pascalCase("{$oneof} {$variant}"); + } } diff --git a/tests/fixtures/sealed_interface/underscore_collision/test.proto b/tests/fixtures/sealed_interface/underscore_collision/test.proto new file mode 100644 index 0000000..08abfc0 --- /dev/null +++ b/tests/fixtures/sealed_interface/underscore_collision/test.proto @@ -0,0 +1,44 @@ +syntax = "proto3"; + +package pg_query; + +message Node { + oneof node { + Integer integer = 263 [json_name="Integer"]; + Float float = 264 [json_name="Float"]; + Boolean boolean = 265 [json_name="Boolean"]; + String string = 266 [json_name="String"]; + BitString bit_string = 267 [json_name="BitString"]; + List list = 268 [json_name="List"]; + } +} + +message Integer +{ + int32 ival = 1; +} + +message Float +{ + string fval = 1; +} + +message Boolean +{ + bool boolval = 1; +} + +message String +{ + string sval = 1; +} + +message BitString +{ + string bsval = 1; +} + +message List +{ + repeated Node items = 1; +} diff --git a/tests/snapshots/sealed_interface/PgQuery/BitString.php b/tests/snapshots/sealed_interface/PgQuery/BitString.php new file mode 100644 index 0000000..d5c8ef6 --- /dev/null +++ b/tests/snapshots/sealed_interface/PgQuery/BitString.php @@ -0,0 +1,26 @@ + $items + */ + public function __construct( + #[Reflection\Field(1, new Reflection\ListT(new Reflection\ObjectT(\PgQuery\Node::class)))] + public array $items = [], + ) {} +} diff --git a/tests/snapshots/sealed_interface/PgQuery/Node.php b/tests/snapshots/sealed_interface/PgQuery/Node.php new file mode 100644 index 0000000..5d0dbff --- /dev/null +++ b/tests/snapshots/sealed_interface/PgQuery/Node.php @@ -0,0 +1,33 @@ +add(Registry\Descriptor::base64(self::DESCRIPTOR_BUFFER), new File( + name: 'underscore_collision/test.proto', + messages: [ + new File\MessageDescriptor('pg_query.Node', \PgQuery\Node::class), + new File\MessageDescriptor('pg_query.Integer', \PgQuery\Integer::class), + new File\MessageDescriptor('pg_query.Float', \PgQuery\Float_::class), + new File\MessageDescriptor('pg_query.Boolean', \PgQuery\Boolean::class), + new File\MessageDescriptor('pg_query.String', \PgQuery\String_::class), + new File\MessageDescriptor('pg_query.BitString', \PgQuery\BitString::class), + new File\MessageDescriptor('pg_query.List', \PgQuery\List_::class), + ], + )); + } +} diff --git a/tests/snapshots/sealed_interface/PgQuery/autoload.metadata.php b/tests/snapshots/sealed_interface/PgQuery/autoload.metadata.php new file mode 100644 index 0000000..45bc4d4 --- /dev/null +++ b/tests/snapshots/sealed_interface/PgQuery/autoload.metadata.php @@ -0,0 +1,14 @@ +register( + new \Thesis\Protobuf\Registry\OnceRegistrar(new \PgQuery\UnderscoreCollisionTestDescriptorRegistry()), +);