Type-safe enums and bitmasks.
An inline value class is used to allow type checked enums and bitmasks without boxing. @JvnName is used to avoid name manging that prevents JNI.
Bug: 331597870
Change-Id: Ib9e9716d4449e0e5a6073aefe7b20f77fefb529b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/187340
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jim Blackler <jimblackler@google.com>
diff --git a/generator/templates/art/api_kotlin_enum.kt b/generator/templates/art/api_kotlin_enum.kt
index c54f813..ff87ebd 100644
--- a/generator/templates/art/api_kotlin_enum.kt
+++ b/generator/templates/art/api_kotlin_enum.kt
@@ -26,8 +26,15 @@
//* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package {{ metadata.kotlin_package }}
-object {{ enum.name.CamelCase() }} {
- {% for value in enum.values %}
- const val {{ as_ktName(value.name.CamelCase() ) }} = {{ '{:#010x}'.format(value.value) }};
- {% endfor %}
+@JvmInline
+value class {{ enum.name.CamelCase() }}(val v: Int) {
+ {% if enum.category == 'bitmask' %}
+ infix fun or(b: {{ enum.name.CamelCase() }}) = {{ enum.name.CamelCase() }}(this.v or b.v)
+ {% endif %}
+ companion object {
+ {% for value in enum.values %}
+ val {{ as_ktName(value.name.CamelCase()) }} =
+ {{- enum.name.CamelCase() }}({{ '{:#010x}'.format(value.value) }})
+ {% endfor %}
+ }
}
diff --git a/generator/templates/art/api_kotlin_structure.kt b/generator/templates/art/api_kotlin_structure.kt
index 076b4f6..a1c36e2 100644
--- a/generator/templates/art/api_kotlin_structure.kt
+++ b/generator/templates/art/api_kotlin_structure.kt
@@ -29,6 +29,9 @@
class {{ structure.name.CamelCase() }}(
{% for member in structure.members %}
+ {%- if member.type.category in ['bitmask', 'enum'] -%}
+ @get:JvmName("get{{ member.name.CamelCase() }}")
+ {% endif %}
var {{ member.name.camelCase() }}: {{ kotlin_declaration(member) }},
{% endfor %}
{% for structure in chain_children[structure.name.get()] %}