-------- foo.bar (*linker.result) --------
// This is the first detached comment for the syntax.

// This is a second detached comment.

// This is a third.

// Syntax comment...
syntax = "proto2"; // Syntax trailer.

// And now the package declaration
package foo.bar;

// option comments FTW!!!
option go_package = "github.com/jhump/protoreflect/v2/internal/testprotos";

import public "google/protobuf/empty.proto";

import "desc_test_options.proto";

// Multiple white space lines (like above) cannot
// be preserved...

// We need a request for our RPC service below.
message /* request with a capital R */ Request /* trailer */ {
  option deprecated = true; // deprecated!

  // A field comment
  repeated int32 ids = /* tag numero uno */ 1 /*
       * tag trailer
       * that spans multiple lines...
       * more than two.
       */ [
    packed = true,
    // packed!
    json_name = "|foo|",
    // custom JSON!
    (testprotos.ffubar) = "abc",
    (testprotos.ffubarb) = "xyz"
  ]; // field trailer #1...

  // lead mfubar
  option (testprotos.mfubar) = true; // trailing mfubar

  // some detached comments

  // some detached comments with unicode 这个是值

  // Another field comment

  // label comment
  optional /* type comment */ string /* name comment */ name = 2 [
    // default lead

    default = "fubar" // default trail
  ];

  extensions 100 to 200;

  extensions 201 to 250 [
    (testprotos.exfubarb) = "\000\001\002\003\004\005\006\007",
    (testprotos.exfubar) = "splat!"
  ];

  reserved 10 to 20, 30 to 50;

  reserved "foo", "bar", "baz";

  // Group comment with emoji 😀 😍 👻 ❤ 💯 💥 🐶 🦂 🥑 🍻 🌍 🚕 🪐
  optional group Extras = 3 {
    // trailer for Extras

    // this is a custom option
    option (testprotos.mfubar) = false;

    optional double dbl = 1;

    optional float flt = 2;

    option no_standard_descriptor_accessor = false;

    // Leading comment...
    optional string str = 3; // Trailing comment...
  }

  enum MarioCharacters /* "super"! */ {
    // trailer for enum

    // allow_alias comments!
    option allow_alias = true;

    MARIO = 1 [
      (testprotos.evfubars) = -314,
      (testprotos.evfubar) = 278
    ];

    LUIGI = 2 [
      (testprotos.evfubaruf) = 100,
      // swoosh!

      (testprotos.evfubaru) = 200
    ];

    PEACH = 3;

    BOWSER = 4;

    option (testprotos.efubars) = -321;

    WARIO = 5;

    WALUIGI = 6;

    SHY_GUY = 7 [(testprotos.evfubarsf) = 10101];

    HEY_HO = 7;

    MAGIKOOPA = 8;

    KAMEK = 8;

    SNIFIT = -101;

    option (testprotos.efubar) = 123;
  }

  // can be this or that
  oneof abc {
    // trailer for oneof abc

    string this = 4;

    int32 that = 5;
  }

  // can be these or those
  oneof xyz {
    // whoops?
    option (testprotos.oofubar) = "whoops, this has invalid UTF8! \274\377";

    string these = 6;

    int32 those = 7;
  }

  // map field
  map<string, string> things = 8;
}

// And next we'll need some extensions...

extend /* extendee comment */ Request {
  // trailer for extend block

  // comment for guid1
  optional uint64 guid1 = 123;

  // ... and a comment for guid2
  optional uint64 guid2 = 124;
}

message /* name leading comment */ AnEmptyMessage {
  // trailer for AnEmptyMessage

}

// Service comment
service /* service name */ RpcService {
  // service trailer
  // that spans multiple lines

  // option that sets field
  option (testprotos.sfubar) = { id: 100, name: "bob" };

  option deprecated = false; // DEPRECATED!

  option (testprotos.sfubare) = VALUE;

  // Method comment
  rpc /* rpc name */ StreamingRpc ( /* comment C */ stream Request ) returns ( /*comment E */ Request ); // compact method trailer

  rpc UnaryRpc ( Request ) returns ( google.protobuf.Empty ) {
    // trailer for method

    // this RPC is deprecated!
    option deprecated = true;

    option (testprotos.mtfubar) = 12.340000;

    option (testprotos.mtfubard) = 123.456000;
  }
}
-------- foo.bar.Request (*linker.msgDescriptor) --------
// Multiple white space lines (like above) cannot
// be preserved...

