// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.36.10
// 	protoc        v5.27.1
// source: cel/expr/checked.proto

package expr

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

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

type Type_PrimitiveType int32

const (
	Type_PRIMITIVE_TYPE_UNSPECIFIED Type_PrimitiveType = 0
	Type_BOOL                       Type_PrimitiveType = 1
	Type_INT64                      Type_PrimitiveType = 2
	Type_UINT64                     Type_PrimitiveType = 3
	Type_DOUBLE                     Type_PrimitiveType = 4
	Type_STRING                     Type_PrimitiveType = 5
	Type_BYTES                      Type_PrimitiveType = 6
)

// Enum value maps for Type_PrimitiveType.
var (
	Type_PrimitiveType_name = map[int32]string{
		0: "PRIMITIVE_TYPE_UNSPECIFIED",
		1: "BOOL",
		2: "INT64",
		3: "UINT64",
		4: "DOUBLE",
		5: "STRING",
		6: "BYTES",
	}
	Type_PrimitiveType_value = map[string]int32{
		"PRIMITIVE_TYPE_UNSPECIFIED": 0,
		"BOOL":                       1,
		"INT64":                      2,
		"UINT64":                     3,
		"DOUBLE":                     4,
		"STRING":                     5,
		"BYTES":                      6,
	}
)

func (x Type_PrimitiveType) Enum() *Type_PrimitiveType {
	p := new(Type_PrimitiveType)
	*p = x
	return p
}

func (x Type_PrimitiveType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Type_PrimitiveType) Descriptor() protoreflect.EnumDescriptor {
	return file_cel_expr_checked_proto_enumTypes[0].Descriptor()
}

func (Type_PrimitiveType) Type() protoreflect.EnumType {
	return &file_cel_expr_checked_proto_enumTypes[0]
}

func (x Type_PrimitiveType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Type_PrimitiveType.Descriptor instead.
func (Type_PrimitiveType) EnumDescriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 0}
}

type Type_WellKnownType int32

const (
	Type_WELL_KNOWN_TYPE_UNSPECIFIED Type_WellKnownType = 0
	Type_ANY                         Type_WellKnownType = 1
	Type_TIMESTAMP                   Type_WellKnownType = 2
	Type_DURATION                    Type_WellKnownType = 3
)

// Enum value maps for Type_WellKnownType.
var (
	Type_WellKnownType_name = map[int32]string{
		0: "WELL_KNOWN_TYPE_UNSPECIFIED",
		1: "ANY",
		2: "TIMESTAMP",
		3: "DURATION",
	}
	Type_WellKnownType_value = map[string]int32{
		"WELL_KNOWN_TYPE_UNSPECIFIED": 0,
		"ANY":                         1,
		"TIMESTAMP":                   2,
		"DURATION":                    3,
	}
)

func (x Type_WellKnownType) Enum() *Type_WellKnownType {
	p := new(Type_WellKnownType)
	*p = x
	return p
}

func (x Type_WellKnownType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Type_WellKnownType) Descriptor() protoreflect.EnumDescriptor {
	return file_cel_expr_checked_proto_enumTypes[1].Descriptor()
}

func (Type_WellKnownType) Type() protoreflect.EnumType {
	return &file_cel_expr_checked_proto_enumTypes[1]
}

func (x Type_WellKnownType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Type_WellKnownType.Descriptor instead.
func (Type_WellKnownType) EnumDescriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 1}
}

