// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/protobuf/source_context.proto

package known_proto

import (
	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)

// `SourceContext` represents information about the source of a
// protobuf element, like the file in which it is defined.
type SourceContext struct {
	// The path-qualified name of the .proto file that contained the associated
	// protobuf element.  For example: `"google/protobuf/source_context.proto"`.
	FileName             string   `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

func (*SourceContext) ProtoMessage() {}

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

func (m *SourceContext) XXX_Methods() *protoiface.Methods {
	return xxx_File_google_protobuf_source_context_proto_messageTypes[0].Methods()
}

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

func (x *SourceContext) GetFileName() string {
	if x != nil {
		return x.FileName
	}
	return ""
}

var File_google_protobuf_source_context_proto protoreflect.FileDescriptor

var xxx_File_google_protobuf_source_context_proto_rawDesc = []byte{
	0x0a, 0x24, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
	0x66, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x22, 0x2c, 0x0a, 0x0d, 0x53, 0x6f, 0x75, 0x72, 0x63,
	0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65,
	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c,
	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x89, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x12, 0x53,
	0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74,
	0x6f, 0x50, 0x01, 0x5a, 0x35, 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, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x3b, 0x6b,
	0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x47, 0x50, 0x42,
	0xaa, 0x02, 0x1e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62,
	0x75, 0x66, 0x2e, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65,
	0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	xxx_File_google_protobuf_source_context_proto_rawDesc_once sync.Once
	xxx_File_google_protobuf_source_context_proto_rawDesc_data = xxx_File_google_protobuf_source_context_proto_rawDesc
)

func xxx_File_google_protobuf_source_context_proto_rawDescGZIP() []byte {
	xxx_File_google_protobuf_source_context_proto_rawDesc_once.Do(func() {
		xxx_File_google_protobuf_source_context_proto_rawDesc_data = protoimpl.X.CompressGZIP(xxx_File_google_protobuf_source_context_proto_rawDesc_data)
	})
	return xxx_File_google_protobuf_source_context_proto_rawDesc_data
}

var xxx_File_google_protobuf_source_context_proto_messageTypes = make([]protoimpl.MessageType, 1)
var xxx_File_google_protobuf_source_context_proto_goTypes = []interface{}{
	(*SourceContext)(nil), // 0: google.protobuf.SourceContext
}
var xxx_File_google_protobuf_source_context_proto_depIdxs = []int32{}

func init() { xxx_File_google_protobuf_source_context_proto_init() }
func xxx_File_google_protobuf_source_context_proto_init() {
	if File_google_protobuf_source_context_proto != nil {
		return
	}
	File_google_protobuf_source_context_proto = protoimpl.FileBuilder{
		RawDescriptor:      xxx_File_google_protobuf_source_context_proto_rawDesc,
		GoTypes:            xxx_File_google_protobuf_source_context_proto_goTypes,
		DependencyIndexes:  xxx_File_google_protobuf_source_context_proto_depIdxs,
		MessageOutputTypes: xxx_File_google_protobuf_source_context_proto_messageTypes,
		FilesRegistry:      protoregistry.GlobalFiles,
		TypesRegistry:      protoregistry.GlobalTypes,
	}.Init()
	xxx_File_google_protobuf_source_context_proto_rawDesc = nil
	xxx_File_google_protobuf_source_context_proto_goTypes = nil
	xxx_File_google_protobuf_source_context_proto_depIdxs = nil
}
