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

package expr

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	durationpb "google.golang.org/protobuf/types/known/durationpb"
	structpb "google.golang.org/protobuf/types/known/structpb"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
	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 SourceInfo_Extension_Component int32

const (
	SourceInfo_Extension_COMPONENT_UNSPECIFIED  SourceInfo_Extension_Component = 0
	SourceInfo_Extension_COMPONENT_PARSER       SourceInfo_Extension_Component = 1
	SourceInfo_Extension_COMPONENT_TYPE_CHECKER SourceInfo_Extension_Component = 2
	SourceInfo_Extension_COMPONENT_RUNTIME      SourceInfo_Extension_Component = 3
)

// Enum value maps for SourceInfo_Extension_Component.
var (
	SourceInfo_Extension_Component_name = map[int32]string{
		0: "COMPONENT_UNSPECIFIED",
		1: "COMPONENT_PARSER",
		2: "COMPONENT_TYPE_CHECKER",
		3: "COMPONENT_RUNTIME",
	}
	SourceInfo_Extension_Component_value = map[string]int32{
		"COMPONENT_UNSPECIFIED":  0,
		"COMPONENT_PARSER":       1,
		"COMPONENT_TYPE_CHECKER": 2,
		"COMPONENT_RUNTIME":      3,
	}
)

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

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

func (SourceInfo_Extension_Component) Descriptor() protoreflect.EnumDescriptor {
	return file_cel_expr_syntax_proto_enumTypes[0].Descriptor()
}

func (SourceInfo_Extension_Component) Type() protoreflect.EnumType {
	return &file_cel_expr_syntax_proto_enumTypes[0]
}

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

// Deprecated: Use SourceInfo_Extension_Component.Descriptor instead.
func (SourceInfo_Extension_Component) EnumDescriptor() ([]byte, []int) {
	return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2, 0}
}

type ParsedExpr struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Expr          *Expr                  `protobuf:"bytes,2,opt,name=expr,proto3" json:"expr,omitempty"`
	SourceInfo    *SourceInfo            `protobuf:"bytes,3,opt,name=source_info,json=sourceInfo,proto3" json:"source_info,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*ParsedExpr) ProtoMessage() {}

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

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

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

type Expr struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	Id    int64                  `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"`
	// Types that are valid to be assigned to ExprKind:
	//
	//	*Expr_ConstExpr
	//	*Expr_IdentExpr
	//	*Expr_SelectExpr
	//	*Expr_CallExpr
	//	*Expr_ListExpr
	//	*Expr_StructExpr
	//	*Expr_ComprehensionExpr
	ExprKind      isExpr_ExprKind `protobuf_oneof:"expr_kind"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*Expr) ProtoMessage() {}

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

func (x *Expr) GetId() int64 {
	if x != nil {
		return x.Id
	}
	return 0
}

func (x *Expr) GetExprKind() isExpr_ExprKind {
	if x != nil {
		return x.ExprKind
	}
	return nil
}

func (x *Expr) GetConstExpr() *Constant {
	if x != nil {
		if x, ok := x.ExprKind.(*Expr_ConstExpr); ok {
			return x.ConstExpr
		}
	}
	return nil
}

func (x *Expr) GetIdentExpr() *Expr_Ident {
	if x != nil {
		if x, ok := x.ExprKind.(*Expr_IdentExpr); ok {
			return x.IdentExpr
		}
	}
	return nil
}

func (x *Expr) GetSelectExpr() *Expr_Select {
	if x != nil {
		if x, ok := x.ExprKind.(*Expr_SelectExpr); ok {
			return x.SelectExpr
		}
	}
	return nil
}

func (x *Expr) GetCallExpr() *Expr_Call {
	if x != nil {
		if x, ok := x.ExprKind.(*Expr_CallExpr); ok {
			return x.CallExpr
		}
	}
	return nil
}

func (x *Expr) GetListExpr() *Expr_CreateList {
	if x != nil {
		if x, ok := x.ExprKind.(*Expr_ListExpr); ok {
			return x.ListExpr
		}
	}
	return nil
}

func (x *Expr) GetStructExpr() *Expr_CreateStruct {
	if x != nil {
		if x, ok := x.ExprKind.(*Expr_StructExpr); ok {
			return x.StructExpr
		}
	}
	return nil
}

func (x *Expr) GetComprehensionExpr() *Expr_Comprehension {
	if x != nil {
		if x, ok := x.ExprKind.(*Expr_ComprehensionExpr); ok {
			return x.ComprehensionExpr
		}
	}
	return nil
}

type isExpr_ExprKind interface {
	isExpr_ExprKind()
}

type Expr_ConstExpr struct {
	ConstExpr *Constant `protobuf:"bytes,3,opt,name=const_expr,json=constExpr,proto3,oneof"`
}

type Expr_IdentExpr struct {
	IdentExpr *Expr_Ident `protobuf:"bytes,4,opt,name=ident_expr,json=identExpr,proto3,oneof"`
}

type Expr_SelectExpr struct {
	SelectExpr *Expr_Select `protobuf:"bytes,5,opt,name=select_expr,json=selectExpr,proto3,oneof"`
}

type Expr_CallExpr struct {
	CallExpr *Expr_Call `protobuf:"bytes,6,opt,name=call_expr,json=callExpr,proto3,oneof"`
}

type Expr_ListExpr struct {
	ListExpr *Expr_CreateList `protobuf:"bytes,7,opt,name=list_expr,json=listExpr,proto3,oneof"`
}

type Expr_StructExpr struct {
	StructExpr *Expr_CreateStruct `protobuf:"bytes,8,opt,name=struct_expr,json=structExpr,proto3,oneof"`
}

type Expr_ComprehensionExpr struct {
	ComprehensionExpr *Expr_Comprehension `protobuf:"bytes,9,opt,name=comprehension_expr,json=comprehensionExpr,proto3,oneof"`
}

func (*Expr_ConstExpr) isExpr_ExprKind() {}

func (*Expr_IdentExpr) isExpr_ExprKind() {}

func (*Expr_SelectExpr) isExpr_ExprKind() {}

func (*Expr_CallExpr) isExpr_ExprKind() {}

func (*Expr_ListExpr) isExpr_ExprKind() {}

func (*Expr_StructExpr) isExpr_ExprKind() {}

func (*Expr_ComprehensionExpr) isExpr_ExprKind() {}

type Constant struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Types that are valid to be assigned to ConstantKind:
	//
	//	*Constant_NullValue
	//	*Constant_BoolValue
	//	*Constant_Int64Value
	//	*Constant_Uint64Value
	//	*Constant_DoubleValue
	//	*Constant_StringValue
	//	*Constant_BytesValue
	//	*Constant_DurationValue
	//	*Constant_TimestampValue
	ConstantKind  isConstant_ConstantKind `protobuf_oneof:"constant_kind"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*Constant) ProtoMessage() {}

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

