| 
					
				 | 
			
			
				@@ -100,6 +100,45 @@ std::string TypeName(const google::protobuf::FieldDescriptor* field) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void GenerateField(const google::protobuf::FieldDescriptor* field, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   google::protobuf::io::Printer* printer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "$label$ :$name$, ", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "label", LabelForField(field), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "name", field->name()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ":$type$, $number$", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "type", TypeName(field), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "number", IntToString(field->number())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ", \"$subtype$\"\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     "subtype", field->message_type()->full_name()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ", \"$subtype$\"\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "subtype", field->enum_type()->full_name()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    printer->Print("\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void GenerateOneof(const google::protobuf::OneofDescriptor* oneof, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   google::protobuf::io::Printer* printer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "oneof :$name$ do\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "name", oneof->name()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  printer->Indent(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (int i = 0; i < oneof->field_count(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const FieldDescriptor* field = oneof->field(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GenerateField(field, printer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  printer->Outdent(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  printer->Print("end\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void GenerateMessage(const google::protobuf::Descriptor* message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      google::protobuf::io::Printer* printer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   printer->Print( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -109,27 +148,16 @@ void GenerateMessage(const google::protobuf::Descriptor* message, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (int i = 0; i < message->field_count(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const FieldDescriptor* field = message->field(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "$label$ :$name$, ", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "label", LabelForField(field), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "name", field->name()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ":$type$, $number$", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "type", TypeName(field), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "number", IntToString(field->number())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ", \"$subtype$\"\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       "subtype", field->message_type()->full_name()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      printer->Print( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ", \"$subtype$\"\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        "subtype", field->enum_type()->full_name()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      printer->Print("\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!field->containing_oneof()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      GenerateField(field, printer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (int i = 0; i < message->oneof_decl_count(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const OneofDescriptor* oneof = message->oneof_decl(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GenerateOneof(oneof, printer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   printer->Outdent(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   printer->Print("end\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |