###############################################################################
# @generated
# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To
# regenerate this file, run the following:
#
#     bazel run //wasm_bindgen/3rdparty:crates_vendor
###############################################################################

load(
    "@bazel_skylib//lib:selects.bzl",
    "selects",
)
load(
    "@rules_rust//cargo:defs.bzl",
    "cargo_build_script",
)

# buildifier: disable=bzl-visibility
load("@rules_rust//crate_universe/private:selects.bzl", "select_with_or")
load(
    "@rules_rust//rust:defs.bzl",
    "rust_library",
)

package(default_visibility = ["//visibility:public"])

# licenses([
#     "TODO",  # MIT OR Apache-2.0
# ])

rust_library(
    name = "proc_macro2",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    compile_data = glob(
        include = ["**"],
        exclude = [
            "BUILD",
            "BUILD.bazel",
            "WORKSPACE",
            "WORKSPACE.bazel",
        ],
    ) + select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "default",
        "proc-macro",
    ],
    crate_root = "src/lib.rs",
    data = select_with_or({
        "//conditions:default": [
        ],
    }),
    edition = "2018",
    proc_macro_deps = [
    ] + select_with_or({
        "//conditions:default": [
        ],
    }),
    rustc_env = {
    },
    rustc_env_files = select_with_or({
        "//conditions:default": [
        ],
    }),
    rustc_flags = [
        # In most cases, warnings in 3rd party crates are not interesting as
        # they're out of the control of consumers. The flag here silences
        # warnings. For more details see:
        # https://doc.rust-lang.org/rustc/lints/levels.html
        "--cap-lints=allow",

        # User provided rustc_flags
        "--cfg=use_proc_macro",
    ],
    tags = [
        "cargo-bazel",
        "manual",
        "noclippy",
        "norustfmt",
    ],
    version = "1.0.40",
    deps = [
    ] + select_with_or({
        "//conditions:default": [
            "@rules_rust_wasm_bindgen__proc-macro2-1.0.40//:build_script_build",
            "@rules_rust_wasm_bindgen__unicode-ident-1.0.1//:unicode_ident",
        ],
    }),
)

cargo_build_script(
    # See comment associated with alias. Do not change this name
    name = "proc-macro2_build_script",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    build_script_env = {
    },
    compile_data = select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "default",
        "proc-macro",
    ],
    crate_name = "build_script_build",
    crate_root = "build.rs",
    data = glob(["**"]) + select_with_or({
        "//conditions:default": [
        ],
    }),
    edition = "2018",
    proc_macro_deps = [
    ] + select_with_or({
        "//conditions:default": [
        ],
    }),
    rustc_env = {
    },
    rustc_env_files = select_with_or({
        "//conditions:default": [
        ],
    }),
    rustc_flags = [
        # In most cases, warnings in 3rd party crates are not interesting as
        # they're out of the control of consumers. The flag here silences
        # warnings. For more details see:
        # https://doc.rust-lang.org/rustc/lints/levels.html
        "--cap-lints=allow",

        # User provided rustc_flags
        "--cfg=use_proc_macro",
    ],
    tags = [
        "cargo-bazel",
        "manual",
        "noclippy",
        "norustfmt",
    ],
    tools = select_with_or({
        "//conditions:default": [
        ],
    }),
    version = "1.0.40",
    visibility = ["//visibility:private"],
    deps = [
    ] + select_with_or({
        "//conditions:default": [
        ],
    }),
)

alias(
    # Because `cargo_build_script` does some invisible target name mutating to
    # determine the package and crate name for a build script, the Bazel
    # target namename of any build script cannot be the Cargo canonical name
    # of `build_script_build` without losing out on having certain Cargo
    # environment variables set.
    name = "build_script_build",
    actual = "proc-macro2_build_script",
    tags = [
        "manual",
    ],
)
