|
@@ -121,37 +121,47 @@ void MessageGenerator::GenerateStaticVariableInitializers(
|
|
|
}
|
|
|
|
|
|
void MessageGenerator::Generate(io::Printer* printer) {
|
|
|
- const string& file_name = descriptor_->file()->name();
|
|
|
- bool is_own_file =
|
|
|
- params_.java_multiple_files(file_name)
|
|
|
- && descriptor_->containing_type() == NULL;
|
|
|
-
|
|
|
if (!params_.store_unknown_fields() &&
|
|
|
(descriptor_->extension_count() != 0 || descriptor_->extension_range_count() != 0)) {
|
|
|
GOOGLE_LOG(FATAL) << "Extensions are only supported in NANO_RUNTIME if the "
|
|
|
"'store_unknown_fields' generator option is 'true'\n";
|
|
|
}
|
|
|
|
|
|
- // Note: Fields (which will be emitted in the loop, below) may have the same names as fields in
|
|
|
- // the inner or outer class. This causes Java warnings, but is not fatal, so we suppress those
|
|
|
- // warnings here in the class declaration.
|
|
|
- printer->Print(
|
|
|
- "@SuppressWarnings(\"hiding\")\n"
|
|
|
- "public $modifiers$final class $classname$ extends\n"
|
|
|
- " com.google.protobuf.nano.MessageNano {\n",
|
|
|
- "modifiers", is_own_file ? "" : "static ",
|
|
|
- "classname", descriptor_->name());
|
|
|
+ const string& file_name = descriptor_->file()->name();
|
|
|
+ bool is_own_file =
|
|
|
+ params_.java_multiple_files(file_name)
|
|
|
+ && descriptor_->containing_type() == NULL;
|
|
|
+
|
|
|
+ if (is_own_file) {
|
|
|
+ // Note: constants (from enums and fields requiring stored defaults, emitted in the loop below)
|
|
|
+ // may have the same names as constants in the nested classes. This causes Java warnings, but
|
|
|
+ // is not fatal, so we suppress those warnings here in the top-most class declaration.
|
|
|
+ printer->Print(
|
|
|
+ "\n"
|
|
|
+ "@SuppressWarnings(\"hiding\")\n"
|
|
|
+ "public final class $classname$ extends\n"
|
|
|
+ " com.google.protobuf.nano.MessageNano {\n",
|
|
|
+ "classname", descriptor_->name());
|
|
|
+ } else {
|
|
|
+ printer->Print(
|
|
|
+ "\n"
|
|
|
+ "public static final class $classname$ extends\n"
|
|
|
+ " com.google.protobuf.nano.MessageNano {\n",
|
|
|
+ "classname", descriptor_->name());
|
|
|
+ }
|
|
|
printer->Indent();
|
|
|
printer->Print(
|
|
|
- "public static final $classname$ EMPTY_ARRAY[] = {};\n"
|
|
|
+ "\n"
|
|
|
+ "public static final $classname$[] EMPTY_ARRAY = {};\n"
|
|
|
+ "\n"
|
|
|
"public $classname$() {\n"
|
|
|
" clear();\n"
|
|
|
- "}\n"
|
|
|
- "\n",
|
|
|
+ "}\n",
|
|
|
"classname", descriptor_->name());
|
|
|
|
|
|
if (params_.store_unknown_fields()) {
|
|
|
printer->Print(
|
|
|
+ "\n"
|
|
|
"private java.util.List<com.google.protobuf.nano.UnknownFieldData>\n"
|
|
|
" unknownFieldData;\n");
|
|
|
}
|
|
@@ -171,16 +181,19 @@ void MessageGenerator::Generate(io::Printer* printer) {
|
|
|
|
|
|
// Integers for bit fields
|
|
|
int totalInts = (field_generators_.total_bits() + 31) / 32;
|
|
|
- for (int i = 0; i < totalInts; i++) {
|
|
|
- printer->Print("private int $bit_field_name$;\n",
|
|
|
- "bit_field_name", GetBitFieldName(i));
|
|
|
+ if (totalInts > 0) {
|
|
|
+ printer->Print("\n");
|
|
|
+ for (int i = 0; i < totalInts; i++) {
|
|
|
+ printer->Print("private int $bit_field_name$;\n",
|
|
|
+ "bit_field_name", GetBitFieldName(i));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Fields
|
|
|
for (int i = 0; i < descriptor_->field_count(); i++) {
|
|
|
+ printer->Print("\n");
|
|
|
PrintFieldComment(printer, descriptor_->field(i));
|
|
|
field_generators_.get(descriptor_->field(i)).GenerateMembers(printer);
|
|
|
- printer->Print("\n");
|
|
|
}
|
|
|
|
|
|
GenerateClear(printer);
|
|
@@ -189,25 +202,27 @@ void MessageGenerator::Generate(io::Printer* printer) {
|
|
|
if (params_.store_unknown_fields()
|
|
|
&& descriptor_->extension_range_count() > 0) {
|
|
|
printer->Print(
|
|
|
+ "\n"
|
|
|
"public <T> T getExtension(com.google.protobuf.nano.Extension<T> extension) {\n"
|
|
|
" return com.google.protobuf.nano.WireFormatNano.getExtension(\n"
|
|
|
" extension, unknownFieldData);\n"
|
|
|
- "}\n\n"
|
|
|
+ "}\n"
|
|
|
+ "\n"
|
|
|
"public <T> void setExtension(com.google.protobuf.nano.Extension<T> extension, T value) {\n"
|
|
|
" if (unknownFieldData == null) {\n"
|
|
|
- " unknownFieldData = \n"
|
|
|
+ " unknownFieldData =\n"
|
|
|
" new java.util.ArrayList<com.google.protobuf.nano.UnknownFieldData>();\n"
|
|
|
" }\n"
|
|
|
" com.google.protobuf.nano.WireFormatNano.setExtension(\n"
|
|
|
" extension, value, unknownFieldData);\n"
|
|
|
- "}\n\n");
|
|
|
+ "}\n");
|
|
|
}
|
|
|
GenerateMessageSerializationMethods(printer);
|
|
|
GenerateMergeFromMethods(printer);
|
|
|
GenerateParseFromMethods(printer);
|
|
|
|
|
|
printer->Outdent();
|
|
|
- printer->Print("}\n\n");
|
|
|
+ printer->Print("}\n");
|
|
|
}
|
|
|
|
|
|
// ===================================================================
|
|
@@ -220,11 +235,13 @@ GenerateMessageSerializationMethods(io::Printer* printer) {
|
|
|
// writeTo only throws an exception if it contains one or more fields to write
|
|
|
if (descriptor_->field_count() > 0 || params_.store_unknown_fields()) {
|
|
|
printer->Print(
|
|
|
+ "\n"
|
|
|
"@Override\n"
|
|
|
"public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)\n"
|
|
|
- " throws java.io.IOException {\n");
|
|
|
+ " throws java.io.IOException {\n");
|
|
|
} else {
|
|
|
printer->Print(
|
|
|
+ "\n"
|
|
|
"@Override\n"
|
|
|
"public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output) {\n");
|
|
|
}
|
|
@@ -274,8 +291,7 @@ GenerateMessageSerializationMethods(io::Printer* printer) {
|
|
|
printer->Print(
|
|
|
" cachedSize = size;\n"
|
|
|
" return size;\n"
|
|
|
- "}\n"
|
|
|
- "\n");
|
|
|
+ "}\n");
|
|
|
}
|
|
|
|
|
|
void MessageGenerator::GenerateMergeFromMethods(io::Printer* printer) {
|
|
@@ -283,9 +299,10 @@ void MessageGenerator::GenerateMergeFromMethods(io::Printer* printer) {
|
|
|
SortFieldsByNumber(descriptor_));
|
|
|
|
|
|
printer->Print(
|
|
|
+ "\n"
|
|
|
"@Override\n"
|
|
|
"public $classname$ mergeFrom(\n"
|
|
|
- " com.google.protobuf.nano.CodedInputByteBufferNano input)\n"
|
|
|
+ " com.google.protobuf.nano.CodedInputByteBufferNano input)\n"
|
|
|
" throws java.io.IOException {\n",
|
|
|
"classname", descriptor_->name());
|
|
|
|
|
@@ -350,8 +367,7 @@ void MessageGenerator::GenerateMergeFromMethods(io::Printer* printer) {
|
|
|
printer->Print(
|
|
|
" }\n" // switch (tag)
|
|
|
" }\n" // while (true)
|
|
|
- "}\n"
|
|
|
- "\n");
|
|
|
+ "}\n");
|
|
|
}
|
|
|
|
|
|
void MessageGenerator::
|
|
@@ -360,6 +376,7 @@ GenerateParseFromMethods(io::Printer* printer) {
|
|
|
// because they need to be generated even for messages that are optimized
|
|
|
// for code size.
|
|
|
printer->Print(
|
|
|
+ "\n"
|
|
|
"public static $classname$ parseFrom(byte[] data)\n"
|
|
|
" throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {\n"
|
|
|
" return com.google.protobuf.nano.MessageNano.mergeFrom(new $classname$(), data);\n"
|
|
@@ -369,8 +386,7 @@ GenerateParseFromMethods(io::Printer* printer) {
|
|
|
" com.google.protobuf.nano.CodedInputByteBufferNano input)\n"
|
|
|
" throws java.io.IOException {\n"
|
|
|
" return new $classname$().mergeFrom(input);\n"
|
|
|
- "}\n"
|
|
|
- "\n",
|
|
|
+ "}\n",
|
|
|
"classname", descriptor_->name());
|
|
|
}
|
|
|
|
|
@@ -381,7 +397,8 @@ void MessageGenerator::GenerateSerializeOneField(
|
|
|
|
|
|
void MessageGenerator::GenerateClear(io::Printer* printer) {
|
|
|
printer->Print(
|
|
|
- "public final $classname$ clear() {\n",
|
|
|
+ "\n"
|
|
|
+ "public $classname$ clear() {\n",
|
|
|
"classname", descriptor_->name());
|
|
|
printer->Indent();
|
|
|
|
|
@@ -407,8 +424,7 @@ void MessageGenerator::GenerateClear(io::Printer* printer) {
|
|
|
printer->Print(
|
|
|
" cachedSize = -1;\n"
|
|
|
" return this;\n"
|
|
|
- "}\n"
|
|
|
- "\n");
|
|
|
+ "}\n");
|
|
|
}
|
|
|
|
|
|
// ===================================================================
|