Skip to content

Commit 2ba25de

Browse files
authored
fix: ensure that the generated resource bundle finder class has a unique name (#803)
`rules_swift_package_manager` generates a resource bundle accessor for ObjC code that has resources. The generated code includes a private class that is used to find the resources. We need to ensure that the finder class has a unique name. - Generate a unique name for the ObjC resource bundle finder class. - Update the `resources_example` to include a second Swift package that has an ObjC resource module. - Update the `README.md` for the `resources_example` with information about one of the cases being tested. Closes #798.
1 parent 6f82321 commit 2ba25de

File tree

9 files changed

+173
-14
lines changed

9 files changed

+173
-14
lines changed

examples/resources_example/MODULE.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,6 @@ use_repo(
5353
"swiftpkg_app_lovin_sdk",
5454
"swiftpkg_googlesignin_ios",
5555
"swiftpkg_package_with_resources",
56+
"swiftpkg_sdwebimageswiftui",
5657
)
5758
# swift_deps END

examples/resources_example/MODULE.bazel.lock

Lines changed: 62 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/resources_example/Package.resolved

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/resources_example/Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ let package = Package(
88
.package(path: "third_party/another_package_with_resources"),
99
.package(path: "third_party/app_lovin_sdk"),
1010
.package(path: "third_party/package_with_resources"),
11+
.package(url: "https://github.com/SDWebImage/SDWebImageSwiftUI.git", from: "2.0.0"),
1112
.package(url: "https://github.com/google/GoogleSignIn-iOS", from: "7.0.0"),
1213
]
1314
)

examples/resources_example/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,11 @@
33
This example demonstrates using an external package that has its resources under a directory. The
44
generated Bazel build files should ensure that the resources are found and made available in a
55
resource bundle.
6+
7+
## Notes
8+
9+
### Multiple Swift packages with Objc targets that contain resources
10+
11+
Both the `third_party/app_lovin_sdk` and the `SDWebImageSwiftUI` packages have or use Objective-C
12+
code that have resources. The inclusion of both in this project ensures that the resource bundle
13+
accessors that are generated for these packages work properly.

examples/resources_example/Sources/MyApp/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ swift_library(
1414
"@swiftpkg_another_package_with_resources//:MoreCoolUI",
1515
"@swiftpkg_googlesignin_ios//:GoogleSignInSwift_Sources_GoogleSignInSwift",
1616
"@swiftpkg_package_with_resources//:Sources_CoolUI",
17+
"@swiftpkg_sdwebimageswiftui//:SDWebImageSwiftUI_Classes_SDWebImageSwiftUI",
1718
],
1819
)
1920

examples/resources_example/Sources/MyApp/MyApp.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import CoolUI
22
import GoogleSignInSwift
33
import MoreCoolUI
4+
import SDWebImageSwiftUI
45
import SwiftUI
56