func (x *Constant) GetConstantKind() isConstant_ConstantKind {
	if x != nil {
		return x.ConstantKind
	}
	return nil
}

func (x *Constant) GetNullValue() structpb.NullValue {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_NullValue); ok {
			return x.NullValue
		}
	}
	return structpb.NullValue(0)
}

func (x *Constant) GetBoolValue() bool {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_BoolValue); ok {
			return x.BoolValue
		}
	}
	return false
}

func (x *Constant) GetInt64Value() int64 {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_Int64Value); ok {
			return x.Int64Value
		}
	}
	return 0
}

func (x *Constant) GetUint64Value() uint64 {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_Uint64Value); ok {
			return x.Uint64Value
		}
	}
	return 0
}

func (x *Constant) GetDoubleValue() float64 {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_DoubleValue); ok {
			return x.DoubleValue
		}
	}
	return 0
}

func (x *Constant) GetStringValue() string {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_StringValue); ok {
			return x.StringValue
		}
	}
	return ""
}

func (x *Constant) GetBytesValue() []byte {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_BytesValue); ok {
			return x.BytesValue
		}
	}
	return nil
}

// Deprecated: Marked as deprecated in cel/expr/syntax.proto.
func (x *Constant) GetDurationValue() *durationpb.Duration {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_DurationValue); ok {
			return x.DurationValue
		}
	}
	return nil
}

// Deprecated: Marked as deprecated in cel/expr/syntax.proto.
func (x *Constant) GetTimestampValue() *timestamppb.Timestamp {
	if x != nil {
		if x, ok := x.ConstantKind.(*Constant_TimestampValue); ok {
			return x.TimestampValue
		}
	}
	return nil
}

type isConstant_ConstantKind interface {
	isConstant_ConstantKind()
}

type Constant_NullValue struct {
	NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"`
}

type Constant_BoolValue struct {
	BoolValue bool `protobuf:"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof"`
}

type Constant_Int64Value struct {
	Int64Value int64 `protobuf:"varint,3,opt,name=int64_value,json=int64Value,proto3,oneof"`
}

type Constant_Uint64Value struct {
	Uint64Value uint64 `protobuf:"varint,4,opt,name=uint64_value,json=uint64Value,proto3,oneof"`
}

type Constant_DoubleValue struct {
	DoubleValue float64 `protobuf:"fixed64,5,opt,name=double_value,json=doubleValue,proto3,oneof"`
}

type Constant_StringValue struct {
	StringValue string `protobuf:"bytes,6,opt,name=string_value,json=stringValue,proto3,oneof"`
}

type Constant_BytesValue struct {
	BytesValue []byte `protobuf:"bytes,7,opt,name=bytes_value,json=bytesValue,proto3,oneof"`
}

type Constant_DurationValue struct {
	// Deprecated: Marked as deprecated in cel/expr/syntax.proto.
	DurationValue *durationpb.Duration `protobuf:"bytes,8,opt,name=duration_value,json=durationValue,proto3,oneof"`
}

