// 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/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 /* detached message name */ /* request with a capital R */ Request // trailer
{	option deprecated = true; // deprecated!

	// A field comment
	repeated int32 ids = /* detached tag */ /* 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

	// Another field comment
	/* label comment */ optional /* type comment */ string /* name comment */ name = 2
		[/* default lead */ default = 'fubar' /* default trail */ ];

	// extension range comments are (sadly) not preserved
	extensions 100 to 200;
	extensions 201 to 250 [(testprotos.exfubarb) = "\0\1\2\3\4\5\6\7", (testprotos.exfubar) = "splat!"];

	// another detached comment

	/* same for reserved range comments */ reserved 10 to 20, 30 to 50 ;
	reserved "foo", "bar", "baz"; /* reserved trailers */

	// Group comment
	optional group /* group name */ Extras = 3 {
		// 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"!
	{
		// 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 {
		string this = 4;
		int32 that = 5;
	}
	// can be these or those
	oneof xyz {
		string these = 6;
		int32 those = 7;
	}

	// map field
	map<string, string> things = 8;
}
// And next we'll need some extensions...

extend
// extendee comment
Request
// extendee trailer
{
	// comment for guid1
	optional uint64 guid1 = 123;
	// ... and a comment for guid2
	optional uint64 guid2 = 124;
}
// extend trailer...

message /* name leading comment */ AnEmptyMessage /* name trailing comment */ {}

// Service comment
service /* service name */ RpcService {
	// option that sets field
	option(testprotos.sfubar).id= 100;
	// another option that sets field
	option(testprotos.sfubar).name= "bob";
	option deprecated = false; // DEPRECATED!

	option (testprotos.sfubare) = VALUE;

	// Method comment
	rpc /* rpc name */ StreamingRpc /* comment A */ (/* comment B */stream /* comment C */ Request)
		returns /* comment D */ (/*comment E */ Request ) /* comment F */ ;

	rpc UnaryRpc (Request) returns (google.protobuf.Empty) {
		option deprecated = true;
		option (testprotos.mtfubar) = 12.34;
		option (testprotos.mtfubard) = 123.456;
	}
}
// service trailer

// Detached comment after all elements cannot be preserved...
