| 5086 | } |
| 5087 | |
| 5088 | void GeneratorGo::GenerateFlags(const std::shared_ptr<Package>& p, const std::shared_ptr<FlagsType>& f, const CppCommon::Path& path) |
| 5089 | { |
| 5090 | std::string flags_name = ConvertToUpper(*f->name); |
| 5091 | |
| 5092 | // Generate the output file |
| 5093 | CppCommon::Path output = path / (flags_name + ".go"); |
| 5094 | WriteBegin(); |
| 5095 | |
| 5096 | // Generate header |
| 5097 | GenerateHeader(CppCommon::Path(_input).filename().string()); |
| 5098 | |
| 5099 | // Generate package |
| 5100 | WriteLine(); |
| 5101 | WriteLineIndent("package " + *p->name); |
| 5102 | |
| 5103 | // Generate imports |
| 5104 | WriteLine(); |
| 5105 | WriteLineIndent("import \"strings\""); |
| 5106 | GenerateImports(p); |
| 5107 | |
| 5108 | std::string flags_type = (f->base && !f->base->empty()) ? *f->base : "int32"; |
| 5109 | |
| 5110 | // Generate flags key |
| 5111 | WriteLine(); |
| 5112 | WriteLineIndent("// " + flags_name + " flags key"); |
| 5113 | WriteLineIndent("type " + flags_name + "Key " + ConvertEnumType(flags_type)); |
| 5114 | |
| 5115 | // Generate flags key String() method |
| 5116 | WriteLine(); |
| 5117 | WriteLineIndent("// Convert " + flags_name + " flags key to string"); |
| 5118 | WriteLineIndent("func (k " + flags_name + "Key) String() string {"); |
| 5119 | Indent(1); |
| 5120 | WriteLineIndent("return " + flags_name + "(k).String()"); |
| 5121 | Indent(-1); |
| 5122 | WriteLineIndent("}"); |
| 5123 | |
| 5124 | // Generate flags type |
| 5125 | WriteLine(); |
| 5126 | WriteLineIndent("// " + flags_name + " flags"); |
| 5127 | WriteLineIndent("type " + flags_name + " " + ConvertEnumType(flags_type)); |
| 5128 | |
| 5129 | // Generate flags body |
| 5130 | if (f->body) |
| 5131 | { |
| 5132 | WriteLine(); |
| 5133 | WriteLineIndent("// " + flags_name + " flags values"); |
| 5134 | WriteLineIndent("//noinspection GoSnakeCaseUsage"); |
| 5135 | WriteLineIndent("const ("); |
| 5136 | Indent(1); |
| 5137 | |
| 5138 | for (const auto& value : f->body->values) |
| 5139 | { |
| 5140 | WriteIndent(flags_name + "_" + *value->name + " = " + flags_name + "("); |
| 5141 | if (value->value) |
| 5142 | { |
| 5143 | if (value->value->constant && !value->value->constant->empty()) |
| 5144 | Write(ConvertEnumConstant(flags_name, flags_type, *value->value->constant)); |
| 5145 | else if (value->value->reference && !value->value->reference->empty()) |