load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_cc//cc:cc_test.bzl", "cc_test")

DEFAULT_VISIBILITY = [
    "//eval:__subpackages__",
    "//runtime:__subpackages__",
    "//extensions:__subpackages__",
    "//testing:__subpackages__",
]

# This package contains code
# that compiles Expr object into evaluatable CelExpression
package(default_visibility = ["//visibility:public"])

licenses(["notice"])

exports_files(["LICENSE"])

package_group(
    name = "coverage_visibility",
    packages = [
        "//tools/...",
    ],
)

cc_library(
    name = "flat_expr_builder_extensions",
    srcs = ["flat_expr_builder_extensions.cc"],
    hdrs = ["flat_expr_builder_extensions.h"],
    deps = [
        ":resolver",
        "//base:ast",
        "//base:data",
        "//common:expr",
        "//common:native_type",
        "//common:value",
        "//eval/eval:direct_expression_step",
        "//eval/eval:evaluator_core",
        "//eval/eval:trace_step",
        "//internal:casts",
        "//runtime:runtime_options",
        "//runtime/internal:issue_collector",
        "//runtime/internal:runtime_env",
        "@com_google_absl//absl/algorithm:container",
        "@com_google_absl//absl/base:core_headers",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/functional:any_invocable",
        "@com_google_absl//absl/log:absl_check",
        "@com_google_absl//absl/memory",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/types:optional",
        "@com_google_absl//absl/types:variant",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_test(
    name = "flat_expr_builder_extensions_test",
    srcs = ["flat_expr_builder_extensions_test.cc"],
    deps = [
        ":flat_expr_builder_extensions",
        ":resolver",
        "//common:expr",
        "//common:native_type",
        "//common:value",
        "//eval/eval:const_value_step",
        "//eval/eval:direct_expression_step",
        "//eval/eval:evaluator_core",
        "//eval/eval:function_step",
        "//internal:status_macros",
        "//internal:testing",
        "//runtime:function_registry",
        "//runtime:runtime_issue",
        "//runtime:runtime_options",
        "//runtime:type_registry",
        "//runtime/internal:issue_collector",
        "//runtime/internal:runtime_env",
        "//runtime/internal:runtime_env_testing",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:status_matchers",
        "@com_google_absl//absl/status:statusor",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_library(
    name = "flat_expr_builder",
    srcs = [
        "flat_expr_builder.cc",
    ],
    hdrs = [
        "flat_expr_builder.h",
    ],
    deps = [
        ":check_ast_extensions",
        ":flat_expr_builder_extensions",
        ":resolver",
        "//base:ast",
        "//base:builtins",
        "//base:data",
        "//common:allocator",
        "//common:ast",
        "//common:ast_traverse",
        "//common:ast_visitor",
        "//common:constant",
        "//common:expr",
        "//common:kind",
        "//common:type",
        "//common:value",
        "//eval/eval:comprehension_step",
        "//eval/eval:const_value_step",
        "//eval/eval:container_access_step",
        "//eval/eval:create_list_step",
        "//eval/eval:create_map_step",
        "//eval/eval:create_struct_step",
        "//eval/eval:direct_expression_step",
        "//eval/eval:equality_steps",
        "//eval/eval:evaluator_core",
        "//eval/eval:function_step",
        "//eval/eval:ident_step",
        "//eval/eval:jump_step",
        "//eval/eval:lazy_init_step",
        "//eval/eval:logic_step",
        "//eval/eval:optional_or_step",
        "//eval/eval:select_step",
        "//eval/eval:shadowable_value_step",
        "//eval/eval:ternary_step",
        "//eval/eval:trace_step",
        "//internal:status_macros",
        "//runtime:function_registry",
        "//runtime:runtime_issue",
        "//runtime:runtime_options",
        "//runtime:type_registry",
        "//runtime/internal:convert_constant",
        "//runtime/internal:issue_collector",
        "//runtime/internal:runtime_env",
        "@com_google_absl//absl/algorithm:container",
        "@com_google_absl//absl/base:core_headers",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/container:flat_hash_set",
        "@com_google_absl//absl/container:node_hash_map",
        "@com_google_absl//absl/functional:any_invocable",
        "@com_google_absl//absl/log:absl_check",
        "@com_google_absl//absl/log:check",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
        "@com_google_absl//absl/types:optional",
        "@com_google_absl//absl/types:span",
        "@com_google_absl//absl/types:variant",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_test(
    name = "flat_expr_builder_test",
    srcs = [
        "flat_expr_builder_test.cc",
    ],
    deps = [
        ":cel_expression_builder_flat_impl",
        ":constant_folding",
        ":flat_expr_builder",
        ":qualified_reference_resolver",
        "//base:builtins",
        "//common:function_descriptor",
        "//common:kind",
        "//common:value",
        "//eval/public:activation",
        "//eval/public:builtin_func_registrar",
        "//eval/public:cel_attribute",
        "//eval/public:cel_builtins",
        "//eval/public:cel_expr_builder_factory",
        "//eval/public:cel_expression",
        "//eval/public:cel_function",
        "//eval/public:cel_function_adapter",
        "//eval/public:cel_function_registry",
        "//eval/public:cel_options",
        "//eval/public:cel_value",
        "//eval/public:portable_cel_function_adapter",
        "//eval/public:unknown_attribute_set",
        "//eval/public:unknown_set",
        "//eval/public/containers:container_backed_map_impl",
        "//eval/public/structs:cel_proto_descriptor_pool_builder",
        "//eval/public/structs:cel_proto_wrapper",
        "//eval/public/testing:matchers",
        "//eval/testutil:test_message_cc_proto",
        "//internal:proto_matchers",
        "//internal:status_macros",
        "//internal:testing",
        "//parser",
        "//runtime:function",
        "//runtime:function_adapter",
        "//runtime:runtime_options",
        "//runtime:standard_functions",
        "//runtime/internal:runtime_env_testing",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/log:absl_check",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:status_matchers",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
        "@com_google_absl//absl/time",
        "@com_google_absl//absl/types:span",
        "@com_google_cel_spec//proto/cel/expr:checked_cc_proto",
        "@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",
        "@com_google_cel_spec//proto/cel/expr/conformance/proto3:test_all_types_cc_proto",
        "@com_google_protobuf//:field_mask_cc_proto",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_test(
    name = "flat_expr_builder_comprehensions_test",
    srcs = [
        "flat_expr_builder_comprehensions_test.cc",
    ],
    deps = [
        ":cel_expression_builder_flat_impl",
        ":comprehension_vulnerability_check",
        ":flat_expr_builder",
        "//eval/public:activation",
        "//eval/public:builtin_func_registrar",
        "//eval/public:cel_attribute",
        "//eval/public:cel_expression",
        "//eval/public:cel_options",
        "//eval/public:cel_value",
        "//eval/public/containers:container_backed_list_impl",
        "//eval/public/testing:matchers",
        "//eval/testutil:test_message_cc_proto",
        "//internal:testing",
        "//parser",
        "//runtime:runtime_options",
        "//runtime/internal:runtime_env_testing",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/strings",
        "@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",
        "@com_google_protobuf//:field_mask_cc_proto",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_library(
    name = "cel_expression_builder_flat_impl",
    srcs = [
        "cel_expression_builder_flat_impl.cc",
    ],
    hdrs = [
        "cel_expression_builder_flat_impl.h",
    ],
    deps = [
        ":flat_expr_builder",
        "//base:ast",
        "//common:native_type",
        "//eval/eval:cel_expression_flat_impl",
        "//eval/eval:direct_expression_step",
        "//eval/eval:evaluator_core",
        "//eval/public:cel_expression",
        "//eval/public:cel_function_registry",
        "//eval/public:cel_type_registry",
        "//extensions/protobuf:ast_converters",
        "//internal:status_macros",
        "//runtime:runtime_issue",
        "//runtime:runtime_options",
        "//runtime/internal:runtime_env",
        "@com_google_absl//absl/base:core_headers",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/log:absl_check",
        "@com_google_absl//absl/log:check",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings:string_view",
        "@com_google_cel_spec//proto/cel/expr:checked_cc_proto",
        "@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",
    ],
)

cc_test(
    name = "cel_expression_builder_flat_impl_test",
    srcs = [
        "cel_expression_builder_flat_impl_test.cc",
    ],
    deps = [
        ":cel_expression_builder_flat_impl",
        ":constant_folding",
        ":regex_precompilation_optimization",
        "//eval/eval:cel_expression_flat_impl",
        "//eval/public:activation",
        "//eval/public:builtin_func_registrar",
        "//eval/public:cel_expression",
        "//eval/public:cel_function",
        "//eval/public:cel_value",
        "//eval/public:portable_cel_function_adapter",
        "//eval/public/containers:container_backed_map_impl",
        "//eval/public/structs:cel_proto_wrapper",
        "//eval/public/structs:protobuf_descriptor_type_provider",
        "//eval/public/testing:matchers",
        "//extensions:bindings_ext",
        "//internal:status_macros",
        "//internal:testing",
        "//parser",
        "//parser:macro",
        "//runtime:runtime_options",
        "//runtime/internal:runtime_env_testing",
        "@com_google_absl//absl/algorithm:container",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings:string_view",
        "@com_google_cel_spec//proto/cel/expr:checked_cc_proto",
        "@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",
        "@com_google_cel_spec//proto/cel/expr/conformance/proto3:test_all_types_cc_proto",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_library(
    name = "constant_folding",
    srcs = [
        "constant_folding.cc",
    ],
    hdrs = [
        "constant_folding.h",
    ],
    deps = [
        ":flat_expr_builder_extensions",
        ":resolver",
        "//base:builtins",
        "//base:data",
        "//common:ast",
        "//common:constant",
        "//common:expr",
        "//common:value",
        "//eval/eval:const_value_step",
        "//eval/eval:evaluator_core",
        "//internal:status_macros",
        "//runtime:activation",
        "//runtime/internal:convert_constant",
        "@com_google_absl//absl/base:core_headers",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_test(
    name = "constant_folding_test",
    srcs = [
        "constant_folding_test.cc",
    ],
    deps = [
        ":constant_folding",
        ":flat_expr_builder_extensions",
        ":resolver",
        "//base:ast",
        "//common:expr",
        "//common:value",
        "//eval/eval:const_value_step",
        "//eval/eval:create_list_step",
        "//eval/eval:create_map_step",
        "//eval/eval:evaluator_core",
        "//extensions/protobuf:ast_converters",
        "//internal:status_macros",
        "//internal:testing",
        "//parser",
        "//runtime:function_registry",
        "//runtime:runtime_issue",
        "//runtime:runtime_options",
        "//runtime:type_registry",
        "//runtime/internal:issue_collector",
        "//runtime/internal:runtime_env",
        "//runtime/internal:runtime_env_testing",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:status_matchers",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
        "@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_library(
    name = "qualified_reference_resolver",
    srcs = [
        "qualified_reference_resolver.cc",
    ],
    hdrs = [
        "qualified_reference_resolver.h",
    ],
    deps = [
        ":flat_expr_builder_extensions",
        ":resolver",
        "//base:ast",
        "//base:builtins",
        "//common:ast",
        "//common:ast_rewrite",
        "//common:expr",
        "//common:kind",
        "//runtime:runtime_issue",
        "//runtime/internal:issue_collector",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/container:flat_hash_set",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
        "@com_google_absl//absl/types:optional",
    ],
)

cc_library(
    name = "check_ast_extensions",
    srcs = ["check_ast_extensions.cc"],
    hdrs = ["check_ast_extensions.h"],
    deps = [
        "//common:ast",
        "//common/ast:metadata",
        "@com_google_absl//absl/container:flat_hash_set",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
    ],
)

cc_test(
    name = "check_ast_extensions_test",
    srcs = ["check_ast_extensions_test.cc"],
    deps = [
        ":check_ast_extensions",
        "//common:ast",
        "//common:expr",
        "//common/ast:metadata",
        "//internal:testing",
        "@com_google_absl//absl/status",
    ],
)

cc_library(
    name = "resolver",
    srcs = ["resolver.cc"],
    hdrs = ["resolver.h"],
    deps = [
        "//common:kind",
        "//common:type",
        "//common:value",
        "//internal:status_macros",
        "//runtime:function_overload_reference",
        "//runtime:function_registry",
        "//runtime:type_registry",
        "@com_google_absl//absl/base:no_destructor",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
        "@com_google_absl//absl/types:optional",
        "@com_google_absl//absl/types:span",
    ],
)

cc_test(
    name = "qualified_reference_resolver_test",
    srcs = [
        "qualified_reference_resolver_test.cc",
    ],
    deps = [
        ":qualified_reference_resolver",
        ":resolver",
        "//base:ast",
        "//base:builtins",
        "//common:ast",
        "//common:expr",
        "//common/ast:expr_proto",
        "//eval/public:builtin_func_registrar",
        "//eval/public:cel_function",
        "//eval/public:cel_function_registry",
        "//eval/public:cel_value",
        "//extensions/protobuf:ast_converters",
        "//internal:proto_matchers",
        "//internal:testing",
        "//runtime:runtime_issue",
        "//runtime:type_registry",
        "//runtime/internal:issue_collector",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/log:absl_check",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/strings",
        "@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_test(
    name = "flat_expr_builder_short_circuiting_conformance_test",
    srcs = [
        "flat_expr_builder_short_circuiting_conformance_test.cc",
    ],
    deps = [
        ":cel_expression_builder_flat_impl",
        "//base:builtins",
        "//eval/public:activation",
        "//eval/public:cel_attribute",
        "//eval/public:cel_expression",
        "//eval/public:cel_value",
        "//eval/public:unknown_attribute_set",
        "//eval/public:unknown_set",
        "//internal:testing",
        "//runtime:runtime_options",
        "//runtime/internal:runtime_env_testing",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/strings",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_test(
    name = "resolver_test",
    size = "small",
    srcs = ["resolver_test.cc"],
    deps = [
        ":resolver",
        "//common:value",
        "//eval/public:cel_function",
        "//eval/public:cel_function_registry",
        "//eval/public:cel_type_registry",
        "//eval/public:cel_value",
        "//eval/testutil:test_message_cc_proto",
        "//internal:testing",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/types:span",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_library(
    name = "regex_precompilation_optimization",
    srcs = ["regex_precompilation_optimization.cc"],
    hdrs = ["regex_precompilation_optimization.h"],
    deps = [
        ":flat_expr_builder_extensions",
        "//base:builtins",
        "//common:ast",
        "//common:casting",
        "//common:expr",
        "//common:native_type",
        "//common:value",
        "//eval/eval:compiler_constant_step",
        "//eval/eval:direct_expression_step",
        "//eval/eval:evaluator_core",
        "//eval/eval:regex_match_step",
        "//internal:casts",
        "//internal:re2_options",
        "//internal:status_macros",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
        "@com_google_absl//absl/strings",
        "@com_google_absl//absl/types:optional",
        "@com_googlesource_code_re2//:re2",
    ],
)

cc_test(
    name = "regex_precompilation_optimization_test",
    srcs = ["regex_precompilation_optimization_test.cc"],
    deps = [
        ":cel_expression_builder_flat_impl",
        ":constant_folding",
        ":flat_expr_builder",
        ":flat_expr_builder_extensions",
        ":regex_precompilation_optimization",
        ":resolver",
        "//common:ast",
        "//eval/eval:evaluator_core",
        "//eval/public:activation",
        "//eval/public:builtin_func_registrar",
        "//eval/public:cel_expression",
        "//eval/public:cel_function_registry",
        "//eval/public:cel_options",
        "//eval/public:cel_type_registry",
        "//eval/public:cel_value",
        "//internal:testing",
        "//parser",
        "//runtime:runtime_issue",
        "//runtime:runtime_options",
        "//runtime/internal:issue_collector",
        "//runtime/internal:runtime_env",
        "//runtime/internal:runtime_env_testing",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/status",
        "@com_google_cel_spec//proto/cel/expr:checked_cc_proto",
        "@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",
        "@com_google_protobuf//:protobuf",
    ],
)

cc_library(
    name = "comprehension_vulnerability_check",
    srcs = ["comprehension_vulnerability_check.cc"],
    hdrs = ["comprehension_vulnerability_check.h"],
    deps = [
        ":flat_expr_builder_extensions",
        "//base:builtins",
        "//common:ast",
        "//common:constant",
        "//common:expr",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/strings:string_view",
        "@com_google_absl//absl/types:variant",
    ],
)

cc_library(
    name = "instrumentation",
    srcs = ["instrumentation.cc"],
    hdrs = ["instrumentation.h"],
    deps = [
        ":flat_expr_builder_extensions",
        "//common:ast",
        "//common:expr",
        "//common:value",
        "//eval/eval:evaluator_core",
        "//eval/eval:expression_step_base",
        "@com_google_absl//absl/functional:any_invocable",
        "@com_google_absl//absl/status",
        "@com_google_absl//absl/status:statusor",
    ],
)

cc_test(
    name = "instrumentation_test",
    srcs = ["instrumentation_test.cc"],
    deps = [
        ":constant_folding",
        ":flat_expr_builder",
        ":instrumentation",
        ":regex_precompilation_optimization",
        "//common:ast",
        "//common:value",
        "//eval/eval:evaluator_core",
        "//extensions/protobuf:ast_converters",
        "//internal:testing",
        "//parser",
        "//runtime:activation",
        "//runtime:function_registry",
        "//runtime:runtime_options",
        "//runtime:standard_functions",
        "//runtime:type_registry",
        "//runtime/internal:runtime_env",
        "//runtime/internal:runtime_env_testing",
        "@com_google_absl//absl/base:nullability",
        "@com_google_absl//absl/container:flat_hash_map",
        "@com_google_absl//absl/status",
        "@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",
        "@com_google_protobuf//:protobuf",
    ],
)