// We need a request for our RPC service below.
message /* request with a capital R */ Request /* trailer */ {
  option deprecated = true; // deprecated!

  // A field comment
  repeated int32 ids = /* tag numero uno */ 1 /*
       * tag trailer
       * that spans multiple lines...
       * more than two.
       */ [
    packed = true,
    // packed!
    json_name = "|foo|",
    // custom JSON!
    (testprotos.ffubar) = "abc",
    (testprotos.ffubarb) = "xyz"
  ]; // field trailer #1...

  // lead mfubar
  option (testprotos.mfubar) = true; // trailing mfubar

  // some detached comments

  // some detached comments with unicode 这个是值

  // Another field comment

  // label comment
  optional /* type comment */ string /* name comment */ name = 2 [
    // default lead

    default = "fubar" // default trail
  ];

  extensions 100 to 200;

  extensions 201 to 250 [
    (testprotos.exfubarb) = "\000\001\002\003\004\005\006\007",
    (testprotos.exfubar) = "splat!"
  ];

  reserved 10 to 20, 30 to 50;

  reserved "foo", "bar", "baz";

  // Group comment with emoji 😀 😍 👻 ❤ 💯 💥 🐶 🦂 🥑 🍻 🌍 🚕 🪐
  optional group Extras = 3 {
    // trailer for Extras

    // this is a custom option
    option (testprotos.mfubar) = false;

    optional double dbl = 1;

    optional float flt = 2;

    option no_standard_descriptor_accessor = false;

    // Leading comment...
    optional string str = 3; // Trailing comment...
  }

  enum MarioCharacters /* "super"! */ {
    // trailer for enum

    // allow_alias comments!
    option allow_alias = true;

    MARIO = 1 [
      (testprotos.evfubars) = -314,
      (testprotos.evfubar) = 278
    ];

    LUIGI = 2 [
      (testprotos.evfubaruf) = 100,
      // swoosh!

      (testprotos.evfubaru) = 200
    ];

    PEACH = 3;

    BOWSER = 4;

    option (testprotos.efubars) = -321;

    WARIO = 5;

    WALUIGI = 6;

    SHY_GUY = 7 [(testprotos.evfubarsf) = 10101];

    HEY_HO = 7;

    MAGIKOOPA = 8;

    KAMEK = 8;

    SNIFIT = -101;

    option (testprotos.efubar) = 123;
  }

  // can be this or that
  oneof abc {
    // trailer for oneof abc

    string this = 4;

    int32 that = 5;
  }

  // can be these or those
  oneof xyz {
    // whoops?
    option (testprotos.oofubar) = "whoops, this has invalid UTF8! \274\377";

    string these = 6;

    int32 those = 7;
  }

  // map field
  map<string, string> things = 8;
}
-------- foo.bar.Request.ids (*linker.fldDescriptor) --------
// A field comment
repeated int32 ids = /* tag numero uno */ 1 /*
     * tag trailer
     * that spans multiple lines...
     * more than two.
     */ [
  packed = true,
  // packed!
  json_name = "|foo|",
  // custom JSON!
  (testprotos.ffubar) = "abc",
  (testprotos.ffubarb) = "xyz"
]; // field trailer #1...
-------- foo.bar.Request.name (*linker.fldDescriptor) --------
// some detached comments

// some detached comments with unicode 这个是值

// Another field comment

// label comment
optional /* type comment */ string /* name comment */ name = 2 [
  // default lead

  default = "fubar" // default trail
];
-------- foo.bar.Request.extras (*linker.fldDescriptor) --------
// Group comment with emoji 😀 😍 👻 ❤ 💯 💥 🐶 🦂 🥑 🍻 🌍 🚕 🪐
optional group Extras = 3 {
  // trailer for Extras

  // this is a custom option
  option (testprotos.mfubar) = false;

  optional double dbl = 1;

  optional float flt = 2;

  option no_standard_descriptor_accessor = false;

  // Leading comment...
  optional string str = 3; // Trailing comment...
}
-------- foo.bar.Request.this (*linker.fldDescriptor) --------
string this = 4;
-------- foo.bar.Request.that (*linker.fldDescriptor) --------
int32 that = 5;
-------- foo.bar.Request.these (*linker.fldDescriptor) --------
string these = 6;
-------- foo.bar.Request.those (*linker.fldDescriptor) --------
int32 those = 7;
-------- foo.bar.Request.things (*linker.fldDescriptor) --------
// map field
map<string, string> things = 8;
-------- foo.bar.Request.abc (*linker.oneofDescriptor) --------
oneof abc {
  string this = 4;

  int32 that = 5;
}
-------- foo.bar.Request.xyz (*linker.oneofDescriptor) --------
oneof xyz {
  option (testprotos.oofubar) = "whoops, this has invalid UTF8! \274\377";

  string these = 6;

  int32 those = 7;
}
-------- foo.bar.Request.Extras (*linker.msgDescriptor) --------
// Group comment with emoji 😀 😍 👻 ❤ 💯 💥 🐶 🦂 🥑 🍻 🌍 🚕 🪐
message /* group name */ Extras {
  // trailer for Extras

  // this is a custom option
  option (testprotos.mfubar) = false;

  optional double dbl = 1;

  optional float flt = 2;

  option no_standard_descriptor_accessor = false;

  // Leading comment...
  optional string str = 3; // Trailing comment...
}
-------- foo.bar.Request.Extras.dbl (*linker.fldDescriptor) --------
optional double dbl = 1;
-------- foo.bar.Request.Extras.flt (*linker.fldDescriptor) --------
optional float flt = 2;
-------- foo.bar.Request.Extras.str (*linker.fldDescriptor) --------
// Leading comment...
optional string str = 3; // Trailing comment...
-------- foo.bar.Request.ThingsEntry (*linker.msgDescriptor) --------
message ThingsEntry {
  option map_entry = true;

  optional string key = 1;

  optional string value = 2;
}
-------- foo.bar.Request.ThingsEntry.key (*linker.fldDescriptor) --------
optional string key = 1;
-------- foo.bar.Request.ThingsEntry.value (*linker.fldDescriptor) --------
optional string value = 2;
-------- foo.bar.Request.MarioCharacters (*linker.enumDescriptor) --------
enum MarioCharacters /* "super"! */ {
  // trailer for enum

