| 4903 | } |
| 4904 | |
| 4905 | void GeneratorGo::GenerateEnum(const std::shared_ptr<Package>& p, const std::shared_ptr<EnumType>& e, const CppCommon::Path& path) |
| 4906 | { |
| 4907 | std::string enum_name = ConvertToUpper(*e->name); |
| 4908 | |
| 4909 | // Generate the output file |
| 4910 | CppCommon::Path output = path / (enum_name + ".go"); |
| 4911 | WriteBegin(); |
| 4912 | |
| 4913 | // Generate header |
| 4914 | GenerateHeader(CppCommon::Path(_input).filename().string()); |
| 4915 | |
| 4916 | // Generate package |
| 4917 | WriteLine(); |
| 4918 | WriteLineIndent("package " + *p->name); |
| 4919 | |
| 4920 | // Generate imports |
| 4921 | WriteLine(); |
| 4922 | GenerateImports(p); |
| 4923 | |
| 4924 | std::string enum_type = (e->base && !e->base->empty()) ? *e->base : "int32"; |
| 4925 | |
| 4926 | // Generate enum key |
| 4927 | WriteLine(); |
| 4928 | WriteLineIndent("// " + enum_name + " enum key"); |
| 4929 | WriteLineIndent("type " + enum_name + "Key " + ConvertEnumType(enum_type)); |
| 4930 | |
| 4931 | // Generate enum key String() method |
| 4932 | WriteLine(); |
| 4933 | WriteLineIndent("// Convert " + enum_name + " enum key to string"); |
| 4934 | WriteLineIndent("func (k " + enum_name + "Key) String() string {"); |
| 4935 | Indent(1); |
| 4936 | WriteLineIndent("return " + enum_name + "(k).String()"); |
| 4937 | Indent(-1); |
| 4938 | WriteLineIndent("}"); |
| 4939 | |
| 4940 | // Generate enum type |
| 4941 | WriteLine(); |
| 4942 | WriteLineIndent("// " + enum_name + " enum"); |
| 4943 | WriteLineIndent("type " + enum_name + " " + ConvertEnumType(enum_type)); |
| 4944 | |
| 4945 | // Generate enum body |
| 4946 | if (e->body) |
| 4947 | { |
| 4948 | WriteLine(); |
| 4949 | WriteLineIndent("// " + enum_name + " enum values"); |
| 4950 | WriteLineIndent("//noinspection GoSnakeCaseUsage"); |
| 4951 | WriteLineIndent("const ("); |
| 4952 | Indent(1); |
| 4953 | |
| 4954 | int index = 0; |
| 4955 | std::string last = ConvertEnumConstant(enum_name, "int32", "0"); |
| 4956 | for (const auto& value : e->body->values) |
| 4957 | { |
| 4958 | WriteIndent(enum_name + "_" + *value->name + " = " + enum_name + "("); |
| 4959 | if (value->value) |
| 4960 | { |
| 4961 | if (value->value->constant && !value->value->constant->empty()) |
| 4962 | { |