syntax = "proto2";

option go_package = "github.com/jhump/protoreflect/internal/testprotos";

package testprotos;

/* Comment for TestMessage */
message TestMessage {
	/* Comment for NestedMessage */
	message NestedMessage {
		/* Comment for AnotherNestedMessage */
		message AnotherNestedMessage {
			/* Comment for AnotherTestMessage extensions (1) */
			extend AnotherTestMessage {
				/* Comment for flags */
				repeated bool flags = 200 [packed = true];
			}

			/* Comment for YetAnotherNestedMessage */
			message YetAnotherNestedMessage {
				/* Comment for DeeplyNestedEnum */
				enum DeeplyNestedEnum {
					/* Comment for VALUE1 */
					VALUE1 = 1;

					/* Comment for VALUE2 */
					VALUE2 = 2;
				}

				/* Comment for foo */
				optional string foo = 1;

				/* Comment for bar */
				optional int32 bar = 2;

				/* Comment for baz */
				optional bytes baz = 3;

				/* Comment for dne */
				optional DeeplyNestedEnum dne = 4;

				/* Comment for anm */
				optional AnotherNestedMessage anm = 5;

				/* Comment for nm */
				optional NestedMessage nm = 6;

				/* Comment for tm */
				optional TestMessage tm = 7;
			}

			/* Comment for yanm */
			repeated YetAnotherNestedMessage yanm = 1;
		}

		/* Comment for anm */
		optional AnotherNestedMessage anm = 1;

		/* Comment for yanm */
		optional AnotherNestedMessage.YetAnotherNestedMessage yanm = 2;
	}

	/* Comment for NestedEnum */
	enum NestedEnum {
		/* Comment for VALUE1 */
		VALUE1 = 1;

		/* Comment for VALUE2 */
		VALUE2 = 2;
	}

	/* Comment for nm */
	optional NestedMessage nm = 1;

	/* Comment for anm */
	optional NestedMessage.AnotherNestedMessage anm = 2;

	/* Comment for yanm */
	optional NestedMessage.AnotherNestedMessage.YetAnotherNestedMessage yanm = 3;

	/* Comment for ne */
	repeated NestedEnum ne = 4;
}

/* Comment for AnotherTestMessage */
message AnotherTestMessage {
	/* Comment for dne */
	optional TestMessage.NestedMessage.AnotherNestedMessage.YetAnotherNestedMessage.DeeplyNestedEnum dne = 1;

	/* Comment for map_field1 */
	map<int32, string> map_field1 = 2;

	/* Comment for map_field2 */
	map<int64, float> map_field2 = 3;

	/* Comment for map_field3 */
	map<uint32, bool> map_field3 = 4;

	/* Comment for map_field4 */
	map<string, AnotherTestMessage> map_field4 = 5;

	/* Comment for RockNRoll */
	optional group RockNRoll = 6 {
		/* Comment for beatles */
		optional string beatles = 1;

		/* Comment for stones */
		optional string stones = 2;

		/* Comment for doors */
		optional string doors = 3;
	}

	/* Comment for atmoo */
	oneof atmoo {
		/* Comment for str */
		string str = 7;

		/* Comment for int */
		int64 int = 8;
	}

	/* Comment for WithOptions */
	optional group WithOptions = 9 [deprecated = true] {
	}

	extensions 100 to 200;
}

/* Comment for AnotherTestMessage extensions (2) */
extend AnotherTestMessage {
	/* Comment for xtm */
	optional TestMessage xtm = 100;

	/* Comment for xs */
	optional string xs = 101;
}

/* Comment for AnotherTestMessage extensions (3) */
extend AnotherTestMessage {
	/* Comment for xi */
	optional int32 xi = 102;

	/* Comment for xui */
	optional uint64 xui = 103;
}