type CheckedExpr struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	ReferenceMap  map[int64]*Reference   `protobuf:"bytes,2,rep,name=reference_map,json=referenceMap,proto3" json:"reference_map,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	TypeMap       map[int64]*Type        `protobuf:"bytes,3,rep,name=type_map,json=typeMap,proto3" json:"type_map,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	SourceInfo    *SourceInfo            `protobuf:"bytes,5,opt,name=source_info,json=sourceInfo,proto3" json:"source_info,omitempty"`
	ExprVersion   string                 `protobuf:"bytes,6,opt,name=expr_version,json=exprVersion,proto3" json:"expr_version,omitempty"`
	Expr          *Expr                  `protobuf:"bytes,4,opt,name=expr,proto3" json:"expr,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*CheckedExpr) ProtoMessage() {}

func (x *CheckedExpr) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_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 CheckedExpr.ProtoReflect.Descriptor instead.
func (*CheckedExpr) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{0}
}

func (x *CheckedExpr) GetReferenceMap() map[int64]*Reference {
	if x != nil {
		return x.ReferenceMap
	}
	return nil
}

func (x *CheckedExpr) GetTypeMap() map[int64]*Type {
	if x != nil {
		return x.TypeMap
	}
	return nil
}

func (x *CheckedExpr) GetSourceInfo() *SourceInfo {
	if x != nil {
		return x.SourceInfo
	}
	return nil
}

func (x *CheckedExpr) GetExprVersion() string {
	if x != nil {
		return x.ExprVersion
	}
	return ""
}

func (x *CheckedExpr) GetExpr() *Expr {
	if x != nil {
		return x.Expr
	}
	return nil
}

type Type struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Types that are valid to be assigned to TypeKind:
	//
	//	*Type_Dyn
	//	*Type_Null
	//	*Type_Primitive
	//	*Type_Wrapper
	//	*Type_WellKnown
	//	*Type_ListType_
	//	*Type_MapType_
	//	*Type_Function
	//	*Type_MessageType
	//	*Type_TypeParam
	//	*Type_Type
	//	*Type_Error
	//	*Type_AbstractType_
	TypeKind      isType_TypeKind `protobuf_oneof:"type_kind"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Type) Reset() {
	*x = Type{}
	mi := &file_cel_expr_checked_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Type) ProtoMessage() {}

func (x *Type) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[1]
	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 Type.ProtoReflect.Descriptor instead.
func (*Type) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{1}
}

func (x *Type) GetTypeKind() isType_TypeKind {
	if x != nil {
		return x.TypeKind
	}
	return nil
}

func (x *Type) GetDyn() *emptypb.Empty {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_Dyn); ok {
			return x.Dyn
		}
	}
	return nil
}

func (x *Type) GetNull() structpb.NullValue {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_Null); ok {
			return x.Null
		}
	}
	return structpb.NullValue(0)
}

func (x *Type) GetPrimitive() Type_PrimitiveType {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_Primitive); ok {
			return x.Primitive
		}
	}
	return Type_PRIMITIVE_TYPE_UNSPECIFIED
}

func (x *Type) GetWrapper() Type_PrimitiveType {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_Wrapper); ok {
			return x.Wrapper
		}
	}
	return Type_PRIMITIVE_TYPE_UNSPECIFIED
}

func (x *Type) GetWellKnown() Type_WellKnownType {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_WellKnown); ok {
			return x.WellKnown
		}
	}
	return Type_WELL_KNOWN_TYPE_UNSPECIFIED
}

func (x *Type) GetListType() *Type_ListType {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_ListType_); ok {
			return x.ListType
		}
	}
	return nil
}

func (x *Type) GetMapType() *Type_MapType {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_MapType_); ok {
			return x.MapType
		}
	}
	return nil
}

func (x *Type) GetFunction() *Type_FunctionType {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_Function); ok {
			return x.Function
		}
	}
	return nil
}

func (x *Type) GetMessageType() string {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_MessageType); ok {
			return x.MessageType
		}
	}
	return ""
}

func (x *Type) GetTypeParam() string {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_TypeParam); ok {
			return x.TypeParam
		}
	}
	return ""
}

func (x *Type) GetType() *Type {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_Type); ok {
			return x.Type
		}
	}
	return nil
}

func (x *Type) GetError() *emptypb.Empty {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_Error); ok {
			return x.Error
		}
	}
	return nil
}

func (x *Type) GetAbstractType() *Type_AbstractType {
	if x != nil {
		if x, ok := x.TypeKind.(*Type_AbstractType_); ok {
			return x.AbstractType
		}
	}
	return nil
}

type isType_TypeKind interface {
	isType_TypeKind()
}

type Type_Dyn struct {
	Dyn *emptypb.Empty `protobuf:"bytes,1,opt,name=dyn,proto3,oneof"`
}

type Type_Null struct {
	Null structpb.NullValue `protobuf:"varint,2,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"`
}

type Type_Primitive struct {
	Primitive Type_PrimitiveType `protobuf:"varint,3,opt,name=primitive,proto3,enum=cel.expr.Type_PrimitiveType,oneof"`
}

type Type_Wrapper struct {
	Wrapper Type_PrimitiveType `protobuf:"varint,4,opt,name=wrapper,proto3,enum=cel.expr.Type_PrimitiveType,oneof"`
}

type Type_WellKnown struct {
	WellKnown Type_WellKnownType `protobuf:"varint,5,opt,name=well_known,json=wellKnown,proto3,enum=cel.expr.Type_WellKnownType,oneof"`
}

type Type_ListType_ struct {
	ListType *Type_ListType `protobuf:"bytes,6,opt,name=list_type,json=listType,proto3,oneof"`
}