type Constant_TimestampValue struct {
	// Deprecated: Marked as deprecated in cel/expr/syntax.proto.
	TimestampValue *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=timestamp_value,json=timestampValue,proto3,oneof"`
}

func (*Constant_NullValue) isConstant_ConstantKind() {}

func (*Constant_BoolValue) isConstant_ConstantKind() {}

func (*Constant_Int64Value) isConstant_ConstantKind() {}

func (*Constant_Uint64Value) isConstant_ConstantKind() {}

func (*Constant_DoubleValue) isConstant_ConstantKind() {}

func (*Constant_StringValue) isConstant_ConstantKind() {}

func (*Constant_BytesValue) isConstant_ConstantKind() {}

func (*Constant_DurationValue) isConstant_ConstantKind() {}

func (*Constant_TimestampValue) isConstant_ConstantKind() {}

type SourceInfo struct {
	state         protoimpl.MessageState  `protogen:"open.v1"`
	SyntaxVersion string                  `protobuf:"bytes,1,opt,name=syntax_version,json=syntaxVersion,proto3" json:"syntax_version,omitempty"`
	Location      string                  `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"`
	LineOffsets   []int32                 `protobuf:"varint,3,rep,packed,name=line_offsets,json=lineOffsets,proto3" json:"line_offsets,omitempty"`
	Positions     map[int64]int32         `protobuf:"bytes,4,rep,name=positions,proto3" json:"positions,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
	MacroCalls    map[int64]*Expr         `protobuf:"bytes,5,rep,name=macro_calls,json=macroCalls,proto3" json:"macro_calls,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	Extensions    []*SourceInfo_Extension `protobuf:"bytes,6,rep,name=extensions,proto3" json:"extensions,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*SourceInfo) ProtoMessage() {}

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

func (x *SourceInfo) GetSyntaxVersion() string {
	if x != nil {
		return x.SyntaxVersion
	}
	return ""
}

func (x *SourceInfo) GetLocation() string {
	if x != nil {
		return x.Location
	}
	return ""
}

func (x *SourceInfo) GetLineOffsets() []int32 {
	if x != nil {
		return x.LineOffsets
	}
	return nil
}

func (x *SourceInfo) GetPositions() map[int64]int32 {
	if x != nil {
		return x.Positions
	}
	return nil
}

func (x *SourceInfo) GetMacroCalls() map[int64]*Expr {
	if x != nil {
		return x.MacroCalls
	}
	return nil
}

func (x *SourceInfo) GetExtensions() []*SourceInfo_Extension {
	if x != nil {
		return x.Extensions
	}
	return nil
}

type Expr_Ident struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Name          string                 `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Expr_Ident) Reset() {
	*x = Expr_Ident{}
	mi := &file_cel_expr_syntax_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Expr_Ident) ProtoMessage() {}

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

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

type Expr_Select struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Operand       *Expr                  `protobuf:"bytes,1,opt,name=operand,proto3" json:"operand,omitempty"`
	Field         string                 `protobuf:"bytes,2,opt,name=field,proto3" json:"field,omitempty"`
	TestOnly      bool                   `protobuf:"varint,3,opt,name=test_only,json=testOnly,proto3" json:"test_only,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Expr_Select) Reset() {
	*x = Expr_Select{}
	mi := &file_cel_expr_syntax_proto_msgTypes[5]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Expr_Select) ProtoMessage() {}

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

func (x *Expr_Select) GetOperand() *Expr {
	if x != nil {
		return x.Operand
	}
	return nil
}

func (x *Expr_Select) GetField() string {
	if x != nil {
		return x.Field
	}
	return ""
}

func (x *Expr_Select) GetTestOnly() bool {
	if x != nil {
		return x.TestOnly
	}
	return false
}

type Expr_Call struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Target        *Expr                  `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"`
	Function      string                 `protobuf:"bytes,2,opt,name=function,proto3" json:"function,omitempty"`
	Args          []*Expr                `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*Expr_Call) ProtoMessage() {}

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

func (x *Expr_Call) GetTarget() *Expr {
	if x != nil {
		return x.Target
	}
	return nil
}

func (x *Expr_Call) GetFunction() string {
	if x != nil {
		return x.Function
	}
	return ""
}

func (x *Expr_Call) GetArgs() []*Expr {
	if x != nil {
		return x.Args
	}
	return nil
}

type Expr_CreateList struct {
	state           protoimpl.MessageState `protogen:"open.v1"`
	Elements        []*Expr                `protobuf:"bytes,1,rep,name=elements,proto3" json:"elements,omitempty"`
	OptionalIndices []int32                `protobuf:"varint,2,rep,packed,name=optional_indices,json=optionalIndices,proto3" json:"optional_indices,omitempty"`
	unknownFields   protoimpl.UnknownFields
	sizeCache       protoimpl.SizeCache
}

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

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

func (*Expr_CreateList) ProtoMessage() {}

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

func (x *Expr_CreateList) GetElements() []*Expr {
	if x != nil {
		return x.Elements
	}
	return nil
}

func (x *Expr_CreateList) GetOptionalIndices() []int32 {
	if x != nil {
		return x.OptionalIndices
	}
	return nil
}

type Expr_CreateStruct struct {
	state         protoimpl.MessageState     `protogen:"open.v1"`
	MessageName   string                     `protobuf:"bytes,1,opt,name=message_name,json=messageName,proto3" json:"message_name,omitempty"`
	Entries       []*Expr_CreateStruct_Entry `protobuf:"bytes,2,rep,name=entries,proto3" json:"entries,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*Expr_CreateStruct) ProtoMessage() {}

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

