Skip to content

Commit 356f86e

Browse files
authored
Merge pull request #244 from mac-cain13/swiftidentifier-refactor
Refactor to SwiftIdentifier
2 parents cc05978 + 3548faf commit 356f86e

22 files changed

+288
-330
lines changed

R.swift.xcodeproj/project.pbxproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@
6262
D5B799771C199755009EA901 /* StoryboardGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B799671C1993B7009EA901 /* StoryboardGenerator.swift */; };
6363
D5B799791C19C082009EA901 /* WhiteListedExtensionsResourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B799781C19C082009EA901 /* WhiteListedExtensionsResourceType.swift */; };
6464
D5B7997A1C19C1BD009EA901 /* WhiteListedExtensionsResourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B799781C19C082009EA901 /* WhiteListedExtensionsResourceType.swift */; };
65-
D5B7997D1C1B07C3009EA901 /* SanitizedSwiftName.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B7997C1C1B07C3009EA901 /* SanitizedSwiftName.swift */; };
65+
D5B7997D1C1B07C3009EA901 /* SwiftIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B7997C1C1B07C3009EA901 /* SwiftIdentifier.swift */; };
6666
D5B7997F1C1B07EB009EA901 /* ErrorOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B7997E1C1B07EB009EA901 /* ErrorOutput.swift */; };
67-
D5B799801C1B0943009EA901 /* SanitizedSwiftName.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B7997C1C1B07C3009EA901 /* SanitizedSwiftName.swift */; };
67+
D5B799801C1B0943009EA901 /* SwiftIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B7997C1C1B07C3009EA901 /* SwiftIdentifier.swift */; };
6868
D5B799811C1B0943009EA901 /* ErrorOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B7997E1C1B07EB009EA901 /* ErrorOutput.swift */; };
6969
D5B799831C1B8C78009EA901 /* Module.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B799821C1B8C78009EA901 /* Module.swift */; };
7070
D5B7998A1C1B91A9009EA901 /* Module.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B799821C1B8C78009EA901 /* Module.swift */; };
@@ -139,7 +139,7 @@
139139
D5B7996D1C19940F009EA901 /* ResourceFileGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResourceFileGenerator.swift; sourceTree = "<group>"; };
140140
D5B7996F1C199420009EA901 /* FontGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FontGenerator.swift; sourceTree = "<group>"; };
141141
D5B799781C19C082009EA901 /* WhiteListedExtensionsResourceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhiteListedExtensionsResourceType.swift; sourceTree = "<group>"; };
142-
D5B7997C1C1B07C3009EA901 /* SanitizedSwiftName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SanitizedSwiftName.swift; sourceTree = "<group>"; };
142+
D5B7997C1C1B07C3009EA901 /* SwiftIdentifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftIdentifier.swift; sourceTree = "<group>"; };
143143
D5B7997E1C1B07EB009EA901 /* ErrorOutput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorOutput.swift; sourceTree = "<group>"; };
144144
D5B799821C1B8C78009EA901 /* Module.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Module.swift; sourceTree = "<group>"; };
145145
D5C4227D1B711FDF004EA9B9 /* rswiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = rswiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -227,7 +227,7 @@
227227
isa = PBXGroup;
228228
children = (
229229
D5B7997E1C1B07EB009EA901 /* ErrorOutput.swift */,
230-
D5B7997C1C1B07C3009EA901 /* SanitizedSwiftName.swift */,
230+
D5B7997C1C1B07C3009EA901 /* SwiftIdentifier.swift */,
231231
D56F923E1C2942B400177FF7 /* Struct+ChildValidation.swift */,
232232
D58672481C21FC9700A760EC /* TypeSequenceProvider.swift */,
233233
D5EA0DFE1A3DF4E300FFEBC4 /* UtilExtensions.swift */,
@@ -482,7 +482,7 @@
482482
D5B799731C199755009EA901 /* NibGenerator.swift in Sources */,
483483
D5B129B31C3BA75A00A1C5FC /* Let.swift in Sources */,
484484
D5F97E491C1819160066D7C0 /* Font.swift in Sources */,
485-
D5B799801C1B0943009EA901 /* SanitizedSwiftName.swift in Sources */,
485+
D5B799801C1B0943009EA901 /* SwiftIdentifier.swift in Sources */,
486486
D5B799711C199755009EA901 /* FontGenerator.swift in Sources */,
487487
D586D1C61BE20D8600F18FEC /* Extensions.swift in Sources */,
488488
D586D1C81BE20D8600F18FEC /* Serialization.swift in Sources */,
@@ -539,7 +539,7 @@
539539
D5646DE51BE2016E0034F4D7 /* PBXObject.swift in Sources */,
540540
D56DC76D1C41758800623437 /* AccessModifier.swift in Sources */,
541541
D5B129AF1C3BA5F900A1C5FC /* Let.swift in Sources */,
542-
D5B7997D1C1B07C3009EA901 /* SanitizedSwiftName.swift in Sources */,
542+
D5B7997D1C1B07C3009EA901 /* SwiftIdentifier.swift in Sources */,
543543
D5A0A82A1C47920A0089ED2C /* SwiftCodeConverible.swift in Sources */,
544544
D5B799681C1993B7009EA901 /* StoryboardGenerator.swift in Sources */,
545545
D5B799701C199420009EA901 /* FontGenerator.swift in Sources */,

