# Inference of nullability annotations

load("@bazel_tools//tools/build_defs/cc:cc_embed_data.bzl", "cc_embed_data")
load("@rules_proto//proto:defs.bzl", "proto_library")
load("@protobuf//bazel:proto_library.bzl", "proto_library")
load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_cc//cc:cc_test.bzl", "cc_test")

package(default_applicable_licenses = ["//:license"])

cc_library(
    name = "collect_evidence",
    srcs = ["collect_evidence.cc"],
    hdrs = ["collect_evidence.h"],
    deps = [
        ":inferable",
        ":inference_cc_proto",
        ":slot_fingerprint",
        ":usr_cache",
        "//nullability:ast_helpers",
        "//nullability:forwarding_functions",
        "//nullability:loc_filter",
        "//nullability:macro_arg_capture",
        "//nullability:pointer_nullability",
        "//nullability:pointer_nullability_analysis",
        "//nullability:pointer_nullability_lattice",
        "//nullability:pragma",
        "//nullability:type_nullability",
        "@abseil-cpp//absl/base:nullability",
        "@abseil-cpp//absl/container:flat_hash_map",
        "@abseil-cpp//absl/log:check",
        "@llvm-project//clang:analysis",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:basic",
        "@llvm-project//clang:unified_symbol_resolution",
        "@llvm-project//llvm:Support",
        "@protobuf:protobuf_lite",
    ],
)

cc_test(
    name = "collect_evidence_test",
    srcs = ["collect_evidence_test.cc"],
    deps = [
        ":augmented_test_inputs",
        ":collect_evidence",
        ":collect_evidence_test_utilities",
        ":inference_cc_proto",
        ":proto_matchers",
        ":slot_fingerprint",
        ":usr_cache",
        "//nullability:pragma",
        "@llvm-project//clang:analysis",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:ast_matchers",
        "@llvm-project//clang:basic",
        "@llvm-project//clang:frontend",
        "@llvm-project//clang:testing",
        "@llvm-project//clang/unittests:dataflow_testing_support",
        "@llvm-project//llvm:Support",
        "@llvm-project//llvm:TestingADT",
        "@llvm-project//llvm:TestingSupport",
        "@llvm-project//third-party/unittest:gmock",
        "@llvm-project//third-party/unittest:gtest",
        "@llvm-project//third-party/unittest:gtest_main",
    ],
)

cc_library(
    name = "merge",
    srcs = ["merge.cc"],
    hdrs = ["merge.h"],
    deps = [
        ":inference_cc_proto",
        "@abseil-cpp//absl/log:check",
        "@llvm-project//llvm:Support",
    ],
)

cc_library(
    name = "proto_matchers",
    testonly = 1,
    srcs = ["proto_matchers.cc"],
    hdrs = ["proto_matchers.h"],
    visibility = [":__subpackages__"],
    deps = [
        "//third_party/protobuf",
        "@abseil-cpp//absl/base:nullability",
        "@llvm-project//llvm:Support",
        "@llvm-project//third-party/unittest:gmock",
        "@llvm-project//third-party/unittest:gtest",
    ],
)

cc_test(
    name = "merge_test",
    srcs = ["merge_test.cc"],
    deps = [
        ":inference_cc_proto",
        ":merge",
        ":proto_matchers",
        "//third_party/protobuf",
        "@abseil-cpp//absl/log:check",
        "@llvm-project//llvm:Support",
        "@llvm-project//third-party/unittest:gmock",
        "@llvm-project//third-party/unittest:gtest",
        "@llvm-project//third-party/unittest:gtest_main",
    ],
)

cc_library(
    name = "inferable",
    srcs = ["inferable.cc"],
    hdrs = ["inferable.h"],
    deps = [
        ":inference_cc_proto",
        "//nullability:type_nullability",
        "@abseil-cpp//absl/base:nullability",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:basic",
        "@llvm-project//llvm:Support",
    ],
)

