Skip to content

Commit aae7ff0

Browse files
author
Stephane Magne
committed
Add ability to filter out weaver references by .project
1 parent f0e40df commit aae7ff0

File tree

8 files changed

+275
-76
lines changed

8 files changed

+275
-76
lines changed

Sources/WeaverCodeGen/Codable.swift

+10
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ extension ConfigurationAttribute: Codable {
3131
self = .escaping(value: try container.decode(Bool.self, forKey: .value))
3232
case .platforms:
3333
self = .platforms(values: try container.decode([Platform].self, forKey: .value))
34+
case .projects:
35+
self = .projects(values: try container.decode([String].self, forKey: .value))
3436
}
3537
}
3638

@@ -58,6 +60,9 @@ extension ConfigurationAttribute: Codable {
5860
case .platforms(let value):
5961
try container.encode(ConfigurationAttributeName.platforms, forKey: .name)
6062
try container.encode(value, forKey: .value)
63+
case .projects(let value):
64+
try container.encode(ConfigurationAttributeName.projects, forKey: .name)
65+
try container.encode(value, forKey: .value)
6166
}
6267
}
6368
}
@@ -95,6 +100,7 @@ extension ConfigurationAttributeName: Codable {
95100
case setter = "set"
96101
case escaping = "e"
97102
case platforms = "p"
103+
case projects = "j"
98104

99105
init(_ value: ConfigurationAttributeName) {
100106
switch value {
@@ -112,6 +118,8 @@ extension ConfigurationAttributeName: Codable {
112118
self = .escaping
113119
case .platforms:
114120
self = .platforms
121+
case .projects:
122+
self = .projects
115123
}
116124
}
117125

@@ -131,6 +139,8 @@ extension ConfigurationAttributeName: Codable {
131139
return .escaping
132140
case .platforms:
133141
return .platforms
142+
case .projects:
143+
return .projects
134144
}
135145
}
136146
}

Sources/WeaverCodeGen/Configuration.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,17 @@ struct DependencyConfiguration: Configuration {
4848
let escaping: Bool
4949

5050
let platforms: Set<Platform>
51-
51+
52+
let projects: Set<String>
53+
5254
init(with attributes: [ConfigurationAttributeName: ConfigurationAttribute]?) {
5355
customBuilder = attributes?[.customBuilder]?.stringValue
5456
scope = attributes?[.scope]?.scopeValue ?? .default
5557
doesSupportObjc = attributes?[.doesSupportObjc]?.boolValue ?? false
5658
setter = attributes?[.setter]?.boolValue ?? false
5759
escaping = attributes?[.escaping]?.boolValue ?? false
5860
platforms = Set(attributes?[.platforms]?.platformValues ?? [])
61+
projects = Set(attributes?[.projects]?.projectValues ?? [])
5962
}
6063
}
6164

Sources/WeaverCodeGen/ConfigurationAttribute.swift

+58-15
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public enum ConfigurationAttributeName: String {
1717
case setter
1818
case escaping
1919
case platforms
20+
case projects
2021
}
2122

2223
public enum ConfigurationAttribute: Hashable {
@@ -27,6 +28,7 @@ public enum ConfigurationAttribute: Hashable {
2728
case setter(value: Bool)
2829
case escaping(value: Bool)
2930
case platforms(values: [Platform])
31+
case projects(values: [String])
3032
}
3133

3234
// MARK: - Target
@@ -64,6 +66,8 @@ extension ConfigurationAttribute: CustomStringConvertible {
6466
return "Config Attr - escaping = \(value)"
6567
case .platforms(let values):
6668
return "Config Attr - platforms = [\(values.map { ".\($0.rawValue)" }.joined(separator: ", "))]"
69+
case .projects(let values):
70+
return "Config Attr - Projects = [\(values.joined(separator: ", "))]"
6771
}
6872
}
6973