type Type_MapType_ struct {
	MapType *Type_MapType `protobuf:"bytes,7,opt,name=map_type,json=mapType,proto3,oneof"`
}

type Type_Function struct {
	Function *Type_FunctionType `protobuf:"bytes,8,opt,name=function,proto3,oneof"`
}

type Type_MessageType struct {
	MessageType string `protobuf:"bytes,9,opt,name=message_type,json=messageType,proto3,oneof"`
}

type Type_TypeParam struct {
	TypeParam string `protobuf:"bytes,10,opt,name=type_param,json=typeParam,proto3,oneof"`
}

type Type_Type struct {
	Type *Type `protobuf:"bytes,11,opt,name=type,proto3,oneof"`
}

type Type_Error struct {
	Error *emptypb.Empty `protobuf:"bytes,12,opt,name=error,proto3,oneof"`
}

type Type_AbstractType_ struct {
	AbstractType *Type_AbstractType `protobuf:"bytes,14,opt,name=abstract_type,json=abstractType,proto3,oneof"`
}

func (*Type_Dyn) isType_TypeKind() {}

func (*Type_Null) isType_TypeKind() {}

func (*Type_Primitive) isType_TypeKind() {}

func (*Type_Wrapper) isType_TypeKind() {}

func (*Type_WellKnown) isType_TypeKind() {}

func (*Type_ListType_) isType_TypeKind() {}

func (*Type_MapType_) isType_TypeKind() {}

func (*Type_Function) isType_TypeKind() {}

func (*Type_MessageType) isType_TypeKind() {}

func (*Type_TypeParam) isType_TypeKind() {}

func (*Type_Type) isType_TypeKind() {}

func (*Type_Error) isType_TypeKind() {}

func (*Type_AbstractType_) isType_TypeKind() {}

type Decl struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	Name  string                 `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Types that are valid to be assigned to DeclKind:
	//
	//	*Decl_Ident
	//	*Decl_Function
	DeclKind      isDecl_DeclKind `protobuf_oneof:"decl_kind"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Decl) Reset() {
	*x = Decl{}
	mi := &file_cel_expr_checked_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Decl) ProtoMessage() {}

func (x *Decl) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[2]
	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 Decl.ProtoReflect.Descriptor instead.
func (*Decl) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{2}
}

func (x *Decl) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Decl) GetDeclKind() isDecl_DeclKind {
	if x != nil {
		return x.DeclKind
	}
	return nil
}

func (x *Decl) GetIdent() *Decl_IdentDecl {
	if x != nil {
		if x, ok := x.DeclKind.(*Decl_Ident); ok {
			return x.Ident
		}
	}
	return nil
}

func (x *Decl) GetFunction() *Decl_FunctionDecl {
	if x != nil {
		if x, ok := x.DeclKind.(*Decl_Function); ok {
			return x.Function
		}
	}
	return nil
}

type isDecl_DeclKind interface {
	isDecl_DeclKind()
}

type Decl_Ident struct {
	Ident *Decl_IdentDecl `protobuf:"bytes,2,opt,name=ident,proto3,oneof"`
}

type Decl_Function struct {
	Function *Decl_FunctionDecl `protobuf:"bytes,3,opt,name=function,proto3,oneof"`
}

func (*Decl_Ident) isDecl_DeclKind() {}

func (*Decl_Function) isDecl_DeclKind() {}

type Reference struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Name          string                 `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	OverloadId    []string               `protobuf:"bytes,3,rep,name=overload_id,json=overloadId,proto3" json:"overload_id,omitempty"`
	Value         *Constant              `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Reference) Reset() {
	*x = Reference{}
	mi := &file_cel_expr_checked_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Reference) ProtoMessage() {}

func (x *Reference) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[3]
	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 Reference.ProtoReflect.Descriptor instead.
func (*Reference) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{3}
}

func (x *Reference) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Reference) GetOverloadId() []string {
	if x != nil {
		return x.OverloadId
	}
	return nil
}

func (x *Reference) GetValue() *Constant {
	if x != nil {
		return x.Value
	}
	return nil
}

