/** * @param \Protobuf\Compiler\Entity $entity * @param \google\protobuf\FieldDescriptorProto $field * * @return string[] */ public function generateFieldWriteStatement(Entity $entity, FieldDescriptorProto $field) { $body = []; $name = $field->getName(); $type = $field->getType(); $rule = $field->getLabel(); $tag = $field->getNumber(); $options = $field->getOptions(); $variable = $this->targetVar ?: '$this->' . $name; $isPack = $options ? $options->getPacked() : false; $wire = $isPack ? WireFormat::WIRE_LENGTH : WireFormat::getWireType($type->value(), null); $key = WireFormat::getFieldKey($tag, $wire); if ($rule === Label::LABEL_REPEATED() && $isPack) { $itemValSttm = $type === Type::TYPE_ENUM() ? '$val->value()' : '$val'; $body[] = '$innerSize = 0;'; $body[] = '$calculator = $sizeContext->getSizeCalculator();'; $body[] = null; $body[] = 'foreach (' . $variable . ' as $val) {'; $body[] = ' $innerSize += ' . $this->generateValueSizeStatement($type->value(), $itemValSttm) . ';'; $body[] = '}'; $body[] = null; $body[] = '$writer->writeVarint($stream, ' . $key . ');'; $body[] = '$writer->writeVarint($stream, $innerSize);'; $body[] = null; $body[] = 'foreach (' . $variable . ' as $val) {'; $body[] = ' ' . $this->generateWriteScalarStatement($type->value(), $itemValSttm) . ';'; $body[] = '}'; return $body; } if ($type === Type::TYPE_MESSAGE() && $rule === Label::LABEL_REPEATED()) { $body[] = 'foreach (' . $variable . ' as $val) {'; $body[] = ' $writer->writeVarint($stream, ' . $key . ');'; $body[] = ' $writer->writeVarint($stream, $val->serializedSize($sizeContext));'; $body[] = ' $val->writeTo($context);'; $body[] = '}'; return $body; } if ($type === Type::TYPE_ENUM() && $rule === LABEL::LABEL_REPEATED()) { $body[] = 'foreach (' . $variable . ' as $val) {'; $body[] = ' $writer->writeVarint($stream, ' . $key . ');'; $body[] = ' ' . $this->generateWriteScalarStatement($type->value(), '$val->value()') . ';'; $body[] = '}'; return $body; } if ($rule === Label::LABEL_REPEATED()) { $body[] = 'foreach (' . $variable . ' as $val) {'; $body[] = ' $writer->writeVarint($stream, ' . $key . ');'; $body[] = ' ' . $this->generateWriteScalarStatement($type->value(), '$val') . ';'; $body[] = '}'; return $body; } if ($type === Type::TYPE_ENUM()) { $body[] = sprintf('$writer->writeVarint($stream, %s);', $key); $body[] = $this->generateWriteScalarStatement($type->value(), $variable . '->value()') . ';'; return $body; } if ($type !== Type::TYPE_MESSAGE()) { $body[] = sprintf('$writer->writeVarint($stream, %s);', $key); $body[] = $this->generateWriteScalarStatement($type->value(), $variable) . ';'; return $body; } $body[] = '$writer->writeVarint($stream, ' . $key . ');'; $body[] = '$writer->writeVarint($stream, ' . $variable . '->serializedSize($sizeContext));'; $body[] = $variable . '->writeTo($context);'; return $body; }
/** * @param \Protobuf\Compiler\Entity $entity * @param \google\protobuf\FieldDescriptorProto $field * * @return string[] */ public function generateFieldReadStatement(Entity $entity, FieldDescriptorProto $field) { $body = []; $reference = null; $type = $field->getType(); $name = $field->getName(); $rule = $field->getLabel(); $tag = $field->getNumber(); $options = $field->getOptions(); $isPack = $options ? $options->getPacked() : false; $variable = $this->targetVar ?: '$this->' . $name; $breakSttm = $this->getBreakStatement($variable); if ($field->hasTypeName()) { $typeName = $field->getTypeName(); $typeEntity = $this->getEntity($typeName); $reference = $typeEntity->getNamespacedName(); } if (!$isPack) { $body[] = sprintf('\\Protobuf\\WireFormat::assertWireType($wire, %s);', $type->value()); $body[] = null; } if ($rule === Label::LABEL_REPEATED() && $isPack) { $readSttm = $type === Type::TYPE_ENUM() ? $reference . '::valueOf(' . $this->generateReadScalarStatement($type->value()) . ')' : $this->generateReadScalarStatement($type->value()); $body[] = '$innerSize = $reader->readVarint($stream);'; $body[] = '$innerLimit = $stream->tell() + $innerSize;'; $body[] = null; $body[] = 'if (' . $variable . ' === null) {'; $body[] = ' ' . $variable . ' = new ' . $this->getCollectionClassName($field) . '();'; $body[] = '}'; $body[] = null; $body[] = 'while ($stream->tell() < $innerLimit) {'; $body[] = ' ' . $variable . '->add(' . $readSttm . ');'; $body[] = '}'; $body[] = null; $body[] = $breakSttm; return $body; } if ($type === Type::TYPE_MESSAGE() && $rule === Label::LABEL_REPEATED()) { $body[] = '$innerSize = $reader->readVarint($stream);'; $body[] = '$innerMessage = new ' . $reference . '();'; $body[] = null; $body[] = 'if (' . $variable . ' === null) {'; $body[] = ' ' . $variable . ' = new \\Protobuf\\MessageCollection();'; $body[] = '}'; $body[] = null; $body[] = $variable . '->add($innerMessage);'; $body[] = null; $body[] = '$context->setLength($innerSize);'; $body[] = '$innerMessage->readFrom($context);'; $body[] = '$context->setLength($length);'; $body[] = null; $body[] = $breakSttm; return $body; } if ($type === Type::TYPE_ENUM() && $rule === LABEL::LABEL_REPEATED()) { $body[] = 'if (' . $variable . ' === null) {'; $body[] = ' ' . $variable . ' = new ' . $this->getCollectionClassName($field) . '();'; $body[] = '}'; $body[] = null; $body[] = $variable . '->add(' . $reference . '::valueOf(' . $this->generateReadScalarStatement($type->value()) . '));'; $body[] = null; $body[] = $breakSttm; return $body; } if ($type === Type::TYPE_MESSAGE()) { $body[] = '$innerSize = $reader->readVarint($stream);'; $body[] = '$innerMessage = new ' . $reference . '();'; $body[] = null; $body[] = $variable . ' = $innerMessage;'; $body[] = null; $body[] = '$context->setLength($innerSize);'; $body[] = '$innerMessage->readFrom($context);'; $body[] = '$context->setLength($length);'; $body[] = null; $body[] = $breakSttm; return $body; } if ($type === Type::TYPE_ENUM()) { $body[] = $variable . ' = ' . $reference . '::valueOf(' . $this->generateReadScalarStatement($type->value()) . ');'; $body[] = null; $body[] = $breakSttm; return $body; } if ($rule !== LABEL::LABEL_REPEATED()) { $body[] = $variable . ' = ' . $this->generateReadScalarStatement($type->value()) . ';'; $body[] = null; $body[] = $breakSttm; return $body; } $body[] = 'if (' . $variable . ' === null) {'; $body[] = ' ' . $variable . ' = new ' . $this->getCollectionClassName($field) . '();'; $body[] = '}'; $body[] = null; $body[] = $variable . '->add(' . $this->generateReadScalarStatement($type->value()) . ');'; $body[] = null; $body[] = $breakSttm; return $body; }
protected function getJavaDocType(proto\FieldDescriptorProto $field) { switch ($field->getType()) { case Protobuf::TYPE_DOUBLE: case Protobuf::TYPE_FLOAT: return 'float'; case Protobuf::TYPE_INT64: case Protobuf::TYPE_UINT64: case Protobuf::TYPE_INT32: case Protobuf::TYPE_FIXED64: case Protobuf::TYPE_FIXED32: case Protobuf::TYPE_UINT32: case Protobuf::TYPE_SFIXED32: case Protobuf::TYPE_SFIXED64: case Protobuf::TYPE_SINT32: case Protobuf::TYPE_SINT64: return 'int'; case Protobuf::TYPE_BOOL: return 'boolean'; case Protobuf::TYPE_STRING: return 'string'; case Protobuf::TYPE_MESSAGE: return '\\' . $this->normalizeNS($field->getTypeName()); case Protobuf::TYPE_BYTES: return 'string'; case Protobuf::TYPE_ENUM: return 'int - \\' . $this->normalizeNS($field->getTypeName()); case Protobuf::TYPE_GROUP: default: return 'unknown'; } }
/** * Obtain a JavaDoc style type for the given field (int, float, string) * * @param proto\FieldDescriptorProto $field * return string */ protected function doctype(proto\FieldDescriptorProto $field) { switch ($field->getType()) { case Protobuf\Protobuf::TYPE_DOUBLE: case Protobuf\Protobuf::TYPE_FLOAT: return 'float'; case Protobuf\Protobuf::TYPE_INT64: case Protobuf\Protobuf::TYPE_UINT64: case Protobuf\Protobuf::TYPE_INT32: case Protobuf\Protobuf::TYPE_FIXED64: case Protobuf\Protobuf::TYPE_FIXED32: case Protobuf\Protobuf::TYPE_UINT32: case Protobuf\Protobuf::TYPE_SFIXED32: case Protobuf\Protobuf::TYPE_SFIXED64: case Protobuf\Protobuf::TYPE_SINT32: case Protobuf\Protobuf::TYPE_SINT64: return 'int'; case Protobuf\Protobuf::TYPE_BOOL: return 'boolean'; case Protobuf\Protobuf::TYPE_STRING: return 'string'; case Protobuf\Protobuf::TYPE_MESSAGE: return $this->ns($field->type_name); case Protobuf\Protobuf::TYPE_BYTES: return 'string'; case Protobuf\Protobuf::TYPE_ENUM: return 'int - ' . $this->ns($field->type_name); default: return '*unknown*'; } }
public static function isEnum(\google\protobuf\FieldDescriptorProto $field) { return self::TYPE_ENUM == $field->getType(); }
/** * @param \google\protobuf\FieldDescriptorProto $field * * @return string */ protected function getDefaultFieldValue(FieldDescriptorProto $field) { $type = $field->getType(); $value = $field->getDefaultValue(); if ($value === null) { return 'null'; } if ($type === Type::TYPE_ENUM()) { $typeName = $field->getTypeName(); $refEntity = $this->getEntity($typeName); $reference = $refEntity->getNamespacedName(); $const = $reference . '::' . $value . '()'; return $const; } if ($type === Type::TYPE_BOOL()) { $value = filter_var($value, FILTER_VALIDATE_BOOLEAN); } return var_export($value, true); }
public function defaultValueAsString(FieldDescriptorProto $field) { if (!$field->hasDefaultValue()) { return 'null'; } $default_value = null; switch ($field->getType()) { case \ProtocolBuffers::TYPE_DOUBLE: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_FLOAT: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_INT64: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_UINT64: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_INT32: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_FIXED64: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_FIXED32: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_BOOL: return $field->getDefaultValue() == "true" ? "true" : "false"; case \ProtocolBuffers::TYPE_STRING: return "\"" . addcslashes($field->getDefaultValue(), "\"\n\r\$") . "\""; case \ProtocolBuffers::TYPE_GROUP: return; case \ProtocolBuffers::TYPE_MESSAGE: return "null"; break; case \ProtocolBuffers::TYPE_BYTES: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_UINT32: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_ENUM: $value = $field->getTypeName(); $descriptor = MessagePool::get($value); if (!FieldDescriptorProto\Label::isRepeated($field)) { $def = $field->getDefaultValue(); if (!empty($def)) { $value = str_replace(".", "\\", $descriptor->full_name) . "::" . $field->getDefaultValue(); } else { $value = "null"; } return $value; } else { return "array()"; } case \ProtocolBuffers::TYPE_SFIXED32: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_SFIXED64: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_SINT32: $default_value = $field->getDefaultValue(); break; case \ProtocolBuffers::TYPE_SINT64: $default_value = $field->getDefaultValue(); break; } if (!$default_value && $default_value !== 0) { return "null"; } else { return $default_value; } }
public function getJsDoc(proto\FieldDescriptorProto $field) { switch ($field->getType()) { case Protobuf::TYPE_DOUBLE: case Protobuf::TYPE_FLOAT: return 'Float'; case Protobuf::TYPE_INT64: case Protobuf::TYPE_UINT64: case Protobuf::TYPE_INT32: case Protobuf::TYPE_FIXED64: case Protobuf::TYPE_FIXED32: case Protobuf::TYPE_UINT32: case Protobuf::TYPE_SFIXED32: case Protobuf::TYPE_SFIXED64: case Protobuf::TYPE_SINT32: case Protobuf::TYPE_SINT64: return 'Int'; case Protobuf::TYPE_BOOL: return 'Boolean'; case Protobuf::TYPE_STRING: return 'String'; case Protobuf::TYPE_MESSAGE: return $this->normalizeNS($field->getTypeName()); case Protobuf::TYPE_BYTES: return 'String'; case Protobuf::TYPE_ENUM: return 'Int (' . $this->normalizeNS($field->getTypeName()) . ')'; case Protobuf::TYPE_GROUP: default: return 'unknown'; } }
/** * @param \google\protobuf\FieldDescriptorProto $field * * @return string[] */ protected function generateFieldBody(FieldDescriptorProto $field) { $lines = []; $name = $field->getName(); $number = $field->getNumber(); $typeName = $field->getTypeName(); $extendee = $field->getExtendee(); $type = $field->getType()->name(); $label = $field->getLabel()->name(); $default = $this->getDefaultFieldValue($field); $values = ['number' => var_export($number, true), 'name' => var_export($name, true), 'type' => '\\google\\protobuf\\FieldDescriptorProto\\Type::' . $type . '()', 'label' => '\\google\\protobuf\\FieldDescriptorProto\\Label::' . $label . '()']; if ($extendee) { $values['extendee'] = var_export($extendee, true); } if ($typeName) { $values['type_name'] = var_export($typeName, true); } if ($field->hasDefaultValue()) { $values['default_value'] = $default; } $lines[] = '\\google\\protobuf\\FieldDescriptorProto::fromArray(['; $lines = array_merge($lines, $this->generateArrayLines($values)); $lines[] = ']),'; return $lines; }
/** * @param \Protobuf\Compiler\Entity $entity * @param google\protobuf\FieldDescriptorProto $field * * @return \Zend\Code\Generator\GeneratorInterface */ protected function generateAddMethod(Entity $entity, FieldDescriptorProto $field) { $fieldName = $field->getName(); $fieldType = $field->getType(); $collClass = $this->getCollectionClassName($field); $methodName = 'add' . $this->getClassifiedName($field); $typeHint = $fieldType !== Type::TYPE_BYTES() ? $this->getDoctype($field) : null; $lines[] = 'if ($this->' . $fieldName . ' === null) {'; $lines[] = ' $this->' . $fieldName . ' = new ' . $collClass . '();'; $lines[] = '}'; $lines[] = null; $lines[] = $fieldType !== Type::TYPE_BYTES() ? '$this->' . $fieldName . '->add($value);' : '$this->' . $fieldName . '->add(\\Protobuf\\Stream::wrap($value));'; return MethodGenerator::fromArray(['name' => $methodName, 'body' => implode(PHP_EOL, $lines), 'parameters' => [['name' => 'value', 'type' => $typeHint]], 'docblock' => ['shortDescription' => "Add a new element to '{$fieldName}'", 'tags' => [['name' => 'param', 'description' => $this->getDoctype($field) . ' $value']]]]); }