diff options
author | Jon Skeet <skeet@pobox.com> | 2009-06-05 19:29:36 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2009-06-05 19:29:36 +0100 |
commit | df67f1482beab88844296a469aa135fbaebcec9d (patch) | |
tree | 86cc32075c445264bd28a582f1a873913664b968 /src/ProtoGen/MessageGenerator.cs | |
parent | 6ef233d4ea9099188310e5278f76c01f931ac817 (diff) | |
download | protobuf-df67f1482beab88844296a469aa135fbaebcec9d.tar.gz protobuf-df67f1482beab88844296a469aa135fbaebcec9d.tar.bz2 protobuf-df67f1482beab88844296a469aa135fbaebcec9d.zip |
Fix custom options behaviour
Diffstat (limited to 'src/ProtoGen/MessageGenerator.cs')
-rw-r--r-- | src/ProtoGen/MessageGenerator.cs | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/src/ProtoGen/MessageGenerator.cs b/src/ProtoGen/MessageGenerator.cs index 4b983003..53859231 100644 --- a/src/ProtoGen/MessageGenerator.cs +++ b/src/ProtoGen/MessageGenerator.cs @@ -39,25 +39,42 @@ namespace Google.ProtocolBuffers.ProtoGen { // The descriptor for this type. string access = Descriptor.File.CSharpOptions.NestClasses ? "private" : "internal"; - writer.WriteLine("{0} static readonly pbd::MessageDescriptor internal__{1}__Descriptor", access, identifier); + writer.WriteLine("{0} static pbd::MessageDescriptor internal__{1}__Descriptor;", access, identifier); + writer.WriteLine("{0} static pb::FieldAccess.FieldAccessorTable<{1}, {1}.Builder> internal__{2}__FieldAccessorTable;", + access, FullClassName, identifier); + + // Generate static members for all nested types. + foreach (MessageDescriptor nestedMessage in Descriptor.NestedTypes) { + new MessageGenerator(nestedMessage).GenerateStaticVariables(writer); + } + } + + internal void GenerateStaticVariableInitializers(TextGenerator writer) { + string identifier = GetUniqueFileScopeIdentifier(Descriptor); + + writer.Write("internal__{0}__Descriptor = ", identifier); if (Descriptor.ContainingType == null) { - writer.WriteLine(" = Descriptor.MessageTypes[{0}];", Descriptor.Index); + writer.WriteLine("Descriptor.MessageTypes[{0}];", Descriptor.Index); } else { - writer.WriteLine(" = internal__{0}__Descriptor.NestedTypes[{1}];", GetUniqueFileScopeIdentifier(Descriptor.ContainingType), Descriptor.Index); + writer.WriteLine("internal__{0}__Descriptor.NestedTypes[{1}];", GetUniqueFileScopeIdentifier(Descriptor.ContainingType), Descriptor.Index); } - writer.WriteLine("{0} static pb::FieldAccess.FieldAccessorTable<{1}, {1}.Builder> internal__{2}__FieldAccessorTable", - access, FullClassName, identifier); - writer.WriteLine(" = new pb::FieldAccess.FieldAccessorTable<{0}, {0}.Builder>(internal__{1}__Descriptor,", - FullClassName, identifier); + + writer.WriteLine("internal__{0}__FieldAccessorTable = ", identifier); + writer.WriteLine(" new pb::FieldAccess.FieldAccessorTable<{1}, {1}.Builder>(internal__{0}__Descriptor,", + identifier, FullClassName); writer.Print(" new string[] { "); foreach (FieldDescriptor field in Descriptor.Fields) { writer.Write("\"{0}\", ", field.CSharpOptions.PropertyName); } writer.WriteLine("});"); - // Generate static members for all nested types. + // Generate static member initializers for all nested types. foreach (MessageDescriptor nestedMessage in Descriptor.NestedTypes) { - new MessageGenerator(nestedMessage).GenerateStaticVariables(writer); + new MessageGenerator(nestedMessage).GenerateStaticVariableInitializers(writer); + } + + foreach (FieldDescriptor extension in Descriptor.Extensions) { + new ExtensionGenerator(extension).GenerateStaticVariableInitializers(writer); } } @@ -119,6 +136,17 @@ namespace Google.ProtocolBuffers.ProtoGen { GenerateParseFromMethods(writer); GenerateBuilder(writer); + + // Force the static initialization code for the file to run, since it may + // initialize static variables declared in this class. + writer.WriteLine("static {0}() {{", ClassName); + // Note that the variable is needed just so we can access the property + writer.WriteLine(" pbd::FileDescriptor descriptor = {0}.Descriptor;", DescriptorUtil.GetFullUmbrellaClassName(Descriptor)); + writer.WriteLine("}"); + + writer.Outdent(); + writer.WriteLine("}"); + writer.WriteLine(); } private void GenerateMessageSerializationMethods(TextGenerator writer) { @@ -297,9 +325,6 @@ namespace Google.ProtocolBuffers.ProtoGen { } writer.Outdent(); writer.WriteLine("}"); - writer.Outdent(); - writer.WriteLine("}"); - writer.WriteLine(); } private void GenerateCommonBuilderMethods(TextGenerator writer) { @@ -472,5 +497,14 @@ namespace Google.ProtocolBuffers.ProtoGen { writer.WriteLine("}"); writer.WriteLine(); } + + internal void GenerateExtensionRegistrationCode(TextGenerator writer) { + foreach (FieldDescriptor extension in Descriptor.Extensions) { + new ExtensionGenerator(extension).GenerateExtensionRegistrationCode(writer); + } + foreach (MessageDescriptor nestedMessage in Descriptor.NestedTypes) { + new MessageGenerator(nestedMessage).GenerateExtensionRegistrationCode(writer); + } + } } } |