func (x *Expr_CreateStruct) GetMessageName() string {
	if x != nil {
		return x.MessageName
	}
	return ""
}

func (x *Expr_CreateStruct) GetEntries() []*Expr_CreateStruct_Entry {
	if x != nil {
		return x.Entries
	}
	return nil
}

type Expr_Comprehension struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	IterVar       string                 `protobuf:"bytes,1,opt,name=iter_var,json=iterVar,proto3" json:"iter_var,omitempty"`
	IterVar2      string                 `protobuf:"bytes,8,opt,name=iter_var2,json=iterVar2,proto3" json:"iter_var2,omitempty"`
	IterRange     *Expr                  `protobuf:"bytes,2,opt,name=iter_range,json=iterRange,proto3" json:"iter_range,omitempty"`
	AccuVar       string                 `protobuf:"bytes,3,opt,name=accu_var,json=accuVar,proto3" json:"accu_var,omitempty"`
	AccuInit      *Expr                  `protobuf:"bytes,4,opt,name=accu_init,json=accuInit,proto3" json:"accu_init,omitempty"`
	LoopCondition *Expr                  `protobuf:"bytes,5,opt,name=loop_condition,json=loopCondition,proto3" json:"loop_condition,omitempty"`
	LoopStep      *Expr                  `protobuf:"bytes,6,opt,name=loop_step,json=loopStep,proto3" json:"loop_step,omitempty"`
	Result        *Expr                  `protobuf:"bytes,7,opt,name=result,proto3" json:"result,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*Expr_Comprehension) ProtoMessage() {}

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

func (x *Expr_Comprehension) GetIterVar() string {
	if x != nil {
		return x.IterVar
	}
	return ""
}

func (x *Expr_Comprehension) GetIterVar2() string {
	if x != nil {
		return x.IterVar2
	}
	return ""
}

func (x *Expr_Comprehension) GetIterRange() *Expr {
	if x != nil {
		return x.IterRange
	}
	return nil
}

func (x *Expr_Comprehension) GetAccuVar() string {
	if x != nil {
		return x.AccuVar
	}
	return ""
}

func (x *Expr_Comprehension) GetAccuInit() *Expr {
	if x != nil {
		return x.AccuInit
	}
	return nil
}

func (x *Expr_Comprehension) GetLoopCondition() *Expr {
	if x != nil {
		return x.LoopCondition
	}
	return nil
}

func (x *Expr_Comprehension) GetLoopStep() *Expr {
	if x != nil {
		return x.LoopStep
	}
	return nil
}

func (x *Expr_Comprehension) GetResult() *Expr {
	if x != nil {
		return x.Result
	}
	return nil
}

type Expr_CreateStruct_Entry struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	Id    int64                  `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
	// Types that are valid to be assigned to KeyKind:
	//
	//	*Expr_CreateStruct_Entry_FieldKey
	//	*Expr_CreateStruct_Entry_MapKey
	KeyKind       isExpr_CreateStruct_Entry_KeyKind `protobuf_oneof:"key_kind"`
	Value         *Expr                             `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
	OptionalEntry bool                              `protobuf:"varint,5,opt,name=optional_entry,json=optionalEntry,proto3" json:"optional_entry,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

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

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

func (*Expr_CreateStruct_Entry) ProtoMessage() {}

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

func (x *Expr_CreateStruct_Entry) GetId() int64 {
	if x != nil {
		return x.Id
	}
	return 0
}

func (x *Expr_CreateStruct_Entry) GetKeyKind() isExpr_CreateStruct_Entry_KeyKind {
	if x != nil {
		return x.KeyKind
	}
	return nil
}

func (x *Expr_CreateStruct_Entry) GetFieldKey() string {
	if x != nil {
		if x, ok := x.KeyKind.(*Expr_CreateStruct_Entry_FieldKey); ok {
			return x.FieldKey
		}
	}
	return ""
}

func (x *Expr_CreateStruct_Entry) GetMapKey() *Expr {
	if x != nil {
		if x, ok := x.KeyKind.(*Expr_CreateStruct_Entry_MapKey); ok {
			return x.MapKey
		}
	}
	return nil
}

