Skip to content

Commit 2839676

Browse files
committed
Provide some more map helpers like the C++ Descriptor (take 2).
Migrate some generator code over to the descriptors also since it makes the sub fields a little less black magic.
1 parent fcdb3c9 commit 2839676

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

Sources/SwiftProtobufPluginLibrary/Descriptor.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,6 @@ public final class Descriptor {
159159
public private(set) weak var file: FileDescriptor!
160160
public private(set) weak var containingType: Descriptor?
161161

162-
public let isMapEntry: Bool
163-
164162
public let enums: [EnumDescriptor]
165163
public let messages: [Descriptor]
166164
public let fields: [FieldDescriptor]
@@ -179,6 +177,17 @@ public final class Descriptor {
179177
return proto.extensionRange
180178
}
181179

180+
/// True/False if this Message is just for a `map<>` entry.
181+
public var isMapEntry: Bool { return proto.options.mapEntry }
182+
183+
/// Returns the `FieldDescriptor`s for the "key" and "value" fields. If
184+
/// this isn't a map entry field, returns nil.
185+
public var mapKeyAndValue: (key: FieldDescriptor, value: FieldDescriptor)? {
186+
guard isMapEntry else { return nil }
187+
assert(fields.count == 2)
188+
return (key: fields[0], value: fields[1])
189+
}
190+
182191
public var useMessageSetWireFormat: Bool { return proto.options.messageSetWireFormat }
183192

184193
fileprivate init(proto: Google_Protobuf_DescriptorProto,
@@ -190,8 +199,6 @@ public final class Descriptor {
190199
let fullName = "\(prefix).\(proto.name)"
191200
self.fullName = fullName
192201

193-
isMapEntry = proto.options.mapEntry
194-
195202
self.enums = proto.enumType.enumeratedMap {
196203
return EnumDescriptor(proto: $1, index: $0, registry: registry, fullNamePrefix: fullName)
197204
}

Sources/protoc-gen-swift/Descriptor+Extensions.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,8 @@ extension Descriptor {
9696

9797
extension FieldDescriptor {
9898
func swiftType(namer: SwiftProtobufNamer) -> String {
99-
if isMap {
100-
let mapDescriptor: Descriptor = messageType
101-
let keyField = mapDescriptor.fields[0]
99+
if case let (keyField, valueField)? = messageType?.mapKeyAndValue {
102100
let keyType = keyField.swiftType(namer: namer)
103-
let valueField = mapDescriptor.fields[1]
104101
let valueType = valueField.swiftType(namer: namer)
105102
return "Dictionary<" + keyType + "," + valueType + ">"
106103
}
@@ -227,11 +224,8 @@ extension FieldDescriptor {
227224
/// Calculates the traits type used for maps and extensions, they
228225
/// are used in decoding and visiting.
229226
func traitsType(namer: SwiftProtobufNamer) -> String {
230-
if isMap {
231-
let mapDescriptor: Descriptor = messageType
232-
let keyField = mapDescriptor.fields[0]
227+
if case let (keyField, valueField)? = messageType?.mapKeyAndValue {
233228
let keyTraits = keyField.traitsType(namer: namer)
234-
let valueField = mapDescriptor.fields[1]
235229
let valueTraits = valueField.traitsType(namer: namer)
236230
switch valueField.type {
237231
case .message: // Map's can't have a group as the value

0 commit comments

Comments
 (0)