Skip to content

Commit e013450

Browse files
chuckatkinsdbaileychess
authored andcommitted
Add a --java-package-prefix option to flatc (google#7848)
Co-authored-by: Derek Bailey <derekbailey@google.com>
1 parent bacbaa5 commit e013450

File tree

3 files changed

+59
-19
lines changed

3 files changed

+59
-19
lines changed

include/flatbuffers/idl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ struct IDLOptions {
655655
CaseStyle cpp_object_api_field_case_style;
656656
bool cpp_direct_copy;
657657
bool gen_nullable;
658+
std::string java_package_prefix;
658659
bool java_checkerframework;
659660
bool gen_generated;
660661
bool gen_json_coders;

src/flatc.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ const static FlatCOption flatc_options[] = {
115115
{ "", "gen-compare", "", "Generate operator== for object-based API types." },
116116
{ "", "gen-nullable", "",
117117
"Add Clang _Nullable for C++ pointer. or @Nullable for Java" },
118+
{ "", "java-package-prefix", "",
119+
"Add a prefix to the generated package name for Java." },
118120
{ "", "java-checkerframe", "", "Add @Pure for Java." },
119121
{ "", "gen-generated", "", "Add @Generated annotation for Java." },
120122
{ "", "gen-jvmstatic", "",
@@ -516,6 +518,9 @@ FlatCOptions FlatCompiler::ParseFromCommandLineArguments(int argc,
516518
Error("unknown case style: " + std::string(argv[argi]), true);
517519
} else if (arg == "--gen-nullable") {
518520
opts.gen_nullable = true;
521+
} else if (arg == "--java-package-prefix") {
522+
if (++argi >= argc) Error("missing prefix following: " + arg, true);
523+
opts.java_package_prefix = argv[argi];
519524
} else if (arg == "--java-checkerframework") {
520525
opts.java_checkerframework = true;
521526
} else if (arg == "--gen-generated") {

src/idl_gen_java.cpp

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,21 @@ class JavaGenerator : public BaseGenerator {
8989

9090
public:
9191
JavaGenerator(const Parser &parser, const std::string &path,
92-
const std::string &file_name)
92+
const std::string &file_name,
93+
const std::string &package_prefix)
9394
: BaseGenerator(parser, path, file_name, "", ".", "java"),
94-
cur_name_space_(nullptr),
95+
cur_name_space_(nullptr),
9596
namer_(WithFlagOptions(JavaDefaultConfig(), parser.opts, path),
96-
JavaKeywords()) {}
97+
JavaKeywords()) {
98+
if (!package_prefix.empty()) {
99+
std::istringstream iss(package_prefix);
100+
std::string component;
101+
while(std::getline(iss, component, '.')) {
102+
package_prefix_ns_.components.push_back(component);
103+
}
104+
package_prefix_ = package_prefix_ns_.GetFullyQualifiedName("") + ".";
105+
}
106+
}
97107

98108
JavaGenerator &operator=(const JavaGenerator &);
99109
bool generate() {
@@ -173,7 +183,13 @@ class JavaGenerator : public BaseGenerator {
173183
std::string code;
174184
code = "// " + std::string(FlatBuffersGeneratedWarning()) + "\n\n";
175185

176-
const std::string namespace_name = FullNamespace(".", ns);
186+
Namespace combined_ns = package_prefix_ns_;
187+
std::copy(
188+
ns.components.begin(),
189+
ns.components.end(),
190+
std::back_inserter(combined_ns.components));
191+
192+
const std::string namespace_name = FullNamespace(".", combined_ns);
177193
if (!namespace_name.empty()) {
178194
code += "package " + namespace_name + ";";
179195
code += "\n\n";
@@ -207,7 +223,7 @@ class JavaGenerator : public BaseGenerator {
207223

208224
code += classcode;
209225
if (!namespace_name.empty()) code += "";
210-
const std::string dirs = namer_.Directories(ns);
226+
const std::string dirs = namer_.Directories(combined_ns);
211227
EnsureDirExists(dirs);
212228
const std::string filename =
213229
dirs + namer_.File(defname, /*skips=*/SkipFile::Suffix);
@@ -247,7 +263,8 @@ class JavaGenerator : public BaseGenerator {
247263
switch (type.base_type) {
248264
case BASE_TYPE_STRING: return "String";
249265
case BASE_TYPE_VECTOR: return GenTypeGet(type.VectorType());
250-
case BASE_TYPE_STRUCT: return namer_.NamespacedType(*type.struct_def);
266+
case BASE_TYPE_STRUCT:
267+
return Prefixed(namer_.NamespacedType(*type.struct_def));
251268
case BASE_TYPE_UNION: FLATBUFFERS_FALLTHROUGH(); // else fall thru
252269
default: return "Table";
253270
}
@@ -351,8 +368,9 @@ class JavaGenerator : public BaseGenerator {
351368
FLATBUFFERS_ASSERT(value.type.enum_def);
352369
auto &enum_def = *value.type.enum_def;
353370
auto enum_val = enum_def.FindByValue(value.constant);
354-
return enum_val ? namer_.NamespacedEnumVariant(enum_def, *enum_val)
355-
: value.constant;
371+
return
372+
enum_val ? Prefixed(namer_.NamespacedEnumVariant(enum_def, *enum_val))
373+
: value.constant;
356374
}
357375

358376
std::string GenDefaultValue(const FieldDef &field) const {
@@ -879,7 +897,7 @@ class JavaGenerator : public BaseGenerator {
879897
for (auto kit = fields.begin(); kit != fields.end(); ++kit) {
880898
auto &key_field = **kit;
881899
if (key_field.key) {
882-
auto qualified_name = namer_.NamespacedType(sd);
900+
auto qualified_name = Prefixed(namer_.NamespacedType(sd));
883901
code += " public " + qualified_name + " ";
884902
code += namer_.Method(field) + "ByKey(";
885903
code += GenTypeNameDest(key_field.value.type) + " key)";
@@ -957,7 +975,8 @@ class JavaGenerator : public BaseGenerator {
957975
}
958976
// generate object accessors if is nested_flatbuffer
959977
if (field.nested_flatbuffer) {
960-
auto nested_type_name = namer_.NamespacedType(*field.nested_flatbuffer);
978+
auto nested_type_name =
979+
Prefixed(namer_.NamespacedType(*field.nested_flatbuffer));
961980
auto nested_method_name =
962981
namer_.Field(field) + "As" + field.nested_flatbuffer->name;
963982
auto get_nested_method_name = nested_method_name;
@@ -1437,7 +1456,7 @@ class JavaGenerator : public BaseGenerator {
14371456
// deleted when issue #6561 is fixed.
14381457
}
14391458
code += indent + " case " +
1440-
namer_.NamespacedEnumVariant(enum_def, ev) + ":\n";
1459+
Prefixed(namer_.NamespacedEnumVariant(enum_def, ev)) + ":\n";
14411460
auto actual_type = GenTypeGet(ev.union_type);
14421461
code += indent + " " + variable_name + "Value = " + field_name +
14431462
"(new " + actual_type + "()" + value_params + ");\n";
@@ -1635,7 +1654,8 @@ class JavaGenerator : public BaseGenerator {
16351654
case BASE_TYPE_UNION:
16361655
array_type = "int";
16371656
element_type =
1638-
namer_.NamespacedType(*field.value.type.enum_def) + "Union";
1657+
Prefixed(namer_.NamespacedType(*field.value.type.enum_def))
1658+
+ "Union";
16391659
to_array = element_type + ".pack(builder, _o." +
16401660
namer_.Method("get", property_name) + "()[_j])";
16411661
break;
@@ -1720,11 +1740,11 @@ class JavaGenerator : public BaseGenerator {
17201740
field.value.type.enum_def->underlying_type, false)) +
17211741
" _" + field_name + "Type = _o." + get_field +
17221742
"() == null ? " +
1723-
namer_.NamespacedType(*field.value.type.enum_def) +
1743+
Prefixed(namer_.NamespacedType(*field.value.type.enum_def)) +
17241744
".NONE : " + "_o." + get_field + "().getType();\n";
17251745
code += " " + GenOffsetType() + " _" + field_name + " = _o." +
17261746
get_field + "() == null ? 0 : " +
1727-
namer_.NamespacedType(*field.value.type.enum_def) +
1747+
Prefixed(namer_.NamespacedType(*field.value.type.enum_def)) +
17281748
"Union.pack(builder, _o." + get_field + "());\n";
17291749
break;
17301750
}
@@ -1976,7 +1996,8 @@ class JavaGenerator : public BaseGenerator {
19761996
type_name_length, new_type_name);
19771997
} else if (type.element == BASE_TYPE_UNION) {
19781998
if (wrap_in_namespace) {
1979-
type_name = namer_.NamespacedType(*type.enum_def) + "Union";
1999+
type_name =
2000+
Prefixed(namer_.NamespacedType(*type.enum_def)) + "Union";
19802001
} else {
19812002
type_name = namer_.Type(*type.enum_def) + "Union";
19822003
}
@@ -1986,7 +2007,8 @@ class JavaGenerator : public BaseGenerator {
19862007

19872008
case BASE_TYPE_UNION: {
19882009
if (wrap_in_namespace) {
1989-
type_name = namer_.NamespacedType(*type.enum_def) + "Union";
2010+
type_name =
2011+
Prefixed(namer_.NamespacedType(*type.enum_def)) + "Union";
19902012
} else {
19912013
type_name = namer_.Type(*type.enum_def) + "Union";
19922014
}
@@ -2020,13 +2042,15 @@ class JavaGenerator : public BaseGenerator {
20202042
type_name.replace(type_name.length() - type_name_length,
20212043
type_name_length, new_type_name);
20222044
} else if (type.element == BASE_TYPE_UNION) {
2023-
type_name = namer_.NamespacedType(*type.enum_def) + "Union";
2045+
type_name =
2046+
Prefixed(namer_.NamespacedType(*type.enum_def)) + "Union";
20242047
}
20252048
break;
20262049
}
20272050

20282051
case BASE_TYPE_UNION: {
2029-
type_name = namer_.NamespacedType(*type.enum_def) + "Union";
2052+
type_name =
2053+
Prefixed(namer_.NamespacedType(*type.enum_def)) + "Union";
20302054
break;
20312055
}
20322056
default: break;
@@ -2160,12 +2184,22 @@ class JavaGenerator : public BaseGenerator {
21602184
// prefixed by its namespace
21612185
const Namespace *cur_name_space_;
21622186
const IdlNamer namer_;
2187+
2188+
private:
2189+
std::string Prefixed(const std::string &str) const {
2190+
return package_prefix_ + str;
2191+
}
2192+
2193+
std::string package_prefix_;
2194+
Namespace package_prefix_ns_;
2195+
21632196
};
21642197
} // namespace java
21652198

21662199
bool GenerateJava(const Parser &parser, const std::string &path,
21672200
const std::string &file_name) {
2168-
java::JavaGenerator generator(parser, path, file_name);
2201+
java::JavaGenerator generator(parser, path, file_name,
2202+
parser.opts.java_package_prefix);
21692203
return generator.generate();
21702204
}
21712205

0 commit comments

Comments
 (0)