func (x *Expr_CreateStruct_Entry) GetValue() *Expr {
	if x != nil {
		return x.Value
	}
	return nil
}

func (x *Expr_CreateStruct_Entry) GetOptionalEntry() bool {
	if x != nil {
		return x.OptionalEntry
	}
	return false
}

type isExpr_CreateStruct_Entry_KeyKind interface {
	isExpr_CreateStruct_Entry_KeyKind()
}

type Expr_CreateStruct_Entry_FieldKey struct {
	FieldKey string `protobuf:"bytes,2,opt,name=field_key,json=fieldKey,proto3,oneof"`
}

type Expr_CreateStruct_Entry_MapKey struct {
	MapKey *Expr `protobuf:"bytes,3,opt,name=map_key,json=mapKey,proto3,oneof"`
}

func (*Expr_CreateStruct_Entry_FieldKey) isExpr_CreateStruct_Entry_KeyKind() {}

func (*Expr_CreateStruct_Entry_MapKey) isExpr_CreateStruct_Entry_KeyKind() {}

type SourceInfo_Extension struct {
	state              protoimpl.MessageState           `protogen:"open.v1"`
	Id                 string                           `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	AffectedComponents []SourceInfo_Extension_Component `protobuf:"varint,2,rep,packed,name=affected_components,json=affectedComponents,proto3,enum=cel.expr.SourceInfo_Extension_Component" json:"affected_components,omitempty"`
	Version            *SourceInfo_Extension_Version    `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
	unknownFields      protoimpl.UnknownFields
	sizeCache          protoimpl.SizeCache
}

func (x *SourceInfo_Extension) Reset() {
	*x = SourceInfo_Extension{}
	mi := &file_cel_expr_syntax_proto_msgTypes[13]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*SourceInfo_Extension) ProtoMessage() {}

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

func (x *SourceInfo_Extension) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (x *SourceInfo_Extension) GetAffectedComponents() []SourceInfo_Extension_Component {
	if x != nil {
		return x.AffectedComponents
	}
	return nil
}

func (x *SourceInfo_Extension) GetVersion() *SourceInfo_Extension_Version {
	if x != nil {
		return x.Version
	}
	return nil
}

type SourceInfo_Extension_Version struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Major         int64                  `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor         int64                  `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *SourceInfo_Extension_Version) Reset() {
	*x = SourceInfo_Extension_Version{}
	mi := &file_cel_expr_syntax_proto_msgTypes[14]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*SourceInfo_Extension_Version) ProtoMessage() {}

func (x *SourceInfo_Extension_Version) ProtoReflect() protoreflect.Message {
	mi := &file_cel_expr_syntax_proto_msgTypes[14]
	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 SourceInfo_Extension_Version.ProtoReflect.Descriptor instead.
func (*SourceInfo_Extension_Version) Descriptor() ([]byte, []int) {
	return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2, 0}
}

func (x *SourceInfo_Extension_Version) GetMajor() int64 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *SourceInfo_Extension_Version) GetMinor() int64 {
	if x != nil {
		return x.Minor
	}
	return 0
}

var File_cel_expr_syntax_proto protoreflect.FileDescriptor