type Type_ListType struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	ElemType      *Type                  `protobuf:"bytes,1,opt,name=elem_type,json=elemType,proto3" json:"elem_type,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Type_ListType) Reset() {
	*x = Type_ListType{}
	mi := &file_cel_expr_checked_proto_msgTypes[6]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Type_ListType) ProtoMessage() {}

func (x *Type_ListType) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[6]
	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 Type_ListType.ProtoReflect.Descriptor instead.
func (*Type_ListType) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 0}
}

func (x *Type_ListType) GetElemType() *Type {
	if x != nil {
		return x.ElemType
	}
	return nil
}

type Type_MapType struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	KeyType       *Type                  `protobuf:"bytes,1,opt,name=key_type,json=keyType,proto3" json:"key_type,omitempty"`
	ValueType     *Type                  `protobuf:"bytes,2,opt,name=value_type,json=valueType,proto3" json:"value_type,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Type_MapType) Reset() {
	*x = Type_MapType{}
	mi := &file_cel_expr_checked_proto_msgTypes[7]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Type_MapType) ProtoMessage() {}

func (x *Type_MapType) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[7]
	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 Type_MapType.ProtoReflect.Descriptor instead.
func (*Type_MapType) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 1}
}

func (x *Type_MapType) GetKeyType() *Type {
	if x != nil {
		return x.KeyType
	}
	return nil
}

func (x *Type_MapType) GetValueType() *Type {
	if x != nil {
		return x.ValueType
	}
	return nil
}

type Type_FunctionType struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	ResultType    *Type                  `protobuf:"bytes,1,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"`
	ArgTypes      []*Type                `protobuf:"bytes,2,rep,name=arg_types,json=argTypes,proto3" json:"arg_types,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Type_FunctionType) Reset() {
	*x = Type_FunctionType{}
	mi := &file_cel_expr_checked_proto_msgTypes[8]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Type_FunctionType) ProtoMessage() {}

func (x *Type_FunctionType) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[8]
	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 Type_FunctionType.ProtoReflect.Descriptor instead.
func (*Type_FunctionType) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 2}
}

func (x *Type_FunctionType) GetResultType() *Type {
	if x != nil {
		return x.ResultType
	}
	return nil
}

func (x *Type_FunctionType) GetArgTypes() []*Type {
	if x != nil {
		return x.ArgTypes
	}
	return nil
}

type Type_AbstractType struct {
	state          protoimpl.MessageState `protogen:"open.v1"`
	Name           string                 `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	ParameterTypes []*Type                `protobuf:"bytes,2,rep,name=parameter_types,json=parameterTypes,proto3" json:"parameter_types,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *Type_AbstractType) Reset() {
	*x = Type_AbstractType{}
	mi := &file_cel_expr_checked_proto_msgTypes[9]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Type_AbstractType) ProtoMessage() {}

func (x *Type_AbstractType) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[9]
	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 Type_AbstractType.ProtoReflect.Descriptor instead.
func (*Type_AbstractType) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 3}
}

func (x *Type_AbstractType) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Type_AbstractType) GetParameterTypes() []*Type {
	if x != nil {
		return x.ParameterTypes
	}
	return nil
}

type Decl_IdentDecl struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Type          *Type                  `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Value         *Constant              `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	Doc           string                 `protobuf:"bytes,3,opt,name=doc,proto3" json:"doc,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Decl_IdentDecl) Reset() {
	*x = Decl_IdentDecl{}
	mi := &file_cel_expr_checked_proto_msgTypes[10]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Decl_IdentDecl) ProtoMessage() {}

func (x *Decl_IdentDecl) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[10]
	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 Decl_IdentDecl.ProtoReflect.Descriptor instead.
func (*Decl_IdentDecl) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 0}
}

func (x *Decl_IdentDecl) GetType() *Type {
	if x != nil {
		return x.Type
	}
	return nil
}

func (x *Decl_IdentDecl) GetValue() *Constant {
	if x != nil {
		return x.Value
	}
	return nil
}

func (x *Decl_IdentDecl) GetDoc() string {
	if x != nil {
		return x.Doc
	}
	return ""
}

