Skip to content

Commit 1d7da61

Browse files
committed
Move SwiftProtobufNamer uniquelyNamedValues(enum:) to the plugin.
The api really is specific to generation of the proto sources and it depends on some apis on `EnumDescriptor` that also should move out of the plugin library. Also move the tests out to the new plugin test target.
1 parent d2e4eec commit 1d7da61

File tree

5 files changed

+349
-89
lines changed

5 files changed

+349
-89
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ let package = Package(
7575
),
7676
.testTarget(
7777
name: "protoc-gen-swiftTests",
78-
dependencies: ["protoc-gen-swift"]
78+
dependencies: ["protoc-gen-swift", "SwiftProtobufTestHelpers"]
7979
),
8080
],
8181
swiftLanguageVersions: [.v5]

Sources/SwiftProtobufPluginLibrary/SwiftProtobufNamer.swift

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -164,32 +164,6 @@ public final class SwiftProtobufNamer {
164164
return "." + NamingUtils.trimBackticks(relativeName)
165165
}
166166

167-
/// Filters the Enum's values to those that will have unique Swift
168-
/// names. Only poorly named proto enum alias values get filtered
169-
/// away, so the assumption is they aren't really needed from an
170-
/// api pov.
171-
public func uniquelyNamedValues(enum e: EnumDescriptor) -> [EnumValueDescriptor] {
172-
return e.values.filter {
173-
// Original are kept as is. The computations for relative
174-
// name already adds values for collisions with different
175-
// values.
176-
guard let aliasOf = $0.aliasOf else { return true }
177-
let relativeName = self.relativeName(enumValue: $0)
178-
let aliasOfRelativeName = self.relativeName(enumValue: aliasOf)
179-
// If the relative name matches for the alias and original, drop
180-
// the alias.
181-
guard relativeName != aliasOfRelativeName else { return false }
182-
// Only include this alias if it is the first one with this name.
183-
// (handles alias with different cases in their names that get
184-
// mangled to a single Swift name.)
185-
let firstAlias = aliasOf.aliases.firstIndex {
186-
let otherRelativeName = self.relativeName(enumValue: $0)
187-
return relativeName == otherRelativeName
188-
}
189-
return aliasOf.aliases[firstAlias!] === $0
190-
}
191-
}
192-
193167
/// Calculate the relative name for the given oneof.
194168
public func relativeName(oneof: OneofDescriptor) -> String {
195169
let camelCase = NamingUtils.toUpperCamelCase(oneof.name)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Sources/SwiftProtobufPluginLibrary/SwiftProtobufNamer.swift - A helper that generates SwiftProtobuf names.
2+
//
3+
// Copyright (c) 2014 - 2017 Apple Inc. and the project authors
4+
// Licensed under Apache License v2.0 with Runtime Library Exception
5+
//
6+
// See LICENSE.txt for license information:
7+
// https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
8+
//
9+
// -----------------------------------------------------------------------------
10+
///
11+
/// A helper that can generate SwiftProtobuf names from types.
12+
///
13+
// -----------------------------------------------------------------------------
14+
15+
import SwiftProtobufPluginLibrary
16+
17+
extension SwiftProtobufNamer {
18+
19+
/// Filters the Enum's values to those that will have unique Swift
20+
/// names. Only poorly named proto enum alias values get filtered
21+
/// away, so the assumption is they aren't really needed from an
22+
/// api pov.
23+
func uniquelyNamedValues(enum e: EnumDescriptor) -> [EnumValueDescriptor] {
24+
return e.values.filter {
25+
// Original are kept as is. The computations for relative
26+
// name already adds values for collisions with different
27+
// values.
28+
guard let aliasOf = $0.aliasOf else { return true }
29+
let relativeName = self.relativeName(enumValue: $0)
30+
let aliasOfRelativeName = self.relativeName(enumValue: aliasOf)
31+
// If the relative name matches for the alias and original, drop
32+
// the alias.
33+
guard relativeName != aliasOfRelativeName else { return false }
34+
// Only include this alias if it is the first one with this name.
35+
// (handles alias with different cases in their names that get
36+
// mangled to a single Swift name.)
37+
let firstAlias = aliasOf.aliases.firstIndex {
38+
let otherRelativeName = self.relativeName(enumValue: $0)
39+
return relativeName == otherRelativeName
40+
}
41+
return aliasOf.aliases[firstAlias!] === $0
42+
}
43+
}
44+
}

Tests/SwiftProtobufPluginLibraryTests/Test_SwiftProtobufNamer.swift

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,6 @@ class Test_SwiftProtobufNamer: XCTestCase {
7676
XCTAssertEqual(namer.relativeName(enumValue: values[3]), "foo")
7777
XCTAssertEqual(namer.relativeName(enumValue: values[4]), "foo")
7878
XCTAssertEqual(namer.relativeName(enumValue: values[5]), "alias")
79-
80-
// Test uniquelyNamedValues(enum:)
81-
82-
let filtered = namer.uniquelyNamedValues(enum: e)
83-
XCTAssertEqual(filtered.count, 3)
84-
85-
XCTAssertEqual(filtered[0].name, "TEST_ENUM_FOO")
86-
XCTAssertEqual(filtered[1].name, "TEST_ENUM_BAR")
87-
XCTAssertEqual(filtered[2].name, "TEST_ENUM_ALIAS")
88-
XCTAssertEqual(namer.relativeName(enumValue: filtered[0]), "foo")
89-
XCTAssertEqual(namer.relativeName(enumValue: filtered[1]), "bar")
90-
XCTAssertEqual(namer.relativeName(enumValue: filtered[2]), "alias")
9179
}
9280

9381
func testEnumValueHandling_NameCollisions() {
@@ -138,20 +126,6 @@ class Test_SwiftProtobufNamer: XCTestCase {
138126
XCTAssertEqual(namer.relativeName(enumValue: values[1]), "bar")
139127
XCTAssertEqual(namer.relativeName(enumValue: values[2]), "foo_2")
140128
XCTAssertEqual(namer.relativeName(enumValue: values[3]), "foo_n1")
141-
142-
// Test uniquelyNamedValues(enum:)
143-
144-
let filtered = namer.uniquelyNamedValues(enum: e)
145-
XCTAssertEqual(filtered.count, 4)
146-
147-
XCTAssertEqual(filtered[0].name, "TEST_ENUM_FOO")
148-
XCTAssertEqual(filtered[1].name, "TEST_ENUM_BAR")
149-
XCTAssertEqual(filtered[2].name, "TESTENUM_FOO")
150-
XCTAssertEqual(filtered[3].name, "_FOO")
151-
XCTAssertEqual(namer.relativeName(enumValue: filtered[0]), "foo_0")
152-
XCTAssertEqual(namer.relativeName(enumValue: filtered[1]), "bar")
153-
XCTAssertEqual(namer.relativeName(enumValue: filtered[2]), "foo_2")
154-
XCTAssertEqual(namer.relativeName(enumValue: filtered[3]), "foo_n1")
155129
}
156130

157131
func testEnumValueHandling_NameCollisionsAndAliasMatches() {
@@ -225,24 +199,6 @@ class Test_SwiftProtobufNamer: XCTestCase {
225199
XCTAssertEqual(namer.relativeName(enumValue: values[5]), "alias")
226200
XCTAssertEqual(namer.relativeName(enumValue: values[6]), "mumble_1")
227201
XCTAssertEqual(namer.relativeName(enumValue: values[7]), "mumble_0")
228-
229-
// Test uniquelyNamedValues(enum:)
230-
231-
let filtered = namer.uniquelyNamedValues(enum: e)
232-
XCTAssertEqual(filtered.count, 6)
233-
234-
XCTAssertEqual(filtered[0].name, "TEST_ENUM_FOO")
235-
XCTAssertEqual(filtered[1].name, "TEST_ENUM_BAR")
236-
XCTAssertEqual(filtered[2].name, "_FOO")
237-
XCTAssertEqual(filtered[3].name, "TEST_ENUM_ALIAS")
238-
XCTAssertEqual(filtered[4].name, "mumble")
239-
XCTAssertEqual(filtered[5].name, "MUMBLE")
240-
XCTAssertEqual(namer.relativeName(enumValue: filtered[0]), "foo_0")
241-
XCTAssertEqual(namer.relativeName(enumValue: filtered[1]), "bar")
242-
XCTAssertEqual(namer.relativeName(enumValue: filtered[2]), "foo_2")
243-
XCTAssertEqual(namer.relativeName(enumValue: filtered[3]), "alias")
244-
XCTAssertEqual(namer.relativeName(enumValue: filtered[4]), "mumble_1")
245-
XCTAssertEqual(namer.relativeName(enumValue: filtered[5]), "mumble_0")
246202
}
247203

248204
func testEnumValueHandling_UniqueAliasNameCollisions() {
@@ -316,24 +272,6 @@ class Test_SwiftProtobufNamer: XCTestCase {
316272
XCTAssertEqual(namer.relativeName(enumValue: values[3]), "qux")
317273
XCTAssertEqual(namer.relativeName(enumValue: values[4]), "qux")
318274
XCTAssertEqual(namer.relativeName(enumValue: values[5]), "bAz")
319-
320-
// Test uniquelyNamedValues(enum:)
321-
322-
// QUX & qux collided, so only one remains.
323-
324-
let filtered = namer.uniquelyNamedValues(enum: e)
325-
XCTAssertEqual(filtered.count, 5)
326-
327-
XCTAssertEqual(filtered[0].name, "ALIAS_FOO")
328-
XCTAssertEqual(filtered[1].name, "ALIAS_BAR")
329-
XCTAssertEqual(filtered[2].name, "ALIAS_BAZ")
330-
XCTAssertEqual(filtered[3].name, "QUX")
331-
XCTAssertEqual(filtered[4].name, "bAz")
332-
XCTAssertEqual(namer.relativeName(enumValue: filtered[0]), "aliasFoo")
333-
XCTAssertEqual(namer.relativeName(enumValue: filtered[1]), "aliasBar")
334-
XCTAssertEqual(namer.relativeName(enumValue: filtered[2]), "aliasBaz")
335-
XCTAssertEqual(namer.relativeName(enumValue: filtered[3]), "qux")
336-
XCTAssertEqual(namer.relativeName(enumValue: filtered[4]), "bAz")
337275
}
338276

339277
}

0 commit comments

Comments
 (0)