const file_cel_expr_syntax_proto_rawDesc = "" +
	"\n" +
	"\x15cel/expr/syntax.proto\x12\bcel.expr\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"g\n" +
	"\n" +
	"ParsedExpr\x12\"\n" +
	"\x04expr\x18\x02 \x01(\v2\x0e.cel.expr.ExprR\x04expr\x125\n" +
	"\vsource_info\x18\x03 \x01(\v2\x14.cel.expr.SourceInfoR\n" +
	"sourceInfo\"\x9a\v\n" +
	"\x04Expr\x12\x0e\n" +
	"\x02id\x18\x02 \x01(\x03R\x02id\x123\n" +
	"\n" +
	"const_expr\x18\x03 \x01(\v2\x12.cel.expr.ConstantH\x00R\tconstExpr\x125\n" +
	"\n" +
	"ident_expr\x18\x04 \x01(\v2\x14.cel.expr.Expr.IdentH\x00R\tidentExpr\x128\n" +
	"\vselect_expr\x18\x05 \x01(\v2\x15.cel.expr.Expr.SelectH\x00R\n" +
	"selectExpr\x122\n" +
	"\tcall_expr\x18\x06 \x01(\v2\x13.cel.expr.Expr.CallH\x00R\bcallExpr\x128\n" +
	"\tlist_expr\x18\a \x01(\v2\x19.cel.expr.Expr.CreateListH\x00R\blistExpr\x12>\n" +
	"\vstruct_expr\x18\b \x01(\v2\x1b.cel.expr.Expr.CreateStructH\x00R\n" +
	"structExpr\x12M\n" +
	"\x12comprehension_expr\x18\t \x01(\v2\x1c.cel.expr.Expr.ComprehensionH\x00R\x11comprehensionExpr\x1a\x1b\n" +
	"\x05Ident\x12\x12\n" +
	"\x04name\x18\x01 \x01(\tR\x04name\x1ae\n" +
	"\x06Select\x12(\n" +
	"\aoperand\x18\x01 \x01(\v2\x0e.cel.expr.ExprR\aoperand\x12\x14\n" +
	"\x05field\x18\x02 \x01(\tR\x05field\x12\x1b\n" +
	"\ttest_only\x18\x03 \x01(\bR\btestOnly\x1an\n" +
	"\x04Call\x12&\n" +
	"\x06target\x18\x01 \x01(\v2\x0e.cel.expr.ExprR\x06target\x12\x1a\n" +
	"\bfunction\x18\x02 \x01(\tR\bfunction\x12\"\n" +
	"\x04args\x18\x03 \x03(\v2\x0e.cel.expr.ExprR\x04args\x1ac\n" +
	"\n" +
	"CreateList\x12*\n" +
	"\belements\x18\x01 \x03(\v2\x0e.cel.expr.ExprR\belements\x12)\n" +
	"\x10optional_indices\x18\x02 \x03(\x05R\x0foptionalIndices\x1a\xab\x02\n" +
	"\fCreateStruct\x12!\n" +
	"\fmessage_name\x18\x01 \x01(\tR\vmessageName\x12;\n" +
	"\aentries\x18\x02 \x03(\v2!.cel.expr.Expr.CreateStruct.EntryR\aentries\x1a\xba\x01\n" +
	"\x05Entry\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\x03R\x02id\x12\x1d\n" +
	"\tfield_key\x18\x02 \x01(\tH\x00R\bfieldKey\x12)\n" +
	"\amap_key\x18\x03 \x01(\v2\x0e.cel.expr.ExprH\x00R\x06mapKey\x12$\n" +
	"\x05value\x18\x04 \x01(\v2\x0e.cel.expr.ExprR\x05value\x12%\n" +
	"\x0eoptional_entry\x18\x05 \x01(\bR\roptionalEntryB\n" +
	"\n" +
	"\bkey_kind\x1a\xca\x02\n" +
	"\rComprehension\x12\x19\n" +
	"\biter_var\x18\x01 \x01(\tR\aiterVar\x12\x1b\n" +
	"\titer_var2\x18\b \x01(\tR\biterVar2\x12-\n" +
	"\n" +
	"iter_range\x18\x02 \x01(\v2\x0e.cel.expr.ExprR\titerRange\x12\x19\n" +
	"\baccu_var\x18\x03 \x01(\tR\aaccuVar\x12+\n" +
	"\taccu_init\x18\x04 \x01(\v2\x0e.cel.expr.ExprR\baccuInit\x125\n" +
	"\x0eloop_condition\x18\x05 \x01(\v2\x0e.cel.expr.ExprR\rloopCondition\x12+\n" +
	"\tloop_step\x18\x06 \x01(\v2\x0e.cel.expr.ExprR\bloopStep\x12&\n" +
	"\x06result\x18\a \x01(\v2\x0e.cel.expr.ExprR\x06resultB\v\n" +
	"\texpr_kind\"\xc1\x03\n" +
	"\bConstant\x12;\n" +
	"\n" +
	"null_value\x18\x01 \x01(\x0e2\x1a.google.protobuf.NullValueH\x00R\tnullValue\x12\x1f\n" +
	"\n" +
	"bool_value\x18\x02 \x01(\bH\x00R\tboolValue\x12!\n" +
	"\vint64_value\x18\x03 \x01(\x03H\x00R\n" +
	"int64Value\x12#\n" +
	"\fuint64_value\x18\x04 \x01(\x04H\x00R\vuint64Value\x12#\n" +
	"\fdouble_value\x18\x05 \x01(\x01H\x00R\vdoubleValue\x12#\n" +
	"\fstring_value\x18\x06 \x01(\tH\x00R\vstringValue\x12!\n" +
	"\vbytes_value\x18\a \x01(\fH\x00R\n" +
	"bytesValue\x12F\n" +
	"\x0eduration_value\x18\b \x01(\v2\x19.google.protobuf.DurationB\x02\x18\x01H\x00R\rdurationValue\x12I\n" +
	"\x0ftimestamp_value\x18\t \x01(\v2\x1a.google.protobuf.TimestampB\x02\x18\x01H\x00R\x0etimestampValueB\x0f\n" +
	"\rconstant_kind\"\xac\x06\n" +
	"\n" +
	"SourceInfo\x12%\n" +
	"\x0esyntax_version\x18\x01 \x01(\tR\rsyntaxVersion\x12\x1a\n" +
	"\blocation\x18\x02 \x01(\tR\blocation\x12!\n" +
	"\fline_offsets\x18\x03 \x03(\x05R\vlineOffsets\x12A\n" +
	"\tpositions\x18\x04 \x03(\v2#.cel.expr.SourceInfo.PositionsEntryR\tpositions\x12E\n" +
	"\vmacro_calls\x18\x05 \x03(\v2$.cel.expr.SourceInfo.MacroCallsEntryR\n" +
	"macroCalls\x12>\n" +
	"\n" +
	"extensions\x18\x06 \x03(\v2\x1e.cel.expr.SourceInfo.ExtensionR\n" +
	"extensions\x1a<\n" +
	"\x0ePositionsEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\x03R\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\x05R\x05value:\x028\x01\x1aM\n" +
	"\x0fMacroCallsEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\x03R\x03key\x12$\n" +
	"\x05value\x18\x02 \x01(\v2\x0e.cel.expr.ExprR\x05value:\x028\x01\x1a\xe0\x02\n" +
	"\tExtension\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\tR\x02id\x12Y\n" +
	"\x13affected_components\x18\x02 \x03(\x0e2(.cel.expr.SourceInfo.Extension.ComponentR\x12affectedComponents\x12@\n" +
	"\aversion\x18\x03 \x01(\v2&.cel.expr.SourceInfo.Extension.VersionR\aversion\x1a5\n" +
	"\aVersion\x12\x14\n" +
	"\x05major\x18\x01 \x01(\x03R\x05major\x12\x14\n" +
	"\x05minor\x18\x02 \x01(\x03R\x05minor\"o\n" +
	"\tComponent\x12\x19\n" +
	"\x15COMPONENT_UNSPECIFIED\x10\x00\x12\x14\n" +
	"\x10COMPONENT_PARSER\x10\x01\x12\x1a\n" +
	"\x16COMPONENT_TYPE_CHECKER\x10\x02\x12\x15\n" +
	"\x11COMPONENT_RUNTIME\x10\x03B.\n" +
	"\fdev.cel.exprB\vSyntaxProtoP\x01Z\fcel.dev/expr\xf8\x01\x01b\x06proto3"

