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()] %}