cc_test(
    name = "inferable_test",
    srcs = ["inferable_test.cc"],
    deps = [
        ":inferable",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:ast_matchers",
        "@llvm-project//clang:basic",
        "@llvm-project//clang:testing",
        "@llvm-project//llvm:Support",
        "@llvm-project//third-party/unittest:gmock",
        "@llvm-project//third-party/unittest:gtest",
        "@llvm-project//third-party/unittest:gtest_main",
    ],
)

cc_library(
    name = "infer_tu",
    srcs = ["infer_tu.cc"],
    hdrs = ["infer_tu.h"],
    deps = [
        ":collect_evidence",
        ":inference_cc_proto",
        ":merge",
        ":slot_fingerprint",
        ":usr_cache",
        "//nullability:pragma",
        "@abseil-cpp//absl/container:flat_hash_map",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:basic",
        "@llvm-project//llvm:Support",
    ],
)

cc_library(
    name = "slot_fingerprint",
    srcs = ["slot_fingerprint.cc"],
    hdrs = ["slot_fingerprint.h"],
    deps = ["@llvm-project//llvm:Support"],
)

cc_library(
    name = "eligible_ranges",
    srcs = ["eligible_ranges.cc"],
    hdrs = ["eligible_ranges.h"],
    deps = [
        ":inferable",
        ":inference_cc_proto",
        ":usr_cache",
        "//nullability:annotations",
        "//nullability:loc_filter",
        "//nullability:type_nullability",
        "@abseil-cpp//absl/base:nullability",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:basic",
        "@llvm-project//clang:lex",
        "@llvm-project//clang:transformer",
        "@llvm-project//clang:unified_symbol_resolution",
        "@llvm-project//clang-tools-extra/clang-tidy:tidy_framework",
        "@llvm-project//llvm:Support",
    ],
)

cc_test(
    name = "eligible_ranges_test",
    srcs = ["eligible_ranges_test.cc"],
    deps = [
        ":augmented_test_inputs",
        ":eligible_ranges",
        ":eligible_ranges_for_test",
        ":inference_cc_proto",
        ":proto_matchers",
        "//nullability:pragma",
        "//nullability:type_nullability",
        "@abseil-cpp//absl/log:check",
        "@abseil-cpp//absl/strings",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:ast_matchers",
        "@llvm-project//clang:basic",
        "@llvm-project//clang:testing",
        "@llvm-project//llvm:Support",
        "@llvm-project//llvm:TestingAnnotations",
        "@llvm-project//third-party/unittest:gmock",
        "@llvm-project//third-party/unittest:gtest",
        "@llvm-project//third-party/unittest:gtest_main",
    ],
)

cc_test(
    name = "slot_fingerprint_test",
    srcs = ["slot_fingerprint_test.cc"],
    deps = [
        ":slot_fingerprint",
        "@llvm-project//third-party/unittest:gtest",
        "@llvm-project//third-party/unittest:gtest_main",
    ],
)

cc_test(
    name = "infer_tu_test",
    srcs = ["infer_tu_test.cc"],
    deps = [
        ":augmented_test_inputs",
        ":infer_tu",
        ":inference_cc_proto",
        ":proto_matchers",
        "//nullability:pragma",
        "@abseil-cpp//absl/container:flat_hash_map",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:ast_matchers",
        "@llvm-project//clang:basic",
        "@llvm-project//clang:testing",
        "@llvm-project//clang:unified_symbol_resolution",
        "@llvm-project//llvm:Support",
        "@llvm-project//third-party/unittest:gmock",
        "@llvm-project//third-party/unittest:gtest",
        "@llvm-project//third-party/unittest:gtest_main",
    ],
)