var (
	file_cel_expr_syntax_proto_rawDescOnce sync.Once
	file_cel_expr_syntax_proto_rawDescData []byte
)

func file_cel_expr_syntax_proto_rawDescGZIP() []byte {
	file_cel_expr_syntax_proto_rawDescOnce.Do(func() {
		file_cel_expr_syntax_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_cel_expr_syntax_proto_rawDesc), len(file_cel_expr_syntax_proto_rawDesc)))
	})
	return file_cel_expr_syntax_proto_rawDescData
}

var file_cel_expr_syntax_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_cel_expr_syntax_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
var file_cel_expr_syntax_proto_goTypes = []any{
	(SourceInfo_Extension_Component)(0),  // 0: cel.expr.SourceInfo.Extension.Component
	(*ParsedExpr)(nil),                   // 1: cel.expr.ParsedExpr
	(*Expr)(nil),                         // 2: cel.expr.Expr
	(*Constant)(nil),                     // 3: cel.expr.Constant
	(*SourceInfo)(nil),                   // 4: cel.expr.SourceInfo
	(*Expr_Ident)(nil),                   // 5: cel.expr.Expr.Ident
	(*Expr_Select)(nil),                  // 6: cel.expr.Expr.Select
	(*Expr_Call)(nil),                    // 7: cel.expr.Expr.Call
	(*Expr_CreateList)(nil),              // 8: cel.expr.Expr.CreateList
	(*Expr_CreateStruct)(nil),            // 9: cel.expr.Expr.CreateStruct
	(*Expr_Comprehension)(nil),           // 10: cel.expr.Expr.Comprehension
	(*Expr_CreateStruct_Entry)(nil),      // 11: cel.expr.Expr.CreateStruct.Entry
	nil,                                  // 12: cel.expr.SourceInfo.PositionsEntry
	nil,                                  // 13: cel.expr.SourceInfo.MacroCallsEntry
	(*SourceInfo_Extension)(nil),         // 14: cel.expr.SourceInfo.Extension
	(*SourceInfo_Extension_Version)(nil), // 15: cel.expr.SourceInfo.Extension.Version
	(structpb.NullValue)(0),              // 16: google.protobuf.NullValue
	(*durationpb.Duration)(nil),          // 17: google.protobuf.Duration
	(*timestamppb.Timestamp)(nil),        // 18: google.protobuf.Timestamp
}
var file_cel_expr_syntax_proto_depIdxs = []int32{
	2,  // 0: cel.expr.ParsedExpr.expr:type_name -> cel.expr.Expr
	4,  // 1: cel.expr.ParsedExpr.source_info:type_name -> cel.expr.SourceInfo
	3,  // 2: cel.expr.Expr.const_expr:type_name -> cel.expr.Constant
	5,  // 3: cel.expr.Expr.ident_expr:type_name -> cel.expr.Expr.Ident
	6,  // 4: cel.expr.Expr.select_expr:type_name -> cel.expr.Expr.Select
	7,  // 5: cel.expr.Expr.call_expr:type_name -> cel.expr.Expr.Call
	8,  // 6: cel.expr.Expr.list_expr:type_name -> cel.expr.Expr.CreateList
	9,  // 7: cel.expr.Expr.struct_expr:type_name -> cel.expr.Expr.CreateStruct
	10, // 8: cel.expr.Expr.comprehension_expr:type_name -> cel.expr.Expr.Comprehension
	16, // 9: cel.expr.Constant.null_value:type_name -> google.protobuf.NullValue
	17, // 10: cel.expr.Constant.duration_value:type_name -> google.protobuf.Duration
	18, // 11: cel.expr.Constant.timestamp_value:type_name -> google.protobuf.Timestamp
	12, // 12: cel.expr.SourceInfo.positions:type_name -> cel.expr.SourceInfo.PositionsEntry
	13, // 13: cel.expr.SourceInfo.macro_calls:type_name -> cel.expr.SourceInfo.MacroCallsEntry
	14, // 14: cel.expr.SourceInfo.extensions:type_name -> cel.expr.SourceInfo.Extension
	2,  // 15: cel.expr.Expr.Select.operand:type_name -> cel.expr.Expr
	2,  // 16: cel.expr.Expr.Call.target:type_name -> cel.expr.Expr
	2,  // 17: cel.expr.Expr.Call.args:type_name -> cel.expr.Expr
	2,  // 18: cel.expr.Expr.CreateList.elements:type_name -> cel.expr.Expr
	11, // 19: cel.expr.Expr.CreateStruct.entries:type_name -> cel.expr.Expr.CreateStruct.Entry
	2,  // 20: cel.expr.Expr.Comprehension.iter_range:type_name -> cel.expr.Expr
	2,  // 21: cel.expr.Expr.Comprehension.accu_init:type_name -> cel.expr.Expr
	2,  // 22: cel.expr.Expr.Comprehension.loop_condition:type_name -> cel.expr.Expr
	2,  // 23: cel.expr.Expr.Comprehension.loop_step:type_name -> cel.expr.Expr
	2,  // 24: cel.expr.Expr.Comprehension.result:type_name -> cel.expr.Expr
	2,  // 25: cel.expr.Expr.CreateStruct.Entry.map_key:type_name -> cel.expr.Expr
	2,  // 26: cel.expr.Expr.CreateStruct.Entry.value:type_name -> cel.expr.Expr
	2,  // 27: cel.expr.SourceInfo.MacroCallsEntry.value:type_name -> cel.expr.Expr
	0,  // 28: cel.expr.SourceInfo.Extension.affected_components:type_name -> cel.expr.SourceInfo.Extension.Component
	15, // 29: cel.expr.SourceInfo.Extension.version:type_name -> cel.expr.SourceInfo.Extension.Version
	30, // [30:30] is the sub-list for method output_type
	30, // [30:30] is the sub-list for method input_type
	30, // [30:30] is the sub-list for extension type_name
	30, // [30:30] is the sub-list for extension extendee
	0,  // [0:30] is the sub-list for field type_name
}

