From f8ca3acd2924421dc18f685c629a6e54875ac113 Mon Sep 17 00:00:00 2001 From: Paul Yang Date: Thu, 1 Dec 2016 14:50:53 -0800 Subject: Generate phpdoc in php generated files. (#2406) --- php/tests/test.pb.php | 948 +++++++++++++++++++++- php/tests/test.proto | 5 + php/tests/test_include.pb.php | 12 + src/google/protobuf/compiler/php/php_generator.cc | 383 ++++++--- 4 files changed, 1229 insertions(+), 119 deletions(-) diff --git a/php/tests/test.pb.php b/php/tests/test.pb.php index ed316b6e..87332ae9 100644 --- a/php/tests/test.pb.php +++ b/php/tests/test.pb.php @@ -10,834 +10,1458 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\GPBUtil; +/** + * Protobuf type foo.TestMessage + */ class TestMessage extends \Google\Protobuf\Internal\Message { + /** + *
+     * Singular
+     * 
+ * + * optional int32 optional_int32 = 1; + */ private $optional_int32 = 0; + /** + * optional int64 optional_int64 = 2; + */ private $optional_int64 = 0; + /** + * optional uint32 optional_uint32 = 3; + */ private $optional_uint32 = 0; + /** + * optional uint64 optional_uint64 = 4; + */ private $optional_uint64 = 0; + /** + * optional sint32 optional_sint32 = 5; + */ private $optional_sint32 = 0; + /** + * optional sint64 optional_sint64 = 6; + */ private $optional_sint64 = 0; + /** + * optional fixed32 optional_fixed32 = 7; + */ private $optional_fixed32 = 0; + /** + * optional fixed64 optional_fixed64 = 8; + */ private $optional_fixed64 = 0; + /** + * optional sfixed32 optional_sfixed32 = 9; + */ private $optional_sfixed32 = 0; + /** + * optional sfixed64 optional_sfixed64 = 10; + */ private $optional_sfixed64 = 0; + /** + * optional float optional_float = 11; + */ private $optional_float = 0.0; + /** + * optional double optional_double = 12; + */ private $optional_double = 0.0; + /** + * optional bool optional_bool = 13; + */ private $optional_bool = false; + /** + * optional string optional_string = 14; + */ private $optional_string = ''; + /** + * optional bytes optional_bytes = 15; + */ private $optional_bytes = ''; + /** + * optional .foo.TestEnum optional_enum = 16; + */ private $optional_enum = 0; + /** + * optional .foo.TestMessage.Sub optional_message = 17; + */ private $optional_message = null; + /** + * optional .bar.TestInclude optional_included_message = 18; + */ private $optional_included_message = null; + /** + * optional .foo.TestMessage recursive = 19; + */ private $recursive = null; + /** + *
+     * Repeated
+     * 
+ * + * repeated int32 repeated_int32 = 31; + */ private $repeated_int32; + /** + * repeated int64 repeated_int64 = 32; + */ private $repeated_int64; + /** + * repeated uint32 repeated_uint32 = 33; + */ private $repeated_uint32; + /** + * repeated uint64 repeated_uint64 = 34; + */ private $repeated_uint64; + /** + * repeated sint32 repeated_sint32 = 35; + */ private $repeated_sint32; + /** + * repeated sint64 repeated_sint64 = 36; + */ private $repeated_sint64; + /** + * repeated fixed32 repeated_fixed32 = 37; + */ private $repeated_fixed32; + /** + * repeated fixed64 repeated_fixed64 = 38; + */ private $repeated_fixed64; + /** + * repeated sfixed32 repeated_sfixed32 = 39; + */ private $repeated_sfixed32; + /** + * repeated sfixed64 repeated_sfixed64 = 40; + */ private $repeated_sfixed64; + /** + * repeated float repeated_float = 41; + */ private $repeated_float; + /** + * repeated double repeated_double = 42; + */ private $repeated_double; + /** + * repeated bool repeated_bool = 43; + */ private $repeated_bool; + /** + * repeated string repeated_string = 44; + */ private $repeated_string; + /** + * repeated bytes repeated_bytes = 45; + */ private $repeated_bytes; + /** + * repeated .foo.TestEnum repeated_enum = 46; + */ private $repeated_enum; + /** + * repeated .foo.TestMessage.Sub repeated_message = 47; + */ private $repeated_message; + /** + * repeated .foo.TestMessage repeated_recursive = 48; + */ private $repeated_recursive; + /** + * map<int32, int32> map_int32_int32 = 71; + */ private $map_int32_int32; + /** + * map<int64, int64> map_int64_int64 = 72; + */ private $map_int64_int64; + /** + * map<uint32, uint32> map_uint32_uint32 = 73; + */ private $map_uint32_uint32; + /** + * map<uint64, uint64> map_uint64_uint64 = 74; + */ private $map_uint64_uint64; + /** + * map<sint32, sint32> map_sint32_sint32 = 75; + */ private $map_sint32_sint32; + /** + * map<sint64, sint64> map_sint64_sint64 = 76; + */ private $map_sint64_sint64; + /** + * map<fixed32, fixed32> map_fixed32_fixed32 = 77; + */ private $map_fixed32_fixed32; + /** + * map<fixed64, fixed64> map_fixed64_fixed64 = 78; + */ private $map_fixed64_fixed64; + /** + * map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 79; + */ private $map_sfixed32_sfixed32; + /** + * map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 80; + */ private $map_sfixed64_sfixed64; + /** + * map<int32, float> map_int32_float = 81; + */ private $map_int32_float; + /** + * map<int32, double> map_int32_double = 82; + */ private $map_int32_double; + /** + * map<bool, bool> map_bool_bool = 83; + */ private $map_bool_bool; + /** + * map<string, string> map_string_string = 84; + */ private $map_string_string; + /** + * map<int32, bytes> map_int32_bytes = 85; + */ private $map_int32_bytes; + /** + * map<int32, .foo.TestEnum> map_int32_enum = 86; + */ private $map_int32_enum; + /** + * map<int32, .foo.TestMessage.Sub> map_int32_message = 87; + */ private $map_int32_message; + /** + * map<int32, .foo.TestMessage> map_recursive = 88; + */ private $map_recursive; protected $my_oneof; + /** + *
+     * Singular
+     * 
+ * + * optional int32 optional_int32 = 1; + */ public function getOptionalInt32() { return $this->optional_int32; } + /** + *
+     * Singular
+     * 
+ * + * optional int32 optional_int32 = 1; + */ public function setOptionalInt32($var) { GPBUtil::checkInt32($var); $this->optional_int32 = $var; } + /** + * optional int64 optional_int64 = 2; + */ public function getOptionalInt64() { return $this->optional_int64; } + /** + * optional int64 optional_int64 = 2; + */ public function setOptionalInt64($var) { GPBUtil::checkInt64($var); $this->optional_int64 = $var; } + /** + * optional uint32 optional_uint32 = 3; + */ public function getOptionalUint32() { return $this->optional_uint32; } + /** + * optional uint32 optional_uint32 = 3; + */ public function setOptionalUint32($var) { GPBUtil::checkUint32($var); $this->optional_uint32 = $var; } + /** + * optional uint64 optional_uint64 = 4; + */ public function getOptionalUint64() { return $this->optional_uint64; } + /** + * optional uint64 optional_uint64 = 4; + */ public function setOptionalUint64($var) { GPBUtil::checkUint64($var); $this->optional_uint64 = $var; } + /** + * optional sint32 optional_sint32 = 5; + */ public function getOptionalSint32() { return $this->optional_sint32; } + /** + * optional sint32 optional_sint32 = 5; + */ public function setOptionalSint32($var) { GPBUtil::checkInt32($var); $this->optional_sint32 = $var; } + /** + * optional sint64 optional_sint64 = 6; + */ public function getOptionalSint64() { return $this->optional_sint64; } + /** + * optional sint64 optional_sint64 = 6; + */ public function setOptionalSint64($var) { GPBUtil::checkInt64($var); $this->optional_sint64 = $var; } + /** + * optional fixed32 optional_fixed32 = 7; + */ public function getOptionalFixed32() { return $this->optional_fixed32; } + /** + * optional fixed32 optional_fixed32 = 7; + */ public function setOptionalFixed32($var) { GPBUtil::checkUint32($var); $this->optional_fixed32 = $var; } + /** + * optional fixed64 optional_fixed64 = 8; + */ public function getOptionalFixed64() { return $this->optional_fixed64; } + /** + * optional fixed64 optional_fixed64 = 8; + */ public function setOptionalFixed64($var) { GPBUtil::checkUint64($var); $this->optional_fixed64 = $var; } + /** + * optional sfixed32 optional_sfixed32 = 9; + */ public function getOptionalSfixed32() { return $this->optional_sfixed32; } + /** + * optional sfixed32 optional_sfixed32 = 9; + */ public function setOptionalSfixed32($var) { GPBUtil::checkInt32($var); $this->optional_sfixed32 = $var; } + /** + * optional sfixed64 optional_sfixed64 = 10; + */ public function getOptionalSfixed64() { return $this->optional_sfixed64; } + /** + * optional sfixed64 optional_sfixed64 = 10; + */ public function setOptionalSfixed64($var) { GPBUtil::checkInt64($var); $this->optional_sfixed64 = $var; } + /** + * optional float optional_float = 11; + */ public function getOptionalFloat() { return $this->optional_float; } + /** + * optional float optional_float = 11; + */ public function setOptionalFloat($var) { GPBUtil::checkFloat($var); $this->optional_float = $var; } + /** + * optional double optional_double = 12; + */ public function getOptionalDouble() { return $this->optional_double; } + /** + * optional double optional_double = 12; + */ public function setOptionalDouble($var) { GPBUtil::checkDouble($var); $this->optional_double = $var; } + /** + * optional bool optional_bool = 13; + */ public function getOptionalBool() { return $this->optional_bool; } + /** + * optional bool optional_bool = 13; + */ public function setOptionalBool($var) { GPBUtil::checkBool($var); $this->optional_bool = $var; } + /** + * optional string optional_string = 14; + */ public function getOptionalString() { return $this->optional_string; } + /** + * optional string optional_string = 14; + */ public function setOptionalString($var) { GPBUtil::checkString($var, True); $this->optional_string = $var; } + /** + * optional bytes optional_bytes = 15; + */ public function getOptionalBytes() { return $this->optional_bytes; } + /** + * optional bytes optional_bytes = 15; + */ public function setOptionalBytes($var) { GPBUtil::checkString($var, False); $this->optional_bytes = $var; } + /** + * optional .foo.TestEnum optional_enum = 16; + */ public function getOptionalEnum() { return $this->optional_enum; } + /** + * optional .foo.TestEnum optional_enum = 16; + */ public function setOptionalEnum($var) { GPBUtil::checkEnum($var, \Foo\TestEnum::class); $this->optional_enum = $var; } + /** + * optional .foo.TestMessage.Sub optional_message = 17; + */ public function getOptionalMessage() { return $this->optional_message; } + /** + * optional .foo.TestMessage.Sub optional_message = 17; + */ public function setOptionalMessage(&$var) { GPBUtil::checkMessage($var, \Foo\TestMessage_Sub::class); $this->optional_message = $var; } + /** + * optional .bar.TestInclude optional_included_message = 18; + */ public function getOptionalIncludedMessage() { return $this->optional_included_message; } + /** + * optional .bar.TestInclude optional_included_message = 18; + */ public function setOptionalIncludedMessage(&$var) { GPBUtil::checkMessage($var, \Bar\TestInclude::class); $this->optional_included_message = $var; } + /** + * optional .foo.TestMessage recursive = 19; + */ public function getRecursive() { return $this->recursive; } + /** + * optional .foo.TestMessage recursive = 19; + */ public function setRecursive(&$var) { GPBUtil::checkMessage($var, \Foo\TestMessage::class); $this->recursive = $var; } + /** + *
+     * Repeated
+     * 
+ * + * repeated int32 repeated_int32 = 31; + */ public function getRepeatedInt32() { return $this->repeated_int32; } + /** + *
+     * Repeated
+     * 
+ * + * repeated int32 repeated_int32 = 31; + */ public function setRepeatedInt32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::INT32); $this->repeated_int32 = $var; } + /** + * repeated int64 repeated_int64 = 32; + */ public function getRepeatedInt64() { return $this->repeated_int64; } + /** + * repeated int64 repeated_int64 = 32; + */ public function setRepeatedInt64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::INT64); $this->repeated_int64 = $var; } + /** + * repeated uint32 repeated_uint32 = 33; + */ public function getRepeatedUint32() { return $this->repeated_uint32; } + /** + * repeated uint32 repeated_uint32 = 33; + */ public function setRepeatedUint32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::UINT32); $this->repeated_uint32 = $var; } + /** + * repeated uint64 repeated_uint64 = 34; + */ public function getRepeatedUint64() { return $this->repeated_uint64; } + /** + * repeated uint64 repeated_uint64 = 34; + */ public function setRepeatedUint64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::UINT64); $this->repeated_uint64 = $var; } + /** + * repeated sint32 repeated_sint32 = 35; + */ public function getRepeatedSint32() { return $this->repeated_sint32; } + /** + * repeated sint32 repeated_sint32 = 35; + */ public function setRepeatedSint32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SINT32); $this->repeated_sint32 = $var; } + /** + * repeated sint64 repeated_sint64 = 36; + */ public function getRepeatedSint64() { return $this->repeated_sint64; } + /** + * repeated sint64 repeated_sint64 = 36; + */ public function setRepeatedSint64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SINT64); $this->repeated_sint64 = $var; } + /** + * repeated fixed32 repeated_fixed32 = 37; + */ public function getRepeatedFixed32() { return $this->repeated_fixed32; } + /** + * repeated fixed32 repeated_fixed32 = 37; + */ public function setRepeatedFixed32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FIXED32); $this->repeated_fixed32 = $var; } + /** + * repeated fixed64 repeated_fixed64 = 38; + */ public function getRepeatedFixed64() { return $this->repeated_fixed64; } + /** + * repeated fixed64 repeated_fixed64 = 38; + */ public function setRepeatedFixed64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FIXED64); $this->repeated_fixed64 = $var; } + /** + * repeated sfixed32 repeated_sfixed32 = 39; + */ public function getRepeatedSfixed32() { return $this->repeated_sfixed32; } + /** + * repeated sfixed32 repeated_sfixed32 = 39; + */ public function setRepeatedSfixed32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SFIXED32); $this->repeated_sfixed32 = $var; } + /** + * repeated sfixed64 repeated_sfixed64 = 40; + */ public function getRepeatedSfixed64() { return $this->repeated_sfixed64; } + /** + * repeated sfixed64 repeated_sfixed64 = 40; + */ public function setRepeatedSfixed64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SFIXED64); $this->repeated_sfixed64 = $var; } + /** + * repeated float repeated_float = 41; + */ public function getRepeatedFloat() { return $this->repeated_float; } + /** + * repeated float repeated_float = 41; + */ public function setRepeatedFloat(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FLOAT); $this->repeated_float = $var; } + /** + * repeated double repeated_double = 42; + */ public function getRepeatedDouble() { return $this->repeated_double; } + /** + * repeated double repeated_double = 42; + */ public function setRepeatedDouble(&$var) { GPBUtil::checkRepeatedField($var, GPBType::DOUBLE); $this->repeated_double = $var; } + /** + * repeated bool repeated_bool = 43; + */ public function getRepeatedBool() { return $this->repeated_bool; } + /** + * repeated bool repeated_bool = 43; + */ public function setRepeatedBool(&$var) { GPBUtil::checkRepeatedField($var, GPBType::BOOL); $this->repeated_bool = $var; } + /** + * repeated string repeated_string = 44; + */ public function getRepeatedString() { return $this->repeated_string; } + /** + * repeated string repeated_string = 44; + */ public function setRepeatedString(&$var) { GPBUtil::checkRepeatedField($var, GPBType::STRING); $this->repeated_string = $var; } + /** + * repeated bytes repeated_bytes = 45; + */ public function getRepeatedBytes() { return $this->repeated_bytes; } + /** + * repeated bytes repeated_bytes = 45; + */ public function setRepeatedBytes(&$var) { GPBUtil::checkRepeatedField($var, GPBType::BYTES); $this->repeated_bytes = $var; } + /** + * repeated .foo.TestEnum repeated_enum = 46; + */ public function getRepeatedEnum() { return $this->repeated_enum; } + /** + * repeated .foo.TestEnum repeated_enum = 46; + */ public function setRepeatedEnum(&$var) { GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class); $this->repeated_enum = $var; } + /** + * repeated .foo.TestMessage.Sub repeated_message = 47; + */ public function getRepeatedMessage() { return $this->repeated_message; } + /** + * repeated .foo.TestMessage.Sub repeated_message = 47; + */ public function setRepeatedMessage(&$var) { GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Foo\TestMessage_Sub::class); $this->repeated_message = $var; } + /** + * repeated .foo.TestMessage repeated_recursive = 48; + */ public function getRepeatedRecursive() { return $this->repeated_recursive; } + /** + * repeated .foo.TestMessage repeated_recursive = 48; + */ public function setRepeatedRecursive(&$var) { GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Foo\TestMessage::class); $this->repeated_recursive = $var; } + /** + * optional int32 oneof_int32 = 51; + */ public function getOneofInt32() { return $this->readOneof(51); } + /** + * optional int32 oneof_int32 = 51; + */ public function setOneofInt32($var) { GPBUtil::checkInt32($var); $this->writeOneof(51, $var); } + /** + * optional int64 oneof_int64 = 52; + */ public function getOneofInt64() { return $this->readOneof(52); } + /** + * optional int64 oneof_int64 = 52; + */ public function setOneofInt64($var) { GPBUtil::checkInt64($var); $this->writeOneof(52, $var); } + /** + * optional uint32 oneof_uint32 = 53; + */ public function getOneofUint32() { return $this->readOneof(53); } + /** + * optional uint32 oneof_uint32 = 53; + */ public function setOneofUint32($var) { GPBUtil::checkUint32($var); $this->writeOneof(53, $var); } + /** + * optional uint64 oneof_uint64 = 54; + */ public function getOneofUint64() { return $this->readOneof(54); } + /** + * optional uint64 oneof_uint64 = 54; + */ public function setOneofUint64($var) { GPBUtil::checkUint64($var); $this->writeOneof(54, $var); } + /** + * optional uint32 oneof_sint32 = 55; + */ public function getOneofSint32() { return $this->readOneof(55); } + /** + * optional uint32 oneof_sint32 = 55; + */ public function setOneofSint32($var) { GPBUtil::checkUint32($var); $this->writeOneof(55, $var); } + /** + * optional uint64 oneof_sint64 = 56; + */ public function getOneofSint64() { return $this->readOneof(56); } + /** + * optional uint64 oneof_sint64 = 56; + */ public function setOneofSint64($var) { GPBUtil::checkUint64($var); $this->writeOneof(56, $var); } + /** + * optional uint32 oneof_fixed32 = 57; + */ public function getOneofFixed32() { return $this->readOneof(57); } + /** + * optional uint32 oneof_fixed32 = 57; + */ public function setOneofFixed32($var) { GPBUtil::checkUint32($var); $this->writeOneof(57, $var); } + /** + * optional uint64 oneof_fixed64 = 58; + */ public function getOneofFixed64() { return $this->readOneof(58); } + /** + * optional uint64 oneof_fixed64 = 58; + */ public function setOneofFixed64($var) { GPBUtil::checkUint64($var); $this->writeOneof(58, $var); } + /** + * optional uint32 oneof_sfixed32 = 59; + */ public function getOneofSfixed32() { return $this->readOneof(59); } + /** + * optional uint32 oneof_sfixed32 = 59; + */ public function setOneofSfixed32($var) { GPBUtil::checkUint32($var); $this->writeOneof(59, $var); } + /** + * optional uint64 oneof_sfixed64 = 60; + */ public function getOneofSfixed64() { return $this->readOneof(60); } + /** + * optional uint64 oneof_sfixed64 = 60; + */ public function setOneofSfixed64($var) { GPBUtil::checkUint64($var); $this->writeOneof(60, $var); } + /** + * optional double oneof_double = 61; + */ public function getOneofDouble() { return $this->readOneof(61); } + /** + * optional double oneof_double = 61; + */ public function setOneofDouble($var) { GPBUtil::checkDouble($var); $this->writeOneof(61, $var); } + /** + * optional float oneof_float = 62; + */ public function getOneofFloat() { return $this->readOneof(62); } + /** + * optional float oneof_float = 62; + */ public function setOneofFloat($var) { GPBUtil::checkFloat($var); $this->writeOneof(62, $var); } + /** + * optional bool oneof_bool = 63; + */ public function getOneofBool() { return $this->readOneof(63); } + /** + * optional bool oneof_bool = 63; + */ public function setOneofBool($var) { GPBUtil::checkBool($var); $this->writeOneof(63, $var); } + /** + * optional string oneof_string = 64; + */ public function getOneofString() { return $this->readOneof(64); } + /** + * optional string oneof_string = 64; + */ public function setOneofString($var) { GPBUtil::checkString($var, True); $this->writeOneof(64, $var); } + /** + * optional bytes oneof_bytes = 65; + */ public function getOneofBytes() { return $this->readOneof(65); } + /** + * optional bytes oneof_bytes = 65; + */ public function setOneofBytes($var) { GPBUtil::checkString($var, False); $this->writeOneof(65, $var); } + /** + * optional .foo.TestEnum oneof_enum = 66; + */ public function getOneofEnum() { return $this->readOneof(66); } + /** + * optional .foo.TestEnum oneof_enum = 66; + */ public function setOneofEnum($var) { GPBUtil::checkEnum($var, \Foo\TestEnum::class); $this->writeOneof(66, $var); } + /** + * optional .foo.TestMessage.Sub oneof_message = 67; + */ public function getOneofMessage() { return $this->readOneof(67); } + /** + * optional .foo.TestMessage.Sub oneof_message = 67; + */ public function setOneofMessage(&$var) { GPBUtil::checkMessage($var, \Foo\TestMessage_Sub::class); $this->writeOneof(67, $var); } + /** + * map<int32, int32> map_int32_int32 = 71; + */ public function getMapInt32Int32() { return $this->map_int32_int32; } + /** + * map<int32, int32> map_int32_int32 = 71; + */ public function setMapInt32Int32(&$var) { $this->map_int32_int32 = $var; } + /** + * map<int64, int64> map_int64_int64 = 72; + */ public function getMapInt64Int64() { return $this->map_int64_int64; } + /** + * map<int64, int64> map_int64_int64 = 72; + */ public function setMapInt64Int64(&$var) { $this->map_int64_int64 = $var; } + /** + * map<uint32, uint32> map_uint32_uint32 = 73; + */ public function getMapUint32Uint32() { return $this->map_uint32_uint32; } + /** + * map<uint32, uint32> map_uint32_uint32 = 73; + */ public function setMapUint32Uint32(&$var) { $this->map_uint32_uint32 = $var; } + /** + * map<uint64, uint64> map_uint64_uint64 = 74; + */ public function getMapUint64Uint64() { return $this->map_uint64_uint64; } + /** + * map<uint64, uint64> map_uint64_uint64 = 74; + */ public function setMapUint64Uint64(&$var) { $this->map_uint64_uint64 = $var; } + /** + * map<sint32, sint32> map_sint32_sint32 = 75; + */ public function getMapSint32Sint32() { return $this->map_sint32_sint32; } + /** + * map<sint32, sint32> map_sint32_sint32 = 75; + */ public function setMapSint32Sint32(&$var) { $this->map_sint32_sint32 = $var; } + /** + * map<sint64, sint64> map_sint64_sint64 = 76; + */ public function getMapSint64Sint64() { return $this->map_sint64_sint64; } + /** + * map<sint64, sint64> map_sint64_sint64 = 76; + */ public function setMapSint64Sint64(&$var) { $this->map_sint64_sint64 = $var; } + /** + * map<fixed32, fixed32> map_fixed32_fixed32 = 77; + */ public function getMapFixed32Fixed32() { return $this->map_fixed32_fixed32; } + /** + * map<fixed32, fixed32> map_fixed32_fixed32 = 77; + */ public function setMapFixed32Fixed32(&$var) { $this->map_fixed32_fixed32 = $var; } + /** + * map<fixed64, fixed64> map_fixed64_fixed64 = 78; + */ public function getMapFixed64Fixed64() { return $this->map_fixed64_fixed64; } + /** + * map<fixed64, fixed64> map_fixed64_fixed64 = 78; + */ public function setMapFixed64Fixed64(&$var) { $this->map_fixed64_fixed64 = $var; } + /** + * map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 79; + */ public function getMapSfixed32Sfixed32() { return $this->map_sfixed32_sfixed32; } + /** + * map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 79; + */ public function setMapSfixed32Sfixed32(&$var) { $this->map_sfixed32_sfixed32 = $var; } + /** + * map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 80; + */ public function getMapSfixed64Sfixed64() { return $this->map_sfixed64_sfixed64; } + /** + * map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 80; + */ public function setMapSfixed64Sfixed64(&$var) { $this->map_sfixed64_sfixed64 = $var; } + /** + * map<int32, float> map_int32_float = 81; + */ public function getMapInt32Float() { return $this->map_int32_float; } + /** + * map<int32, float> map_int32_float = 81; + */ public function setMapInt32Float(&$var) { $this->map_int32_float = $var; } + /** + * map<int32, double> map_int32_double = 82; + */ public function getMapInt32Double() { return $this->map_int32_double; } + /** + * map<int32, double> map_int32_double = 82; + */ public function setMapInt32Double(&$var) { $this->map_int32_double = $var; } + /** + * map<bool, bool> map_bool_bool = 83; + */ public function getMapBoolBool() { return $this->map_bool_bool; } + /** + * map<bool, bool> map_bool_bool = 83; + */ public function setMapBoolBool(&$var) { $this->map_bool_bool = $var; } + /** + * map<string, string> map_string_string = 84; + */ public function getMapStringString() { return $this->map_string_string; } + /** + * map<string, string> map_string_string = 84; + */ public function setMapStringString(&$var) { $this->map_string_string = $var; } + /** + * map<int32, bytes> map_int32_bytes = 85; + */ public function getMapInt32Bytes() { return $this->map_int32_bytes; } + /** + * map<int32, bytes> map_int32_bytes = 85; + */ public function setMapInt32Bytes(&$var) { $this->map_int32_bytes = $var; } + /** + * map<int32, .foo.TestEnum> map_int32_enum = 86; + */ public function getMapInt32Enum() { return $this->map_int32_enum; } + /** + * map<int32, .foo.TestEnum> map_int32_enum = 86; + */ public function setMapInt32Enum(&$var) { $this->map_int32_enum = $var; } + /** + * map<int32, .foo.TestMessage.Sub> map_int32_message = 87; + */ public function getMapInt32Message() { return $this->map_int32_message; } + /** + * map<int32, .foo.TestMessage.Sub> map_int32_message = 87; + */ public function setMapInt32Message(&$var) { $this->map_int32_message = $var; } + /** + * map<int32, .foo.TestMessage> map_recursive = 88; + */ public function getMapRecursive() { return $this->map_recursive; } + /** + * map<int32, .foo.TestMessage> map_recursive = 88; + */ public function setMapRecursive(&$var) { $this->map_recursive = $var; @@ -850,15 +1474,27 @@ class TestMessage extends \Google\Protobuf\Internal\Message } +/** + * Protobuf type foo.TestMessage.Sub + */ class TestMessage_Sub extends \Google\Protobuf\Internal\Message { + /** + * optional int32 a = 1; + */ private $a = 0; + /** + * optional int32 a = 1; + */ public function getA() { return $this->a; } + /** + * optional int32 a = 1; + */ public function setA($var) { GPBUtil::checkInt32($var); @@ -867,171 +1503,300 @@ class TestMessage_Sub extends \Google\Protobuf\Internal\Message } +/** + * Protobuf type foo.TestPackedMessage + */ class TestPackedMessage extends \Google\Protobuf\Internal\Message { + /** + * repeated int32 repeated_int32 = 90 [packed = true]; + */ private $repeated_int32; + /** + * repeated int64 repeated_int64 = 91 [packed = true]; + */ private $repeated_int64; + /** + * repeated uint32 repeated_uint32 = 92 [packed = true]; + */ private $repeated_uint32; + /** + * repeated uint64 repeated_uint64 = 93 [packed = true]; + */ private $repeated_uint64; + /** + * repeated sint32 repeated_sint32 = 94 [packed = true]; + */ private $repeated_sint32; + /** + * repeated sint64 repeated_sint64 = 95 [packed = true]; + */ private $repeated_sint64; + /** + * repeated fixed32 repeated_fixed32 = 96 [packed = true]; + */ private $repeated_fixed32; + /** + * repeated fixed64 repeated_fixed64 = 97 [packed = true]; + */ private $repeated_fixed64; + /** + * repeated sfixed32 repeated_sfixed32 = 98 [packed = true]; + */ private $repeated_sfixed32; + /** + * repeated sfixed64 repeated_sfixed64 = 99 [packed = true]; + */ private $repeated_sfixed64; + /** + * repeated float repeated_float = 100 [packed = true]; + */ private $repeated_float; + /** + * repeated double repeated_double = 101 [packed = true]; + */ private $repeated_double; + /** + * repeated bool repeated_bool = 102 [packed = true]; + */ private $repeated_bool; + /** + * repeated .foo.TestEnum repeated_enum = 103 [packed = true]; + */ private $repeated_enum; + /** + * repeated int32 repeated_int32 = 90 [packed = true]; + */ public function getRepeatedInt32() { return $this->repeated_int32; } + /** + * repeated int32 repeated_int32 = 90 [packed = true]; + */ public function setRepeatedInt32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::INT32); $this->repeated_int32 = $var; } + /** + * repeated int64 repeated_int64 = 91 [packed = true]; + */ public function getRepeatedInt64() { return $this->repeated_int64; } + /** + * repeated int64 repeated_int64 = 91 [packed = true]; + */ public function setRepeatedInt64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::INT64); $this->repeated_int64 = $var; } + /** + * repeated uint32 repeated_uint32 = 92 [packed = true]; + */ public function getRepeatedUint32() { return $this->repeated_uint32; } + /** + * repeated uint32 repeated_uint32 = 92 [packed = true]; + */ public function setRepeatedUint32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::UINT32); $this->repeated_uint32 = $var; } + /** + * repeated uint64 repeated_uint64 = 93 [packed = true]; + */ public function getRepeatedUint64() { return $this->repeated_uint64; } + /** + * repeated uint64 repeated_uint64 = 93 [packed = true]; + */ public function setRepeatedUint64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::UINT64); $this->repeated_uint64 = $var; } + /** + * repeated sint32 repeated_sint32 = 94 [packed = true]; + */ public function getRepeatedSint32() { return $this->repeated_sint32; } + /** + * repeated sint32 repeated_sint32 = 94 [packed = true]; + */ public function setRepeatedSint32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SINT32); $this->repeated_sint32 = $var; } + /** + * repeated sint64 repeated_sint64 = 95 [packed = true]; + */ public function getRepeatedSint64() { return $this->repeated_sint64; } + /** + * repeated sint64 repeated_sint64 = 95 [packed = true]; + */ public function setRepeatedSint64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SINT64); $this->repeated_sint64 = $var; } + /** + * repeated fixed32 repeated_fixed32 = 96 [packed = true]; + */ public function getRepeatedFixed32() { return $this->repeated_fixed32; } + /** + * repeated fixed32 repeated_fixed32 = 96 [packed = true]; + */ public function setRepeatedFixed32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FIXED32); $this->repeated_fixed32 = $var; } + /** + * repeated fixed64 repeated_fixed64 = 97 [packed = true]; + */ public function getRepeatedFixed64() { return $this->repeated_fixed64; } + /** + * repeated fixed64 repeated_fixed64 = 97 [packed = true]; + */ public function setRepeatedFixed64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FIXED64); $this->repeated_fixed64 = $var; } + /** + * repeated sfixed32 repeated_sfixed32 = 98 [packed = true]; + */ public function getRepeatedSfixed32() { return $this->repeated_sfixed32; } + /** + * repeated sfixed32 repeated_sfixed32 = 98 [packed = true]; + */ public function setRepeatedSfixed32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SFIXED32); $this->repeated_sfixed32 = $var; } + /** + * repeated sfixed64 repeated_sfixed64 = 99 [packed = true]; + */ public function getRepeatedSfixed64() { return $this->repeated_sfixed64; } + /** + * repeated sfixed64 repeated_sfixed64 = 99 [packed = true]; + */ public function setRepeatedSfixed64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SFIXED64); $this->repeated_sfixed64 = $var; } + /** + * repeated float repeated_float = 100 [packed = true]; + */ public function getRepeatedFloat() { return $this->repeated_float; } + /** + * repeated float repeated_float = 100 [packed = true]; + */ public function setRepeatedFloat(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FLOAT); $this->repeated_float = $var; } + /** + * repeated double repeated_double = 101 [packed = true]; + */ public function getRepeatedDouble() { return $this->repeated_double; } + /** + * repeated double repeated_double = 101 [packed = true]; + */ public function setRepeatedDouble(&$var) { GPBUtil::checkRepeatedField($var, GPBType::DOUBLE); $this->repeated_double = $var; } + /** + * repeated bool repeated_bool = 102 [packed = true]; + */ public function getRepeatedBool() { return $this->repeated_bool; } + /** + * repeated bool repeated_bool = 102 [packed = true]; + */ public function setRepeatedBool(&$var) { GPBUtil::checkRepeatedField($var, GPBType::BOOL); $this->repeated_bool = $var; } + /** + * repeated .foo.TestEnum repeated_enum = 103 [packed = true]; + */ public function getRepeatedEnum() { return $this->repeated_enum; } + /** + * repeated .foo.TestEnum repeated_enum = 103 [packed = true]; + */ public function setRepeatedEnum(&$var) { GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class); @@ -1040,171 +1805,304 @@ class TestPackedMessage extends \Google\Protobuf\Internal\Message } +/** + *
+ * Need to be in sync with TestPackedMessage.
+ * 
+ * + * Protobuf type foo.TestUnpackedMessage + */ class TestUnpackedMessage extends \Google\Protobuf\Internal\Message { + /** + * repeated int32 repeated_int32 = 90 [packed = false]; + */ private $repeated_int32; + /** + * repeated int64 repeated_int64 = 91 [packed = false]; + */ private $repeated_int64; + /** + * repeated uint32 repeated_uint32 = 92 [packed = false]; + */ private $repeated_uint32; + /** + * repeated uint64 repeated_uint64 = 93 [packed = false]; + */ private $repeated_uint64; + /** + * repeated sint32 repeated_sint32 = 94 [packed = false]; + */ private $repeated_sint32; + /** + * repeated sint64 repeated_sint64 = 95 [packed = false]; + */ private $repeated_sint64; + /** + * repeated fixed32 repeated_fixed32 = 96 [packed = false]; + */ private $repeated_fixed32; + /** + * repeated fixed64 repeated_fixed64 = 97 [packed = false]; + */ private $repeated_fixed64; + /** + * repeated sfixed32 repeated_sfixed32 = 98 [packed = false]; + */ private $repeated_sfixed32; + /** + * repeated sfixed64 repeated_sfixed64 = 99 [packed = false]; + */ private $repeated_sfixed64; + /** + * repeated float repeated_float = 100 [packed = false]; + */ private $repeated_float; + /** + * repeated double repeated_double = 101 [packed = false]; + */ private $repeated_double; + /** + * repeated bool repeated_bool = 102 [packed = false]; + */ private $repeated_bool; + /** + * repeated .foo.TestEnum repeated_enum = 103 [packed = false]; + */ private $repeated_enum; + /** + * repeated int32 repeated_int32 = 90 [packed = false]; + */ public function getRepeatedInt32() { return $this->repeated_int32; } + /** + * repeated int32 repeated_int32 = 90 [packed = false]; + */ public function setRepeatedInt32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::INT32); $this->repeated_int32 = $var; } + /** + * repeated int64 repeated_int64 = 91 [packed = false]; + */ public function getRepeatedInt64() { return $this->repeated_int64; } + /** + * repeated int64 repeated_int64 = 91 [packed = false]; + */ public function setRepeatedInt64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::INT64); $this->repeated_int64 = $var; } + /** + * repeated uint32 repeated_uint32 = 92 [packed = false]; + */ public function getRepeatedUint32() { return $this->repeated_uint32; } + /** + * repeated uint32 repeated_uint32 = 92 [packed = false]; + */ public function setRepeatedUint32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::UINT32); $this->repeated_uint32 = $var; } + /** + * repeated uint64 repeated_uint64 = 93 [packed = false]; + */ public function getRepeatedUint64() { return $this->repeated_uint64; } + /** + * repeated uint64 repeated_uint64 = 93 [packed = false]; + */ public function setRepeatedUint64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::UINT64); $this->repeated_uint64 = $var; } + /** + * repeated sint32 repeated_sint32 = 94 [packed = false]; + */ public function getRepeatedSint32() { return $this->repeated_sint32; } + /** + * repeated sint32 repeated_sint32 = 94 [packed = false]; + */ public function setRepeatedSint32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SINT32); $this->repeated_sint32 = $var; } + /** + * repeated sint64 repeated_sint64 = 95 [packed = false]; + */ public function getRepeatedSint64() { return $this->repeated_sint64; } + /** + * repeated sint64 repeated_sint64 = 95 [packed = false]; + */ public function setRepeatedSint64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SINT64); $this->repeated_sint64 = $var; } + /** + * repeated fixed32 repeated_fixed32 = 96 [packed = false]; + */ public function getRepeatedFixed32() { return $this->repeated_fixed32; } + /** + * repeated fixed32 repeated_fixed32 = 96 [packed = false]; + */ public function setRepeatedFixed32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FIXED32); $this->repeated_fixed32 = $var; } + /** + * repeated fixed64 repeated_fixed64 = 97 [packed = false]; + */ public function getRepeatedFixed64() { return $this->repeated_fixed64; } + /** + * repeated fixed64 repeated_fixed64 = 97 [packed = false]; + */ public function setRepeatedFixed64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FIXED64); $this->repeated_fixed64 = $var; } + /** + * repeated sfixed32 repeated_sfixed32 = 98 [packed = false]; + */ public function getRepeatedSfixed32() { return $this->repeated_sfixed32; } + /** + * repeated sfixed32 repeated_sfixed32 = 98 [packed = false]; + */ public function setRepeatedSfixed32(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SFIXED32); $this->repeated_sfixed32 = $var; } + /** + * repeated sfixed64 repeated_sfixed64 = 99 [packed = false]; + */ public function getRepeatedSfixed64() { return $this->repeated_sfixed64; } + /** + * repeated sfixed64 repeated_sfixed64 = 99 [packed = false]; + */ public function setRepeatedSfixed64(&$var) { GPBUtil::checkRepeatedField($var, GPBType::SFIXED64); $this->repeated_sfixed64 = $var; } + /** + * repeated float repeated_float = 100 [packed = false]; + */ public function getRepeatedFloat() { return $this->repeated_float; } + /** + * repeated float repeated_float = 100 [packed = false]; + */ public function setRepeatedFloat(&$var) { GPBUtil::checkRepeatedField($var, GPBType::FLOAT); $this->repeated_float = $var; } + /** + * repeated double repeated_double = 101 [packed = false]; + */ public function getRepeatedDouble() { return $this->repeated_double; } + /** + * repeated double repeated_double = 101 [packed = false]; + */ public function setRepeatedDouble(&$var) { GPBUtil::checkRepeatedField($var, GPBType::DOUBLE); $this->repeated_double = $var; } + /** + * repeated bool repeated_bool = 102 [packed = false]; + */ public function getRepeatedBool() { return $this->repeated_bool; } + /** + * repeated bool repeated_bool = 102 [packed = false]; + */ public function setRepeatedBool(&$var) { GPBUtil::checkRepeatedField($var, GPBType::BOOL); $this->repeated_bool = $var; } + /** + * repeated .foo.TestEnum repeated_enum = 103 [packed = false]; + */ public function getRepeatedEnum() { return $this->repeated_enum; } + /** + * repeated .foo.TestEnum repeated_enum = 103 [packed = false]; + */ public function setRepeatedEnum(&$var) { GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class); @@ -1213,16 +2111,58 @@ class TestUnpackedMessage extends \Google\Protobuf\Internal\Message } +/** + *
+ * /**/@<>&\{
+ * 
+ * + * Protobuf type foo.TestPhpDoc + */ +class TestPhpDoc extends \Google\Protobuf\Internal\Message +{ + /** + * optional int32 a = 1; + */ + private $a = 0; + + /** + * optional int32 a = 1; + */ + public function getA() + { + return $this->a; + } + + /** + * optional int32 a = 1; + */ + public function setA($var) + { + GPBUtil::checkInt32($var); + $this->a = $var; + } + +} + +/** + * Protobuf enum foo.TestEnum + */ class TestEnum { + /** + * ZERO = 0; + */ const ZERO = 0; + /** + * ONE = 1; + */ const ONE = 1; } $pool = DescriptorPool::getGeneratedPool(); $pool->internalAddGeneratedFile(hex2bin( - "0a83250a0a746573742e70726f746f1203666f6f1a12746573745f696e63" . + "0a9c250a0a746573742e70726f746f1203666f6f1a12746573745f696e63" . "6c7564652e70726f746f22be1d0a0b546573744d65737361676512160a0e" . "6f7074696f6e616c5f696e74333218012001280512160a0e6f7074696f6e" . "616c5f696e74363418022001280312170a0f6f7074696f6e616c5f75696e" . @@ -1378,8 +2318,8 @@ $pool->internalAddGeneratedFile(hex2bin( "666c6f617418642003280242021000121b0a0f72657065617465645f646f" . "75626c651865200328014202100012190a0d72657065617465645f626f6f" . "6c1866200328084202100012280a0d72657065617465645f656e756d1867" . - "2003280e320d2e666f6f2e54657374456e756d420210002a1d0a08546573" . - "74456e756d12080a045a45524f100012070a034f4e451001620670726f74" . - "6f33" + "2003280e320d2e666f6f2e54657374456e756d4202100022170a0a546573" . + "74506870446f6312090a01611801200128052a1d0a0854657374456e756d" . + "12080a045a45524f100012070a034f4e451001620670726f746f33" )); diff --git a/php/tests/test.proto b/php/tests/test.proto index 15709c83..f15f6297 100644 --- a/php/tests/test.proto +++ b/php/tests/test.proto @@ -134,3 +134,8 @@ message TestUnpackedMessage { repeated bool repeated_bool = 102 [packed = false]; repeated TestEnum repeated_enum = 103 [packed = false]; } + +// /**/@<>&\{ +message TestPhpDoc { + int32 a = 1; +} diff --git a/php/tests/test_include.pb.php b/php/tests/test_include.pb.php index 2c43cc41..11ff59cb 100644 --- a/php/tests/test_include.pb.php +++ b/php/tests/test_include.pb.php @@ -9,15 +9,27 @@ use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\RepeatedField; use Google\Protobuf\Internal\GPBUtil; +/** + * Protobuf type bar.TestInclude + */ class TestInclude extends \Google\Protobuf\Internal\Message { + /** + * optional int32 a = 1; + */ private $a = 0; + /** + * optional int32 a = 1; + */ public function getA() { return $this->a; } + /** + * optional int32 a = 1; + */ public function setA($var) { GPBUtil::checkInt32($var); diff --git a/src/google/protobuf/compiler/php/php_generator.cc b/src/google/protobuf/compiler/php/php_generator.cc index 83e629b9..aac4e8af 100644 --- a/src/google/protobuf/compiler/php/php_generator.cc +++ b/src/google/protobuf/compiler/php/php_generator.cc @@ -52,25 +52,28 @@ namespace php { // Forward decls. std::string PhpName(const std::string& full_name, bool is_descriptor); -std::string DefaultForField(google::protobuf::FieldDescriptor* field); +std::string DefaultForField(FieldDescriptor* field); std::string IntToString(int32 value); std::string GeneratedFileName(const std::string& proto_file, bool is_descriptor); -std::string LabelForField(google::protobuf::FieldDescriptor* field); -std::string TypeName(google::protobuf::FieldDescriptor* field); +std::string LabelForField(FieldDescriptor* field); +std::string TypeName(FieldDescriptor* field); std::string UnderscoresToCamelCase(const string& name, bool cap_first_letter); std::string EscapeDollor(const string& to_escape); std::string BinaryToHex(const string& binary); -void GenerateMessage(const string& name_prefix, - const google::protobuf::Descriptor* message, - bool is_descriptor, - google::protobuf::io::Printer* printer); -void GenerateEnum(const google::protobuf::EnumDescriptor* en, - google::protobuf::io::Printer* printer); -void Indent(google::protobuf::io::Printer* printer); -void Outdent(google::protobuf::io::Printer* printer); - -std::string MessagePrefix(const google::protobuf::Descriptor* message) { +void GenerateMessage(const string& name_prefix, const Descriptor* message, + bool is_descriptor, io::Printer* printer); +void GenerateEnum(const EnumDescriptor* en, io::Printer* printer); +void Indent(io::Printer* printer); +void Outdent(io::Printer* printer); +void GenerateMessageDocComment(io::Printer* printer, const Descriptor* message); +void GenerateFieldDocComment(io::Printer* printer, + const FieldDescriptor* field); +void GenerateEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_); +void GenerateEnumValueDocComment(io::Printer* printer, + const EnumValueDescriptor* value); + +std::string MessagePrefix(const Descriptor* message) { // Empty cannot be php class name. if (message->name() == "Empty" && message->file()->package() == "google.protobuf") { @@ -80,10 +83,9 @@ std::string MessagePrefix(const google::protobuf::Descriptor* message) { } } -std::string MessageName(const google::protobuf::Descriptor* message, - bool is_descriptor) { +std::string MessageName(const Descriptor* message, bool is_descriptor) { string message_name = message->name(); - const google::protobuf::Descriptor* descriptor = message->containing_type(); + const Descriptor* descriptor = message->containing_type(); while (descriptor != NULL) { message_name = descriptor->name() + '_' + message_name; descriptor = descriptor->containing_type(); @@ -94,8 +96,7 @@ std::string MessageName(const google::protobuf::Descriptor* message, message_name; } -std::string MessageFullName(const google::protobuf::Descriptor* message, - bool is_descriptor) { +std::string MessageFullName(const Descriptor* message, bool is_descriptor) { if (is_descriptor) { return StringReplace(message->full_name(), "google.protobuf", @@ -105,8 +106,7 @@ std::string MessageFullName(const google::protobuf::Descriptor* message, } } -std::string EnumFullName(const google::protobuf::EnumDescriptor* envm, - bool is_descriptor) { +std::string EnumFullName(const EnumDescriptor* envm, bool is_descriptor) { if (is_descriptor) { return StringReplace(envm->full_name(), "google.protobuf", @@ -116,9 +116,9 @@ std::string EnumFullName(const google::protobuf::EnumDescriptor* envm, } } -std::string EnumClassName(const google::protobuf::EnumDescriptor* envm) { +std::string EnumClassName(const EnumDescriptor* envm) { string enum_class_name = envm->name(); - const google::protobuf::Descriptor* descriptor = envm->containing_type(); + const Descriptor* descriptor = envm->containing_type(); while (descriptor != NULL) { enum_class_name = descriptor->name() + '_' + enum_class_name; descriptor = descriptor->containing_type(); @@ -126,8 +126,7 @@ std::string EnumClassName(const google::protobuf::EnumDescriptor* envm) { return enum_class_name; } -std::string EnumName(const google::protobuf::EnumDescriptor* envm, - bool is_descriptor) { +std::string EnumName(const EnumDescriptor* envm, bool is_descriptor) { string enum_name = EnumClassName(envm); return PhpName(envm->file()->package(), is_descriptor) + '\\' + enum_name; } @@ -154,7 +153,7 @@ std::string PhpName(const std::string& full_name, bool is_descriptor) { return result; } -std::string DefaultForField(const google::protobuf::FieldDescriptor* field) { +std::string DefaultForField(const FieldDescriptor* field) { switch (field->type()) { case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_INT64: @@ -194,7 +193,7 @@ std::string IntToString(int32 value) { return os.str(); } -std::string LabelForField(const google::protobuf::FieldDescriptor* field) { +std::string LabelForField(const FieldDescriptor* field) { switch (field->label()) { case FieldDescriptor::LABEL_OPTIONAL: return "optional"; case FieldDescriptor::LABEL_REQUIRED: return "required"; @@ -203,7 +202,7 @@ std::string LabelForField(const google::protobuf::FieldDescriptor* field) { } } -std::string TypeName(const google::protobuf::FieldDescriptor* field) { +std::string TypeName(const FieldDescriptor* field) { switch (field->type()) { case FieldDescriptor::TYPE_INT32: return "int32"; case FieldDescriptor::TYPE_INT64: return "int64"; @@ -228,7 +227,7 @@ std::string TypeName(const google::protobuf::FieldDescriptor* field) { } std::string EnumOrMessageSuffix( - const google::protobuf::FieldDescriptor* field, bool is_descriptor) { + const FieldDescriptor* field, bool is_descriptor) { if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { return ", '" + MessageFullName(field->message_type(), is_descriptor) + "'"; } @@ -299,74 +298,77 @@ std::string BinaryToHex(const string& src) { return dest; } -void Indent(google::protobuf::io::Printer* printer) { +void Indent(io::Printer* printer) { printer->Indent(); printer->Indent(); } -void Outdent(google::protobuf::io::Printer* printer) { +void Outdent(io::Printer* printer) { printer->Outdent(); printer->Outdent(); } -void GenerateField(const google::protobuf::FieldDescriptor* field, - google::protobuf::io::Printer* printer, bool is_descriptor) { +void GenerateField(const FieldDescriptor* field, io::Printer* printer, + bool is_descriptor) { if (field->is_repeated()) { + GenerateFieldDocComment(printer, field); printer->Print( - "private $@name@;\n", + "private $^name^;\n", "name", field->name()); } else if (field->containing_oneof()) { // Oneof fields are handled by GenerateOneofField. return; } else { + GenerateFieldDocComment(printer, field); printer->Print( - "private $@name@ = @default@;\n", + "private $^name^ = ^default^;\n", "name", field->name(), "default", DefaultForField(field)); } if (is_descriptor) { printer->Print( - "private $has_@name@ = false;\n", + "private $has_^name^ = false;\n", "name", field->name()); } } -void GenerateOneofField(const google::protobuf::OneofDescriptor* oneof, - google::protobuf::io::Printer* printer) { +void GenerateOneofField(const OneofDescriptor* oneof, io::Printer* printer) { // Oneof property needs to be protected in order to be accessed by parent // class in implementation. printer->Print( - "protected $@name@;\n", + "protected $^name^;\n", "name", oneof->name()); } -void GenerateFieldAccessor(const google::protobuf::FieldDescriptor* field, - bool is_descriptor, - google::protobuf::io::Printer* printer) { +void GenerateFieldAccessor(const FieldDescriptor* field, bool is_descriptor, + io::Printer* printer) { const OneofDescriptor* oneof = field->containing_oneof(); // Generate getter. if (oneof != NULL) { + GenerateFieldDocComment(printer, field); printer->Print( - "public function get@camel_name@()\n" + "public function get^camel_name^()\n" "{\n" - " return $this->readOneof(@number@);\n" + " return $this->readOneof(^number^);\n" "}\n\n", "camel_name", UnderscoresToCamelCase(field->name(), true), "number", IntToString(field->number())); } else { + GenerateFieldDocComment(printer, field); printer->Print( - "public function get@camel_name@()\n" + "public function get^camel_name^()\n" "{\n" - " return $this->@name@;\n" + " return $this->^name^;\n" "}\n\n", "camel_name", UnderscoresToCamelCase(field->name(), true), "name", field->name()); } // Generate setter. + GenerateFieldDocComment(printer, field); printer->Print( - "public function set@camel_name@(@var@)\n" + "public function set^camel_name^(^var^)\n" "{\n", "camel_name", UnderscoresToCamelCase(field->name(), true), "var", (field->is_repeated() || @@ -379,16 +381,16 @@ void GenerateFieldAccessor(const google::protobuf::FieldDescriptor* field, if (field->is_map()) { } else if (field->is_repeated()) { printer->Print( - "GPBUtil::checkRepeatedField($var, GPBType::@type@", + "GPBUtil::checkRepeatedField($var, GPBType::^type^", "type", ToUpper(field->type_name())); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( - ", \\@class_name@);\n", + ", \\^class_name^);\n", "class_name", MessageName(field->message_type(), is_descriptor) + "::class"); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { printer->Print( - ", @class_name@);\n", + ", ^class_name^);\n", "class_name", EnumName(field->enum_type(), is_descriptor) + "::class"); } else { @@ -396,37 +398,37 @@ void GenerateFieldAccessor(const google::protobuf::FieldDescriptor* field, } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( - "GPBUtil::checkMessage($var, \\@class_name@::class);\n", + "GPBUtil::checkMessage($var, \\^class_name^::class);\n", "class_name", MessageName(field->message_type(), is_descriptor)); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { printer->Print( - "GPBUtil::checkEnum($var, \\@class_name@::class);\n", + "GPBUtil::checkEnum($var, \\^class_name^::class);\n", "class_name", EnumName(field->enum_type(), is_descriptor)); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { printer->Print( - "GPBUtil::checkString($var, @utf8@);\n", + "GPBUtil::checkString($var, ^utf8^);\n", "utf8", field->type() == FieldDescriptor::TYPE_STRING ? "True": "False"); } else { printer->Print( - "GPBUtil::check@type@($var);\n", + "GPBUtil::check^type^($var);\n", "type", UnderscoresToCamelCase(field->cpp_type_name(), true)); } if (oneof != NULL) { printer->Print( - "$this->writeOneof(@number@, $var);\n", + "$this->writeOneof(^number^, $var);\n", "number", IntToString(field->number())); } else { printer->Print( - "$this->@name@ = $var;\n", + "$this->^name^ = $var;\n", "name", field->name()); } // Set has bit for proto2 only. if (is_descriptor) { printer->Print( - "$this->has_@field_name@ = true;\n", + "$this->has_^field_name^ = true;\n", "field_name", field->name()); } @@ -438,39 +440,36 @@ void GenerateFieldAccessor(const google::protobuf::FieldDescriptor* field, // Generate has method for proto2 only. if (is_descriptor) { printer->Print( - "public function has@camel_name@()\n" + "public function has^camel_name^()\n" "{\n" - " return $this->has_@field_name@;\n" + " return $this->has_^field_name^;\n" "}\n\n", "camel_name", UnderscoresToCamelCase(field->name(), true), "field_name", field->name()); } } -void GenerateRepeatedFieldDecode( - const google::protobuf::FieldDescriptor* field, - google::protobuf::io::Printer* printer) { +void GenerateRepeatedFieldDecode(const FieldDescriptor* field, + io::Printer* printer) { printer->Print( - "if ($input->read@cap_wire_type@($var)) return False;\n" - "$this->get@cap_field_name@() []= $var;\n", + "if ($input->read^cap_wire_type^($var)) return False;\n" + "$this->get^cap_field_name^() []= $var;\n", "cap_field_name", UnderscoresToCamelCase(field->name(), true), "cap_wire_type", UnderscoresToCamelCase(field->type_name(), true)); } -void GeneratePrimitiveFieldDecode( - const google::protobuf::FieldDescriptor* field, - google::protobuf::io::Printer* printer) { +void GeneratePrimitiveFieldDecode(const FieldDescriptor* field, + io::Printer* printer) { printer->Print( - "if ($input->read@cap_wire_type@($var)) return False;\n" - "$this->set@cap_field_name@($var);\n", + "if ($input->read^cap_wire_type^($var)) return False;\n" + "$this->set^cap_field_name^($var);\n", "cap_field_name", UnderscoresToCamelCase(field->name(), true), "cap_wire_type", UnderscoresToCamelCase(field->type_name(), true)); } -void GenerateFieldDecode(const google::protobuf::FieldDescriptor* field, - google::protobuf::io::Printer* printer) { +void GenerateFieldDecode(const FieldDescriptor* field, io::Printer* printer) { printer->Print( - "case @number@:\n", + "case ^number^:\n", "number", IntToString(field->number())); Indent(printer); @@ -485,23 +484,23 @@ void GenerateFieldDecode(const google::protobuf::FieldDescriptor* field, Outdent(printer); } -void GenerateMessage(const string& name_prefix, - const google::protobuf::Descriptor* message, - bool is_descriptor, - google::protobuf::io::Printer* printer) { +void GenerateMessage(const string& name_prefix, const Descriptor* message, + bool is_descriptor, io::Printer* printer) { // Don't generate MapEntry messages -- we use the PHP extension's native // support for map fields instead. if (message->options().map_entry()) { return; } + GenerateMessageDocComment(printer, message); + string message_name = name_prefix.empty() ? message->name() : name_prefix + "_" + MessagePrefix(message) + message->name(); printer->Print( - "class @name@ extends \\Google\\Protobuf\\Internal\\Message\n" + "class ^name^ extends \\Google\\Protobuf\\Internal\\Message\n" "{\n", "name", message_name); Indent(printer); @@ -523,11 +522,11 @@ void GenerateMessage(const string& name_prefix, GenerateFieldAccessor(field, is_descriptor, printer); } for (int i = 0; i < message->oneof_decl_count(); i++) { - const google::protobuf::OneofDescriptor* oneof = message->oneof_decl(i); + const OneofDescriptor* oneof = message->oneof_decl(i); printer->Print( - "public function get@camel_name@()\n" + "public function get^camel_name^()\n" "{\n" - " return $this->@name@;\n" + " return $this->^name^;\n" "}\n\n", "camel_name", UnderscoresToCamelCase(oneof->name(), true), "name", oneof->name()); @@ -546,11 +545,10 @@ void GenerateMessage(const string& name_prefix, } } -void GenerateEnumToPool(const google::protobuf::EnumDescriptor* en, - bool is_descriptor, - google::protobuf::io::Printer* printer) { +void GenerateEnumToPool(const EnumDescriptor* en, bool is_descriptor, + io::Printer* printer) { printer->Print( - "$pool->addEnum('@name@', @class_name@::class)\n", + "$pool->addEnum('^name^', ^class_name^::class)\n", "name", EnumFullName(en, is_descriptor), "class_name", en->name()); Indent(printer); @@ -558,7 +556,7 @@ void GenerateEnumToPool(const google::protobuf::EnumDescriptor* en, for (int i = 0; i < en->value_count(); i++) { const EnumValueDescriptor* value = en->value(i); printer->Print( - "->value(\"@name@\", @number@)\n", + "->value(\"^name^\", ^number^)\n", "name", value->name(), "number", IntToString(value->number())); } @@ -566,10 +564,8 @@ void GenerateEnumToPool(const google::protobuf::EnumDescriptor* en, Outdent(printer); } -void GenerateMessageToPool(const string& name_prefix, - const google::protobuf::Descriptor* message, - bool is_descriptor, - google::protobuf::io::Printer* printer) { +void GenerateMessageToPool(const string& name_prefix, const Descriptor* message, + bool is_descriptor, io::Printer* printer) { // Don't generate MapEntry messages -- we use the PHP extension's native // support for map fields instead. if (message->options().map_entry()) { @@ -579,7 +575,7 @@ void GenerateMessageToPool(const string& name_prefix, message->name() : name_prefix + "_" + message->name(); printer->Print( - "$pool->addMessage('@message@', @class_name@::class)\n", + "$pool->addMessage('^message^', ^class_name^::class)\n", "message", MessageFullName(message, is_descriptor), "class_name", class_name); @@ -593,8 +589,8 @@ void GenerateMessageToPool(const string& name_prefix, const FieldDescriptor* val = field->message_type()->FindFieldByName("value"); printer->Print( - "->map('@field@', GPBType::@key@, " - "GPBType::@value@, @number@@other@)\n", + "->map('^field^', GPBType::^key^, " + "GPBType::^value^, ^number^^other^)\n", "field", field->name(), "key", ToUpper(key->type_name()), "value", ToUpper(val->type_name()), @@ -602,7 +598,7 @@ void GenerateMessageToPool(const string& name_prefix, "other", EnumOrMessageSuffix(val, is_descriptor)); } else if (!field->containing_oneof()) { printer->Print( - "->@label@('@field@', GPBType::@type@, @number@@other@)\n", + "->^label^('^field^', GPBType::^type^, ^number^^other^)\n", "field", field->name(), "label", LabelForField(field), "type", ToUpper(field->type_name()), @@ -614,13 +610,13 @@ void GenerateMessageToPool(const string& name_prefix, // oneofs. for (int i = 0; i < message->oneof_decl_count(); i++) { const OneofDescriptor* oneof = message->oneof_decl(i); - printer->Print("->oneof(@name@)\n", + printer->Print("->oneof(^name^)\n", "name", oneof->name()); Indent(printer); for (int index = 0; index < oneof->field_count(); index++) { const FieldDescriptor* field = oneof->field(index); printer->Print( - "->value('@field@', GPBType::@type@, @number@@other@)\n", + "->value('^field^', GPBType::^type^, ^number^^other^)\n", "field", field->name(), "type", ToUpper(field->type_name()), "number", SimpleItoa(field->number()), @@ -647,9 +643,8 @@ void GenerateMessageToPool(const string& name_prefix, } } -void GenerateAddFileToPool(const google::protobuf::FileDescriptor* file, - bool is_descriptor, - google::protobuf::io::Printer* printer) { +void GenerateAddFileToPool(const FileDescriptor* file, bool is_descriptor, + io::Printer* printer) { if (is_descriptor) { printer->Print("$pool = DescriptorPool::getGeneratedPool();\n\n"); @@ -679,7 +674,7 @@ void GenerateAddFileToPool(const google::protobuf::FileDescriptor* file, static const int kBytesPerLine = 30; for (int i = 0; i < files_data.size(); i += kBytesPerLine) { printer->Print( - "\"@data@\"@dot@\n", + "\"^data^\"^dot^\n", "data", BinaryToHex(files_data.substr(i, kBytesPerLine)), "dot", i + kBytesPerLine < files_data.size() ? " ." : ""); } @@ -691,17 +686,18 @@ void GenerateAddFileToPool(const google::protobuf::FileDescriptor* file, } -void GenerateEnum(const google::protobuf::EnumDescriptor* en, - google::protobuf::io::Printer* printer) { +void GenerateEnum(const EnumDescriptor* en, io::Printer* printer) { + GenerateEnumDocComment(printer, en); printer->Print( - "class @name@\n" + "class ^name^\n" "{\n", "name", EnumClassName(en)); Indent(printer); for (int i = 0; i < en->value_count(); i++) { const EnumValueDescriptor* value = en->value(i); - printer->Print("const @name@ = @number@;\n", + GenerateEnumValueDocComment(printer, value); + printer->Print("const ^name^ = ^number^;\n", "name", value->name(), "number", IntToString(value->number())); } @@ -709,8 +705,7 @@ void GenerateEnum(const google::protobuf::EnumDescriptor* en, printer->Print("}\n\n"); } -void GenerateUseDeclaration(bool is_descriptor, - google::protobuf::io::Printer* printer) { +void GenerateUseDeclaration(bool is_descriptor, io::Printer* printer) { if (!is_descriptor) { printer->Print( "use Google\\Protobuf\\Internal\\DescriptorPool;\n" @@ -728,22 +723,22 @@ void GenerateUseDeclaration(bool is_descriptor, } } -void GenerateFile(const google::protobuf::FileDescriptor* file, - bool is_descriptor, google::protobuf::io::Printer* printer) { +void GenerateFile(const FileDescriptor* file, bool is_descriptor, + io::Printer* printer) { printer->Print( "name()); if (!file->package().empty()) { - printer->Print("namespace @name@;\n\n", + printer->Print("namespace ^name^;\n\n", "name", PhpName(file->package(), is_descriptor)); } for (int i = 0; i < file->dependency_count(); i++) { const std::string& name = file->dependency(i)->name(); - printer->Print("require_once('@name@');\n", "name", + printer->Print("require_once('^name^');\n", "name", GeneratedFileName(name, is_descriptor)); } @@ -759,11 +754,169 @@ void GenerateFile(const google::protobuf::FileDescriptor* file, GenerateAddFileToPool(file, is_descriptor, printer); } -bool Generator::Generate( - const FileDescriptor* file, - const string& parameter, - GeneratorContext* generator_context, - string* error) const { +static string EscapePhpdoc(const string& input) { + string result; + result.reserve(input.size() * 2); + + char prev = '*'; + + for (string::size_type i = 0; i < input.size(); i++) { + char c = input[i]; + switch (c) { + case '*': + // Avoid "/*". + if (prev == '/') { + result.append("*"); + } else { + result.push_back(c); + } + break; + case '/': + // Avoid "*/". + if (prev == '*') { + result.append("/"); + } else { + result.push_back(c); + } + break; + case '@': + // '@' starts phpdoc tags including the @deprecated tag, which will + // cause a compile-time error if inserted before a declaration that + // does not have a corresponding @Deprecated annotation. + result.append("@"); + break; + case '<': + // Avoid interpretation as HTML. + result.append("<"); + break; + case '>': + // Avoid interpretation as HTML. + result.append(">"); + break; + case '&': + // Avoid interpretation as HTML. + result.append("&"); + break; + case '\\': + // Java interprets Unicode escape sequences anywhere! + result.append("\"); + break; + default: + result.push_back(c); + break; + } + + prev = c; + } + + return result; +} + +static void GenerateDocCommentBodyForLocation( + io::Printer* printer, const SourceLocation& location) { + string comments = location.leading_comments.empty() ? + location.trailing_comments : location.leading_comments; + if (!comments.empty()) { + // TODO(teboring): Ideally we should parse the comment text as Markdown and + // write it back as HTML, but this requires a Markdown parser. For now + // we just use
 to get fixed-width text formatting.
+
+    // If the comment itself contains block comment start or end markers,
+    // HTML-escape them so that they don't accidentally close the doc comment.
+    comments = EscapePhpdoc(comments);
+
+    vector lines = Split(comments, "\n");
+    while (!lines.empty() && lines.back().empty()) {
+      lines.pop_back();
+    }
+
+    printer->Print(" * 
\n");
+    for (int i = 0; i < lines.size(); i++) {
+      // Most lines should start with a space.  Watch out for lines that start
+      // with a /, since putting that right after the leading asterisk will
+      // close the comment.
+      if (!lines[i].empty() && lines[i][0] == '/') {
+        printer->Print(" * ^line^\n", "line", lines[i]);
+      } else {
+        printer->Print(" *^line^\n", "line", lines[i]);
+      }
+    }
+    printer->Print(
+        " * 
\n" + " *\n"); + } +} + +template +static void GenerateDocCommentBody( + io::Printer* printer, const DescriptorType* descriptor) { + SourceLocation location; + if (descriptor->GetSourceLocation(&location)) { + GenerateDocCommentBodyForLocation(printer, location); + } +} + +static string FirstLineOf(const string& value) { + string result = value; + + string::size_type pos = result.find_first_of('\n'); + if (pos != string::npos) { + result.erase(pos); + } + + return result; +} + +void GenerateMessageDocComment(io::Printer* printer, + const Descriptor* message) { + printer->Print("/**\n"); + GenerateDocCommentBody(printer, message); + printer->Print( + " * Protobuf type ^fullname^\n" + " */\n", + "fullname", EscapePhpdoc(message->full_name())); +} + +void GenerateFieldDocComment(io::Printer* printer, + const FieldDescriptor* field) { + // In theory we should have slightly different comments for setters, getters, + // etc., but in practice everyone already knows the difference between these + // so it's redundant information. + + // We start the comment with the main body based on the comments from the + // .proto file (if present). We then end with the field declaration, e.g.: + // optional string foo = 5; + // If the field is a group, the debug string might end with {. + printer->Print("/**\n"); + GenerateDocCommentBody(printer, field); + printer->Print( + " * ^def^\n", + "def", EscapePhpdoc(FirstLineOf(field->DebugString()))); + printer->Print(" */\n"); +} + +void GenerateEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_) { + printer->Print("/**\n"); + GenerateDocCommentBody(printer, enum_); + printer->Print( + " * Protobuf enum ^fullname^\n" + " */\n", + "fullname", EscapePhpdoc(enum_->full_name())); +} + +void GenerateEnumValueDocComment(io::Printer* printer, + const EnumValueDescriptor* value) { + printer->Print("/**\n"); + GenerateDocCommentBody(printer, value); + printer->Print( + " * ^def^\n" + " */\n", + "def", EscapePhpdoc(FirstLineOf(value->DebugString()))); +} + +bool Generator::Generate(const FileDescriptor* file, const string& parameter, + GeneratorContext* generator_context, + string* error) const { bool is_descriptor = parameter == "internal"; if (is_descriptor && file->name() != kDescriptorFile) { @@ -782,7 +935,7 @@ bool Generator::Generate( std::string filename = GeneratedFileName(file->name(), is_descriptor); scoped_ptr output( generator_context->Open(filename)); - io::Printer printer(output.get(), '@'); + io::Printer printer(output.get(), '^'); GenerateFile(file, is_descriptor, &printer); -- cgit v1.2.3