// Code generated by protoc-gen-go. DO NOT EDIT.
// source: imports/test_import_a1m2.proto

package imports

import (
	test_a_1 "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/imports/test_a_1"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoregistry "google.golang.org/protobuf/reflect/protoregistry"
	protoiface "google.golang.org/protobuf/runtime/protoiface"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	sync "sync"
)

const (
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 0)
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(0 - protoimpl.MinVersion)
)

type A1M2 struct {
	F                    *test_a_1.M2            `protobuf:"bytes,1,opt,name=f,proto3" json:"f,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     protoimpl.UnknownFields `json:"-"`
	XXX_sizecache        protoimpl.SizeCache     `json:"-"`
}

func (x *A1M2) Reset() {
	*x = A1M2{}
}

func (x *A1M2) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*A1M2) ProtoMessage() {}

func (x *A1M2) ProtoReflect() protoreflect.Message {
	return file_imports_test_import_a1m2_proto_msgTypes[0].MessageOf(x)
}

func (m *A1M2) XXX_Methods() *protoiface.Methods {
	return file_imports_test_import_a1m2_proto_msgTypes[0].Methods()
}

// Deprecated: Use A1M2.ProtoReflect.Type instead.
func (*A1M2) Descriptor() ([]byte, []int) {
	return file_imports_test_import_a1m2_proto_rawDescGZIP(), []int{0}
}

func (x *A1M2) GetF() *test_a_1.M2 {
	if x != nil {
		return x.F
	}
	return nil
}

var File_imports_test_import_a1m2_proto protoreflect.FileDescriptor

var file_imports_test_import_a1m2_proto_rawDesc = []byte{
	0x0a, 0x1e, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69,
	0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x31, 0x6d, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x04, 0x74, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x5f, 0x31, 0x2f, 0x6d, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x22, 0x20, 0x0a, 0x04, 0x41, 0x31, 0x4d, 0x32, 0x12, 0x18, 0x0a, 0x01, 0x66, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x2e, 0x4d, 0x32,
	0x52, 0x01, 0x66, 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f,
	0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
	0x66, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e,
	0x2d, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x69, 0x6d, 0x70,
	0x6f, 0x72, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_imports_test_import_a1m2_proto_rawDescOnce sync.Once
	file_imports_test_import_a1m2_proto_rawDescData = file_imports_test_import_a1m2_proto_rawDesc
)

func file_imports_test_import_a1m2_proto_rawDescGZIP() []byte {
	file_imports_test_import_a1m2_proto_rawDescOnce.Do(func() {
		file_imports_test_import_a1m2_proto_rawDescData = protoimpl.X.CompressGZIP(file_imports_test_import_a1m2_proto_rawDescData)
	})
	return file_imports_test_import_a1m2_proto_rawDescData
}

var file_imports_test_import_a1m2_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_imports_test_import_a1m2_proto_goTypes = []interface{}{
	(*A1M2)(nil),        // 0: test.A1M2
	(*test_a_1.M2)(nil), // 1: test.a.M2
}
var file_imports_test_import_a1m2_proto_depIdxs = []int32{
	1, // test.A1M2.f:type_name -> test.a.M2
}

func init() { file_imports_test_import_a1m2_proto_init() }
func file_imports_test_import_a1m2_proto_init() {
	if File_imports_test_import_a1m2_proto != nil {
		return
	}
	File_imports_test_import_a1m2_proto = protoimpl.FileBuilder{
		RawDescriptor:      file_imports_test_import_a1m2_proto_rawDesc,
		GoTypes:            file_imports_test_import_a1m2_proto_goTypes,
		DependencyIndexes:  file_imports_test_import_a1m2_proto_depIdxs,
		MessageOutputTypes: file_imports_test_import_a1m2_proto_msgTypes,
		FilesRegistry:      protoregistry.GlobalFiles,
		TypesRegistry:      protoregistry.GlobalTypes,
	}.Init()
	file_imports_test_import_a1m2_proto_rawDesc = nil
	file_imports_test_import_a1m2_proto_goTypes = nil
	file_imports_test_import_a1m2_proto_depIdxs = nil
}