67
@main
@@ -12,6 +13,9 @@ struct MyApp: App {
1213
CoolStuff.image().resizable()
1314
MoreCoolStuff.title()
1415
MoreCoolStuff.image().resizable()
16+
WebImage(url: URL(string: "https://nokiatech.github.io/heif/content/images/ski_jump_1440x960.heic"))
17+
.resizable()
18+
.aspectRatio(contentMode: .fit)
1519
// Ensure that Google sign-in can find its resources.
1620
GoogleSignInButton {
1721
print("Signing in")

examples/resources_example/swift_deps_index.json

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
"another_package_with_resources",
44
"app_lovin_sdk",
55
"googlesignin-ios",
6-
"package_with_resources"
6+
"package_with_resources",
7+
"sdwebimageswiftui"
78
],
89
"modules": [
910
{
@@ -142,6 +143,37 @@
142143
"product_memberships": [
143144
"CoolUI"
144145
]
146+
},
147+
{
148+
"name": "SDWebImageMapKit",
149+
"c99name": "SDWebImageMapKit",
150+
"src_type": "objc",
151+
"label": "@swiftpkg_sdwebimage//:SDWebImageMapKit_SDWebImageMapKit",
152+
"package_identity": "sdwebimage",
153+
"product_memberships": [
154+
"SDWebImageMapKit"
155+
]
156+
},
157+
{
158+
"name": "SDWebImage",
159+
"c99name": "SDWebImage",
160+
"src_type": "objc",
161+
"label": "@swiftpkg_sdwebimage//:SDWebImage_SDWebImage",
162+
"package_identity": "sdwebimage",
163+
"product_memberships": [
164+
"SDWebImage",
165+
"SDWebImageMapKit"
166+
]
167+
},
168+
{
169+
"name": "SDWebImageSwiftUI",
170+
"c99name": "SDWebImageSwiftUI",
171+
"src_type": "swift",
172+
"label": "@swiftpkg_sdwebimageswiftui//:SDWebImageSwiftUI_Classes_SDWebImageSwiftUI",
173+
"package_identity": "sdwebimageswiftui",
174+
"product_memberships": [
175+
"SDWebImageSwiftUI"
176+
]
145177
}
146178
],
147179
"products": [
@@ -249,6 +281,30 @@
249281
"target_labels": [
250282
"@swiftpkg_package_with_resources//:Sources_CoolUI"
251283
]
284+
},
285+
{
286+
"identity": "sdwebimageswiftui",
287+
"name": "SDWebImageSwiftUI",
288+
"type": "library",
289+
"target_labels": [
290+
"@swiftpkg_sdwebimageswiftui//:SDWebImageSwiftUI_Classes_SDWebImageSwiftUI"
291+
]
292+
},
293+
{
294+
"identity": "sdwebimage",
295+
"name": "SDWebImage",
296+
"type": "library",
297+
"target_labels": [
298+
"@swiftpkg_sdwebimage//:SDWebImage_SDWebImage"
299+
]
300+
},
301+
{
302+
"identity": "sdwebimage",
303+
"name": "SDWebImageMapKit",
304+
"type": "library",
305+
"target_labels": [
306+
"@swiftpkg_sdwebimage//:SDWebImageMapKit_SDWebImageMapKit"
307+
]
252308
}
253309
],
254310
"packages": [
@@ -308,6 +364,24 @@
308364
"local": {
309365
"path": "third_party/package_with_resources"
310366
}
367+
},
368+
{
369+
"name": "swiftpkg_sdwebimage",
370+
"identity": "sdwebimage",
371+
"remote": {
372+
"commit": "e278c13e46e8d20c895c221e922c6ac6b72aaca9",
373+
"remote": "https://github.com/SDWebImage/SDWebImage",
374+
"version": "5.18.7"
375+
}
376+
},
377+
{
378+
"name": "swiftpkg_sdwebimageswiftui",
379+
"identity": "sdwebimageswiftui",
380+
"remote": {
381+
"commit": "aee64ef39b570c44ccf0f884c440fc6494a23c76",
382+
"remote": "https://github.com/SDWebImage/SDWebImageSwiftUI.git",
383+
"version": "2.2.5"
384+
}
311385
}
312386
]
313387
}

swiftpkg/internal/ObjcResourceBundleAccessor.m.tmpl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
#import <Foundation/Foundation.h>
22

3-
@interface __CurrentBundleFinder : NSObject
3+
@interface __{MODULE_NAME}_CurrentBundleFinder : NSObject
44
@end
55

6-
@implementation __CurrentBundleFinder
6+
@implementation __{MODULE_NAME}_CurrentBundleFinder
77
@end
88

99
NSBundle* {MODULE_NAME}_SWIFTPM_MODULE_BUNDLE() {
1010
NSArray *candidates = @[
1111
[[NSBundle mainBundle] bundleURL],
12-
[[NSBundle bundleForClass:[__CurrentBundleFinder class]] bundleURL],
12+
[[NSBundle bundleForClass:[__{MODULE_NAME}_CurrentBundleFinder class]] bundleURL],
1313
];
1414
for (id obj in candidates) {
1515
NSURL *baseURL = obj;

0 commit comments

Comments
 (0)