func init() { file_cel_expr_syntax_proto_init() }
func file_cel_expr_syntax_proto_init() {
	if File_cel_expr_syntax_proto != nil {
		return
	}
	file_cel_expr_syntax_proto_msgTypes[1].OneofWrappers = []any{
		(*Expr_ConstExpr)(nil),
		(*Expr_IdentExpr)(nil),
		(*Expr_SelectExpr)(nil),
		(*Expr_CallExpr)(nil),
		(*Expr_ListExpr)(nil),
		(*Expr_StructExpr)(nil),
		(*Expr_ComprehensionExpr)(nil),
	}
	file_cel_expr_syntax_proto_msgTypes[2].OneofWrappers = []any{
		(*Constant_NullValue)(nil),
		(*Constant_BoolValue)(nil),
		(*Constant_Int64Value)(nil),
		(*Constant_Uint64Value)(nil),
		(*Constant_DoubleValue)(nil),
		(*Constant_StringValue)(nil),
		(*Constant_BytesValue)(nil),
		(*Constant_DurationValue)(nil),
		(*Constant_TimestampValue)(nil),
	}
	file_cel_expr_syntax_proto_msgTypes[10].OneofWrappers = []any{
		(*Expr_CreateStruct_Entry_FieldKey)(nil),
		(*Expr_CreateStruct_Entry_MapKey)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_cel_expr_syntax_proto_rawDesc), len(file_cel_expr_syntax_proto_rawDesc)),
			NumEnums:      1,
			NumMessages:   15,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_cel_expr_syntax_proto_goTypes,
		DependencyIndexes: file_cel_expr_syntax_proto_depIdxs,
		EnumInfos:         file_cel_expr_syntax_proto_enumTypes,
		MessageInfos:      file_cel_expr_syntax_proto_msgTypes,
	}.Build()
	File_cel_expr_syntax_proto = out.File
	file_cel_expr_syntax_proto_goTypes = nil
	file_cel_expr_syntax_proto_depIdxs = nil
}