@@ -83,6 +87,8 @@ extension ConfigurationAttribute: CustomStringConvertible {
8387
return .escaping
8488
case .platforms:
8589
return .platforms
90+
case .projects:
91+
return .projects
8692
}
8793
}
8894
}
@@ -111,7 +117,8 @@ extension ConfigurationAnnotation {
111117
(.doesSupportObjc, .dependency),
112118
(.setter, .dependency),
113119
(.escaping, .dependency),
114-
(.platforms, .dependency):
120+
(.platforms, .dependency),
121+
(.projects, .dependency):
115122
return true
116123

117124
case (.isIsolated, _),
@@ -120,7 +127,8 @@ extension ConfigurationAnnotation {
120127
(.doesSupportObjc, _),
121128
(.setter, _),
122129
(.escaping, _),
123-
(.platforms, _):
130+
(.platforms, _),
131+
(.projects, _):
124132
return false
125133
}
126134
}
@@ -140,7 +148,8 @@ extension ConfigurationAnnotation {
140148
(.setter, .registration),
141149
(.doesSupportObjc, .registration),
142150
(.escaping, .parameter),
143-
(.platforms, _):
151+
(.platforms, _),
152+
(.projects, _):
144153
return true
145154
case (.isIsolated, _),
146155
(.scope, _),
@@ -173,6 +182,8 @@ extension ConfigurationAttribute {
173182
self = .escaping(value: try ConfigurationAttribute.boolValue(from: valueString))
174183
case .platforms:
175184
self = .platforms(values: try ConfigurationAttribute.platformValues(from: valueString))
185+
case .projects:
186+
self = .projects(values: try ConfigurationAttribute.projectValues(from: valueString))
176187
case .none:
177188
throw TokenError.unknownConfigurationAttribute(name: name)
178189
}
@@ -194,15 +205,14 @@ extension ConfigurationAttribute {
194205
}
195206

196207
private static func platformValues(from string: String) throws -> [Platform] {
197-
198-
var string = string.trimmingTrailingCharacters(in: .whitespaces)
199-
guard string.first == "[" && string.last == "]" else {
200-
throw TokenError.invalidConfigurationAttributeValue(value: string, expected: "Array of platforms (eg: `[.iOS, .watchOS, ...]`)")
208+
var parsedString = string.trimmingTrailingCharacters(in: .whitespaces)
209+
guard parsedString.first == "[" && parsedString.last == "]" else {
210+
throw TokenError.invalidConfigurationAttributeValue(value: parsedString, expected: "Array of platforms (eg: `[.iOS, .watchOS, ...]`)")
201211
}
202-
string.removeFirst()
203-
string.removeLast()
212+
parsedString.removeFirst()
213+
parsedString.removeLast()
204214

205-
return try string
215+
return try parsedString
206216
.split(separator: ",")
207217
.map { $0.trimmingCharacters(in: .whitespaces) }
208218
.map {
@@ -213,6 +223,19 @@ extension ConfigurationAttribute {
213223
return platform
214224
}
215225
}
226+
227+
private static func projectValues(from string: String) throws -> [String] {
228+
var parsedString = string.trimmingTrailingCharacters(in: .whitespaces)
229+
guard parsedString.first == "[" && parsedString.last == "]" else {
230+
throw TokenError.invalidConfigurationAttributeValue(value: parsedString, expected: "Array of projects (eg: `[Calculator, Photos, ...]`)")
231+
}
232+
parsedString.removeFirst()
233+
parsedString.removeLast()
234+
235+
return parsedString
236+
.split(separator: ",")
237+
.map { $0.trimmingCharacters(in: .whitespaces).trimmingCharacters(in: .punctuationCharacters) }
238+
}
216239
}
217240

218241
extension ConfigurationAttributeTarget {
@@ -241,7 +264,8 @@ extension ConfigurationAttribute {
241264

242265
case .scope,
243266
.customBuilder,
244-
.platforms:
267+
.platforms,
268+
.projects:
245269
return nil
246270
}
247271
}
@@ -256,7 +280,8 @@ extension ConfigurationAttribute {
256280
.doesSupportObjc,
257281
.setter,
258282
.escaping,
259-
.platforms:
283+
.platforms,
284+
.projects:
260285
return nil
261286
}
262287
}
@@ -271,7 +296,8 @@ extension ConfigurationAttribute {
271296
.doesSupportObjc,
272297
.setter,
273298
.escaping,
274-
.platforms:
299+
.platforms,
300+
.projects:
275301
return nil
276302
}
277303
}
@@ -280,13 +306,30 @@ extension ConfigurationAttribute {
280306
switch self {
281307
case .platforms(let values):
282308
return values
283-
309+
310+
case .scope,
311+
.customBuilder,
312+
.isIsolated,
313+
.setter,
314+
.escaping,
315+
.doesSupportObjc,
316+
.projects:
317+
return nil
318+
}
319+
}
320+
321+
var projectValues: [String]? {
322+
switch self {
323+
case .projects(let values):
324+
return values
325+
284326
case .scope,
285327
.customBuilder,
286328
.isIsolated,
287329
.setter,
288330
.escaping,
289-
.doesSupportObjc:
331+
.doesSupportObjc,
332+
.platforms:
290333
return nil
291334
}
292335
}

0 commit comments

Comments
 (0)