1 #ifndef FLATBUFFERS_IDL_NAMER
2 #define FLATBUFFERS_IDL_NAMER
3
4 #include "flatbuffers/idl.h"
5 #include "namer.h"
6
7 namespace flatbuffers {
8
9 // Provides Namer capabilities to types defined in the flatbuffers IDL.
10 class IdlNamer : public Namer {
11 public:
IdlNamer(Config config,std::set<std::string> keywords)12 explicit IdlNamer(Config config, std::set<std::string> keywords)
13 : Namer(config, std::move(keywords)) {}
14
15 using Namer::Constant;
16 using Namer::Directories;
17 using Namer::Field;
18 using Namer::File;
19 using Namer::Function;
20 using Namer::Method;
21 using Namer::Namespace;
22 using Namer::NamespacedType;
23 using Namer::ObjectType;
24 using Namer::Type;
25 using Namer::Variable;
26 using Namer::Variant;
27
Constant(const FieldDef & d)28 std::string Constant(const FieldDef &d) const { return Constant(d.name); }
29
30 // Types are always structs or enums so we can only expose these two
31 // overloads.
Type(const StructDef & d)32 std::string Type(const StructDef &d) const { return Type(d.name); }
Type(const EnumDef & d)33 std::string Type(const EnumDef &d) const { return Type(d.name); }
34
Function(const Definition & s)35 std::string Function(const Definition &s) const { return Function(s.name); }
36
Field(const FieldDef & s)37 std::string Field(const FieldDef &s) const { return Field(s.name); }
Field(const FieldDef & d,const std::string & s)38 std::string Field(const FieldDef &d, const std::string &s) const {
39 return Field(d.name + "_" + s);
40 }
41
Variable(const FieldDef & s)42 std::string Variable(const FieldDef &s) const { return Variable(s.name); }
43
Variable(const StructDef & s)44 std::string Variable(const StructDef &s) const { return Variable(s.name); }
45
Variant(const EnumVal & s)46 std::string Variant(const EnumVal &s) const { return Variant(s.name); }
47
EnumVariant(const EnumDef & e,const EnumVal & v)48 std::string EnumVariant(const EnumDef &e, const EnumVal &v) const {
49 return Type(e) + config_.enum_variant_seperator + Variant(v);
50 }
51
ObjectType(const StructDef & d)52 std::string ObjectType(const StructDef &d) const {
53 return ObjectType(d.name);
54 }
ObjectType(const EnumDef & d)55 std::string ObjectType(const EnumDef &d) const { return ObjectType(d.name); }
56
Method(const FieldDef & d,const std::string & suffix)57 std::string Method(const FieldDef &d, const std::string &suffix) const {
58 return Method(d.name, suffix);
59 }
Method(const std::string & prefix,const StructDef & d)60 std::string Method(const std::string &prefix, const StructDef &d) const {
61 return Method(prefix, d.name);
62 }
Method(const std::string & prefix,const FieldDef & d)63 std::string Method(const std::string &prefix, const FieldDef &d) const {
64 return Method(prefix, d.name);
65 }
Method(const std::string & prefix,const FieldDef & d,const std::string & suffix)66 std::string Method(const std::string &prefix, const FieldDef &d,
67 const std::string &suffix) const {
68 return Method(prefix, d.name, suffix);
69 }
70
Namespace(const struct Namespace & ns)71 std::string Namespace(const struct Namespace &ns) const {
72 return Namespace(ns.components);
73 }
74
NamespacedEnumVariant(const EnumDef & e,const EnumVal & v)75 std::string NamespacedEnumVariant(const EnumDef &e, const EnumVal &v) const {
76 return NamespacedString(e.defined_namespace, EnumVariant(e, v));
77 }
78
NamespacedType(const Definition & def)79 std::string NamespacedType(const Definition &def) const {
80 return NamespacedString(def.defined_namespace, Type(def.name));
81 }
82
NamespacedObjectType(const Definition & def)83 std::string NamespacedObjectType(const Definition &def) const {
84 return NamespacedString(def.defined_namespace, ObjectType(def.name));
85 }
86
87 std::string Directories(const struct Namespace &ns,
88 SkipDir skips = SkipDir::None) const {
89 return Directories(ns.components, skips);
90 }
91
92 // Legacy fields do not really follow the usual config and should be
93 // considered for deprecation.
94
LegacyRustNativeVariant(const EnumVal & v)95 std::string LegacyRustNativeVariant(const EnumVal &v) const {
96 return ConvertCase(EscapeKeyword(v.name), Case::kUpperCamel);
97 }
98
LegacyRustFieldOffsetName(const FieldDef & field)99 std::string LegacyRustFieldOffsetName(const FieldDef &field) const {
100 return "VT_" + ConvertCase(EscapeKeyword(field.name), Case::kAllUpper);
101 }
102
LegacySwiftVariant(const EnumVal & ev)103 std::string LegacySwiftVariant(const EnumVal &ev) const {
104 auto name = ev.name;
105 if (isupper(name.front())) {
106 std::transform(name.begin(), name.end(), name.begin(), CharToLower);
107 }
108 return EscapeKeyword(ConvertCase(name, Case::kLowerCamel));
109 }
110
111 // Also used by Kotlin, lol.
LegacyJavaMethod2(const std::string & prefix,const StructDef & sd,const std::string & suffix)112 std::string LegacyJavaMethod2(const std::string &prefix, const StructDef &sd,
113 const std::string &suffix) const {
114 return prefix + sd.name + suffix;
115 }
116
LegacyKotlinVariant(EnumVal & ev)117 std::string LegacyKotlinVariant(EnumVal &ev) const {
118 // Namer assumes the input case is snake case which is wrong...
119 return ConvertCase(EscapeKeyword(ev.name), Case::kLowerCamel);
120 }
121 // Kotlin methods escapes keywords after case conversion but before
122 // prefixing and suffixing.
LegacyKotlinMethod(const std::string & prefix,const FieldDef & d,const std::string & suffix)123 std::string LegacyKotlinMethod(const std::string &prefix, const FieldDef &d,
124 const std::string &suffix) const {
125 return prefix + ConvertCase(EscapeKeyword(d.name), Case::kUpperCamel) +
126 suffix;
127 }
LegacyKotlinMethod(const std::string & prefix,const StructDef & d,const std::string & suffix)128 std::string LegacyKotlinMethod(const std::string &prefix, const StructDef &d,
129 const std::string &suffix) const {
130 return prefix + ConvertCase(EscapeKeyword(d.name), Case::kUpperCamel) +
131 suffix;
132 }
133
134 private:
NamespacedString(const struct Namespace * ns,const std::string & str)135 std::string NamespacedString(const struct Namespace *ns,
136 const std::string &str) const {
137 std::string ret;
138 if (ns != nullptr) { ret += Namespace(ns->components); }
139 if (!ret.empty()) ret += config_.namespace_seperator;
140 return ret + str;
141 }
142 };
143
144 // This is a temporary helper function for code generators to call until all
145 // flag-overriding logic into flatc.cpp
WithFlagOptions(const Namer::Config & input,const IDLOptions & opts,const std::string & path)146 inline Namer::Config WithFlagOptions(const Namer::Config &input,
147 const IDLOptions &opts,
148 const std::string &path) {
149 Namer::Config result = input;
150 result.object_prefix = opts.object_prefix;
151 result.object_suffix = opts.object_suffix;
152 result.output_path = path;
153 result.filename_suffix = opts.filename_suffix;
154 return result;
155 }
156
157 } // namespace flatbuffers
158
159 #endif // FLATBUFFERS_IDL_NAMER
160