xref: /aosp_15_r20/external/emboss/compiler/back_end/cpp/attributes.py (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1*99e0aae7SDavid Rees# Copyright 2023 Google LLC
2*99e0aae7SDavid Rees#
3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License");
4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License.
5*99e0aae7SDavid Rees# You may obtain a copy of the License at
6*99e0aae7SDavid Rees#
7*99e0aae7SDavid Rees#     https://www.apache.org/licenses/LICENSE-2.0
8*99e0aae7SDavid Rees#
9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software
10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS,
11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and
13*99e0aae7SDavid Rees# limitations under the License.
14*99e0aae7SDavid Rees
15*99e0aae7SDavid Rees"""Attributes in the C++ backend and associated metadata."""
16*99e0aae7SDavid Rees
17*99e0aae7SDavid Reesfrom enum import Enum
18*99e0aae7SDavid Reesfrom compiler.util import attribute_util
19*99e0aae7SDavid Rees
20*99e0aae7SDavid Rees
21*99e0aae7SDavid Reesclass Attribute(str, Enum):
22*99e0aae7SDavid Rees    """Attributes available in the C++ backend."""
23*99e0aae7SDavid Rees    NAMESPACE = "namespace"
24*99e0aae7SDavid Rees    ENUM_CASE = "enum_case"
25*99e0aae7SDavid Rees
26*99e0aae7SDavid Rees
27*99e0aae7SDavid Rees# Types associated with C++ backend attributes.
28*99e0aae7SDavid ReesTYPES = {
29*99e0aae7SDavid Rees    Attribute.NAMESPACE: attribute_util.STRING,
30*99e0aae7SDavid Rees    Attribute.ENUM_CASE: attribute_util.STRING,
31*99e0aae7SDavid Rees}
32*99e0aae7SDavid Rees
33*99e0aae7SDavid Rees
34*99e0aae7SDavid Reesclass Scope(set, Enum):
35*99e0aae7SDavid Rees    """Allowed scopes for C++ backend attributes.
36*99e0aae7SDavid Rees
37*99e0aae7SDavid Rees    Each entry is a set of (Attribute, default?) tuples, the first value being
38*99e0aae7SDavid Rees    the attribute itself, the second value being a boolean value indicating
39*99e0aae7SDavid Rees    whether the attribute is allowed to be defaulted in that scope."""
40*99e0aae7SDavid Rees    BITS = {
41*99e0aae7SDavid Rees        # Bits may contain an enum definition.
42*99e0aae7SDavid Rees        (Attribute.ENUM_CASE, True)
43*99e0aae7SDavid Rees    }
44*99e0aae7SDavid Rees    ENUM = {
45*99e0aae7SDavid Rees        (Attribute.ENUM_CASE, True),
46*99e0aae7SDavid Rees    }
47*99e0aae7SDavid Rees    ENUM_VALUE = {
48*99e0aae7SDavid Rees        (Attribute.ENUM_CASE, False),
49*99e0aae7SDavid Rees    }
50*99e0aae7SDavid Rees    MODULE = {
51*99e0aae7SDavid Rees        (Attribute.NAMESPACE, False),
52*99e0aae7SDavid Rees        (Attribute.ENUM_CASE, True),
53*99e0aae7SDavid Rees    },
54*99e0aae7SDavid Rees    STRUCT = {
55*99e0aae7SDavid Rees        # Struct may contain an enum definition.
56*99e0aae7SDavid Rees        (Attribute.ENUM_CASE, True),
57*99e0aae7SDavid Rees    }
58