idl_gen_json_schema Fix generation of arrays of enums (#6184)

* idl_gen_json_schema.cpp: Fixed generation of arrays of enums
#6175

* Fixed failing unit tests

* GenBaseType generate "integer".
Fixes #6066

* Ran tests/generate_code.

* Removed modern R"()" strings

* changed std::to_string to NumToString
This commit is contained in:
schoetbi
2020-10-16 19:43:09 +02:00
committed by GitHub
parent 0e1415b996
commit a402b3abae
3 changed files with 111 additions and 89 deletions

View File

@@ -24,25 +24,6 @@ namespace flatbuffers {
namespace jsons { namespace jsons {
std::string GenNativeType(BaseType type) {
switch (type) {
case BASE_TYPE_BOOL: return "boolean";
case BASE_TYPE_CHAR:
case BASE_TYPE_UCHAR:
case BASE_TYPE_SHORT:
case BASE_TYPE_USHORT:
case BASE_TYPE_INT:
case BASE_TYPE_UINT:
case BASE_TYPE_LONG:
case BASE_TYPE_ULONG:
case BASE_TYPE_FLOAT:
case BASE_TYPE_DOUBLE: return "number";
case BASE_TYPE_STRING: return "string";
case BASE_TYPE_ARRAY: return "array";
default: return "";
}
}
template<class T> std::string GenFullName(const T *enum_def) { template<class T> std::string GenFullName(const T *enum_def) {
std::string full_name; std::string full_name;
const auto &name_spaces = enum_def->defined_namespace->components; const auto &name_spaces = enum_def->defined_namespace->components;
@@ -61,23 +42,62 @@ std::string GenType(const std::string &name) {
return "\"type\" : \"" + name + "\""; return "\"type\" : \"" + name + "\"";
} }
std::string GenType(const Type &type) { std::string GenType(BaseType type) {
if (type.enum_def != nullptr && !type.enum_def->is_union) { switch (type) {
// it is a reference to an enum type case BASE_TYPE_BOOL: return "\"type\" : \"boolean\"";
return GenTypeRef(type.enum_def); case BASE_TYPE_CHAR:
return "\"type\" : \"integer\", \"minimum\" : " +
NumToString(std::numeric_limits<int8_t>::min()) +
", \"maximum\" : " +
NumToString(std::numeric_limits<int8_t>::max()) + "\"";
case BASE_TYPE_UCHAR:
return "\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" :" +
NumToString(std::numeric_limits<uint8_t>::max()) + "\"";
case BASE_TYPE_SHORT:
return "\"type\" : \"integer\", \"minimum\" : " +
NumToString(std::numeric_limits<int16_t>::min()) +
", \"maximum\" : " +
NumToString(std::numeric_limits<int16_t>::max());
case BASE_TYPE_USHORT:
return "\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : " +
NumToString(std::numeric_limits<uint16_t>::max());
case BASE_TYPE_INT:
return "\"type\" : \"integer\", \"minimum\" : " +
NumToString(std::numeric_limits<int32_t>::min()) +
", \"maximum\" : " +
NumToString(std::numeric_limits<int32_t>::max());
case BASE_TYPE_UINT:
return "\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : " +
NumToString(std::numeric_limits<uint32_t>::max());
case BASE_TYPE_LONG:
return "\"type\" : \"integer\", \"minimum\" : " +
NumToString(std::numeric_limits<int64_t>::min()) +
", \"maximum\" : " +
NumToString(std::numeric_limits<int64_t>::max());
case BASE_TYPE_ULONG:
return "\"type\" : \"integer\", \"minimum\" : 0, \"maximum\" : " +
NumToString(std::numeric_limits<uint64_t>::max());
case BASE_TYPE_FLOAT:
case BASE_TYPE_DOUBLE: return "\"type\" : \"number\"";
case BASE_TYPE_STRING: return "\"type\" : \"string\"";
default: return "";
} }
}
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 (type.base_type == BASE_TYPE_ARRAY || type.base_type == BASE_TYPE_VECTOR) {
return "\"type\" : \"array\", \"items\" : {" + GenType(type.element) + "}";
}
return GenType(type.base_type);
}
std::string GenType(const Type &type) {
switch (type.base_type) { switch (type.base_type) {
case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH(); // fall thru case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH(); // fall thru
case BASE_TYPE_VECTOR: { case BASE_TYPE_VECTOR: {
std::string typeline; return GenBaseType(type);
typeline.append("\"type\" : \"array\", \"items\" : { ");
if (type.element == BASE_TYPE_STRUCT) {
typeline.append(GenTypeRef(type.struct_def));
} else {
typeline.append(GenType(GenNativeType(type.element)));
}
typeline.append(" }");
return typeline;
} }
case BASE_TYPE_STRUCT: { case BASE_TYPE_STRUCT: {
return GenTypeRef(type.struct_def); return GenTypeRef(type.struct_def);
@@ -86,7 +106,7 @@ std::string GenType(const Type &type) {
std::string union_type_string("\"anyOf\": ["); std::string union_type_string("\"anyOf\": [");
const auto &union_types = type.enum_def->Vals(); const auto &union_types = type.enum_def->Vals();
for (auto ut = union_types.cbegin(); ut < union_types.cend(); ++ut) { for (auto ut = union_types.cbegin(); ut < union_types.cend(); ++ut) {
auto &union_type = *ut; const auto &union_type = *ut;
if (union_type->union_type.base_type == BASE_TYPE_NONE) { continue; } if (union_type->union_type.base_type == BASE_TYPE_NONE) { continue; }
if (union_type->union_type.base_type == BASE_TYPE_STRUCT) { if (union_type->union_type.base_type == BASE_TYPE_STRUCT) {
union_type_string.append( union_type_string.append(
@@ -100,7 +120,9 @@ std::string GenType(const Type &type) {
return union_type_string; return union_type_string;
} }
case BASE_TYPE_UTYPE: return GenTypeRef(type.enum_def); case BASE_TYPE_UTYPE: return GenTypeRef(type.enum_def);
default: return GenType(GenNativeType(type.base_type)); default: {
return GenBaseType(type);
}
} }
} }

View File

@@ -9,7 +9,7 @@
"type" : "object", "type" : "object",
"properties" : { "properties" : {
"a" : { "a" : {
"type" : "array", "items" : { "type" : "number" }, "type" : "array", "items" : {"type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647},
"minItems": 2, "minItems": 2,
"maxItems": 2 "maxItems": 2
}, },
@@ -22,7 +22,7 @@
"maxItems": 2 "maxItems": 2
}, },
"d" : { "d" : {
"type" : "array", "items" : { "type" : "number" }, "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807},
"minItems": 2, "minItems": 2,
"maxItems": 2 "maxItems": 2
} }
@@ -36,23 +36,23 @@
"type" : "number" "type" : "number"
}, },
"b" : { "b" : {
"type" : "array", "items" : { "type" : "number" }, "type" : "array", "items" : {"type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647},
"minItems": 15, "minItems": 15,
"maxItems": 15 "maxItems": 15
}, },
"c" : { "c" : {
"type" : "number" "type" : "integer", "minimum" : -128, "maximum" : 127"
}, },
"d" : { "d" : {
"type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_NestedStruct" }, "$ref" : "#/definitions/MyGame_Example_NestedStruct",
"minItems": 2, "minItems": 2,
"maxItems": 2 "maxItems": 2
}, },
"e" : { "e" : {
"type" : "number" "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
}, },
"f" : { "f" : {
"type" : "array", "items" : { "type" : "number" }, "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807},
"minItems": 2, "minItems": 2,
"maxItems": 2 "maxItems": 2
} }

View File

@@ -29,7 +29,7 @@
"type" : "object", "type" : "object",
"properties" : { "properties" : {
"a" : { "a" : {
"type" : "number" "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
} }
}, },
"additionalProperties" : false "additionalProperties" : false
@@ -68,10 +68,10 @@
"type" : "object", "type" : "object",
"properties" : { "properties" : {
"a" : { "a" : {
"type" : "number" "type" : "integer", "minimum" : -32768, "maximum" : 32767
}, },
"b" : { "b" : {
"type" : "number" "type" : "integer", "minimum" : -128, "maximum" : 127"
} }
}, },
"additionalProperties" : false "additionalProperties" : false
@@ -113,10 +113,10 @@
"type" : "object", "type" : "object",
"properties" : { "properties" : {
"id" : { "id" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 4294967295
}, },
"distance" : { "distance" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 4294967295
} }
}, },
"additionalProperties" : false "additionalProperties" : false
@@ -128,10 +128,10 @@
"type" : "string" "type" : "string"
}, },
"val" : { "val" : {
"type" : "number" "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807
}, },
"count" : { "count" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 65535
} }
}, },
"additionalProperties" : false "additionalProperties" : false
@@ -140,7 +140,7 @@
"type" : "object", "type" : "object",
"properties" : { "properties" : {
"id" : { "id" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
} }
}, },
"additionalProperties" : false "additionalProperties" : false
@@ -153,10 +153,10 @@
"$ref" : "#/definitions/MyGame_Example_Vec3" "$ref" : "#/definitions/MyGame_Example_Vec3"
}, },
"mana" : { "mana" : {
"type" : "number" "type" : "integer", "minimum" : -32768, "maximum" : 32767
}, },
"hp" : { "hp" : {
"type" : "number" "type" : "integer", "minimum" : -32768, "maximum" : 32767
}, },
"name" : { "name" : {
"type" : "string" "type" : "string"
@@ -166,7 +166,7 @@
"deprecated" : true, "deprecated" : true,
}, },
"inventory" : { "inventory" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"}
}, },
"color" : { "color" : {
"$ref" : "#/definitions/MyGame_Example_Color" "$ref" : "#/definitions/MyGame_Example_Color"
@@ -178,19 +178,19 @@
"anyOf": [{ "$ref" : "#/definitions/MyGame_Example_Monster" },{ "$ref" : "#/definitions/MyGame_Example_TestSimpleTableWithEnum" },{ "$ref" : "#/definitions/MyGame_Example2_Monster" }] "anyOf": [{ "$ref" : "#/definitions/MyGame_Example_Monster" },{ "$ref" : "#/definitions/MyGame_Example_TestSimpleTableWithEnum" },{ "$ref" : "#/definitions/MyGame_Example2_Monster" }]
}, },
"test4" : { "test4" : {
"type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Test" } "$ref" : "#/definitions/MyGame_Example_Test"
}, },
"testarrayofstring" : { "testarrayofstring" : {
"type" : "array", "items" : { "type" : "string" } "type" : "array", "items" : {"type" : "string"}
}, },
"testarrayoftables" : { "testarrayoftables" : {
"type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Monster" } "$ref" : "#/definitions/MyGame_Example_Monster"
}, },
"enemy" : { "enemy" : {
"$ref" : "#/definitions/MyGame_Example_Monster" "$ref" : "#/definitions/MyGame_Example_Monster"
}, },
"testnestedflatbuffer" : { "testnestedflatbuffer" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"}
}, },
"testempty" : { "testempty" : {
"$ref" : "#/definitions/MyGame_Example_Stat" "$ref" : "#/definitions/MyGame_Example_Stat"
@@ -199,31 +199,31 @@
"type" : "boolean" "type" : "boolean"
}, },
"testhashs32_fnv1" : { "testhashs32_fnv1" : {
"type" : "number" "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
}, },
"testhashu32_fnv1" : { "testhashu32_fnv1" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 4294967295
}, },
"testhashs64_fnv1" : { "testhashs64_fnv1" : {
"type" : "number" "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807
}, },
"testhashu64_fnv1" : { "testhashu64_fnv1" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
}, },
"testhashs32_fnv1a" : { "testhashs32_fnv1a" : {
"type" : "number" "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
}, },
"testhashu32_fnv1a" : { "testhashu32_fnv1a" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 4294967295
}, },
"testhashs64_fnv1a" : { "testhashs64_fnv1a" : {
"type" : "number" "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807
}, },
"testhashu64_fnv1a" : { "testhashu64_fnv1a" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
}, },
"testarrayofbools" : { "testarrayofbools" : {
"type" : "array", "items" : { "type" : "boolean" } "type" : "array", "items" : {"type" : "boolean"}
}, },
"testf" : { "testf" : {
"type" : "number" "type" : "number"
@@ -235,49 +235,49 @@
"type" : "number" "type" : "number"
}, },
"testarrayofstring2" : { "testarrayofstring2" : {
"type" : "array", "items" : { "type" : "string" } "type" : "array", "items" : {"type" : "string"}
}, },
"testarrayofsortedstruct" : { "testarrayofsortedstruct" : {
"type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Ability" } "$ref" : "#/definitions/MyGame_Example_Ability"
}, },
"flex" : { "flex" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"}
}, },
"test5" : { "test5" : {
"type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Test" } "$ref" : "#/definitions/MyGame_Example_Test"
}, },
"vector_of_longs" : { "vector_of_longs" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807}
}, },
"vector_of_doubles" : { "vector_of_doubles" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "number"}
}, },
"parent_namespace_test" : { "parent_namespace_test" : {
"$ref" : "#/definitions/MyGame_InParentNamespace" "$ref" : "#/definitions/MyGame_InParentNamespace"
}, },
"vector_of_referrables" : { "vector_of_referrables" : {
"type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Referrable" } "$ref" : "#/definitions/MyGame_Example_Referrable"
}, },
"single_weak_reference" : { "single_weak_reference" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
}, },
"vector_of_weak_references" : { "vector_of_weak_references" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615}
}, },
"vector_of_strong_referrables" : { "vector_of_strong_referrables" : {
"type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Referrable" } "$ref" : "#/definitions/MyGame_Example_Referrable"
}, },
"co_owning_reference" : { "co_owning_reference" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
}, },
"vector_of_co_owning_references" : { "vector_of_co_owning_references" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615}
}, },
"non_owning_reference" : { "non_owning_reference" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
}, },
"vector_of_non_owning_references" : { "vector_of_non_owning_references" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615}
}, },
"any_unique_type" : { "any_unique_type" : {
"$ref" : "#/definitions/MyGame_Example_AnyUniqueAliases" "$ref" : "#/definitions/MyGame_Example_AnyUniqueAliases"
@@ -305,28 +305,28 @@
"type" : "object", "type" : "object",
"properties" : { "properties" : {
"i8" : { "i8" : {
"type" : "number" "type" : "integer", "minimum" : -128, "maximum" : 127"
}, },
"u8" : { "u8" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" :255"
}, },
"i16" : { "i16" : {
"type" : "number" "type" : "integer", "minimum" : -32768, "maximum" : 32767
}, },
"u16" : { "u16" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 65535
}, },
"i32" : { "i32" : {
"type" : "number" "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
}, },
"u32" : { "u32" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 4294967295
}, },
"i64" : { "i64" : {
"type" : "number" "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807
}, },
"u64" : { "u64" : {
"type" : "number" "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
}, },
"f32" : { "f32" : {
"type" : "number" "type" : "number"
@@ -335,10 +335,10 @@
"type" : "number" "type" : "number"
}, },
"v8" : { "v8" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "integer", "minimum" : -128, "maximum" : 127"}
}, },
"vf64" : { "vf64" : {
"type" : "array", "items" : { "type" : "number" } "type" : "array", "items" : {"type" : "number"}
} }
}, },
"additionalProperties" : false "additionalProperties" : false