Skip to content

Cleaned up generated code for closed Enums #1751

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 5, 2025
Merged
Show file tree
Hide file tree
Changes from 2 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
18 changes: 12 additions & 6 deletions Sources/protoc-gen-swift/EnumGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,12 @@ class EnumGenerator {

p.print(
"",
"\(enumDescriptor.protoSourceCommentsWithDeprecation(generatorOptions: generatorOptions))\(visibility)enum \(swiftRelativeName): \(namer.swiftProtobufModulePrefix)Enum, \(Self.requiredProtocolConformancesForEnums) {"
"\(enumDescriptor.protoSourceCommentsWithDeprecation(generatorOptions: generatorOptions))\(visibility)enum \(swiftRelativeName): \(enumDescriptor.isClosed ? "Int, " : "")\(namer.swiftProtobufModulePrefix)Enum, \(Self.requiredProtocolConformancesForEnums) {"
)
p.withIndentation { p in
p.print("\(visibility)typealias RawValue = Int")
if !enumDescriptor.isClosed {
p.print("\(visibility)typealias RawValue = Int")
}

// Cases/aliases
generateCasesOrAliases(printer: &p)
Expand All @@ -76,11 +78,13 @@ class EnumGenerator {
p.printIndented("self = \(namer.dottedRelativeName(enumValue: enumDescriptor.values.first!))")
p.print("}")

p.print()
generateInitRawValue(printer: &p)
if !enumDescriptor.isClosed {
p.print()
generateInitRawValue(printer: &p)

p.print()
generateRawValueProperty(printer: &p)
p.print()
generateRawValueProperty(printer: &p)
}

maybeGenerateCaseIterable(printer: &p)

Expand Down Expand Up @@ -134,6 +138,8 @@ class EnumGenerator {
if let aliasOf = aliasInfo.original(of: enumValueDescriptor) {
let aliasOfName = namer.relativeName(enumValue: aliasOf)
p.print("\(comments)\(visibility)static let \(relativeName) = \(aliasOfName)")
} else if enumDescriptor.isClosed {
p.print("\(comments)case \(relativeName) = \(enumValueDescriptor.number)")
} else {
p.print("\(comments)case \(relativeName) // = \(enumValueDescriptor.number)")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,33 +36,15 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP
typealias Version = _2
}

enum SDTTopLevelEnum: SwiftProtobuf.Enum, Swift.CaseIterable {
typealias RawValue = Int
case valueZero // = 0
case valueOne // = 1
case valueTwo // = 2
enum SDTTopLevelEnum: Int, SwiftProtobuf.Enum, Swift.CaseIterable {
case valueZero = 0
case valueOne = 1
case valueTwo = 2

init() {
self = .valueZero
}

init?(rawValue: Int) {
switch rawValue {
case 0: self = .valueZero
case 1: self = .valueOne
case 2: self = .valueTwo
default: return nil
}
}

var rawValue: Int {
switch self {
case .valueZero: return 0
case .valueOne: return 1
case .valueTwo: return 2
}
}

}

struct SDTTopLevelMessage: @unchecked Sendable {
Expand Down Expand Up @@ -135,33 +117,15 @@ struct SDTTopLevelMessage: @unchecked Sendable {

}

enum SubEnum: SwiftProtobuf.Enum, Swift.CaseIterable {
typealias RawValue = Int
case subValue0 // = 0
case subValue1 // = 1
case subValue2 // = 2
enum SubEnum: Int, SwiftProtobuf.Enum, Swift.CaseIterable {
case subValue0 = 0
case subValue1 = 1
case subValue2 = 2

init() {
self = .subValue0
}

init?(rawValue: Int) {
switch rawValue {
case 0: self = .subValue0
case 1: self = .subValue1
case 2: self = .subValue2
default: return nil
}
}

var rawValue: Int {
switch self {
case .subValue0: return 0
case .subValue1: return 1
case .subValue2: return 2
}
}

}

struct SubMessage: @unchecked Sendable {
Expand Down
42 changes: 8 additions & 34 deletions Tests/SwiftProtobufPluginLibraryTests/test_features.pb.swift
Original file line number Diff line number Diff line change
Expand Up @@ -84,45 +84,19 @@ struct SwiftFeatureTest_TestFeatures: Sendable {

var unknownFields = SwiftProtobuf.UnknownStorage()

enum EnumFeature: SwiftProtobuf.Enum, Swift.CaseIterable {
typealias RawValue = Int
case unknown // = 0
case value1 // = 1
case value2 // = 2
case value3 // = 3
case value4 // = 4
case value5 // = 5
case value6 // = 6
enum EnumFeature: Int, SwiftProtobuf.Enum, Swift.CaseIterable {
case unknown = 0
case value1 = 1
case value2 = 2
case value3 = 3
case value4 = 4
case value5 = 5
case value6 = 6

init() {
self = .unknown
}

init?(rawValue: Int) {
switch rawValue {
case 0: self = .unknown
case 1: self = .value1
case 2: self = .value2
case 3: self = .value3
case 4: self = .value4
case 5: self = .value5
case 6: self = .value6
default: return nil
}
}

var rawValue: Int {
switch self {
case .unknown: return 0
case .value1: return 1
case .value2: return 2
case .value3: return 3
case .value4: return 4
case .value5: return 5
case .value6: return 6
}
}

}

init() {}
Expand Down
30 changes: 5 additions & 25 deletions Tests/SwiftProtobufTests/fuzz_testing.pb.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,36 +35,16 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP
typealias Version = _2
}

enum SwiftProtoTesting_Fuzz_AnEnum: SwiftProtobuf.Enum, Swift.CaseIterable {
typealias RawValue = Int
case zero // = 0
case one // = 1
case two // = 2
case three // = 3
enum SwiftProtoTesting_Fuzz_AnEnum: Int, SwiftProtobuf.Enum, Swift.CaseIterable {
case zero = 0
case one = 1
case two = 2
case three = 3

init() {
self = .zero
}

init?(rawValue: Int) {
switch rawValue {
case 0: self = .zero
case 1: self = .one
case 2: self = .two
case 3: self = .three
default: return nil
}
}

var rawValue: Int {
switch self {
case .zero: return 0
case .one: return 1
case .two: return 2
case .three: return 3
}
}

}

struct SwiftProtoTesting_Fuzz_Message: SwiftProtobuf.ExtensibleMessage, @unchecked Sendable {
Expand Down
56 changes: 9 additions & 47 deletions Tests/SwiftProtobufTests/map_proto2_unittest.pb.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,65 +50,27 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP
typealias Version = _2
}

enum SwiftProtoTesting_Proto2MapEnum: SwiftProtobuf.Enum, Swift.CaseIterable {
typealias RawValue = Int
case foo // = 0
case bar // = 1
case baz // = 2
enum SwiftProtoTesting_Proto2MapEnum: Int, SwiftProtobuf.Enum, Swift.CaseIterable {
case foo = 0
case bar = 1
case baz = 2

init() {
self = .foo
}

init?(rawValue: Int) {
switch rawValue {
case 0: self = .foo
case 1: self = .bar
case 2: self = .baz
default: return nil
}
}

var rawValue: Int {
switch self {
case .foo: return 0
case .bar: return 1
case .baz: return 2
}
}

}

enum SwiftProtoTesting_Proto2MapEnumPlusExtra: SwiftProtobuf.Enum, Swift.CaseIterable {
typealias RawValue = Int
case eProto2MapEnumFoo // = 0
case eProto2MapEnumBar // = 1
case eProto2MapEnumBaz // = 2
case eProto2MapEnumExtra // = 3
enum SwiftProtoTesting_Proto2MapEnumPlusExtra: Int, SwiftProtobuf.Enum, Swift.CaseIterable {
case eProto2MapEnumFoo = 0
case eProto2MapEnumBar = 1
case eProto2MapEnumBaz = 2
case eProto2MapEnumExtra = 3

init() {
self = .eProto2MapEnumFoo
}

init?(rawValue: Int) {
switch rawValue {
case 0: self = .eProto2MapEnumFoo
case 1: self = .eProto2MapEnumBar
case 2: self = .eProto2MapEnumBaz
case 3: self = .eProto2MapEnumExtra
default: return nil
}
}

var rawValue: Int {
switch self {
case .eProto2MapEnumFoo: return 0
case .eProto2MapEnumBar: return 1
case .eProto2MapEnumBaz: return 2
case .eProto2MapEnumExtra: return 3
}
}

}

struct SwiftProtoTesting_TestEnumMap: Sendable {
Expand Down
Loading
Loading