cc_binary(
    name = "infer_tu_main",
    srcs = ["infer_tu_main.cc"],
    deps = [
        ":clang_tidy_nullability_replacement_macros",
        ":infer_tu",
        ":inference_cc_proto",
        ":replace_macros",
        "//nullability:pragma",
        "@abseil-cpp//absl/base:nullability",
        "@abseil-cpp//absl/container:flat_hash_map",
        "@abseil-cpp//absl/log:check",
        "@abseil-cpp//absl/strings",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:basic",
        "@llvm-project//clang:frontend",
        "@llvm-project//clang:tooling",
        "@llvm-project//clang:unified_symbol_resolution",
        "@llvm-project//llvm:Support",
    ],
)

proto_library(
    name = "inference_proto",
    srcs = ["inference.proto"],
)

cc_proto_library(
    name = "inference_cc_proto",
    deps = [":inference_proto"],
)

filegroup(
    name = "replacement_macros_exclude_from_build_cleaner",
    srcs = ["clang_tidy_nullability_replacement_macros.h"],
    tags = ["ignore_srcs"],
    visibility = ["//visibility:private"],
)

cc_embed_data(
    name = "clang_tidy_nullability_replacement_macros",
    srcs = ["clang_tidy_nullability_replacement_macros.h"],
    outs = [
        "ctn_replacement_macros.cc",
        "ctn_replacement_macros.h",
        "ctn_replacement_macros.o",
    ],
)

cc_library(
    name = "replace_macros",
    srcs = ["replace_macros.cc"],
    hdrs = ["replace_macros.h"],
    deps = [
        "@llvm-project//clang:ast",
        "@llvm-project//clang:basic",
        "@llvm-project//clang:frontend",
        "@llvm-project//clang:lex",
        "@llvm-project//llvm:Support",
    ],
)

cc_library(
    name = "augmented_test_inputs",
    testonly = True,
    srcs = ["augmented_test_inputs.cc"],
    hdrs = ["augmented_test_inputs.h"],
    deps = [
        ":clang_tidy_nullability_replacement_macros",
        ":replace_macros",
        "//nullability:pragma",
        "//nullability/test:mock_headers",
        "@llvm-project//clang:frontend",
        "@llvm-project//clang:testing",
        "@llvm-project//llvm:Support",
    ],
)

cc_library(
    name = "usr_cache",
    srcs = ["usr_cache.cc"],
    hdrs = ["usr_cache.h"],
    deps = [
        "@llvm-project//clang:ast",
        "@llvm-project//clang:unified_symbol_resolution",
        "@llvm-project//llvm:Support",
    ],
)

cc_library(
    name = "eligible_ranges_for_test",
    testonly = True,
    hdrs = ["eligible_ranges_for_test.h"],
    deps = [
        ":eligible_ranges",
        "//nullability:type_nullability",
        "@llvm-project//clang:ast",
    ],
)

cc_library(
    name = "collect_evidence_test_utilities",
    testonly = True,
    srcs = ["collect_evidence_test_utilities.cc"],
    hdrs = ["collect_evidence_test_utilities.h"],
    deps = [
        ":augmented_test_inputs",
        ":collect_evidence",
        ":inference_cc_proto",
        ":usr_cache",
        "//nullability:pointer_nullability_analysis",
        "//nullability:pragma",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:testing",
        "@llvm-project//clang/unittests:dataflow_testing_support",
        "@llvm-project//llvm:Support",
        "@llvm-project//llvm:TestingSupport",
        "@llvm-project//third-party/unittest:gmock",
        "@llvm-project//third-party/unittest:gtest",
    ],
)

cc_test(
    name = "replace_macros_test",
    srcs = ["replace_macros_test.cc"],
    deps = [
        ":clang_tidy_nullability_replacement_macros",
        ":replace_macros",
        "//nullability:macro_arg_capture",
        "@llvm-project//clang:ast",
        "@llvm-project//clang:ast_matchers",
        "@llvm-project//clang:testing",
        "@llvm-project//llvm:Support",
        "@llvm-project//third-party/unittest:gmock",
        "@llvm-project//third-party/unittest:gtest",
    ],
)
