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