type Decl_FunctionDecl struct {
	state         protoimpl.MessageState        `protogen:"open.v1"`
	Overloads     []*Decl_FunctionDecl_Overload `protobuf:"bytes,1,rep,name=overloads,proto3" json:"overloads,omitempty"`
	Doc           string                        `protobuf:"bytes,2,opt,name=doc,proto3" json:"doc,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Decl_FunctionDecl) Reset() {
	*x = Decl_FunctionDecl{}
	mi := &file_cel_expr_checked_proto_msgTypes[11]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Decl_FunctionDecl) ProtoMessage() {}

func (x *Decl_FunctionDecl) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[11]
	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 Decl_FunctionDecl.ProtoReflect.Descriptor instead.
func (*Decl_FunctionDecl) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 1}
}

func (x *Decl_FunctionDecl) GetOverloads() []*Decl_FunctionDecl_Overload {
	if x != nil {
		return x.Overloads
	}
	return nil
}

func (x *Decl_FunctionDecl) GetDoc() string {
	if x != nil {
		return x.Doc
	}
	return ""
}

type Decl_FunctionDecl_Overload struct {
	state              protoimpl.MessageState `protogen:"open.v1"`
	OverloadId         string                 `protobuf:"bytes,1,opt,name=overload_id,json=overloadId,proto3" json:"overload_id,omitempty"`
	Params             []*Type                `protobuf:"bytes,2,rep,name=params,proto3" json:"params,omitempty"`
	TypeParams         []string               `protobuf:"bytes,3,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"`
	ResultType         *Type                  `protobuf:"bytes,4,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"`
	IsInstanceFunction bool                   `protobuf:"varint,5,opt,name=is_instance_function,json=isInstanceFunction,proto3" json:"is_instance_function,omitempty"`
	Doc                string                 `protobuf:"bytes,6,opt,name=doc,proto3" json:"doc,omitempty"`
	unknownFields      protoimpl.UnknownFields
	sizeCache          protoimpl.SizeCache
}

func (x *Decl_FunctionDecl_Overload) Reset() {
	*x = Decl_FunctionDecl_Overload{}
	mi := &file_cel_expr_checked_proto_msgTypes[12]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Decl_FunctionDecl_Overload) ProtoMessage() {}

func (x *Decl_FunctionDecl_Overload) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_checked_proto_msgTypes[12]
	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 Decl_FunctionDecl_Overload.ProtoReflect.Descriptor instead.
func (*Decl_FunctionDecl_Overload) Descriptor() ([]byte, []int) {
	return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 1, 0}
}

func (x *Decl_FunctionDecl_Overload) GetOverloadId() string {
	if x != nil {
		return x.OverloadId
	}
	return ""
}

func (x *Decl_FunctionDecl_Overload) GetParams() []*Type {
	if x != nil {
		return x.Params
	}
	return nil
}

func (x *Decl_FunctionDecl_Overload) GetTypeParams() []string {
	if x != nil {
		return x.TypeParams
	}
	return nil
}

func (x *Decl_FunctionDecl_Overload) GetResultType() *Type {
	if x != nil {
		return x.ResultType
	}
	return nil
}

func (x *Decl_FunctionDecl_Overload) GetIsInstanceFunction() bool {
	if x != nil {
		return x.IsInstanceFunction
	}
	return false
}

func (x *Decl_FunctionDecl_Overload) GetDoc() string {
	if x != nil {
		return x.Doc
	}
	return ""
}

var File_cel_expr_checked_proto protoreflect.FileDescriptor

const file_cel_expr_checked_proto_rawDesc = "" +
	"\n" +
	"\x16cel/expr/checked.proto\x12\bcel.expr\x1a\x15cel/expr/syntax.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\"\xba\x03\n" +
	"\vCheckedExpr\x12L\n" +
	"\rreference_map\x18\x02 \x03(\v2'.cel.expr.CheckedExpr.ReferenceMapEntryR\freferenceMap\x12=\n" +
	"\btype_map\x18\x03 \x03(\v2\".cel.expr.CheckedExpr.TypeMapEntryR\atypeMap\x125\n" +
	"\vsource_info\x18\x05 \x01(\v2\x14.cel.expr.SourceInfoR\n" +
	"sourceInfo\x12!\n" +
	"\fexpr_version\x18\x06 \x01(\tR\vexprVersion\x12\"\n" +
	"\x04expr\x18\x04 \x01(\v2\x0e.cel.expr.ExprR\x04expr\x1aT\n" +
	"\x11ReferenceMapEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\x03R\x03key\x12)\n" +
	"\x05value\x18\x02 \x01(\v2\x13.cel.expr.ReferenceR\x05value:\x028\x01\x1aJ\n" +
	"\fTypeMapEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\x03R\x03key\x12$\n" +
	"\x05value\x18\x02 \x01(\v2\x0e.cel.expr.TypeR\x05value:\x028\x01\"\xe6\t\n" +
	"\x04Type\x12*\n" +
	"\x03dyn\x18\x01 \x01(\v2\x16.google.protobuf.EmptyH\x00R\x03dyn\x120\n" +
	"\x04null\x18\x02 \x01(\x0e2\x1a.google.protobuf.NullValueH\x00R\x04null\x12<\n" +
	"\tprimitive\x18\x03 \x01(\x0e2\x1c.cel.expr.Type.PrimitiveTypeH\x00R\tprimitive\x128\n" +
	"\awrapper\x18\x04 \x01(\x0e2\x1c.cel.expr.Type.PrimitiveTypeH\x00R\awrapper\x12=\n" +
	"\n" +
	"well_known\x18\x05 \x01(\x0e2\x1c.cel.expr.Type.WellKnownTypeH\x00R\twellKnown\x126\n" +
	"\tlist_type\x18\x06 \x01(\v2\x17.cel.expr.Type.ListTypeH\x00R\blistType\x123\n" +
	"\bmap_type\x18\a \x01(\v2\x16.cel.expr.Type.MapTypeH\x00R\amapType\x129\n" +
	"\bfunction\x18\b \x01(\v2\x1b.cel.expr.Type.FunctionTypeH\x00R\bfunction\x12#\n" +
	"\fmessage_type\x18\t \x01(\tH\x00R\vmessageType\x12\x1f\n" +
	"\n" +
	"type_param\x18\n" +
	" \x01(\tH\x00R\ttypeParam\x12$\n" +
	"\x04type\x18\v \x01(\v2\x0e.cel.expr.TypeH\x00R\x04type\x12.\n" +
	"\x05error\x18\f \x01(\v2\x16.google.protobuf.EmptyH\x00R\x05error\x12B\n" +
	"\rabstract_type\x18\x0e \x01(\v2\x1b.cel.expr.Type.AbstractTypeH\x00R\fabstractType\x1a7\n" +
	"\bListType\x12+\n" +
	"\telem_type\x18\x01 \x01(\v2\x0e.cel.expr.TypeR\belemType\x1ac\n" +
	"\aMapType\x12)\n" +
	"\bkey_type\x18\x01 \x01(\v2\x0e.cel.expr.TypeR\akeyType\x12-\n" +
	"\n" +
	"value_type\x18\x02 \x01(\v2\x0e.cel.expr.TypeR\tvalueType\x1al\n" +
	"\fFunctionType\x12/\n" +
	"\vresult_type\x18\x01 \x01(\v2\x0e.cel.expr.TypeR\n" +
	"resultType\x12+\n" +
	"\targ_types\x18\x02 \x03(\v2\x0e.cel.expr.TypeR\bargTypes\x1a[\n" +
	"\fAbstractType\x12\x12\n" +
	"\x04name\x18\x01 \x01(\tR\x04name\x127\n" +
	"\x0fparameter_types\x18\x02 \x03(\v2\x0e.cel.expr.TypeR\x0eparameterTypes\"s\n" +
	"\rPrimitiveType\x12\x1e\n" +
	"\x1aPRIMITIVE_TYPE_UNSPECIFIED\x10\x00\x12\b\n" +
	"\x04BOOL\x10\x01\x12\t\n" +
	"\x05INT64\x10\x02\x12\n" +
	"\n" +
	"\x06UINT64\x10\x03\x12\n" +
	"\n" +
	"\x06DOUBLE\x10\x04\x12\n" +
	"\n" +
	"\x06STRING\x10\x05\x12\t\n" +
	"\x05BYTES\x10\x06\"V\n" +
	"\rWellKnownType\x12\x1f\n" +
	"\x1bWELL_KNOWN_TYPE_UNSPECIFIED\x10\x00\x12\a\n" +
	"\x03ANY\x10\x01\x12\r\n" +
	"\tTIMESTAMP\x10\x02\x12\f\n" +
	"\bDURATION\x10\x03B\v\n" +
	"\ttype_kind\"\xd4\x04\n" +
	"\x04Decl\x12\x12\n" +
	"\x04name\x18\x01 \x01(\tR\x04name\x120\n" +
	"\x05ident\x18\x02 \x01(\v2\x18.cel.expr.Decl.IdentDeclH\x00R\x05ident\x129\n" +
	"\bfunction\x18\x03 \x01(\v2\x1b.cel.expr.Decl.FunctionDeclH\x00R\bfunction\x1ak\n" +
	"\tIdentDecl\x12\"\n" +
	"\x04type\x18\x01 \x01(\v2\x0e.cel.expr.TypeR\x04type\x12(\n" +
	"\x05value\x18\x02 \x01(\v2\x12.cel.expr.ConstantR\x05value\x12\x10\n" +
	"\x03doc\x18\x03 \x01(\tR\x03doc\x1a\xd0\x02\n" +
	"\fFunctionDecl\x12B\n" +
	"\toverloads\x18\x01 \x03(\v2$.cel.expr.Decl.FunctionDecl.OverloadR\toverloads\x12\x10\n" +
	"\x03doc\x18\x02 \x01(\tR\x03doc\x1a\xe9\x01\n" +
	"\bOverload\x12\x1f\n" +
	"\voverload_id\x18\x01 \x01(\tR\n" +
	"overloadId\x12&\n" +
	"\x06params\x18\x02 \x03(\v2\x0e.cel.expr.TypeR\x06params\x12\x1f\n" +
	"\vtype_params\x18\x03 \x03(\tR\n" +
	"typeParams\x12/\n" +
	"\vresult_type\x18\x04 \x01(\v2\x0e.cel.expr.TypeR\n" +
	"resultType\x120\n" +
	"\x14is_instance_function\x18\x05 \x01(\bR\x12isInstanceFunction\x12\x10\n" +
	"\x03doc\x18\x06 \x01(\tR\x03docB\v\n" +
	"\tdecl_kind\"j\n" +
	"\tReference\x12\x12\n" +
	"\x04name\x18\x01 \x01(\tR\x04name\x12\x1f\n" +
	"\voverload_id\x18\x03 \x03(\tR\n" +
	"overloadId\x12(\n" +
	"\x05value\x18\x04 \x01(\v2\x12.cel.expr.ConstantR\x05valueB,\n" +
	"\fdev.cel.exprB\tDeclProtoP\x01Z\fcel.dev/expr\xf8\x01\x01b\x06proto3"

var (
	file_cel_expr_checked_proto_rawDescOnce sync.Once
	file_cel_expr_checked_proto_rawDescData []byte
)

func file_cel_expr_checked_proto_rawDescGZIP() []byte {
	file_cel_expr_checked_proto_rawDescOnce.Do(func() {
		file_cel_expr_checked_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_cel_expr_checked_proto_rawDesc), len(file_cel_expr_checked_proto_rawDesc)))
	})
	return file_cel_expr_checked_proto_rawDescData
}

var file_cel_expr_checked_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_cel_expr_checked_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
var file_cel_expr_checked_proto_goTypes = []any{
	(Type_PrimitiveType)(0),            // 0: cel.expr.Type.PrimitiveType
	(Type_WellKnownType)(0),            // 1: cel.expr.Type.WellKnownType
	(*CheckedExpr)(nil),                // 2: cel.expr.CheckedExpr
	(*Type)(nil),                       // 3: cel.expr.Type
	(*Decl)(nil),                       // 4: cel.expr.Decl
	(*Reference)(nil),                  // 5: cel.expr.Reference
	nil,                                // 6: cel.expr.CheckedExpr.ReferenceMapEntry
	nil,                                // 7: cel.expr.CheckedExpr.TypeMapEntry
	(*Type_ListType)(nil),              // 8: cel.expr.Type.ListType
	(*Type_MapType)(nil),               // 9: cel.expr.Type.MapType
	(*Type_FunctionType)(nil),          // 10: cel.expr.Type.FunctionType
	(*Type_AbstractType)(nil),          // 11: cel.expr.Type.AbstractType
	(*Decl_IdentDecl)(nil),             // 12: cel.expr.Decl.IdentDecl
	(*Decl_FunctionDecl)(nil),          // 13: cel.expr.Decl.FunctionDecl
	(*Decl_FunctionDecl_Overload)(nil), // 14: cel.expr.Decl.FunctionDecl.Overload
	(*SourceInfo)(nil),                 // 15: cel.expr.SourceInfo
	(*Expr)(nil),                       // 16: cel.expr.Expr
	(*emptypb.Empty)(nil),              // 17: google.protobuf.Empty
	(structpb.NullValue)(0),            // 18: google.protobuf.NullValue
	(*Constant)(nil),                   // 19: cel.expr.Constant
}
var file_cel_expr_checked_proto_depIdxs = []int32{
	6,  // 0: cel.expr.CheckedExpr.reference_map:type_name -> cel.expr.CheckedExpr.ReferenceMapEntry
	7,  // 1: cel.expr.CheckedExpr.type_map:type_name -> cel.expr.CheckedExpr.TypeMapEntry
	15, // 2: cel.expr.CheckedExpr.source_info:type_name -> cel.expr.SourceInfo
	16, // 3: cel.expr.CheckedExpr.expr:type_name -> cel.expr.Expr
	17, // 4: cel.expr.Type.dyn:type_name -> google.protobuf.Empty
	18, // 5: cel.expr.Type.null:type_name -> google.protobuf.NullValue
	0,  // 6: cel.expr.Type.primitive:type_name -> cel.expr.Type.PrimitiveType
	0,  // 7: cel.expr.Type.wrapper:type_name -> cel.expr.Type.PrimitiveType
	1,  // 8: cel.expr.Type.well_known:type_name -> cel.expr.Type.WellKnownType
	8,  // 9: cel.expr.Type.list_type:type_name -> cel.expr.Type.ListType
	9,  // 10: cel.expr.Type.map_type:type_name -> cel.expr.Type.MapType
	10, // 11: cel.expr.Type.function:type_name -> cel.expr.Type.FunctionType
	3,  // 12: cel.expr.Type.type:type_name -> cel.expr.Type
	17, // 13: cel.expr.Type.error:type_name -> google.protobuf.Empty
	11, // 14: cel.expr.Type.abstract_type:type_name -> cel.expr.Type.AbstractType
	12, // 15: cel.expr.Decl.ident:type_name -> cel.expr.Decl.IdentDecl
	13, // 16: cel.expr.Decl.function:type_name -> cel.expr.Decl.FunctionDecl
	19, // 17: cel.expr.Reference.value:type_name -> cel.expr.Constant
	5,  // 18: cel.expr.CheckedExpr.ReferenceMapEntry.value:type_name -> cel.expr.Reference
	3,  // 19: cel.expr.CheckedExpr.TypeMapEntry.value:type_name -> cel.expr.Type
	3,  // 20: cel.expr.Type.ListType.elem_type:type_name -> cel.expr.Type
	3,  // 21: cel.expr.Type.MapType.key_type:type_name -> cel.expr.Type
	3,  // 22: cel.expr.Type.MapType.value_type:type_name -> cel.expr.Type
	3,  // 23: cel.expr.Type.FunctionType.result_type:type_name -> cel.expr.Type
	3,  // 24: cel.expr.Type.FunctionType.arg_types:type_name -> cel.expr.Type
	3,  // 25: cel.expr.Type.AbstractType.parameter_types:type_name -> cel.expr.Type
	3,  // 26: cel.expr.Decl.IdentDecl.type:type_name -> cel.expr.Type
	19, // 27: cel.expr.Decl.IdentDecl.value:type_name -> cel.expr.Constant
	14, // 28: cel.expr.Decl.FunctionDecl.overloads:type_name -> cel.expr.Decl.FunctionDecl.Overload
	3,  // 29: cel.expr.Decl.FunctionDecl.Overload.params:type_name -> cel.expr.Type
	3,  // 30: cel.expr.Decl.FunctionDecl.Overload.result_type:type_name -> cel.expr.Type
	31, // [31:31] is the sub-list for method output_type
	31, // [31:31] is the sub-list for method input_type
	31, // [31:31] is the sub-list for extension type_name
	31, // [31:31] is the sub-list for extension extendee
	0,  // [0:31] is the sub-list for field type_name
}

func init() { file_cel_expr_checked_proto_init() }
func file_cel_expr_checked_proto_init() {
	if File_cel_expr_checked_proto != nil {
		return
	}
	file_cel_expr_syntax_proto_init()
	file_cel_expr_checked_proto_msgTypes[1].OneofWrappers = []any{
		(*Type_Dyn)(nil),
		(*Type_Null)(nil),
		(*Type_Primitive)(nil),
		(*Type_Wrapper)(nil),
		(*Type_WellKnown)(nil),
		(*Type_ListType_)(nil),
		(*Type_MapType_)(nil),
		(*Type_Function)(nil),
		(*Type_MessageType)(nil),
		(*Type_TypeParam)(nil),
		(*Type_Type)(nil),
		(*Type_Error)(nil),
		(*Type_AbstractType_)(nil),
	}
	file_cel_expr_checked_proto_msgTypes[2].OneofWrappers = []any{
		(*Decl_Ident)(nil),
		(*Decl_Function)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_cel_expr_checked_proto_rawDesc), len(file_cel_expr_checked_proto_rawDesc)),
			NumEnums:      2,
			NumMessages:   13,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_cel_expr_checked_proto_goTypes,
		DependencyIndexes: file_cel_expr_checked_proto_depIdxs,
		EnumInfos:         file_cel_expr_checked_proto_enumTypes,
		MessageInfos:      file_cel_expr_checked_proto_msgTypes,
	}.Build()
	File_cel_expr_checked_proto = out.File
	file_cel_expr_checked_proto_goTypes = nil
	file_cel_expr_checked_proto_depIdxs = nil
}
