diff --git a/src/google/protobuf/compiler/csharp/csharp_enum.cc b/src/google/protobuf/compiler/csharp/csharp_enum.cc index bdfcc2beec..ba61c4c73e 100644 --- a/src/google/protobuf/compiler/csharp/csharp_enum.cc +++ b/src/google/protobuf/compiler/csharp/csharp_enum.cc @@ -60,7 +60,7 @@ EnumGenerator::~EnumGenerator() { void EnumGenerator::Generate(io::Printer* printer) { WriteEnumDocComment(printer, descriptor_); - WriteGeneratedCodeAttributes(printer); + WriteGeneratedTypeAttributes(printer); printer->Print("$access_level$ enum $name$ {\n", "access_level", class_access_level(), "name", descriptor_->name()); diff --git a/src/google/protobuf/compiler/csharp/csharp_field_base.cc b/src/google/protobuf/compiler/csharp/csharp_field_base.cc index e3c34040b8..e2011b76ca 100644 --- a/src/google/protobuf/compiler/csharp/csharp_field_base.cc +++ b/src/google/protobuf/compiler/csharp/csharp_field_base.cc @@ -124,12 +124,13 @@ void FieldGeneratorBase::GenerateCodecCode(io::Printer* printer) { void FieldGeneratorBase::AddDeprecatedFlag(io::Printer* printer) { if (descriptor_->options().deprecated()) { - printer->Print("[global::System.ObsoleteAttribute()]\n"); + printer->Print("[global::System.ObsoleteAttribute]\n"); } } void FieldGeneratorBase::AddPublicMemberAttributes(io::Printer* printer) { AddDeprecatedFlag(printer); + WriteGeneratedCodeAttributes(printer); } std::string FieldGeneratorBase::oneof_property_name() { diff --git a/src/google/protobuf/compiler/csharp/csharp_map_field.cc b/src/google/protobuf/compiler/csharp/csharp_map_field.cc index 565d12259f..e6eac6edb2 100644 --- a/src/google/protobuf/compiler/csharp/csharp_map_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_map_field.cc @@ -80,7 +80,7 @@ void MapFieldGenerator::GenerateMembers(io::Printer* printer) { ", $tag$);\n" "private readonly pbc::MapField<$key_type_name$, $value_type_name$> $name$_ = new pbc::MapField<$key_type_name$, $value_type_name$>();\n"); WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ pbc::MapField<$key_type_name$, $value_type_name$> $property_name$ {\n" diff --git a/src/google/protobuf/compiler/csharp/csharp_message.cc b/src/google/protobuf/compiler/csharp/csharp_message.cc index 532da6b9e1..4c3ec6bd00 100644 --- a/src/google/protobuf/compiler/csharp/csharp_message.cc +++ b/src/google/protobuf/compiler/csharp/csharp_message.cc @@ -104,9 +104,7 @@ void MessageGenerator::Generate(io::Printer* printer) { vars["access_level"] = class_access_level(); WriteMessageDocComment(printer, descriptor_); - printer->Print( - "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n"); - WriteGeneratedCodeAttributes(printer); + WriteGeneratedTypeAttributes(printer); printer->Print( vars, "$access_level$ sealed partial class $class_name$ : pb::IMessage<$class_name$> {\n"); @@ -114,9 +112,13 @@ void MessageGenerator::Generate(io::Printer* printer) { // All static fields and properties printer->Print( - vars, - "private static readonly pb::MessageParser<$class_name$> _parser = new pb::MessageParser<$class_name$>(() => new $class_name$());\n" - "public static pb::MessageParser<$class_name$> Parser { get { return _parser; } }\n\n"); + vars, + "private static readonly pb::MessageParser<$class_name$> _parser = new pb::MessageParser<$class_name$>(() => new $class_name$());\n"); + + WriteGeneratedCodeAttributes(printer); + printer->Print( + vars, + "public static pb::MessageParser<$class_name$> Parser { get { return _parser; } }\n\n"); // Access the message descriptor via the relevant file descriptor or containing message descriptor. if (!descriptor_->containing_type()) { @@ -127,18 +129,23 @@ void MessageGenerator::Generate(io::Printer* printer) { + ".Descriptor.NestedTypes[" + SimpleItoa(descriptor_->index()) + "]"; } + WriteGeneratedCodeAttributes(printer); printer->Print( - vars, - "public static pbr::MessageDescriptor Descriptor {\n" - " get { return $descriptor_accessor$; }\n" - "}\n" - "\n" + vars, + "public static pbr::MessageDescriptor Descriptor {\n" + " get { return $descriptor_accessor$; }\n" + "}\n" + "\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print( + vars, "pbr::MessageDescriptor pb::IMessage.Descriptor {\n" " get { return Descriptor; }\n" "}\n" "\n"); // Parameterless constructor and partial OnConstruction method. + WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public $class_name$() {\n" @@ -188,12 +195,18 @@ void MessageGenerator::Generate(io::Printer* printer) { printer->Print("}\n"); // TODO: Should we put the oneof .proto comments here? // It's unclear exactly where they should go. - printer->Print( - vars, - "private $property_name$OneofCase $name$Case_ = $property_name$OneofCase.None;\n" - "public $property_name$OneofCase $property_name$Case {\n" - " get { return $name$Case_; }\n" - "}\n\n" + printer->Print( + vars, + "private $property_name$OneofCase $name$Case_ = $property_name$OneofCase.None;\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print( + vars, + "public $property_name$OneofCase $property_name$Case {\n" + " get { return $name$Case_; }\n" + "}\n\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print( + vars, "public void Clear$property_name$() {\n" " $name$Case_ = $property_name$OneofCase.None;\n" " $name$_ = null;\n" @@ -210,8 +223,7 @@ void MessageGenerator::Generate(io::Printer* printer) { printer->Print( vars, "#region Nested types\n" - "/// Container for nested types declared in the $class_name$ message type.\n" - "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n"); + "/// Container for nested types declared in the $class_name$ message type.\n"); WriteGeneratedCodeAttributes(printer); printer->Print("public static partial class Types {\n"); printer->Indent(); @@ -255,6 +267,7 @@ bool MessageGenerator::HasNestedGeneratedTypes() void MessageGenerator::GenerateCloningCode(io::Printer* printer) { map vars; + WriteGeneratedCodeAttributes(printer); vars["class_name"] = class_name(); printer->Print( vars, @@ -294,6 +307,7 @@ void MessageGenerator::GenerateCloningCode(io::Printer* printer) { printer->Outdent(); printer->Print("}\n\n"); + WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public $class_name$ Clone() {\n" @@ -309,11 +323,15 @@ void MessageGenerator::GenerateFrameworkMethods(io::Printer* printer) { vars["class_name"] = class_name(); // Equality + WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public override bool Equals(object other) {\n" " return Equals(other as $class_name$);\n" - "}\n\n" + "}\n\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print( + vars, "public bool Equals($class_name$ other) {\n" " if (ReferenceEquals(other, null)) {\n" " return false;\n" @@ -338,7 +356,8 @@ void MessageGenerator::GenerateFrameworkMethods(io::Printer* printer) { // GetHashCode // Start with a non-zero value to easily distinguish between null and "empty" messages. - printer->Print( + WriteGeneratedCodeAttributes(printer); + printer->Print( "public override int GetHashCode() {\n" " int hash = 1;\n"); printer->Indent(); @@ -355,13 +374,15 @@ void MessageGenerator::GenerateFrameworkMethods(io::Printer* printer) { printer->Outdent(); printer->Print("}\n\n"); - printer->Print( + WriteGeneratedCodeAttributes(printer); + printer->Print( "public override string ToString() {\n" " return pb::JsonFormatter.ToDiagnosticString(this);\n" "}\n\n"); } void MessageGenerator::GenerateMessageSerializationMethods(io::Printer* printer) { + WriteGeneratedCodeAttributes(printer); printer->Print( "public void WriteTo(pb::CodedOutputStream output) {\n"); printer->Indent(); @@ -376,8 +397,10 @@ void MessageGenerator::GenerateMessageSerializationMethods(io::Printer* printer) // TODO(jonskeet): Memoize size of frozen messages? printer->Outdent(); printer->Print( - "}\n" - "\n" + "}\n" + "\n"); + WriteGeneratedCodeAttributes(printer); + printer->Print( "public int CalculateSize() {\n"); printer->Indent(); printer->Print("int size = 0;\n"); @@ -398,6 +421,7 @@ void MessageGenerator::GenerateMergingMethods(io::Printer* printer) { map vars; vars["class_name"] = class_name(); + WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public void MergeFrom($class_name$ other) {\n"); @@ -434,6 +458,7 @@ void MessageGenerator::GenerateMergingMethods(io::Printer* printer) { } printer->Outdent(); printer->Print("}\n\n"); + WriteGeneratedCodeAttributes(printer); printer->Print("public void MergeFrom(pb::CodedInputStream input) {\n"); printer->Indent(); printer->Print( diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_message_field.cc index 338692f8c7..438f310221 100644 --- a/src/google/protobuf/compiler/csharp/csharp_message_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_message_field.cc @@ -65,7 +65,7 @@ void MessageFieldGenerator::GenerateMembers(io::Printer* printer) { variables_, "private $type_name$ $name$_;\n"); WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" @@ -159,7 +159,7 @@ MessageOneofFieldGenerator::~MessageOneofFieldGenerator() { void MessageOneofFieldGenerator::GenerateMembers(io::Printer* printer) { WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc index 3b7ca75ab8..169122e6be 100644 --- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc @@ -71,7 +71,7 @@ void PrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) { variables_, "private $type_name$ $name_def_message$;\n"); WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" @@ -174,7 +174,7 @@ PrimitiveOneofFieldGenerator::~PrimitiveOneofFieldGenerator() { void PrimitiveOneofFieldGenerator::GenerateMembers(io::Printer* printer) { WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" diff --git a/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc b/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc index f7397c0f6e..df7ea11b08 100644 --- a/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc +++ b/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc @@ -122,10 +122,9 @@ void ReflectionClassGenerator::WriteIntroduction(io::Printer* printer) { } printer->Print( - "/// Holder for reflection information generated from $file_name$\n" - "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n", + "/// Holder for reflection information generated from $file_name$\n", "file_name", file_->name()); - WriteGeneratedCodeAttributes(printer); + WriteGeneratedTypeAttributes(printer); printer->Print( "$access_level$ static partial class $reflection_class_name$ {\n" "\n", diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc index 1befdc1511..683c4b0b7a 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc @@ -64,7 +64,7 @@ void RepeatedEnumFieldGenerator::GenerateMembers(io::Printer* printer) { printer->Print(variables_, "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n"); WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n" diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc index d51e638a9c..8fa0b0504f 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc @@ -79,7 +79,7 @@ void RepeatedMessageFieldGenerator::GenerateMembers(io::Printer* printer) { variables_, "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n"); WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n" diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc index bee3f3630f..cd91506ff1 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc @@ -64,7 +64,7 @@ void RepeatedPrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) { printer->Print(variables_, "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n"); WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n" diff --git a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc index 16411e49c7..d8ef2d2ee0 100644 --- a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc +++ b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc @@ -56,6 +56,10 @@ SourceGeneratorBase::~SourceGeneratorBase() { } void SourceGeneratorBase::WriteGeneratedCodeAttributes(io::Printer* printer) { + printer->Print("[global::System.Diagnostics.DebuggerNonUserCodeAttribute]\n"); +} + +void SourceGeneratorBase::WriteGeneratedTypeAttributes(io::Printer* printer) { // This hook can be used to reintroduce generated code attributes in the future. } diff --git a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h index 2e73458121..9cfe5c6944 100644 --- a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h +++ b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h @@ -50,7 +50,12 @@ class SourceGeneratorBase { std::string class_access_level(); const Options* options(); + // Write any attributes used to decorate generated function members (methods and properties). + // Should not be used to decorate types. void WriteGeneratedCodeAttributes(io::Printer* printer); + // Write any attributes used to decorate generated types. + // Should not be used to decorate function members. + void WriteGeneratedTypeAttributes(io::Printer* printer); private: const FileDescriptor* descriptor_; diff --git a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc index 5cb86b6b26..797d498ed3 100644 --- a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc @@ -73,7 +73,7 @@ void WrapperFieldGenerator::GenerateMembers(io::Printer* printer) { ";\n" "private $type_name$ $name$_;\n"); WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" @@ -169,7 +169,7 @@ void WrapperOneofFieldGenerator::GenerateMembers(io::Printer* printer) { GenerateCodecCode(printer); printer->Print(";\n"); WritePropertyDocComment(printer, descriptor_); - AddDeprecatedFlag(printer); + AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n"