Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/idl_gen_swift.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -848,7 +848,7 @@ class SwiftGenerator : public BaseGenerator {
code_.SetValue("ENUM_NAME", NameWrappedInNameSpace(enum_def));
code_.SetValue("BASE_TYPE", GenTypeBasic(enum_def.underlying_type, false));
GenComment(enum_def.doc_comment);
code_ += "{{ACCESS_TYPE}} enum {{ENUM_NAME}}: {{BASE_TYPE}}, Enum { ";
code_ += "{{ACCESS_TYPE}} enum {{ENUM_NAME}}: {{BASE_TYPE}}, Enum {";
Indent();
code_ += "{{ACCESS_TYPE}} typealias T = {{BASE_TYPE}}";
code_ +=
Expand Down Expand Up @@ -1472,7 +1472,9 @@ class SwiftGenerator : public BaseGenerator {
auto &value = field.value;
FLATBUFFERS_ASSERT(value.type.enum_def);
auto &enum_def = *value.type.enum_def;
auto enum_val = enum_def.FindByValue(value.constant);
// Vector of enum defaults are always "[]" which never works.
const std::string constant = IsVector(value.type) ? "0" : value.constant;
auto enum_val = enum_def.FindByValue(constant);
std::string name;
if (enum_val) {
name = Name(*enum_val);
Expand Down
42 changes: 25 additions & 17 deletions src/idl_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -910,24 +910,32 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
}

if (type.enum_def) {
// The type.base_type can only be scalar, union, array or vector.
// Table, struct or string can't have enum_def.
// Default value of union and vector in NONE, NULL translated to "0".
FLATBUFFERS_ASSERT(IsInteger(type.base_type) ||
(type.base_type == BASE_TYPE_UNION) || IsVector(type) ||
IsArray(type));
if (IsVector(type)) {
// Vector can't use initialization list.
FLATBUFFERS_ASSERT(field->value.constant == "0");
// Verify the enum's type and default value.
const std::string &constant = field->value.constant;
if (type.base_type == BASE_TYPE_UNION) {
if (constant != "0") { return Error("Union defaults must be NONE"); }
} else if (IsVector(type)) {
if (constant != "0" && constant != "[]") {
return Error("Vector defaults may only be `[]`.");
}
} else if (IsArray(type)) {
if (constant != "0") {
return Error("Array defaults are not supported yet.");
}
} else {
// All unions should have the NONE ("0") enum value.
auto in_enum = field->IsOptional() ||
type.enum_def->attributes.Lookup("bit_flags") ||
type.enum_def->FindByValue(field->value.constant);
if (false == in_enum)
return Error("default value of " + field->value.constant +
" for field " + name + " is not part of enum " +
type.enum_def->name);
if (!IsInteger(type.base_type)) {
return Error("Enums must have integer base types");
}
// Optional and bitflags enums may have default constants that are not
// their specified variants.
if (!field->IsOptional() &&
type.enum_def->attributes.Lookup("bit_flags") == nullptr) {
if (type.enum_def->FindByValue(constant) == nullptr) {
return Error("default value of `" + constant + "` for " + "field `" +
name + "` is not part of enum `" + type.enum_def->name +
"`.");
}
}
}
}

Expand Down
1 change: 1 addition & 0 deletions tests/FlatBuffers.Test.Swift/SwiftTest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ swift_dir=`pwd`
cd ..
test_dir=`pwd`
alias fbc='${test_dir}/../flatc'
shopt -s expand_aliases

cd ${swift_dir}/Tests/FlatBuffers.Test.SwiftTests
fbc --swift --gen-mutable --grpc --gen-object-api -I ${test_dir}/include_test ${test_dir}/monster_test.fbs ${test_dir}/union_vector/union_vector.fbs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,11 @@ class FlatBuffersMoreDefaults: XCTestCase {
XCTAssertEqual(defaults.someString, "some")
XCTAssertEqual(defaults.ints, [])
XCTAssertEqual(defaults.floats, [])
XCTAssertEqual(defaults.bools, [])
XCTAssertEqual(defaults.intsCount, 0)
XCTAssertEqual(defaults.floatsCount, 0)
XCTAssertEqual(defaults.abcsCount, 0)
XCTAssertEqual(defaults.boolsCount, 0)
}

func testFlatbuffersObjectAPI() {
Expand All @@ -40,6 +43,8 @@ class FlatBuffersMoreDefaults: XCTestCase {
XCTAssertEqual(defaults.someString, "some")
XCTAssertEqual(defaults.ints, [])
XCTAssertEqual(defaults.floats, [])
XCTAssertEqual(defaults.abcs, [])
XCTAssertEqual(defaults.bools, [])

let buffer = defaults.serialize(builder: &fbb, type: MoreDefaults.self)
let fDefaults = MoreDefaults.getRootAsMoreDefaults(bb: buffer)
Expand All @@ -49,5 +54,7 @@ class FlatBuffersMoreDefaults: XCTestCase {
XCTAssertEqual(fDefaults.floats, [])
XCTAssertEqual(fDefaults.intsCount, 0)
XCTAssertEqual(fDefaults.floatsCount, 0)
XCTAssertEqual(fDefaults.abcsCount, 0)
XCTAssertEqual(fDefaults.boolsCount, 0)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import FlatBuffers

/// Composite components of Monster color.
public enum MyGame_Example_Color: UInt8, Enum {
public enum MyGame_Example_Color: UInt8, Enum {
public typealias T = UInt8
public static var byteSize: Int { return MemoryLayout<UInt8>.size }
public var value: UInt8 { return self.rawValue }
Expand All @@ -21,7 +21,7 @@ public enum MyGame_Example_Color: UInt8, Enum {
public static var min: MyGame_Example_Color { return .red }
}

public enum MyGame_Example_Race: Int8, Enum {
public enum MyGame_Example_Race: Int8, Enum {
public typealias T = Int8
public static var byteSize: Int { return MemoryLayout<Int8>.size }
public var value: Int8 { return self.rawValue }
Expand All @@ -35,7 +35,7 @@ public enum MyGame_Example_Race: Int8, Enum {
public static var min: MyGame_Example_Race { return .none_ }
}

public enum MyGame_Example_Any_: UInt8, Enum {
public enum MyGame_Example_Any_: UInt8, Enum {
public typealias T = UInt8
public static var byteSize: Int { return MemoryLayout<UInt8>.size }
public var value: UInt8 { return self.rawValue }
Expand Down Expand Up @@ -71,7 +71,7 @@ public struct MyGame_Example_Any_Union {
}
}
}
public enum MyGame_Example_AnyUniqueAliases: UInt8, Enum {
public enum MyGame_Example_AnyUniqueAliases: UInt8, Enum {
public typealias T = UInt8
public static var byteSize: Int { return MemoryLayout<UInt8>.size }
public var value: UInt8 { return self.rawValue }
Expand Down Expand Up @@ -107,7 +107,7 @@ public struct MyGame_Example_AnyUniqueAliasesUnion {
}
}
}
public enum MyGame_Example_AnyAmbiguousAliases: UInt8, Enum {
public enum MyGame_Example_AnyAmbiguousAliases: UInt8, Enum {
public typealias T = UInt8
public static var byteSize: Int { return MemoryLayout<UInt8>.size }
public var value: UInt8 { return self.rawValue }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,19 @@

import FlatBuffers

public enum ABC: Int32, Enum {
public typealias T = Int32
public static var byteSize: Int { return MemoryLayout<Int32>.size }
public var value: Int32 { return self.rawValue }
case a = 0
case b = 1
case c = 2


public static var max: ABC { return .c }
public static var min: ABC { return .a }
}

public struct MoreDefaults: FlatBufferObject, ObjectAPIPacker {

static func validateVersion() { FlatBuffersVersion_1_12_0() }
Expand All @@ -20,6 +33,8 @@ public struct MoreDefaults: FlatBufferObject, ObjectAPIPacker {
case floats = 6
case emptyString = 8
case someString = 10
case abcs = 12
case bools = 14
var v: Int32 { Int32(self.rawValue) }
var p: VOffset { self.rawValue }
}
Expand All @@ -34,24 +49,35 @@ public struct MoreDefaults: FlatBufferObject, ObjectAPIPacker {
public var emptyStringSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.emptyString.v) }
public var someString: String? { let o = _accessor.offset(VTOFFSET.someString.v); return o == 0 ? "some" : _accessor.string(at: o) }
public var someStringSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.someString.v) }
public static func startMoreDefaults(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 4) }
public var abcsCount: Int32 { let o = _accessor.offset(VTOFFSET.abcs.v); return o == 0 ? 0 : _accessor.vector(count: o) }
public func abcs(at index: Int32) -> ABC? { let o = _accessor.offset(VTOFFSET.abcs.v); return o == 0 ? ABC.a : ABC(rawValue: _accessor.directRead(of: Int32.self, offset: _accessor.vector(at: o) + index * 4)) }
public var boolsCount: Int32 { let o = _accessor.offset(VTOFFSET.bools.v); return o == 0 ? 0 : _accessor.vector(count: o) }
public func bools(at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.bools.v); return o == 0 ? true : _accessor.directRead(of: Bool.self, offset: _accessor.vector(at: o) + index * 1) }
public var bools: [Bool] { return _accessor.getVector(at: VTOFFSET.bools.v) ?? [] }
public static func startMoreDefaults(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 6) }
public static func addVectorOf(ints: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: ints, at: VTOFFSET.ints.p) }
public static func addVectorOf(floats: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: floats, at: VTOFFSET.floats.p) }
public static func add(emptyString: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: emptyString, at: VTOFFSET.emptyString.p) }
public static func add(someString: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: someString, at: VTOFFSET.someString.p) }
public static func addVectorOf(abcs: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: abcs, at: VTOFFSET.abcs.p) }
public static func addVectorOf(bools: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: bools, at: VTOFFSET.bools.p) }
public static func endMoreDefaults(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
public static func createMoreDefaults(
_ fbb: inout FlatBufferBuilder,
intsVectorOffset ints: Offset<UOffset> = Offset(),
floatsVectorOffset floats: Offset<UOffset> = Offset(),
emptyStringOffset emptyString: Offset<String> = Offset(),
someStringOffset someString: Offset<String> = Offset()
someStringOffset someString: Offset<String> = Offset(),
abcsVectorOffset abcs: Offset<UOffset> = Offset(),
boolsVectorOffset bools: Offset<UOffset> = Offset()
) -> Offset<UOffset> {
let __start = MoreDefaults.startMoreDefaults(&fbb)
MoreDefaults.addVectorOf(ints: ints, &fbb)
MoreDefaults.addVectorOf(floats: floats, &fbb)
MoreDefaults.add(emptyString: emptyString, &fbb)
MoreDefaults.add(someString: someString, &fbb)
MoreDefaults.addVectorOf(abcs: abcs, &fbb)
MoreDefaults.addVectorOf(bools: bools, &fbb)
return MoreDefaults.endMoreDefaults(&fbb, start: __start)
}

Expand Down Expand Up @@ -81,11 +107,15 @@ public struct MoreDefaults: FlatBufferObject, ObjectAPIPacker {
__someString = Offset<String>()
}

let __abcs = builder.createVector(obj.abcs)
let __bools = builder.createVector(obj.bools)
let __root = MoreDefaults.startMoreDefaults(&builder)
MoreDefaults.addVectorOf(ints: __ints, &builder)
MoreDefaults.addVectorOf(floats: __floats, &builder)
MoreDefaults.add(emptyString: __emptyString, &builder)
MoreDefaults.add(someString: __someString, &builder)
MoreDefaults.addVectorOf(abcs: __abcs, &builder)
MoreDefaults.addVectorOf(bools: __bools, &builder)
return MoreDefaults.endMoreDefaults(&builder, start: __root)
}
}
Expand All @@ -96,6 +126,8 @@ public class MoreDefaultsT: NativeObject {
public var floats: [Float32]
public var emptyString: String?
public var someString: String?
public var abcs: [ABC]
public var bools: [Bool]

public init(_ _t: inout MoreDefaults) {
ints = []
Expand All @@ -108,13 +140,23 @@ public class MoreDefaultsT: NativeObject {
}
emptyString = _t.emptyString
someString = _t.someString
abcs = []
for index in 0..<_t.abcsCount {
abcs.append(_t.abcs(at: index)!)
}
bools = []
for index in 0..<_t.boolsCount {
bools.append(_t.bools(at: index))
}
}

public init() {
ints = []
floats = []
emptyString = ""
someString = "some"
abcs = []
bools = []
}

public func serialize() -> ByteBuffer { return serialize(type: MoreDefaults.self) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import FlatBuffers

public enum optional_scalars_OptionalByte: Int8, Enum {
public enum optional_scalars_OptionalByte: Int8, Enum {
public typealias T = Int8
public static var byteSize: Int { return MemoryLayout<Int8>.size }
public var value: Int8 { return self.rawValue }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import FlatBuffers

public enum Character: UInt8, Enum {
public enum Character: UInt8, Enum {
public typealias T = UInt8
public static var byteSize: Int { return MemoryLayout<UInt8>.size }
public var value: UInt8 { return self.rawValue }
Expand Down
5 changes: 5 additions & 0 deletions tests/more_defaults.fbs
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@

enum ABC: int { A, B, C }


table MoreDefaults {
ints: [int] = [];
floats: [float] = [ ];
empty_string: string = "";
some_string: string = "some";
abcs: [ABC] = [];
bools: [bool] = [];
}
Loading