[Kotlin] Control the generation of reflection with --reflect-names (#7775)

* [Kotlin] Control the generation of reflection with --reflect-names.
Tested:
```
$ cmake -G "Unix Makefiles" && make && ./tests/flatc/main.py
...
KotlinTests.EnumValAttributes
 [PASSED]
KotlinTests.EnumValAttributes_ReflectNames
 [PASSED]
KotlinTests: 2 of 2 passsed
...

35 of 35 tests passed
```

* [Kotlin] Fix SampleBinary by converting Byte to UByte for ubyte fields.

* [Kotlin] Annotate all generated classes with kotlin.ExperimentalUnsignedTypes.
diff --git a/samples/SampleBinary.kt b/samples/SampleBinary.kt
index 2974f36..04a749c 100644
--- a/samples/SampleBinary.kt
+++ b/samples/SampleBinary.kt
@@ -24,6 +24,7 @@
 
 import com.google.flatbuffers.FlatBufferBuilder
 
+@kotlin.ExperimentalUnsignedTypes
 class SampleBinary {
 
   companion object {
@@ -45,7 +46,7 @@
 
         // Serialize the FlatBuffer data.
         val name = builder.createString("Orc")
-        val treasure = byteArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
+        val treasure = byteArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asUByteArray()
         val inv = Monster.createInventoryVector(builder, treasure)
         val weapons = Monster.createWeaponsVector(builder, weaps)
         val pos = Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f)
@@ -85,7 +86,7 @@
 
         // Get and test the `inventory` FlatBuffer `vector`.
         for (i in 0 until monster.inventoryLength) {
-            assert(monster.inventory(i) == i.toByte().toInt())
+            assert(monster.inventory(i) == i.toUByte())
         }
 
         // Get and test the `weapons` FlatBuffer `vector` of `table`s.
diff --git a/src/idl_gen_kotlin.cpp b/src/idl_gen_kotlin.cpp
index b19f2a3..2cbed65 100644
--- a/src/idl_gen_kotlin.cpp
+++ b/src/idl_gen_kotlin.cpp
@@ -287,6 +287,7 @@
     GenerateComment(enum_def.doc_comment, writer, &comment_config);
 
     writer += "@Suppress(\"unused\")";
+    writer += "@kotlin.ExperimentalUnsignedTypes";
     writer += "class " + namer_.Type(enum_def) + " private constructor() {";
     writer.IncrementIdentLevel();
 
@@ -313,7 +314,10 @@
       // Average distance between values above which we consider a table
       // "too sparse". Change at will.
       static const uint64_t kMaxSparseness = 5;
-      if (range / static_cast<uint64_t>(enum_def.size()) < kMaxSparseness) {
+      bool generate_names =
+          range / static_cast<uint64_t>(enum_def.size()) < kMaxSparseness &&
+          parser_.opts.mini_reflect == IDLOptions::kTypesAndNames;
+      if (generate_names) {
         GeneratePropertyOneLine(writer, "names", "Array<String>", [&]() {
           writer += "arrayOf(\\";
           auto val = enum_def.Vals().front();
@@ -489,6 +493,7 @@
     writer.SetValue("superclass", fixed ? "Struct" : "Table");
 
     writer += "@Suppress(\"unused\")";
+    writer += "@kotlin.ExperimentalUnsignedTypes";
     writer += "class {{struct_name}} : {{superclass}}() {\n";
 
     writer.IncrementIdentLevel();
diff --git a/tests/DictionaryLookup/LongFloatEntry.kt b/tests/DictionaryLookup/LongFloatEntry.kt
index d49afa4..5ba11bf 100644
--- a/tests/DictionaryLookup/LongFloatEntry.kt
+++ b/tests/DictionaryLookup/LongFloatEntry.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class LongFloatEntry : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/DictionaryLookup/LongFloatMap.kt b/tests/DictionaryLookup/LongFloatMap.kt
index bc1541f..bb0cd3e 100644
--- a/tests/DictionaryLookup/LongFloatMap.kt
+++ b/tests/DictionaryLookup/LongFloatMap.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class LongFloatMap : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/Ability.kt b/tests/MyGame/Example/Ability.kt
index dc2b0b8..a3e17be 100644
--- a/tests/MyGame/Example/Ability.kt
+++ b/tests/MyGame/Example/Ability.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Ability : Struct() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/Any.kt b/tests/MyGame/Example/Any.kt
index 5a7ecf7..8818c39 100644
--- a/tests/MyGame/Example/Any.kt
+++ b/tests/MyGame/Example/Any.kt
@@ -3,6 +3,7 @@
 package MyGame.Example
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Any_ private constructor() {
     companion object {
         const val NONE: UByte = 0u
diff --git a/tests/MyGame/Example/AnyAmbiguousAliases.kt b/tests/MyGame/Example/AnyAmbiguousAliases.kt
index c38923b..4043096 100644
--- a/tests/MyGame/Example/AnyAmbiguousAliases.kt
+++ b/tests/MyGame/Example/AnyAmbiguousAliases.kt
@@ -3,6 +3,7 @@
 package MyGame.Example
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class AnyAmbiguousAliases private constructor() {
     companion object {
         const val NONE: UByte = 0u
diff --git a/tests/MyGame/Example/AnyUniqueAliases.kt b/tests/MyGame/Example/AnyUniqueAliases.kt
index 2db45a6..8be0cc8 100644
--- a/tests/MyGame/Example/AnyUniqueAliases.kt
+++ b/tests/MyGame/Example/AnyUniqueAliases.kt
@@ -3,6 +3,7 @@
 package MyGame.Example
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class AnyUniqueAliases private constructor() {
     companion object {
         const val NONE: UByte = 0u
diff --git a/tests/MyGame/Example/Color.kt b/tests/MyGame/Example/Color.kt
index 0af56e1..61a313e 100644
--- a/tests/MyGame/Example/Color.kt
+++ b/tests/MyGame/Example/Color.kt
@@ -6,6 +6,7 @@
  * Composite components of Monster color.
  */
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Color private constructor() {
     companion object {
         const val Red: UByte = 1u
diff --git a/tests/MyGame/Example/LongEnum.kt b/tests/MyGame/Example/LongEnum.kt
index ecb5aab..328c9c4 100644
--- a/tests/MyGame/Example/LongEnum.kt
+++ b/tests/MyGame/Example/LongEnum.kt
@@ -3,6 +3,7 @@
 package MyGame.Example
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class LongEnum private constructor() {
     companion object {
         const val LongOne: ULong = 2UL
diff --git a/tests/MyGame/Example/Monster.kt b/tests/MyGame/Example/Monster.kt
index be60c70..9d547fe 100644
--- a/tests/MyGame/Example/Monster.kt
+++ b/tests/MyGame/Example/Monster.kt
@@ -22,6 +22,7 @@
  * an example documentation comment: "monster object"
  */
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Monster : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/Race.kt b/tests/MyGame/Example/Race.kt
index 6f770a3..9cf8857 100644
--- a/tests/MyGame/Example/Race.kt
+++ b/tests/MyGame/Example/Race.kt
@@ -3,6 +3,7 @@
 package MyGame.Example
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Race private constructor() {
     companion object {
         const val None: Byte = -1
diff --git a/tests/MyGame/Example/Referrable.kt b/tests/MyGame/Example/Referrable.kt
index 819af37..9d4d2e6 100644
--- a/tests/MyGame/Example/Referrable.kt
+++ b/tests/MyGame/Example/Referrable.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Referrable : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/Stat.kt b/tests/MyGame/Example/Stat.kt
index 7968681..752d7a2 100644
--- a/tests/MyGame/Example/Stat.kt
+++ b/tests/MyGame/Example/Stat.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Stat : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/StructOfStructs.kt b/tests/MyGame/Example/StructOfStructs.kt
index e7a27a2..89fd831 100644
--- a/tests/MyGame/Example/StructOfStructs.kt
+++ b/tests/MyGame/Example/StructOfStructs.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class StructOfStructs : Struct() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/StructOfStructsOfStructs.kt b/tests/MyGame/Example/StructOfStructsOfStructs.kt
index 5fb1a1e..24bd1cf 100644
--- a/tests/MyGame/Example/StructOfStructsOfStructs.kt
+++ b/tests/MyGame/Example/StructOfStructsOfStructs.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class StructOfStructsOfStructs : Struct() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/Test.kt b/tests/MyGame/Example/Test.kt
index c2ce96e..c910b3e 100644
--- a/tests/MyGame/Example/Test.kt
+++ b/tests/MyGame/Example/Test.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Test : Struct() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/TestSimpleTableWithEnum.kt b/tests/MyGame/Example/TestSimpleTableWithEnum.kt
index fec981f..e299299 100644
--- a/tests/MyGame/Example/TestSimpleTableWithEnum.kt
+++ b/tests/MyGame/Example/TestSimpleTableWithEnum.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class TestSimpleTableWithEnum : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/TypeAliases.kt b/tests/MyGame/Example/TypeAliases.kt
index 6d77d95..cd7c78f 100644
--- a/tests/MyGame/Example/TypeAliases.kt
+++ b/tests/MyGame/Example/TypeAliases.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class TypeAliases : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example/Vec3.kt b/tests/MyGame/Example/Vec3.kt
index 9e1f89e..59a431d 100644
--- a/tests/MyGame/Example/Vec3.kt
+++ b/tests/MyGame/Example/Vec3.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Vec3 : Struct() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/Example2/Monster.kt b/tests/MyGame/Example2/Monster.kt
index 8455c0a..22ccf27 100644
--- a/tests/MyGame/Example2/Monster.kt
+++ b/tests/MyGame/Example2/Monster.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Monster : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/InParentNamespace.kt b/tests/MyGame/InParentNamespace.kt
index 84a8cff..acea692 100644
--- a/tests/MyGame/InParentNamespace.kt
+++ b/tests/MyGame/InParentNamespace.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class InParentNamespace : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/MyGame/MonsterExtra.kt b/tests/MyGame/MonsterExtra.kt
index d1e75a2..e150e6d 100644
--- a/tests/MyGame/MonsterExtra.kt
+++ b/tests/MyGame/MonsterExtra.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class MonsterExtra : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/flatc/flatc_kotlin_tests.py b/tests/flatc/flatc_kotlin_tests.py
new file mode 100644
index 0000000..bca3cba
--- /dev/null
+++ b/tests/flatc/flatc_kotlin_tests.py
@@ -0,0 +1,32 @@
+# Copyright 2022 Google Inc. All rights reserved.
+#
+# 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
+#
+#     http://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.
+
+from flatc_test import *
+
+
+class KotlinTests:
+
+    def EnumValAttributes(self):
+        flatc(["--kotlin", "enum_val_attributes.fbs"])
+
+        subject = assert_file_exists("ValAttributes.kt")
+        assert_file_doesnt_contains(subject, 'val names : Array<String> = arrayOf("Val1", "Val2", "Val3")')
+        assert_file_doesnt_contains(subject, 'fun name(e: Int) : String = names[e]')
+
+    def EnumValAttributes_ReflectNames(self):
+        flatc(["--kotlin", "--reflect-names", "enum_val_attributes.fbs"])
+
+        subject = assert_file_exists("ValAttributes.kt")
+        assert_file_contains(subject, 'val names : Array<String> = arrayOf("Val1", "Val2", "Val3")')
+        assert_file_contains(subject, 'fun name(e: Int) : String = names[e]')
diff --git a/tests/flatc/main.py b/tests/flatc/main.py
index 3bc2318..b296c47 100755
--- a/tests/flatc/main.py
+++ b/tests/flatc/main.py
@@ -18,10 +18,11 @@
 
 from flatc_test import run_all
 from flatc_cpp_tests import CppTests
+from flatc_kotlin_tests import KotlinTests
 from flatc_ts_tests import TsTests
 from flatc_schema_tests import SchemaTests
 
-passing, failing = run_all(CppTests, TsTests, SchemaTests)
+passing, failing = run_all(CppTests, KotlinTests, TsTests, SchemaTests)
 
 print("")
 print("{0} of {1} tests passed".format(passing, passing + failing))
diff --git a/tests/optional_scalars/OptionalByte.kt b/tests/optional_scalars/OptionalByte.kt
index afb3690..1379cd1 100644
--- a/tests/optional_scalars/OptionalByte.kt
+++ b/tests/optional_scalars/OptionalByte.kt
@@ -3,12 +3,11 @@
 package optional_scalars
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class OptionalByte private constructor() {
     companion object {
         const val None: Byte = 0
         const val One: Byte = 1
         const val Two: Byte = 2
-        val names : Array<String> = arrayOf("None", "One", "Two")
-        fun name(e: Int) : String = names[e]
     }
 }
diff --git a/tests/optional_scalars/ScalarStuff.kt b/tests/optional_scalars/ScalarStuff.kt
index bc3ef4b..ba498ed 100644
--- a/tests/optional_scalars/ScalarStuff.kt
+++ b/tests/optional_scalars/ScalarStuff.kt
@@ -19,6 +19,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class ScalarStuff : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/union_vector/Attacker.kt b/tests/union_vector/Attacker.kt
index 6823eed..f71a6c0 100644
--- a/tests/union_vector/Attacker.kt
+++ b/tests/union_vector/Attacker.kt
@@ -17,6 +17,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Attacker : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/union_vector/BookReader.kt b/tests/union_vector/BookReader.kt
index 87dff73..ddeb09d 100644
--- a/tests/union_vector/BookReader.kt
+++ b/tests/union_vector/BookReader.kt
@@ -17,6 +17,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class BookReader : Struct() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/union_vector/Character.kt b/tests/union_vector/Character.kt
index 2e80a35..302b7e5 100644
--- a/tests/union_vector/Character.kt
+++ b/tests/union_vector/Character.kt
@@ -1,6 +1,7 @@
 // automatically generated by the FlatBuffers compiler, do not modify
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Character_ private constructor() {
     companion object {
         const val NONE: UByte = 0u
diff --git a/tests/union_vector/FallingTub.kt b/tests/union_vector/FallingTub.kt
index 43e477a..0f16725 100644
--- a/tests/union_vector/FallingTub.kt
+++ b/tests/union_vector/FallingTub.kt
@@ -17,6 +17,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class FallingTub : Struct() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/union_vector/Gadget.kt b/tests/union_vector/Gadget.kt
index 4fb3b10..c537a4f 100644
--- a/tests/union_vector/Gadget.kt
+++ b/tests/union_vector/Gadget.kt
@@ -1,6 +1,7 @@
 // automatically generated by the FlatBuffers compiler, do not modify
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Gadget private constructor() {
     companion object {
         const val NONE: UByte = 0u
diff --git a/tests/union_vector/HandFan.kt b/tests/union_vector/HandFan.kt
index debcb4c..d60ba28 100644
--- a/tests/union_vector/HandFan.kt
+++ b/tests/union_vector/HandFan.kt
@@ -17,6 +17,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class HandFan : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/union_vector/Movie.kt b/tests/union_vector/Movie.kt
index ee07eef..8d3e410 100644
--- a/tests/union_vector/Movie.kt
+++ b/tests/union_vector/Movie.kt
@@ -17,6 +17,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Movie : Table() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {
diff --git a/tests/union_vector/Rapunzel.kt b/tests/union_vector/Rapunzel.kt
index e3296e1..d51402a 100644
--- a/tests/union_vector/Rapunzel.kt
+++ b/tests/union_vector/Rapunzel.kt
@@ -17,6 +17,7 @@
 import kotlin.math.sign
 
 @Suppress("unused")
+@kotlin.ExperimentalUnsignedTypes
 class Rapunzel : Struct() {
 
     fun __init(_i: Int, _bb: ByteBuffer)  {