Move DebuggerNonUserCodeAttribute to function members

I think this has caught everything.
I've left a stub for attributes to be applied to the types themselves, but we don't currently need anything.

Follow-up commit will include the changes to generated code itself.

Fixes #1671.
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum.cc b/src/google/protobuf/compiler/csharp/csharp_enum.cc
index bdfcc2b..ba61c4c 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_enum.cc
@@ -60,7 +60,7 @@
 
 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 e3c3404..e2011b7 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::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 565d122..e6eac6e 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 @@
     ", $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 532da6b..4c3ec6b 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_message.cc
@@ -104,9 +104,7 @@
   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 @@
 
   // 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 @@
         + ".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 @@
     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 @@
     printer->Print(
       vars,
       "#region Nested types\n"
-      "/// <summary>Container for nested types declared in the $class_name$ message type.</summary>\n"
-      "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n");
+      "/// <summary>Container for nested types declared in the $class_name$ message type.</summary>\n");
     WriteGeneratedCodeAttributes(printer);
     printer->Print("public static partial class Types {\n");
     printer->Indent();
@@ -255,6 +267,7 @@
 
 void MessageGenerator::GenerateCloningCode(io::Printer* printer) {
   map<string, string> vars;
+  WriteGeneratedCodeAttributes(printer);
   vars["class_name"] = class_name();
     printer->Print(
     vars,
@@ -294,6 +307,7 @@
   printer->Outdent();
   printer->Print("}\n\n");
 
+  WriteGeneratedCodeAttributes(printer);
   printer->Print(
     vars,
     "public $class_name$ Clone() {\n"
@@ -309,11 +323,15 @@
     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 @@
 
     // 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 @@
     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 @@
   // 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 @@
   map<string, string> vars;
   vars["class_name"] = class_name();
 
+  WriteGeneratedCodeAttributes(printer);
   printer->Print(
     vars,
     "public void MergeFrom($class_name$ other) {\n");
@@ -434,6 +458,7 @@
   }
   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 338692f..438f310 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 @@
     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 @@
 
 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 3b7ca75..169122e 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 @@
     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 @@
 
 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 f7397c0..df7ea11 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 @@
   }
 
   printer->Print(
-    "/// <summary>Holder for reflection information generated from $file_name$</summary>\n"
-    "[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n",
+    "/// <summary>Holder for reflection information generated from $file_name$</summary>\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 1befdc1..683c4b0 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 @@
   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 d51e638..8fa0b05 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 @@
     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 bee3f36..cd91506 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 @@
   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 16411e4..d8ef2d2 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 @@
 }
 
 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 2e73458..9cfe5c6 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 @@
   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 5cb86b6..797d498 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 @@
     ";\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 @@
   GenerateCodecCode(printer);
   printer->Print(";\n");
   WritePropertyDocComment(printer, descriptor_);
-  AddDeprecatedFlag(printer);
+  AddPublicMemberAttributes(printer);
   printer->Print(
     variables_,
     "$access_level$ $type_name$ $property_name$ {\n"