Class DescriptorProtos.FieldDescriptorProto.Builder

All Implemented Interfaces:
DescriptorProtos.FieldDescriptorProtoOrBuilder, Message.Builder, MessageLite.Builder, MessageLiteOrBuilder, MessageOrBuilder, Cloneable
Enclosing class:
DescriptorProtos.FieldDescriptorProto

public static final class DescriptorProtos.FieldDescriptorProto.Builder extends GeneratedMessage.Builder<DescriptorProtos.FieldDescriptorProto.Builder> implements DescriptorProtos.FieldDescriptorProtoOrBuilder
 Describes a field within a message.
 
Protobuf type google.protobuf.FieldDescriptorProto
  • Field Details

  • Constructor Details

  • Method Details

    • getDescriptor

      public static final Descriptors.Descriptor getDescriptor()
    • internalGetFieldAccessorTable

      protected GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable()
      Description copied from class: GeneratedMessage.Builder
      Get the FieldAccessorTable for this type. We can't have the message class pass this in to the constructor because of bootstrapping trouble with DescriptorProtos.
      Specified by:
      internalGetFieldAccessorTable in class GeneratedMessage.Builder<DescriptorProtos.FieldDescriptorProto.Builder>
    • maybeForceBuilderInitialization

      private void maybeForceBuilderInitialization()
    • clear

      Description copied from class: GeneratedMessage.Builder
      Called by the initialization and clear code paths to allow subclasses to reset any of their builtin fields back to the initial values.
      Specified by:
      clear in interface Message.Builder
      Specified by:
      clear in interface MessageLite.Builder
      Overrides:
      clear in class GeneratedMessage.Builder<DescriptorProtos.FieldDescriptorProto.Builder>
    • getDescriptorForType

      public Descriptors.Descriptor getDescriptorForType()
      Description copied from interface: Message.Builder
      Get the message's type's descriptor. See MessageOrBuilder.getDescriptorForType().
      Specified by:
      getDescriptorForType in interface Message.Builder
      Specified by:
      getDescriptorForType in interface MessageOrBuilder
      Overrides:
      getDescriptorForType in class GeneratedMessage.Builder<DescriptorProtos.FieldDescriptorProto.Builder>
    • getDefaultInstanceForType

      public DescriptorProtos.FieldDescriptorProto getDefaultInstanceForType()
      Description copied from interface: MessageLiteOrBuilder
      Get an instance of the type with no fields set. Because no fields are set, all getters for singular fields will return default values and repeated fields will appear empty. This may or may not be a singleton. This differs from the getDefaultInstance() method of generated message classes in that this method is an abstract method of the MessageLite interface whereas getDefaultInstance() is a static method of a specific class. They return the same thing.
      Specified by:
      getDefaultInstanceForType in interface MessageLiteOrBuilder
      Specified by:
      getDefaultInstanceForType in interface MessageOrBuilder
    • build

      Description copied from interface: MessageLite.Builder
      Constructs the message based on the state of the Builder. Subsequent changes to the Builder will not affect the returned message.
      Specified by:
      build in interface Message.Builder
      Specified by:
      build in interface MessageLite.Builder
    • buildPartial

      Description copied from interface: MessageLite.Builder
      Like MessageLite.Builder.build(), but does not throw an exception if the message is missing required fields. Instead, a partial message is returned. Subsequent changes to the Builder will not affect the returned message.
      Specified by:
      buildPartial in interface Message.Builder
      Specified by:
      buildPartial in interface MessageLite.Builder
    • buildPartial0

      private void buildPartial0(DescriptorProtos.FieldDescriptorProto result)
    • mergeFrom

      Description copied from interface: Message.Builder
      Merge other into the message being built. other must have the exact same type as this (i.e. getDescriptorForType() == other.getDescriptorForType()).

      Merging occurs as follows. For each field:
      * For singular primitive fields, if the field is set in other, then other's value overwrites the value in this message.
      * For singular message fields, if the field is set in other, it is merged into the corresponding sub-message of this message using the same merging rules.
      * For repeated fields, the elements in other are concatenated with the elements in this message.
      * For oneof groups, if the other message has one of the fields set, the group of this message is cleared and replaced by the field of the other message, so that the oneof constraint is preserved.

      This is equivalent to the Message::MergeFrom method in C++.

      Specified by:
      mergeFrom in interface Message.Builder
      Overrides:
      mergeFrom in class AbstractMessage.Builder<DescriptorProtos.FieldDescriptorProto.Builder>
    • mergeFrom

    • isInitialized

      public final boolean isInitialized()
      Description copied from interface: MessageLiteOrBuilder
      Returns true if all required fields in the message and all embedded messages are set, false otherwise.

      See also: MessageOrBuilder.getInitializationErrorString()

      Specified by:
      isInitialized in interface MessageLiteOrBuilder
      Overrides:
      isInitialized in class GeneratedMessage.Builder<DescriptorProtos.FieldDescriptorProto.Builder>
    • mergeFrom

      Description copied from interface: MessageLite.Builder
      Like MessageLite.Builder.mergeFrom(CodedInputStream), but also parses extensions. The extensions that you want to be able to parse must be registered in extensionRegistry. Extensions not in the registry will be treated as unknown fields.
      Specified by:
      mergeFrom in interface Message.Builder
      Specified by:
      mergeFrom in interface MessageLite.Builder
      Overrides:
      mergeFrom in class AbstractMessage.Builder<DescriptorProtos.FieldDescriptorProto.Builder>
      Throws:
      IOException - an I/O error reading from the stream
    • hasName

      public boolean hasName()
      optional string name = 1;
      Specified by:
      hasName in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the name field is set.
    • getName

      public String getName()
      optional string name = 1;
      Specified by:
      getName in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The name.
    • getNameBytes

      public ByteString getNameBytes()
      optional string name = 1;
      Specified by:
      getNameBytes in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The bytes for name.
    • setName

      optional string name = 1;
      Parameters:
      value - The name to set.
      Returns:
      This builder for chaining.
    • clearName

      optional string name = 1;
      Returns:
      This builder for chaining.
    • setNameBytes

      optional string name = 1;
      Parameters:
      value - The bytes for name to set.
      Returns:
      This builder for chaining.
    • hasNumber

      public boolean hasNumber()
      optional int32 number = 3;
      Specified by:
      hasNumber in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the number field is set.
    • getNumber

      public int getNumber()
      optional int32 number = 3;
      Specified by:
      getNumber in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The number.
    • setNumber

      public DescriptorProtos.FieldDescriptorProto.Builder setNumber(int value)
      optional int32 number = 3;
      Parameters:
      value - The number to set.
      Returns:
      This builder for chaining.
    • clearNumber

      optional int32 number = 3;
      Returns:
      This builder for chaining.
    • hasLabel

      public boolean hasLabel()
      optional .google.protobuf.FieldDescriptorProto.Label label = 4;
      Specified by:
      hasLabel in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the label field is set.
    • getLabel

      optional .google.protobuf.FieldDescriptorProto.Label label = 4;
      Specified by:
      getLabel in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The label.
    • setLabel

      optional .google.protobuf.FieldDescriptorProto.Label label = 4;
      Parameters:
      value - The label to set.
      Returns:
      This builder for chaining.
    • clearLabel

      optional .google.protobuf.FieldDescriptorProto.Label label = 4;
      Returns:
      This builder for chaining.
    • hasType

      public boolean hasType()
       If type_name is set, this need not be set.  If both this and type_name
       are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
       
      optional .google.protobuf.FieldDescriptorProto.Type type = 5;
      Specified by:
      hasType in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the type field is set.
    • getType

       If type_name is set, this need not be set.  If both this and type_name
       are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
       
      optional .google.protobuf.FieldDescriptorProto.Type type = 5;
      Specified by:
      getType in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The type.
    • setType

       If type_name is set, this need not be set.  If both this and type_name
       are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
       
      optional .google.protobuf.FieldDescriptorProto.Type type = 5;
      Parameters:
      value - The type to set.
      Returns:
      This builder for chaining.
    • clearType

       If type_name is set, this need not be set.  If both this and type_name
       are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
       
      optional .google.protobuf.FieldDescriptorProto.Type type = 5;
      Returns:
      This builder for chaining.
    • hasTypeName

      public boolean hasTypeName()
       For message and enum types, this is the name of the type.  If the name
       starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
       rules are used to find the type (i.e. first the nested types within this
       message are searched, then within the parent, on up to the root
       namespace).
       
      optional string type_name = 6;
      Specified by:
      hasTypeName in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the typeName field is set.
    • getTypeName

      public String getTypeName()
       For message and enum types, this is the name of the type.  If the name
       starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
       rules are used to find the type (i.e. first the nested types within this
       message are searched, then within the parent, on up to the root
       namespace).
       
      optional string type_name = 6;
      Specified by:
      getTypeName in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The typeName.
    • getTypeNameBytes

      public ByteString getTypeNameBytes()
       For message and enum types, this is the name of the type.  If the name
       starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
       rules are used to find the type (i.e. first the nested types within this
       message are searched, then within the parent, on up to the root
       namespace).
       
      optional string type_name = 6;
      Specified by:
      getTypeNameBytes in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The bytes for typeName.
    • setTypeName

       For message and enum types, this is the name of the type.  If the name
       starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
       rules are used to find the type (i.e. first the nested types within this
       message are searched, then within the parent, on up to the root
       namespace).
       
      optional string type_name = 6;
      Parameters:
      value - The typeName to set.
      Returns:
      This builder for chaining.
    • clearTypeName

       For message and enum types, this is the name of the type.  If the name
       starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
       rules are used to find the type (i.e. first the nested types within this
       message are searched, then within the parent, on up to the root
       namespace).
       
      optional string type_name = 6;
      Returns:
      This builder for chaining.
    • setTypeNameBytes

       For message and enum types, this is the name of the type.  If the name
       starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
       rules are used to find the type (i.e. first the nested types within this
       message are searched, then within the parent, on up to the root
       namespace).
       
      optional string type_name = 6;
      Parameters:
      value - The bytes for typeName to set.
      Returns:
      This builder for chaining.
    • hasExtendee

      public boolean hasExtendee()
       For extensions, this is the name of the type being extended.  It is
       resolved in the same manner as type_name.
       
      optional string extendee = 2;
      Specified by:
      hasExtendee in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the extendee field is set.
    • getExtendee

      public String getExtendee()
       For extensions, this is the name of the type being extended.  It is
       resolved in the same manner as type_name.
       
      optional string extendee = 2;
      Specified by:
      getExtendee in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The extendee.
    • getExtendeeBytes

      public ByteString getExtendeeBytes()
       For extensions, this is the name of the type being extended.  It is
       resolved in the same manner as type_name.
       
      optional string extendee = 2;
      Specified by:
      getExtendeeBytes in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The bytes for extendee.
    • setExtendee

       For extensions, this is the name of the type being extended.  It is
       resolved in the same manner as type_name.
       
      optional string extendee = 2;
      Parameters:
      value - The extendee to set.
      Returns:
      This builder for chaining.
    • clearExtendee

       For extensions, this is the name of the type being extended.  It is
       resolved in the same manner as type_name.
       
      optional string extendee = 2;
      Returns:
      This builder for chaining.
    • setExtendeeBytes

       For extensions, this is the name of the type being extended.  It is
       resolved in the same manner as type_name.
       
      optional string extendee = 2;
      Parameters:
      value - The bytes for extendee to set.
      Returns:
      This builder for chaining.
    • hasDefaultValue

      public boolean hasDefaultValue()
       For numeric types, contains the original text representation of the value.
       For booleans, "true" or "false".
       For strings, contains the default text contents (not escaped in any way).
       For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
       
      optional string default_value = 7;
      Specified by:
      hasDefaultValue in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the defaultValue field is set.
    • getDefaultValue

      public String getDefaultValue()
       For numeric types, contains the original text representation of the value.
       For booleans, "true" or "false".
       For strings, contains the default text contents (not escaped in any way).
       For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
       
      optional string default_value = 7;
      Specified by:
      getDefaultValue in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The defaultValue.
    • getDefaultValueBytes

      public ByteString getDefaultValueBytes()
       For numeric types, contains the original text representation of the value.
       For booleans, "true" or "false".
       For strings, contains the default text contents (not escaped in any way).
       For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
       
      optional string default_value = 7;
      Specified by:
      getDefaultValueBytes in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The bytes for defaultValue.
    • setDefaultValue

      public DescriptorProtos.FieldDescriptorProto.Builder setDefaultValue(String value)
       For numeric types, contains the original text representation of the value.
       For booleans, "true" or "false".
       For strings, contains the default text contents (not escaped in any way).
       For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
       
      optional string default_value = 7;
      Parameters:
      value - The defaultValue to set.
      Returns:
      This builder for chaining.
    • clearDefaultValue

       For numeric types, contains the original text representation of the value.
       For booleans, "true" or "false".
       For strings, contains the default text contents (not escaped in any way).
       For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
       
      optional string default_value = 7;
      Returns:
      This builder for chaining.
    • setDefaultValueBytes

      public DescriptorProtos.FieldDescriptorProto.Builder setDefaultValueBytes(ByteString value)
       For numeric types, contains the original text representation of the value.
       For booleans, "true" or "false".
       For strings, contains the default text contents (not escaped in any way).
       For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
       
      optional string default_value = 7;
      Parameters:
      value - The bytes for defaultValue to set.
      Returns:
      This builder for chaining.
    • hasOneofIndex

      public boolean hasOneofIndex()
       If set, gives the index of a oneof in the containing type's oneof_decl
       list.  This field is a member of that oneof.
       
      optional int32 oneof_index = 9;
      Specified by:
      hasOneofIndex in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the oneofIndex field is set.
    • getOneofIndex

      public int getOneofIndex()
       If set, gives the index of a oneof in the containing type's oneof_decl
       list.  This field is a member of that oneof.
       
      optional int32 oneof_index = 9;
      Specified by:
      getOneofIndex in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The oneofIndex.
    • setOneofIndex

      public DescriptorProtos.FieldDescriptorProto.Builder setOneofIndex(int value)
       If set, gives the index of a oneof in the containing type's oneof_decl
       list.  This field is a member of that oneof.
       
      optional int32 oneof_index = 9;
      Parameters:
      value - The oneofIndex to set.
      Returns:
      This builder for chaining.
    • clearOneofIndex

       If set, gives the index of a oneof in the containing type's oneof_decl
       list.  This field is a member of that oneof.
       
      optional int32 oneof_index = 9;
      Returns:
      This builder for chaining.
    • hasJsonName

      public boolean hasJsonName()
       JSON name of this field. The value is set by protocol compiler. If the
       user has set a "json_name" option on this field, that option's value
       will be used. Otherwise, it's deduced from the field's name by converting
       it to camelCase.
       
      optional string json_name = 10;
      Specified by:
      hasJsonName in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the jsonName field is set.
    • getJsonName

      public String getJsonName()
       JSON name of this field. The value is set by protocol compiler. If the
       user has set a "json_name" option on this field, that option's value
       will be used. Otherwise, it's deduced from the field's name by converting
       it to camelCase.
       
      optional string json_name = 10;
      Specified by:
      getJsonName in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The jsonName.
    • getJsonNameBytes

      public ByteString getJsonNameBytes()
       JSON name of this field. The value is set by protocol compiler. If the
       user has set a "json_name" option on this field, that option's value
       will be used. Otherwise, it's deduced from the field's name by converting
       it to camelCase.
       
      optional string json_name = 10;
      Specified by:
      getJsonNameBytes in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The bytes for jsonName.
    • setJsonName

       JSON name of this field. The value is set by protocol compiler. If the
       user has set a "json_name" option on this field, that option's value
       will be used. Otherwise, it's deduced from the field's name by converting
       it to camelCase.
       
      optional string json_name = 10;
      Parameters:
      value - The jsonName to set.
      Returns:
      This builder for chaining.
    • clearJsonName

       JSON name of this field. The value is set by protocol compiler. If the
       user has set a "json_name" option on this field, that option's value
       will be used. Otherwise, it's deduced from the field's name by converting
       it to camelCase.
       
      optional string json_name = 10;
      Returns:
      This builder for chaining.
    • setJsonNameBytes

       JSON name of this field. The value is set by protocol compiler. If the
       user has set a "json_name" option on this field, that option's value
       will be used. Otherwise, it's deduced from the field's name by converting
       it to camelCase.
       
      optional string json_name = 10;
      Parameters:
      value - The bytes for jsonName to set.
      Returns:
      This builder for chaining.
    • hasOptions

      public boolean hasOptions()
      optional .google.protobuf.FieldOptions options = 8;
      Specified by:
      hasOptions in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the options field is set.
    • getOptions

      public DescriptorProtos.FieldOptions getOptions()
      optional .google.protobuf.FieldOptions options = 8;
      Specified by:
      getOptions in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The options.
    • setOptions

      optional .google.protobuf.FieldOptions options = 8;
    • setOptions

      optional .google.protobuf.FieldOptions options = 8;
    • mergeOptions

      optional .google.protobuf.FieldOptions options = 8;
    • clearOptions

      optional .google.protobuf.FieldOptions options = 8;
    • getOptionsBuilder

      public DescriptorProtos.FieldOptions.Builder getOptionsBuilder()
      optional .google.protobuf.FieldOptions options = 8;
    • getOptionsOrBuilder

      public DescriptorProtos.FieldOptionsOrBuilder getOptionsOrBuilder()
      optional .google.protobuf.FieldOptions options = 8;
      Specified by:
      getOptionsOrBuilder in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
    • internalGetOptionsFieldBuilder

      optional .google.protobuf.FieldOptions options = 8;
    • hasProto3Optional

      public boolean hasProto3Optional()
       If true, this is a proto3 "optional". When a proto3 field is optional, it
       tracks presence regardless of field type.
      
       When proto3_optional is true, this field must belong to a oneof to signal
       to old proto3 clients that presence is tracked for this field. This oneof
       is known as a "synthetic" oneof, and this field must be its sole member
       (each proto3 optional field gets its own synthetic oneof). Synthetic oneofs
       exist in the descriptor only, and do not generate any API. Synthetic oneofs
       must be ordered after all "real" oneofs.
      
       For message fields, proto3_optional doesn't create any semantic change,
       since non-repeated message fields always track presence. However it still
       indicates the semantic detail of whether the user wrote "optional" or not.
       This can be useful for round-tripping the .proto file. For consistency we
       give message fields a synthetic oneof also, even though it is not required
       to track presence. This is especially important because the parser can't
       tell if a field is a message or an enum, so it must always create a
       synthetic oneof.
      
       Proto2 optional fields do not set this flag, because they already indicate
       optional with `LABEL_OPTIONAL`.
       
      optional bool proto3_optional = 17;
      Specified by:
      hasProto3Optional in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      Whether the proto3Optional field is set.
    • getProto3Optional

      public boolean getProto3Optional()
       If true, this is a proto3 "optional". When a proto3 field is optional, it
       tracks presence regardless of field type.
      
       When proto3_optional is true, this field must belong to a oneof to signal
       to old proto3 clients that presence is tracked for this field. This oneof
       is known as a "synthetic" oneof, and this field must be its sole member
       (each proto3 optional field gets its own synthetic oneof). Synthetic oneofs
       exist in the descriptor only, and do not generate any API. Synthetic oneofs
       must be ordered after all "real" oneofs.
      
       For message fields, proto3_optional doesn't create any semantic change,
       since non-repeated message fields always track presence. However it still
       indicates the semantic detail of whether the user wrote "optional" or not.
       This can be useful for round-tripping the .proto file. For consistency we
       give message fields a synthetic oneof also, even though it is not required
       to track presence. This is especially important because the parser can't
       tell if a field is a message or an enum, so it must always create a
       synthetic oneof.
      
       Proto2 optional fields do not set this flag, because they already indicate
       optional with `LABEL_OPTIONAL`.
       
      optional bool proto3_optional = 17;
      Specified by:
      getProto3Optional in interface DescriptorProtos.FieldDescriptorProtoOrBuilder
      Returns:
      The proto3Optional.
    • setProto3Optional

      public DescriptorProtos.FieldDescriptorProto.Builder setProto3Optional(boolean value)
       If true, this is a proto3 "optional". When a proto3 field is optional, it
       tracks presence regardless of field type.
      
       When proto3_optional is true, this field must belong to a oneof to signal
       to old proto3 clients that presence is tracked for this field. This oneof
       is known as a "synthetic" oneof, and this field must be its sole member
       (each proto3 optional field gets its own synthetic oneof). Synthetic oneofs
       exist in the descriptor only, and do not generate any API. Synthetic oneofs
       must be ordered after all "real" oneofs.
      
       For message fields, proto3_optional doesn't create any semantic change,
       since non-repeated message fields always track presence. However it still
       indicates the semantic detail of whether the user wrote "optional" or not.
       This can be useful for round-tripping the .proto file. For consistency we
       give message fields a synthetic oneof also, even though it is not required
       to track presence. This is especially important because the parser can't
       tell if a field is a message or an enum, so it must always create a
       synthetic oneof.
      
       Proto2 optional fields do not set this flag, because they already indicate
       optional with `LABEL_OPTIONAL`.
       
      optional bool proto3_optional = 17;
      Parameters:
      value - The proto3Optional to set.
      Returns:
      This builder for chaining.
    • clearProto3Optional

      public DescriptorProtos.FieldDescriptorProto.Builder clearProto3Optional()
       If true, this is a proto3 "optional". When a proto3 field is optional, it
       tracks presence regardless of field type.
      
       When proto3_optional is true, this field must belong to a oneof to signal
       to old proto3 clients that presence is tracked for this field. This oneof
       is known as a "synthetic" oneof, and this field must be its sole member
       (each proto3 optional field gets its own synthetic oneof). Synthetic oneofs
       exist in the descriptor only, and do not generate any API. Synthetic oneofs
       must be ordered after all "real" oneofs.
      
       For message fields, proto3_optional doesn't create any semantic change,
       since non-repeated message fields always track presence. However it still
       indicates the semantic detail of whether the user wrote "optional" or not.
       This can be useful for round-tripping the .proto file. For consistency we
       give message fields a synthetic oneof also, even though it is not required
       to track presence. This is especially important because the parser can't
       tell if a field is a message or an enum, so it must always create a
       synthetic oneof.
      
       Proto2 optional fields do not set this flag, because they already indicate
       optional with `LABEL_OPTIONAL`.
       
      optional bool proto3_optional = 17;
      Returns:
      This builder for chaining.