| 4894 | } |
| 4895 | |
| 4896 | void GeneratorKotlin::GenerateEnumClass(const std::shared_ptr<Package>& p, const std::shared_ptr<EnumType>& e, const CppCommon::Path& path) |
| 4897 | { |
| 4898 | std::string enum_name = *e->name; |
| 4899 | std::string enum_type_name = *e->name + "Enum"; |
| 4900 | |
| 4901 | // Generate the output file |
| 4902 | CppCommon::Path output = path / (enum_name + ".kt"); |
| 4903 | WriteBegin(); |
| 4904 | |
| 4905 | // Generate enum class header |
| 4906 | GenerateHeader(CppCommon::Path(_input).filename().string()); |
| 4907 | GenerateImports(p); |
| 4908 | |
| 4909 | std::string enum_type = (e->base && !e->base->empty()) ? *e->base : "int32"; |
| 4910 | std::string enum_base_type = ConvertEnumType(enum_type); |
| 4911 | std::string enum_to = ConvertEnumTo(enum_type); |
| 4912 | |
| 4913 | // Generate enum class body |
| 4914 | WriteLine(); |
| 4915 | WriteLineIndent("@Suppress(\"MemberVisibilityCanBePrivate\", \"RemoveRedundantCallsOfConversionMethods\")"); |
| 4916 | WriteLineIndent("class " + enum_name + " : Comparable<" + enum_name + ">"); |
| 4917 | WriteLineIndent("{"); |
| 4918 | Indent(1); |
| 4919 | if (e->body) |
| 4920 | { |
| 4921 | WriteLineIndent("companion object"); |
| 4922 | WriteLineIndent("{"); |
| 4923 | Indent(1); |
| 4924 | for (const auto& value : e->body->values) |
| 4925 | WriteLineIndent("val " + *value->name + " = " + enum_name + "(" + enum_type_name + "." + *value->name + ")"); |
| 4926 | Indent(-1); |
| 4927 | WriteLineIndent("}"); |
| 4928 | WriteLine(); |
| 4929 | } |
| 4930 | |
| 4931 | // Generate enum class value |
| 4932 | WriteLineIndent("var value: " + enum_type_name + "?" + " = " + enum_type_name + ".values()[0]"); |
| 4933 | Indent(1); |
| 4934 | WriteLineIndent("private set"); |
| 4935 | Indent(-1); |
| 4936 | WriteLine(); |
| 4937 | |
| 4938 | // Generate enum raw value |
| 4939 | WriteLineIndent("val raw: " + enum_base_type); |
| 4940 | Indent(1); |
| 4941 | WriteLineIndent("get() = value!!.raw"); |
| 4942 | Indent(-1); |
| 4943 | WriteLine(); |
| 4944 | |
| 4945 | // Generate enum class constructors |
| 4946 | WriteLineIndent("constructor()"); |
| 4947 | WriteLineIndent("constructor(value: " + enum_base_type + ") { setEnum(value) }"); |
| 4948 | WriteLineIndent("constructor(value: " + enum_type_name + ") { setEnum(value) }"); |
| 4949 | WriteLineIndent("constructor(value: " + enum_name + ") { setEnum(value) }"); |
| 4950 | WriteLine(); |
| 4951 | |
| 4952 | // Generate enum class setDefault() method |
| 4953 | WriteLineIndent("fun setDefault() { setEnum(0" + enum_to + ") }"); |