// Code generated by protoc-gen-go. DO NOT EDIT.
// source: import_public/a.proto

package import_public

import (
	sub "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/import_public/sub"
	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
	sync "sync"
)

const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)

// Symbols defined in public import of import_public/sub/a.proto

type E = sub.E

const E_ZERO = sub.E_ZERO

var E_name = sub.E_name
var E_value = sub.E_value

type M_Subenum = sub.M_Subenum

const M_M_ZERO = sub.M_M_ZERO

var M_Subenum_name = sub.M_Subenum_name
var M_Subenum_value = sub.M_Subenum_value

type M_Submessage_Submessage_Subenum = sub.M_Submessage_Submessage_Subenum

const M_Submessage_M_SUBMESSAGE_ZERO = sub.M_Submessage_M_SUBMESSAGE_ZERO

var M_Submessage_Submessage_Subenum_name = sub.M_Submessage_Submessage_Subenum_name
var M_Submessage_Submessage_Subenum_value = sub.M_Submessage_Submessage_Subenum_value

type M = sub.M

const Default_M_S = sub.Default_M_S

var Default_M_B = sub.Default_M_B
var Default_M_F = sub.Default_M_F

type M_OneofInt32 = sub.M_OneofInt32
type M_OneofInt64 = sub.M_OneofInt64
type M_Submessage = sub.M_Submessage
type M_Submessage_SubmessageOneofInt32 = sub.M_Submessage_SubmessageOneofInt32
type M_Submessage_SubmessageOneofInt64 = sub.M_Submessage_SubmessageOneofInt64

var E_ExtensionField = sub.E_ExtensionField

type Public struct {
	M                    *sub.M                  `protobuf:"bytes,1,opt,name=m" json:"m,omitempty"`
	E                    *sub.E                  `protobuf:"varint,2,opt,name=e,enum=goproto.protoc.import_public.sub.E" json:"e,omitempty"`
	Local                *Local                  `protobuf:"bytes,3,opt,name=local" json:"local,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     protoimpl.UnknownFields `json:"-"`
	XXX_sizecache        protoimpl.SizeCache     `json:"-"`
}

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

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

func (*Public) ProtoMessage() {}

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

func (m *Public) XXX_Methods() *protoiface.Methods {
	return file_import_public_a_proto_msgTypes[0].Methods()
}

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

func (x *Public) GetM() *sub.M {
	if x != nil {
		return x.M
	}
	return nil
}

func (x *Public) GetE() sub.E {
	if x != nil && x.E != nil {
		return *x.E
	}
	return sub.E_ZERO
}

func (x *Public) GetLocal() *Local {
	if x != nil {
		return x.Local
	}
	return nil
}

var File_import_public_a_proto protoreflect.FileDescriptor

var file_import_public_a_proto_rawDesc = []byte{
	0x0a, 0x15, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
	0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2e, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70,
	0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75,
	0x62, 0x6c, 0x69, 0x63, 0x2f, 0x73, 0x75, 0x62, 0x2f, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x1a, 0x15, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f,
	0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa9, 0x01, 0x0a, 0x06, 0x50, 0x75, 0x62, 0x6c,
	0x69, 0x63, 0x12, 0x31, 0x0a, 0x01, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
	0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2e, 0x69,
	0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x73, 0x75, 0x62,
	0x2e, 0x4d, 0x52, 0x01, 0x6d, 0x12, 0x31, 0x0a, 0x01, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x23, 0x2e, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x63, 0x2e, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e,
	0x73, 0x75, 0x62, 0x2e, 0x45, 0x52, 0x01, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61,
	0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2e, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f,
	0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x05, 0x6c, 0x6f,
	0x63, 0x61, 0x6c, 0x42, 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
	0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
	0x66, 0x2f, 0x76, 0x32, 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, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x00, 0x50,
	0x01,
}

var (
	file_import_public_a_proto_rawDescOnce sync.Once
	file_import_public_a_proto_rawDescData = file_import_public_a_proto_rawDesc
)

func file_import_public_a_proto_rawDescGZIP() []byte {
	file_import_public_a_proto_rawDescOnce.Do(func() {
		file_import_public_a_proto_rawDescData = protoimpl.X.CompressGZIP(file_import_public_a_proto_rawDescData)
	})
	return file_import_public_a_proto_rawDescData
}

var file_import_public_a_proto_msgTypes = make([]protoimpl.MessageType, 1)
var file_import_public_a_proto_goTypes = []interface{}{
	(*Public)(nil), // 0: goproto.protoc.import_public.Public
	(*sub.M)(nil),  // 1: goproto.protoc.import_public.sub.M
	(sub.E)(0),     // 2: goproto.protoc.import_public.sub.E
	(*Local)(nil),  // 3: goproto.protoc.import_public.Local
}
var file_import_public_a_proto_depIdxs = []int32{
	1, // goproto.protoc.import_public.Public.m:type_name -> goproto.protoc.import_public.sub.M
	2, // goproto.protoc.import_public.Public.e:type_name -> goproto.protoc.import_public.sub.E
	3, // goproto.protoc.import_public.Public.local:type_name -> goproto.protoc.import_public.Local
}

func init() { file_import_public_a_proto_init() }
func file_import_public_a_proto_init() {
	if File_import_public_a_proto != nil {
		return
	}
	file_import_public_b_proto_init()
	File_import_public_a_proto = protoimpl.FileBuilder{
		RawDescriptor:      file_import_public_a_proto_rawDesc,
		GoTypes:            file_import_public_a_proto_goTypes,
		DependencyIndexes:  file_import_public_a_proto_depIdxs,
		MessageOutputTypes: file_import_public_a_proto_msgTypes,
		FilesRegistry:      protoregistry.GlobalFiles,
		TypesRegistry:      protoregistry.GlobalTypes,
	}.Init()
	file_import_public_a_proto_rawDesc = nil
	file_import_public_a_proto_goTypes = nil
	file_import_public_a_proto_depIdxs = nil
}
