// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/test_weak.proto

package test

import (
	proto "github.com/golang/protobuf/proto"
	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
	reflect "reflect"
)

type WeakImportMessage struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *WeakImportMessage) ProtoReflect() protoreflect.Message {
	return xxx_File_test_test_weak_proto_messageTypes[0].MessageOf(m)
}
func (m *WeakImportMessage) Reset()         { *m = WeakImportMessage{} }
func (m *WeakImportMessage) String() string { return proto.CompactTextString(m) }
func (*WeakImportMessage) ProtoMessage()    {}

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

func (m *WeakImportMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WeakImportMessage.Unmarshal(m, b)
}
func (m *WeakImportMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WeakImportMessage.Marshal(b, m, deterministic)
}
func (m *WeakImportMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WeakImportMessage.Merge(m, src)
}
func (m *WeakImportMessage) XXX_Size() int {
	return xxx_messageInfo_WeakImportMessage.Size(m)
}
func (m *WeakImportMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_WeakImportMessage.DiscardUnknown(m)
}

var xxx_messageInfo_WeakImportMessage proto.InternalMessageInfo

var xxx_File_test_test_weak_proto_rawdesc = []byte{
	// 121 bytes of the wire-encoded FileDescriptorProto
	0x0a, 0x14, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x65, 0x61, 0x6b,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x22, 0x13, 0x0a, 0x11, 0x57, 0x65,
	0x61, 0x6b, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42,
	0x38, 0x5a, 0x36, 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, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74,
}

var xxx_File_test_test_weak_proto_rawdesc_gzipped = protoimpl.X.CompressGZIP(xxx_File_test_test_weak_proto_rawdesc)

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

var File_test_test_weak_proto protoreflect.FileDescriptor

var xxx_File_test_test_weak_proto_messageTypes = make([]protoimpl.MessageType, 1)
var xxx_File_test_test_weak_proto_goTypes = []interface{}{
	(*WeakImportMessage)(nil), // 0: goproto.proto.test.WeakImportMessage
}
var xxx_File_test_test_weak_proto_depIdxs = []int32{}

func init() { xxx_File_test_test_weak_proto_init() }
func xxx_File_test_test_weak_proto_init() {
	if File_test_test_weak_proto != nil {
		return
	}
	messageTypes := make([]protoreflect.MessageType, 1)
	File_test_test_weak_proto = protoimpl.FileBuilder{
		RawDescriptor:      xxx_File_test_test_weak_proto_rawdesc,
		GoTypes:            xxx_File_test_test_weak_proto_goTypes,
		DependencyIndexes:  xxx_File_test_test_weak_proto_depIdxs,
		MessageOutputTypes: messageTypes,
	}.Init()
	messageGoTypes := xxx_File_test_test_weak_proto_goTypes[0:][:1]
	for i, mt := range messageTypes {
		xxx_File_test_test_weak_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
		xxx_File_test_test_weak_proto_messageTypes[i].PBType = mt
	}
	proto.RegisterFile("test/test_weak.proto", xxx_File_test_test_weak_proto_rawdesc_gzipped)
	proto.RegisterType((*WeakImportMessage)(nil), "goproto.proto.test.WeakImportMessage")
	xxx_File_test_test_weak_proto_goTypes = nil
	xxx_File_test_test_weak_proto_depIdxs = nil
}
