// 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/bufbuild/protocompile/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 with unicode 这个是值

	// 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 with emoji 😀 😍 👻 ❤ 💯 💥 🐶 🦂 🥑 🍻 🌍 🚕 🪐
	optional group /* group name */ Extras = 3 {
		// trailer for Extras

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

		optional double dbl = 1; /* trailing comment for dbl */ /* detached comment */ /* leading comment for flt */ optional float flt = 2;

		option no_standard_descriptor_accessor = false; /* weird trailing comment
		                                                   for the option that gets
		                                                   classified as detached
		                                                   since it's on the same
		                                                   line as the following
		                                                   element */ option deprecated=true;

		// 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; /* peach trailer */ /* bowser leader */ 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! \xBC\xFF";

		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
{
	// trailer for extend block

	// comment for guid1
	optional uint64 guid1 = 123;
	// ... and a comment for guid2
	optional uint64 guid2 = 124;
}
// after extend block

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

/*
 * Tests javadoc style comment, where every line in block comment has leading
 * asterisk that should be stripped.
 */
message AnotherEmptyMessage  { /* trailer for AnotherEmptyMessage */
}

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

	// option that sets field
	option(testprotos.sfubar).id= 100;
	// another option that sets field
	option(testprotos.sfubar).name= "bob";
	option deprecated = false; // DEPRECATED!

	/**
	 * Another javadoc-style comment.
	 * This one has the double-asterisk on first line, like javadoc.
	 */
	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 */ ; // compact method trailer

	rpc UnaryRpc (Request) returns (google.protobuf.Empty) { // trailer for method
		// this RPC is deprecated!
		option deprecated = true;
		option (testprotos.mtfubar) = 12.34;
		option (testprotos.mtfubard) = 123.456;
	}
}
// another comment after service

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