R.swift/Generators/ColorGenerator.swift

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,27 @@ struct ColorGenerator: Generator {
1414
let internalStruct: Struct? = nil
1515

1616
init(colorPalettes palettes: [ColorPalette]) {
17+
let groupedPalettes = palettes.groupBySwiftIdentifiers { $0.filename }
18+
groupedPalettes.printWarningsForDuplicatesAndEmpties(source: "color palette", result: "file")
19+
1720
externalStruct = Struct(
1821
comments: ["This `R.color` struct is generated, and contains static references to \(palettes.count) color palettes."],
1922
type: Type(module: .Host, name: "color"),
2023
implements: [],
2124
typealiasses: [],
2225
properties: [],
2326
functions: [],
24-
structs: palettes.flatMap(ColorGenerator.colorStructFromPalette)
27+
structs: groupedPalettes.uniques.flatMap(ColorGenerator.colorStructFromPalette)
2528
)
2629
}
2730

2831
private static func colorStructFromPalette(palette: ColorPalette) -> Struct? {
2932
if palette.colors.isEmpty { return nil }
3033

31-
let name = sanitizedSwiftName(palette.filename)
32-
let groupedColors = palette.colors.groupBySwiftNames { $0.0 }
33-
34-
for (sanitizedName, duplicates) in groupedColors.duplicates {
35-
warn("Skipping \(duplicates.count) colors in palette '\(palette.filename)' because symbol '\(sanitizedName)' would be generated for all of these colors: \(duplicates.joinWithSeparator(", "))")
36-
}
34+
let name = SwiftIdentifier(name: palette.filename)
35+
let groupedColors = palette.colors.groupBySwiftIdentifiers { $0.0 }
3736

38-
let empties = groupedColors.empties
39-
if let empty = empties.first where empties.count == 1 {
40-
warn("Skipping 1 color in palette '\(palette.filename)' because no swift identifier can be generated for image: \(empty)")
41-
}
42-
else if empties.count > 1 {
43-
warn("Skipping \(empties.count) images in palette '\(palette.filename)' because no swift identifier can be generated for all of these images: \(empties.joinWithSeparator(", "))")
44-
}
37+
groupedColors.printWarningsForDuplicatesAndEmpties(source: "color", container: "in palette '\(palette.filename)'", result: "color")
4538

4639
return Struct(
4740
comments: ["This `R.color.\(name)` struct is generated, and contains static references to \(groupedColors.uniques.count) colors."],
@@ -60,7 +53,7 @@ struct ColorGenerator: Generator {
6053
"<span style='background-color: #\(color.hexString); color: #\(color.opposite.hexString); padding: 1px 3px;'>#\(color.hexString)</span> \(name)"
6154
],
6255
isStatic: true,
63-
name: name,
56+
name: SwiftIdentifier(name: name),
6457
typeDefinition: .Inferred(Type.ColorResource),
6558
value: "ColorResource(name: \"\(name)\", red: \(color.redComponent), green: \(color.greenComponent), blue: \(color.blueComponent), alpha: \(color.alphaComponent))"
6659
)
@@ -74,7 +67,7 @@ struct ColorGenerator: Generator {
7467
"UIColor(red: \(color.redComponent), green: \(color.greenComponent), blue: \(color.blueComponent), alpha: \(color.alphaComponent))"
7568
],
7669
isStatic: true,
77-
name: name,
70+
name: SwiftIdentifier(name: name),
7871
generics: nil,
7972
parameters: [
8073
Function.Parameter(name: "_", type: Type._Void)

R.swift/Generators/FontGenerator.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ struct FontGenerator: Generator {
1313
let internalStruct: Struct? = nil
1414

1515
init(fonts: [Font]) {
16+
let groupedFonts = fonts.groupBySwiftIdentifiers { $0.name }
17+
groupedFonts.printWarningsForDuplicatesAndEmpties(source: "font resource", result: "file")
1618

17-
let fontProperties: [Property] = fonts.map {
19+
let fontProperties: [Property] = groupedFonts.uniques.map {
1820
Let(
1921
comments: ["Font `\($0.name)`."],
2022
isStatic: true,
21-
name: $0.name,
23+
name: SwiftIdentifier(name: $0.name),
2224
typeDefinition: .Inferred(Type.FontResource),
2325
value: "FontResource(fontName: \"\($0.name)\")"
2426
)
@@ -30,7 +32,7 @@ struct FontGenerator: Generator {
3032
implements: [],
3133
typealiasses: [],
3234
properties: fontProperties,
33-
functions: fonts.map(FontGenerator.fontFunctionFromFont),
35+
functions: groupedFonts.uniques.map(FontGenerator.fontFunctionFromFont),
3436
structs: []
3537
)
3638
}
@@ -39,14 +41,14 @@ struct FontGenerator: Generator {
3941
return Function(
4042
comments: ["`UIFont(name: \"\(font.name)\", size: ...)`"],
4143
isStatic: true,
42-
name: font.name,
44+
name: SwiftIdentifier(name: font.name),
4345
generics: nil,
4446
parameters: [
4547
Function.Parameter(name: "size", localName: "size", type: Type._CGFloat)
4648
],
4749
doesThrow: false,
4850
returnType: Type._UIFont.asOptional(),
49-
body: "return UIFont(resource: \(sanitizedSwiftName(font.name)), size: size)"
51+
body: "return UIFont(resource: \(SwiftIdentifier(name: font.name)), size: size)"
5052
)
5153
}
5254
}

R.swift/Generators/ImageGenerator.swift

Lines changed: 31 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -13,78 +13,28 @@ struct ImageGenerator: Generator {
1313
let internalStruct: Struct? = nil
1414

1515
init(assetFolders: [AssetFolder], images: [Image]) {
16-
let assetFolderImageFunctions = assetFolders
16+
let assetFolderImageNames = assetFolders
1717
.flatMap { $0.imageAssets }
18-
.map {
19-
Function(
20-
comments: ["`UIImage(named: \"\($0)\", bundle: ..., traitCollection: ...)`"],
21-
isStatic: true,
22-
name: $0,
23-
generics: nil,
24-
parameters: [
25-
Function.Parameter(
26-
name: "compatibleWithTraitCollection",
27-
localName: "traitCollection",
28-
type: Type._UITraitCollection.asOptional(),
29-
defaultValue: "nil"
30-
)
31-
],
32-
doesThrow: false,
33-
returnType: Type._UIImage.asOptional(),
34-
body: "return UIImage(resource: R.image.\(sanitizedSwiftName($0)), compatibleWithTraitCollection: traitCollection)"
35-
)
36-
}
3718

38-
let uniqueImages = images
19+
let imagesNames = images
3920
.groupBy { $0.name }
4021
.values
41-
.flatMap { $0.first }
42-
43-
let imageFunctions = uniqueImages
44-
.map {
45-
Function(
46-
comments: ["`UIImage(named: \"\($0.name)\", bundle: ..., traitCollection: ...)`"],
47-
isStatic: true,
48-
name: $0.name,
49-
generics: nil,
50-
parameters: [
51-
Function.Parameter(
52-
name: "compatibleWithTraitCollection",
53-
localName: "traitCollection",
54-
type: Type._UITraitCollection.asOptional(),
55-
defaultValue: "nil"
56-
)
57-
],
58-
doesThrow: false,
59-
returnType: Type._UIImage.asOptional(),
60-
body: "return \(Type._UIImage.name)(resource: R.image.\(sanitizedSwiftName($0.name)), compatibleWithTraitCollection: traitCollection)"
61-
)
62-
}
63-
64-
let allFunctions = assetFolderImageFunctions + imageFunctions
65-
let groupedFunctions = allFunctions.groupBySwiftNames { $0.name }
22+
.flatMap { $0.first?.name }
6623

67-
for (sanitizedName, duplicates) in groupedFunctions.duplicates {
68-
warn("Skipping \(duplicates.count) images because symbol '\(sanitizedName)' would be generated for all of these images: \(duplicates.joinWithSeparator(", "))")
69-
}
24+
let allFunctions = assetFolderImageNames + imagesNames
25+
let groupedFunctions = allFunctions.groupBySwiftIdentifiers { $0 }
7026

71-
let empties = groupedFunctions.empties
72-
if let empty = empties.first where empties.count == 1 {
73-
warn("Skipping 1 image because no swift identifier can be generated for image: \(empty)")
74-
}
75-
else if empties.count > 1 {
76-
warn("Skipping \(empties.count) images because no swift identifier can be generated for all of these images: \(empties.joinWithSeparator(", "))")
77-
}
27+
groupedFunctions.printWarningsForDuplicatesAndEmpties(source: "image", result: "image")
7828

7929
let imageLets = groupedFunctions
8030
.uniques
81-
.map {
31+
.map { name in
8232
Let(
83-
comments: ["Image `\($0.name)`."],
33+
comments: ["Image `\(name)`."],
8434
isStatic: true,
85-
name: $0.name,
35+
name: SwiftIdentifier(name: name),
8636
typeDefinition: .Inferred(Type.ImageResource),
87-
value: "\(Type.ImageResource.name)(bundle: _R.hostingBundle, name: \"\($0.name)\")"
37+
value: "\(Type.ImageResource.name)(bundle: _R.hostingBundle, name: \"\(name)\")"
8838
)
8939
}
9040

@@ -94,8 +44,28 @@ struct ImageGenerator: Generator {
9444
implements: [],
9545
typealiasses: [],
9646
properties: imageLets.map(anyProperty),
97-
functions: groupedFunctions.uniques,
47+
functions: groupedFunctions.uniques.map(ImageGenerator.functionForImageName),
9848
structs: []
9949
)
10050
}
51+
52+
static func functionForImageName(name: String) -> Function {
53+
return Function(
54+
comments: ["`UIImage(named: \"\(name)\", bundle: ..., traitCollection: ...)`"],
55+
isStatic: true,
56+
name: SwiftIdentifier(name: name),
57+
generics: nil,
58+
parameters: [
59+
Function.Parameter(
60+
name: "compatibleWithTraitCollection",
61+
localName: "traitCollection",
62+
type: Type._UITraitCollection.asOptional(),
63+
defaultValue: "nil"
64+
)
65+
],
66+
doesThrow: false,
67+
returnType: Type._UIImage.asOptional(),
68+
body: "return \(Type._UIImage.name)(resource: R.image.\(SwiftIdentifier(name: name)), compatibleWithTraitCollection: traitCollection)"
69+
)
70+
}
10171
}

R.swift/Generators/NibGenerator.swift

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,8 @@ struct NibGenerator: Generator {
3636
let internalStruct: Struct?
3737

3838
init(nibs: [Nib]) {
39-
let groupedNibs = nibs.groupBySwiftNames { $0.name }
40-
41-
for (name, duplicates) in groupedNibs.duplicates {
42-
warn("Skipping \(duplicates.count) xibs because symbol '\(name)' would be generated for all of these xibs: \(duplicates.joinWithSeparator(", "))")
43-
}
44-
45-
let empties = groupedNibs.empties
46-
if let empty = empties.first where empties.count == 1 {
47-
warn("Skipping 1 xib because no swift identifier can be generated for xib: \(empty)")
48-
}
49-
else if empties.count > 1 {
50-
warn("Skipping \(empties.count) xibs because no swift identifier can be generated for all of these xibs: \(empties.joinWithSeparator(", "))")
51-
}
39+
let groupedNibs = nibs.groupBySwiftIdentifiers { $0.name }
40+
groupedNibs.printWarningsForDuplicatesAndEmpties(source: "xib", result: "file")
5241

5342
internalStruct = Struct(
5443
type: Type(module: .Host, name: "nib"),
@@ -83,24 +72,24 @@ struct NibGenerator: Generator {
8372
return Function(
8473
comments: ["`UINib(name: \"\(nib.name)\", bundle: ...)`"],
8574
isStatic: true,
86-
name: nib.name,
75+
name: SwiftIdentifier(name: nib.name),
8776
generics: nil,
8877
parameters: [
8978
Function.Parameter(name: "_", type: Type._Void)
9079
],
9180
doesThrow: false,
9281
returnType: Type._UINib,
93-
body: "return UINib(resource: R.nib.\(sanitizedSwiftName(nib.name)))"
82+
body: "return UINib(resource: R.nib.\(SwiftIdentifier(name: nib.name)))"
9483
)
9584
}
9685

9786
private static func nibVarForNib(nib: Nib) -> Let {
98-
let nibStructName = sanitizedSwiftName("_\(nib.name)")
99-
let structType = Type(module: .Host, name: "_R.nib.\(nibStructName)")
87+
let nibStructName = SwiftIdentifier(name: "_\(nib.name)")
88+
let structType = Type(module: .Host, name: SwiftIdentifier(rawValue: "_R.nib.\(nibStructName)"))
10089
return Let(
10190
comments: ["Nib `\(nib.name)`."],
10291
isStatic: true,
103-
name: nib.name,
92+
name: SwiftIdentifier(name: nib.name),
10493
typeDefinition: .Inferred(structType),
10594
value: "\(structType)()"
10695
)
@@ -110,7 +99,7 @@ struct NibGenerator: Generator {
11099

111100
let instantiateParameters = [
112101
Function.Parameter(name: "owner", localName: "ownerOrNil", type: Type._AnyObject.asOptional()),
113-
Function.Parameter(name: "options", localName: "optionsOrNil", type: Type(module: .StdLib, name: "[NSObject : AnyObject]", optional: true), defaultValue: "nil")
102+
Function.Parameter(name: "options", localName: "optionsOrNil", type: Type(module: .StdLib, name: SwiftIdentifier(rawValue: "[NSObject : AnyObject]"), optional: true), defaultValue: "nil")
114103
]
115104

116105
let bundleLet = Let(
@@ -134,7 +123,7 @@ struct NibGenerator: Generator {
134123
let viewTypeString = viewInfo.view.description
135124
return Function(
136125
isStatic: false,
137-
name: "\(viewInfo.ordinal.word)View",
126+
name: SwiftIdentifier(name: "\(viewInfo.ordinal.word)View"),
138127
generics: nil,
139128
parameters: instantiateParameters,
140129
doesThrow: false,
@@ -161,9 +150,9 @@ struct NibGenerator: Generator {
161150
reuseProtocols = []
162151
}
163152

164-
let sanitizedName = sanitizedSwiftName(nib.name, lowercaseFirstCharacter: false)
153+
let sanitizedName = SwiftIdentifier(name: nib.name, lowercaseFirstCharacter: false)
165154
return Struct(
166-
type: Type(module: .Host, name: "_\(sanitizedName)"),
155+
type: Type(module: .Host, name: SwiftIdentifier(name: "_\(sanitizedName)")),
167156
implements: ([Type.NibResourceType] + reuseProtocols).map(TypePrinter.init),
168157
typealiasses: reuseTypealiasses,
169158
properties: [bundleLet, nameVar] + reuseIdentifierProperties,

R.swift/Generators/ResourceFileGenerator.swift

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,8 @@ struct ResourceFileGenerator: Generator {
1313
let internalStruct: Struct? = nil
1414

1515
init(resourceFiles: [ResourceFile]) {
16-
let groupedResourceFiles = resourceFiles.groupBySwiftNames { $0.fullname }
17-
18-
for (name, duplicates) in groupedResourceFiles.duplicates {
19-
warn("Skipping \(duplicates.count) resource files because symbol '\(name)' would be generated for all of these files: \(duplicates.joinWithSeparator(", "))")
20-
}
21-
22-
let empties = groupedResourceFiles.empties
23-
if let empty = empties.first where empties.count == 1 {
24-
warn("Skipping 1 resource file because no swift identifier can be generated for file: \(empty)")
25-
}
26-
else if empties.count > 1 {
27-
warn("Skipping \(empties.count) resource files because no swift identifier can be generated for all of these files: \(empties.joinWithSeparator(", "))")
28-
}
16+
let groupedResourceFiles = resourceFiles.groupBySwiftIdentifiers { $0.fullname }
17+
groupedResourceFiles.printWarningsForDuplicatesAndEmpties(source: "resource file", result: "file")
2918

3019
let resourceFileProperties: [Property] = groupedResourceFiles
3120
.uniques
@@ -34,7 +23,7 @@ struct ResourceFileGenerator: Generator {
3423
return Let(
3524
comments: ["Resource file `\($0.fullname)`."],
3625
isStatic: true,
37-
name: $0.fullname,
26+
name: SwiftIdentifier(name: $0.fullname),
3827
typeDefinition: .Inferred(Type.FileResource),
3928
value: "FileResource(bundle: _R.hostingBundle, name: \"\($0.filename)\", pathExtension: \(pathExtensionOrNilString))"
4029
)
@@ -50,14 +39,14 @@ struct ResourceFileGenerator: Generator {
5039
Function(
5140
comments: ["`bundle.URLForResource(\"\(filename)\", withExtension: \(pathExtension))`"],
5241
isStatic: true,
53-
name: fullname,
42+
name: SwiftIdentifier(name: fullname),
5443
generics: nil,
5544
parameters: [
5645
Function.Parameter(name: "_", type: Type._Void)
5746
],
5847
doesThrow: false,
5948
returnType: Type._NSURL.asOptional(),
60-
body: "let fileResource = R.file.\(sanitizedSwiftName(fullname))\nreturn fileResource.bundle.URLForResource(fileResource)"
49+
body: "let fileResource = R.file.\(SwiftIdentifier(name: fullname))\nreturn fileResource.bundle.URLForResource(fileResource)"
6150
)
6251
]
6352
}

0 commit comments

Comments
 (0)