  // allow_alias comments!
  option allow_alias = true;

  MARIO = 1 [
    (testprotos.evfubars) = -314,
    (testprotos.evfubar) = 278
  ];

  LUIGI = 2 [
    (testprotos.evfubaruf) = 100,
    // swoosh!

    (testprotos.evfubaru) = 200
  ];

  PEACH = 3;

  BOWSER = 4;

  option (testprotos.efubars) = -321;

  WARIO = 5;

  WALUIGI = 6;

  SHY_GUY = 7 [(testprotos.evfubarsf) = 10101];

  HEY_HO = 7;

  MAGIKOOPA = 8;

  KAMEK = 8;

  SNIFIT = -101;

  option (testprotos.efubar) = 123;
}
-------- foo.bar.Request.MARIO (*linker.enValDescriptor) --------
MARIO = 1 [
  (testprotos.evfubars) = -314,
  (testprotos.evfubar) = 278
];
-------- foo.bar.Request.LUIGI (*linker.enValDescriptor) --------
LUIGI = 2 [
  (testprotos.evfubaruf) = 100,
  // swoosh!

  (testprotos.evfubaru) = 200
];
-------- foo.bar.Request.PEACH (*linker.enValDescriptor) --------
PEACH = 3;
-------- foo.bar.Request.BOWSER (*linker.enValDescriptor) --------
BOWSER = 4;
-------- foo.bar.Request.WARIO (*linker.enValDescriptor) --------
WARIO = 5;
-------- foo.bar.Request.WALUIGI (*linker.enValDescriptor) --------
WALUIGI = 6;
-------- foo.bar.Request.SHY_GUY (*linker.enValDescriptor) --------
SHY_GUY = 7 [(testprotos.evfubarsf) = 10101];
-------- foo.bar.Request.HEY_HO (*linker.enValDescriptor) --------
HEY_HO = 7;
-------- foo.bar.Request.MAGIKOOPA (*linker.enValDescriptor) --------
MAGIKOOPA = 8;
-------- foo.bar.Request.KAMEK (*linker.enValDescriptor) --------
KAMEK = 8;
-------- foo.bar.Request.SNIFIT (*linker.enValDescriptor) --------
SNIFIT = -101;
-------- foo.bar.AnEmptyMessage (*linker.msgDescriptor) --------
message /* name leading comment */ AnEmptyMessage {
  // trailer for AnEmptyMessage

}
-------- foo.bar.guid1 (*linker.extTypeDescriptor) --------
extend /* extendee comment */ Request {
  // comment for guid1
  optional uint64 guid1 = 123;
}
-------- foo.bar.guid2 (*linker.extTypeDescriptor) --------
extend Request {
  // ... and a comment for guid2
  optional uint64 guid2 = 124;
}
-------- foo.bar.RpcService (*linker.svcDescriptor) --------
// Service comment
service /* service name */ RpcService {
  // service trailer
  // that spans multiple lines

  // option that sets field
  option (testprotos.sfubar) = { id: 100, name: "bob" };

  option deprecated = false; // DEPRECATED!

  option (testprotos.sfubare) = VALUE;

  // Method comment
  rpc /* rpc name */ StreamingRpc ( /* comment C */ stream Request ) returns ( /*comment E */ Request ); // compact method trailer

  rpc UnaryRpc ( Request ) returns ( google.protobuf.Empty ) {
    // trailer for method

    // this RPC is deprecated!
    option deprecated = true;

    option (testprotos.mtfubar) = 12.340000;

    option (testprotos.mtfubard) = 123.456000;
  }
}
-------- foo.bar.RpcService.StreamingRpc (*linker.mtdDescriptor) --------
// Method comment
rpc /* rpc name */ StreamingRpc ( /* comment C */ stream Request ) returns ( /*comment E */ Request ); // compact method trailer
-------- foo.bar.RpcService.UnaryRpc (*linker.mtdDescriptor) --------
rpc UnaryRpc ( Request ) returns ( google.protobuf.Empty ) {
  // trailer for method

  // this RPC is deprecated!
  option deprecated = true;

  option (testprotos.mtfubar) = 12.340000;

  option (testprotos.mtfubard) = 123.456000;
}
