Skip to content

Commit d5ace32

Browse files
authored
Merge branch 'main' into hd-naming-strategy-optimistic
2 parents fd62811 + a5052b9 commit d5ace32

File tree

9 files changed

+259
-174
lines changed

9 files changed

+259
-174
lines changed

.swiftformatignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
Tests/OpenAPIGeneratorReferenceTests/Resources
22
Sources/swift-openapi-generator/Documentation.docc
33
Examples/**/Generated/*
4-
Examples/**/GeneratedSources/*
4+
Examples/**/GeneratedSources/*
5+
**Package.swift

Package.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,14 @@ let package = Package(
147147
),
148148
]
149149
)
150+
151+
// --- STANDARD CROSS-REPO SETTINGS DO NOT EDIT --- //
152+
for target in package.targets {
153+
if target.type != .plugin {
154+
var settings = target.swiftSettings ?? []
155+
// https://github.com/swiftlang/swift-evolution/blob/main/proposals/0444-member-import-visibility.md
156+
settings.append(.enableUpcomingFeature("MemberImportVisibility"))
157+
target.swiftSettings = settings
158+
}
159+
}
160+
// --- END: STANDARD CROSS-REPO SETTINGS DO NOT EDIT --- //

Plugins/PluginsShared/PluginError.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ enum PluginError: Swift.Error, CustomStringConvertible, LocalizedError {
3737
let targetNames = targetNames.joined(separator: ", ", lastSeparator: " and ")
3838
return "Found no targets with names \(targetNames)."
3939
case .fileErrors(let fileErrors):
40-
return "Issues with required files: \(fileErrors.map(\.description).joined(separator: ", and"))."
40+
return "Issues with required files:\n\(fileErrors.map { "- " + $0.description }.joined(separator: "\n"))."
4141
}
4242
}
4343

Sources/_OpenAPIGeneratorCore/Layers/StructuredSwiftRepresentation.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,6 +1354,16 @@ extension Expression {
13541354
/// - Returns: A new expression representing member access with a dot prefix.
13551355
static func dot(_ member: String) -> Self { Self.memberAccess(.init(right: member)) }
13561356

1357+
/// Returns a new member access expression with `self` as the receiver.
1358+
///
1359+
/// For example: `self.foo`, where `member` is `foo`.
1360+
///
1361+
/// - Parameter member: The name of the member to access on the expression.
1362+
/// - Returns: A new expression representing member access.
1363+
static func selfDot(_ member: String) -> Expression {
1364+
.memberAccess(.init(left: .identifier(.pattern("self")), right: member))
1365+
}
1366+
13571367
/// Returns a new identifier expression for the provided pattern, such
13581368
/// as a variable or function name.
13591369
/// - Parameter name: The name of the identifier.
@@ -1555,6 +1565,7 @@ extension Expression {
15551565
/// - Parameter expressions: The member expressions.
15561566
/// - Returns: A tuple expression.
15571567
static func tuple(_ expressions: [Expression]) -> Self { .tuple(.init(members: expressions)) }
1568+
15581569
}
15591570

15601571
extension MemberAccessDescription {

Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ extension FileTranslator {
118118
let assignExprs: [Expression] = properties.map { property in
119119
let typeUsage = property.typeUsage
120120
return .assignment(
121-
left: .identifierPattern("self").dot(property.swiftSafeName),
121+
left: .selfDot(property.swiftSafeName),
122122
right: .try(
123123
.identifierPattern("container").dot("decode\(typeUsage.isOptional ? "IfPresent" : "")")
124124
.call([
@@ -156,7 +156,7 @@ extension FileTranslator {
156156
.try(
157157
.identifierPattern("container").dot("encode\(property.typeUsage.isOptional ? "IfPresent" : "")")
158158
.call([
159-
.init(label: nil, expression: .identifierPattern(property.swiftSafeName)),
159+
.init(label: nil, expression: .selfDot(property.swiftSafeName)),
160160
.init(label: "forKey", expression: .dot(property.swiftSafeName)),
161161
])
162162
)
@@ -181,7 +181,7 @@ extension FileTranslator {
181181
let assignExprs: [Expression] = properties.map { property, isKeyValuePair in
182182
let decoderExpr: Expression =
183183
isKeyValuePair ? .initFromDecoderExpr() : .decodeFromSingleValueContainerExpr()
184-
return .assignment(left: .identifierPattern(property.swiftSafeName), right: .try(decoderExpr))
184+
return .assignment(left: .selfDot(property.swiftSafeName), right: .try(decoderExpr))
185185
}
186186
return decoderInitializer(body: assignExprs.map { .expression($0) })
187187
}
@@ -194,12 +194,11 @@ extension FileTranslator {
194194
{
195195
let exprs: [Expression]
196196
if let firstSingleValue = properties.first(where: { !$0.isKeyValuePair }) {
197-
let expr: Expression = .identifierPattern(firstSingleValue.property.swiftSafeName)
197+
let expr: Expression = .selfDot(firstSingleValue.property.swiftSafeName)
198198
.encodeToSingleValueContainerExpr(gracefully: false)
199199
exprs = [expr]
200200
} else {
201-
exprs = properties.filter { $0.isKeyValuePair }.map(\.property.swiftSafeName)
202-
.map { name in .identifierPattern(name).encodeExpr() }
201+
exprs = properties.filter(\.isKeyValuePair).map { .selfDot($0.property.swiftSafeName).encodeExpr() }
203202
}
204203
return encoderFunction(body: exprs.map { .expression($0) })
205204
}
@@ -216,18 +215,15 @@ extension FileTranslator {
216215
let assignBlocks: [CodeBlock] = properties.map { (property, isKeyValuePair) in
217216
let decoderExpr: Expression =
218217
isKeyValuePair ? .initFromDecoderExpr() : .decodeFromSingleValueContainerExpr()
219-
let assignExpr: Expression = .assignment(
220-
left: .identifierPattern(property.swiftSafeName),
221-
right: .try(decoderExpr)
222-
)
218+
let assignExpr: Expression = .assignment(left: .selfDot(property.swiftSafeName), right: .try(decoderExpr))
223219
return .expression(assignExpr.wrapInDoCatchAppendArrayExpr())
224220
}
225221
let atLeastOneNotNilCheckExpr: Expression = .try(
226222
.identifierType(TypeName.decodingError).dot("verifyAtLeastOneSchemaIsNotNil")
227223
.call([
228224
.init(
229225
label: nil,
230-
expression: .literal(.array(properties.map { .identifierPattern($0.property.swiftSafeName) }))
226+
expression: .literal(.array(properties.map { .selfDot($0.property.swiftSafeName) }))
231227
), .init(label: "type", expression: .identifierPattern("Self").dot("self")),
232228
.init(label: "codingPath", expression: .identifierPattern("decoder").dot("codingPath")),
233229
.init(label: "errors", expression: .identifierPattern("errors")),
@@ -250,14 +246,12 @@ extension FileTranslator {
250246
? nil
251247
: .try(
252248
.identifierPattern("encoder").dot("encodeFirstNonNilValueToSingleValueContainer")
253-
.call([
254-
.init(label: nil, expression: .literal(.array(singleValueNames.map { .identifierPattern($0) })))
255-
])
249+
.call([.init(label: nil, expression: .literal(.array(singleValueNames.map { .selfDot($0) })))])
256250
)
257251
let encodeExprs: [Expression] =
258252
(encodeSingleValuesExpr.flatMap { [$0] } ?? [])
259253
+ properties.filter { $0.isKeyValuePair }.map(\.property)
260-
.map { property in .identifierPattern(property.swiftSafeName).optionallyChained().encodeExpr() }
254+
.map { property in .selfDot(property.swiftSafeName).optionallyChained().encodeExpr() }
261255
return encoderFunction(body: encodeExprs.map { .expression($0) })
262256
}
263257

Sources/_OpenAPIGeneratorCore/Translator/TypesTranslator/translateBoxedTypes.swift

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,8 @@ extension TypesFileTranslator {
107107
case .variable(var variableDescription) = commented
108108
else { return member }
109109
let name = TextBasedRenderer.renderedExpressionAsString(variableDescription.left)
110-
variableDescription.getter = [.expression(.identifierPattern("storage").dot("value").dot(name))]
111-
variableDescription.modify = [
112-
.expression(.yield(.inOut(.identifierPattern("storage").dot("value").dot(name))))
113-
]
110+
variableDescription.getter = [.expression(.selfDot("storage").dot("value").dot(name))]
111+
variableDescription.modify = [.expression(.yield(.inOut(.selfDot("storage").dot("value").dot(name))))]
114112
return .commentable(comment, .variable(variableDescription))
115113
}
116114

@@ -127,7 +125,7 @@ extension TypesFileTranslator {
127125
funcDesc.body = [
128126
.expression(
129127
.assignment(
130-
left: .identifierPattern("storage"),
128+
left: .selfDot("storage"),
131129
right: .dot("init")
132130
.call([
133131
.init(
@@ -167,7 +165,7 @@ extension TypesFileTranslator {
167165
body: [
168166
.expression(
169167
.assignment(
170-
left: .identifierPattern("storage"),
168+
left: .selfDot("storage"),
171169
right: .try(
172170
.dot("init").call([.init(label: "from", expression: .identifierPattern("decoder"))])
173171
)
@@ -185,7 +183,7 @@ extension TypesFileTranslator {
185183
body: [
186184
.expression(
187185
.try(
188-
.identifierPattern("storage").dot("encode")
186+
.selfDot("storage").dot("encode")
189187
.call([.init(label: "to", expression: .identifierPattern("encoder"))])
190188
)
191189
)

Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,14 @@ components:
406406
type: [array, null]
407407
items:
408408
type: [string, null]
409+
# To catch the clashes of members and the decoding container.
410+
TypedAdditionalPropertiesWithPropertyNamedContainer:
411+
type: object
412+
properties:
413+
container:
414+
type: string
415+
additionalProperties:
416+
type: integer
409417
CodeError:
410418
type: object
411419
properties:

0 commit comments

Comments
 (0)