Squashed 'third_party/flatbuffers/' changes from d6a8dbd26..338393f85
338393f85 Documentation updates for Optional Scalars (#6014) (#6270)
c27bc2d76 [C++] Add ParseJson(), Parser(Parser&&), update fuzzers (#6284)
bc518a512 Fixed FlexBufferBuilder asserting on duplicate keys
100c59054 Added a few more paths for auto labeler (#6281)
e58c18244 Add --require-explicit-ids to require explicit ids (#6277)
69a8b2a57 idl_gen_json_schema.cpp: Changed generation of array element types (#6253)
25eba6f35 fix typo (#6280)
e1f0f75ba Updated Ms build Action to fix build issue (#6279)
faeb04fbe Add type annotation to unspecified array (#6264)
537212afe [Swift] Adds a format file and reformats the swift project (#6250)
6764f25d9 Adds a fix for enum generation (#6263)
Change-Id: I716bd4d2521fb0a673e50a699cef761e042052b2
git-subtree-dir: third_party/flatbuffers
git-subtree-split: 338393f854eb5ba24761a22cd9316ff5cee4eab0
diff --git a/src/idl_gen_json_schema.cpp b/src/idl_gen_json_schema.cpp
index a321b89..76540d1 100644
--- a/src/idl_gen_json_schema.cpp
+++ b/src/idl_gen_json_schema.cpp
@@ -87,17 +87,27 @@
std::string GenBaseType(const Type &type) {
if (type.struct_def != nullptr) { return GenTypeRef(type.struct_def); }
if (type.enum_def != nullptr) { return GenTypeRef(type.enum_def); }
- if (IsArray(type) || IsVector(type)) {
- return "\"type\" : \"array\", \"items\" : {" + GenType(type.element) + "}";
+ return GenType(type.base_type);
+}
+
+std::string GenArrayType(const Type &type) {
+ std::string element_type;
+ if (type.struct_def != nullptr) {
+ element_type = GenTypeRef(type.struct_def);
+ } else if (type.enum_def != nullptr) {
+ element_type = GenTypeRef(type.enum_def);
+ } else {
+ element_type = GenType(type.element);
}
- return GenType(type.base_type);
+
+ return "\"type\" : \"array\", \"items\" : {" + element_type + "}";
}
std::string GenType(const Type &type) {
switch (type.base_type) {
case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH(); // fall thru
case BASE_TYPE_VECTOR: {
- return GenBaseType(type);
+ return GenArrayType(type);
}
case BASE_TYPE_STRUCT: {
return GenTypeRef(type.struct_def);
@@ -147,13 +157,13 @@
// If indentation is less than 0, that indicates we don't want any newlines
// either.
- const std::string NewLine() {
+ std::string NewLine() const {
return parser_.opts.indent_step >= 0 ? "\n" : "";
}
- const std::string Indent(int indent) {
- std::string indentation = "";
- return indentation.append(indent * std::max(parser_.opts.indent_step, 0), ' ');
+ std::string Indent(int indent) const {
+ const auto num_spaces = indent * std::max(parser_.opts.indent_step, 0);
+ return std::string(num_spaces, ' ');
}
bool generate() {
@@ -168,7 +178,7 @@
++e) {
code_ += Indent(2) + "\"" + GenFullName(*e) + "\" : {" + NewLine();
code_ += Indent(3) + GenType("string") + "," + NewLine();
- std::string enumdef(Indent(3) + "\"enum\": [");
+ auto enumdef(Indent(3) + "\"enum\": [");
for (auto enum_value = (*e)->Vals().begin();
enum_value != (*e)->Vals().end(); ++enum_value) {
enumdef.append("\"" + (*enum_value)->name + "\"");
@@ -189,7 +199,7 @@
comment_line != comment_lines.cend(); ++comment_line) {
comment.append(*comment_line);
}
- if (comment.size() > 0) {
+ if (!comment.empty()) {
std::string description;
if (!EscapeString(comment.c_str(), comment.length(), &description, true,
true)) {
@@ -206,13 +216,14 @@
std::string arrayInfo = "";
if (IsArray(property->value.type)) {
arrayInfo = "," + NewLine() + Indent(8) + "\"minItems\": " +
- NumToString(property->value.type.fixed_length) +
- "," + NewLine() + Indent(8) + "\"maxItems\": " +
+ NumToString(property->value.type.fixed_length) + "," +
+ NewLine() + Indent(8) + "\"maxItems\": " +
NumToString(property->value.type.fixed_length);
}
std::string deprecated_info = "";
if (property->deprecated) {
- deprecated_info = "," + NewLine() + Indent(8) + "\"deprecated\" : true,";
+ deprecated_info =
+ "," + NewLine() + Indent(8) + "\"deprecated\" : true,";
}
std::string typeLine = Indent(4) + "\"" + property->name + "\"";
typeLine += " : {" + NewLine() + Indent(8);
@@ -229,8 +240,8 @@
std::copy_if(properties.begin(), properties.end(),
back_inserter(requiredProperties),
[](FieldDef const *prop) { return prop->required; });
- if (requiredProperties.size() > 0) {
- std::string required_string(Indent(3) + "\"required\" : [");
+ if (!requiredProperties.empty()) {
+ auto required_string(Indent(3) + "\"required\" : [");
for (auto req_prop = requiredProperties.cbegin();
req_prop != requiredProperties.cend(); ++req_prop) {
required_string.append("\"" + (*req_prop)->name + "\"");
@@ -242,7 +253,7 @@
code_ += required_string + NewLine();
}
code_ += Indent(3) + "\"additionalProperties\" : false" + NewLine();
- std::string closeType(Indent(2) + "}");
+ auto closeType(Indent(2) + "}");
if (*s != parser_.structs_.vec.back()) { closeType.append(","); }
code_ += closeType + NewLine(); // close type
}
@@ -256,15 +267,13 @@
return true;
}
- bool save() {
- const std::string file_path =
+ bool save() const {
+ const auto file_path =
GeneratedFileName(path_, file_name_, parser_.opts);
return SaveFile(file_path.c_str(), code_, false);
}
- const std::string getJson() {
- return code_;
- }
+ const std::string getJson() { return code_; }
};
} // namespace jsons