Add support for EDITIONS in Java and Java Lite syntax enum / bits.

PiperOrigin-RevId: 555522301
pull/13505/head
Sandy Zhang 2 years ago committed by Copybara-Service
parent 09647a17f8
commit 924a15200c
  1. 2
      java/core/src/main/java/com/google/protobuf/DescriptorMessageInfoFactory.java
  2. 14
      java/core/src/main/java/com/google/protobuf/Descriptors.java
  3. 3
      java/core/src/main/java/com/google/protobuf/ProtoSyntax.java
  4. 6
      java/core/src/main/java/com/google/protobuf/RawMessageInfo.java
  5. 5
      src/google/protobuf/compiler/java/message_lite.cc

@ -129,6 +129,8 @@ final class DescriptorMessageInfoFactory implements MessageInfoFactory {
return ProtoSyntax.PROTO2;
case PROTO3:
return ProtoSyntax.PROTO3;
case EDITIONS:
return ProtoSyntax.EDITIONS;
default:
throw new IllegalArgumentException("Unsupported syntax: " + syntax);
}

@ -167,7 +167,8 @@ public final class Descriptors {
enum Syntax {
UNKNOWN("unknown"),
PROTO2("proto2"),
PROTO3("proto3");
PROTO3("proto3"),
EDITIONS("editions");
Syntax(String name) {
this.name = name;
@ -182,16 +183,27 @@ public final class Descriptors {
Syntax getSyntax() {
if (Syntax.PROTO3.name.equals(proto.getSyntax())) {
return Syntax.PROTO3;
} else if (Syntax.EDITIONS.name.equals(proto.getSyntax())) {
return Syntax.EDITIONS;
}
return Syntax.PROTO2;
}
/** Get the edition of the .proto file. */
public String getEdition() {
return proto.getEdition();
}
public void copyHeadingTo(FileDescriptorProto.Builder protoBuilder) {
protoBuilder.setName(getName()).setSyntax(getSyntax().name);
if (!getPackage().isEmpty()) {
protoBuilder.setPackage(getPackage());
}
if (getSyntax().equals(Syntax.EDITIONS)) {
protoBuilder.setEdition(getEdition());
}
if (!getOptions().equals(FileOptions.getDefaultInstance())) {
protoBuilder.setOptions(getOptions());
}

@ -34,5 +34,6 @@ package com.google.protobuf;
@ExperimentalApi
public enum ProtoSyntax {
PROTO2,
PROTO3;
PROTO3,
EDITIONS;
}

@ -37,6 +37,7 @@ package com.google.protobuf;
@CheckReturnValue
final class RawMessageInfo implements MessageInfo {
private static final int IS_PROTO2_BIT = 0x1;
private static final int IS_EDITION_BIT = 0x4;
private final MessageLite defaultInstance;
@ -61,7 +62,8 @@ final class RawMessageInfo implements MessageInfo {
* <p>The integer sequence encoded in the String object has the following layout:
*
* <ul>
* <li>[0]: flags, flags & 0x1 = is proto2?, flags & 0x2 = is message?
* <li>[0]: flags, flags & 0x1 = is proto2?, flags & 0x2 = is message?, flags & 0x4 = is
* edition?
* <li>[1]: field count, if 0, this is the end of the integer sequence and the corresponding
* Object[] array should be null.
* <li>[2]: oneof count
@ -215,6 +217,8 @@ final class RawMessageInfo implements MessageInfo {
public ProtoSyntax getSyntax() {
if ((flags & IS_PROTO2_BIT) != 0) {
return ProtoSyntax.PROTO2;
} else if ((flags & IS_EDITION_BIT) == 0x4) {
return ProtoSyntax.EDITIONS;
} else {
return ProtoSyntax.PROTO3;
}

@ -515,6 +515,11 @@ void ImmutableMessageLiteGenerator::GenerateDynamicMethodNewBuildMessageInfo(
if (descriptor_->options().message_set_wire_format()) {
flags |= 0x2;
}
if (FileDescriptorLegacy(descriptor_->file()).syntax() ==
FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS) {
flags |= 0x4;
}
WriteIntToUtf16CharSequence(flags, &chars);
WriteIntToUtf16CharSequence(descriptor_->field_count(), &chars);

Loading…
Cancel
Save