// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: cmd/protoc-gen-go/testdata/imports/fmt/m.proto

package fmt

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

type M struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *M) Reset() {
	*x = M{}
	mi := &file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*M) ProtoMessage() {}

func (x *M) ProtoReflect() protoreflect.Message {
	mi := &file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

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

var File_cmd_protoc_gen_go_testdata_imports_fmt_m_proto protoreflect.FileDescriptor

const file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDesc = "" +
	"\n" +
	".cmd/protoc-gen-go/testdata/imports/fmt/m.proto\x12\x03fmt\"\x03\n" +
	"\x01MBCZAgoogle.golang.org/protobuf/cmd/protoc-gen-go/testdata/imports/fmtb\x06proto3"

var (
	file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDescOnce sync.Once
	file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDescData []byte
)

func file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDescGZIP() []byte {
	file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDescOnce.Do(func() {
		file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDesc), len(file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDesc)))
	})
	return file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDescData
}

var file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_goTypes = []any{
	(*M)(nil), // 0: fmt.M
}
var file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_init() }
func file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_init() {
	if File_cmd_protoc_gen_go_testdata_imports_fmt_m_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDesc), len(file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_rawDesc)),
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_goTypes,
		DependencyIndexes: file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_depIdxs,
		MessageInfos:      file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_msgTypes,
	}.Build()
	File_cmd_protoc_gen_go_testdata_imports_fmt_m_proto = out.File
	file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_goTypes = nil
	file_cmd_protoc_gen_go_testdata_imports_fmt_m_proto_depIdxs = nil
}
