# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Shared utilities for Emboss back ends.

package(
    default_visibility = ["//compiler:__subpackages__"],
)

py_library(
    name = "ir_pb2",
    srcs = [
        "ir_pb2.py",
    ],
)

py_library(
    name = "expression_parser",
    srcs = ["expression_parser.py"],
    deps = [
        "//compiler/front_end:module_ir",
        "//compiler/front_end:parser",
        "//compiler/front_end:tokenizer",
    ],
)

py_library(
    name = "ir_util",
    srcs = ["ir_util.py"],
    deps = [":ir_pb2"],
)

py_test(
    name = "ir_util_test",
    srcs = ["ir_util_test.py"],
    python_version = "PY3",
    deps = [
        ":expression_parser",
        ":ir_pb2",
        ":ir_util",
    ],
)

py_library(
    name = "attribute_util",
    srcs = ["attribute_util.py"],
    deps = [
        ":error",
        ":ir_pb2",
        ":ir_util",
        ":traverse_ir",
    ],
)

py_library(
    name = "simple_memoizer",
    srcs = ["simple_memoizer.py"],
    deps = [],
)

py_test(
    name = "simple_memoizer_test",
    srcs = ["simple_memoizer_test.py"],
    python_version = "PY3",
    deps = [
        ":simple_memoizer",
    ],
)

py_library(
    name = "test_util",
    testonly = 1,
    srcs = ["test_util.py"],
    deps = [],
)

py_test(
    name = "test_util_test",
    srcs = ["test_util_test.py"],
    python_version = "PY3",
    deps = [
        ":test_util",
        "//compiler/util:ir_pb2",
        "//compiler/util:parser_types",
    ],
)

py_library(
    name = "traverse_ir",
    srcs = ["traverse_ir.py"],
    deps = [
        ":simple_memoizer",
        ":ir_pb2",
    ],
)

py_test(
    name = "traverse_ir_test",
    srcs = ["traverse_ir_test.py"],
    python_version = "PY3",
    deps = [
        ":traverse_ir",
        ":ir_pb2",
    ],
)

py_library(
    name = "parser_types",
    srcs = ["parser_types.py"],
    deps = [
        ":ir_pb2",
    ],
)

py_test(
    name = "parser_types_test",
    srcs = ["parser_types_test.py"],
    python_version = "PY3",
    deps = [
        ":parser_types",
        ":ir_pb2",
    ],
)

py_library(
    name = "error",
    srcs = [
        "error.py",
    ],
    deps = [
        ":parser_types",
    ],
)

py_test(
    name = "error_test",
    srcs = ["error_test.py"],
    python_version = "PY3",
    deps = [
        ":error",
        ":parser_types",
    ],
)

py_library(
    name = "name_conversion",
    srcs = ["name_conversion.py"],
    deps = [],
)

py_test(
    name = "name_conversion_test",
    srcs = ["name_conversion_test.py"],
    python_version = "PY3",
    deps = [
        ":name_conversion",
    ],
)

py_library(
    name = "resources",
    srcs = ["resources.py"],
    deps = [],
)
