Skip to content

Commit e06c1d6

Browse files
committed
don't use if- or switch-expressions
1 parent 133789f commit e06c1d6

File tree

1 file changed

+51
-56
lines changed

1 file changed

+51
-56
lines changed

lib/Macros/Sources/SwiftMacros/PointerBoundsMacro.swift

+51-56
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ struct DiagnosticError: Error {
9595
}
9696
}
9797

98-
enum UnsafePointerKind {
98+
enum Mutability {
9999
case Immutable
100100
case Mutable
101101
}
@@ -125,6 +125,33 @@ func replaceTypeName(_ type: TypeSyntax, _ name: TokenSyntax) -> TypeSyntax {
125125
return TypeSyntax(idType.with(\.name, name))
126126
}
127127

128+
func getPointerMutability(text: String) -> Mutability {
129+
switch text {
130+
case "UnsafePointer": return .Immutable
131+
case "UnsafeMutablePointer": return .Mutable
132+
case "UnsafeRawPointer": return .Immutable
133+
case "UnsafeMutableRawPointer": return .Mutable
134+
default:
135+
throw DiagnosticError(
136+
"expected Unsafe[Mutable][Raw]Pointer type for type \(prev)"
137+
+ " - first type token is '\(text)'", node: name)
138+
}
139+
}
140+
141+
func getSafePointerName(mut: Mutability, generateSpan: Bool, isRaw: Bool) -> TokenSyntax {
142+
switch (mut, generateSpan, isRaw) {
143+
case (.Immutable, true, true): return "RawSpan"
144+
case (.Mutable, true, true): return "MutableRawSpan"
145+
case (.Immutable, false, true): return "UnsafeRawBufferPointer"
146+
case (.Mutable, false, true): return "UnsafeMutableRawBufferPointer"
147+
148+
case (.Immutable, true, false): return "Span"
149+
case (.Mutable, true, false): return "MutableSpan"
150+
case (.Immutable, false, false): return "UnsafeBufferPointer"
151+
case (.Mutable, false, false): return "UnsafeMutableBufferPointer"
152+
}
153+
}
154+
128155
func transformType(_ prev: TypeSyntax, _ variant: Variant, _ isSizedBy: Bool) throws -> TypeSyntax {
129156
if let optType = prev.as(OptionalTypeSyntax.self) {
130157
return TypeSyntax(
@@ -135,37 +162,16 @@ func transformType(_ prev: TypeSyntax, _ variant: Variant, _ isSizedBy: Bool) th
135162
}
136163
let name = try getTypeName(prev)
137164
let text = name.text
138-
let kind: UnsafePointerKind =
139-
switch text {
140-
case "UnsafePointer": .Immutable
141-
case "UnsafeMutablePointer": .Mutable
142-
case "UnsafeRawPointer": .Immutable
143-
case "UnsafeMutableRawPointer": .Mutable
144-
default:
145-
throw DiagnosticError(
146-
"expected Unsafe[Mutable][Raw]Pointer type for type \(prev)"
147-
+ " - first type token is '\(text)'", node: name)
148-
}
165+
if !isSizedBy && (text == "UnsafeRawPointer" || text == "UnsafeMutableRawPointer") {
166+
throw DiagnosticError("raw pointers only supported for SizedBy", node: name)
167+
}
168+
169+
let kind: Mutability =
170+
getPointerMutability(text: text)
171+
let token = getSafePointerName(mut: kind, generateSpan: variant.generateSpan, isRaw: isSizedBy)
149172
if isSizedBy {
150-
let token: TokenSyntax =
151-
switch (kind, variant.generateSpan) {
152-
case (.Immutable, true): "RawSpan"
153-
case (.Mutable, true): "MutableRawSpan"
154-
case (.Immutable, false): "UnsafeRawBufferPointer"
155-
case (.Mutable, false): "UnsafeMutableRawBufferPointer"
156-
}
157173
return TypeSyntax(IdentifierTypeSyntax(name: token))
158174
}
159-
if text == "UnsafeRawPointer" || text == "UnsafeMutableRawPointer" {
160-
throw DiagnosticError("raw pointers only supported for SizedBy", node: name)
161-
}
162-
let token: TokenSyntax =
163-
switch (kind, variant.generateSpan) {
164-
case (.Immutable, true): "Span"
165-
case (.Mutable, true): "MutableSpan"
166-
case (.Immutable, false): "UnsafeBufferPointer"
167-
case (.Mutable, false): "UnsafeMutableBufferPointer"
168-
}
169175
return replaceTypeName(prev, token)
170176
}
171177

@@ -183,13 +189,11 @@ protocol BoundsCheckedThunkBuilder {
183189

184190
func getParam(_ signature: FunctionSignatureSyntax, _ paramIndex: Int) -> FunctionParameterSyntax {
185191
let params = signature.parameterClause.parameters
186-
let index =
187-
if paramIndex > 0 {
188-
params.index(params.startIndex, offsetBy: paramIndex)
189-
} else {
190-
params.startIndex
191-
}
192-
return params[index]
192+
if paramIndex > 0 {
193+
return params[params.index(params.startIndex, offsetBy: paramIndex)]
194+
} else {
195+
return params[params.startIndex]
196+
}
193197
}
194198
func getParam(_ funcDecl: FunctionDeclSyntax, _ paramIndex: Int) -> FunctionParameterSyntax {
195199
return getParam(funcDecl.signature, paramIndex)
@@ -342,19 +346,17 @@ struct CountedOrSizedPointerThunkBuilder: PointerBoundsThunkBuilder {
342346

343347
func getCount(_ variant: Variant) -> ExprSyntax {
344348
let countName = isSizedBy && variant.generateSpan ? "byteCount" : "count"
345-
return if nullable {
346-
ExprSyntax("\(name)?.\(raw: countName) ?? 0")
347-
} else {
348-
ExprSyntax("\(name).\(raw: countName)")
349+
if nullable {
350+
return ExprSyntax("\(name)?.\(raw: countName) ?? 0")
349351
}
352+
return ExprSyntax("\(name).\(raw: countName)")
350353
}
351354

352355
func getPointerArg() -> ExprSyntax {
353-
return if nullable {
354-
ExprSyntax("\(name)?.baseAddress")
355-
} else {
356-
ExprSyntax("\(name).baseAddress!")
356+
if nullable {
357+
return ExprSyntax("\(name)?.baseAddress")
357358
}
359+
return ExprSyntax("\(name).baseAddress!")
358360
}
359361

360362
func buildFunctionCall(_ argOverrides: [Int: ExprSyntax], _ variant: Variant) throws -> ExprSyntax
@@ -541,12 +543,7 @@ public struct PointerBoundsMacro: PeerMacro {
541543
let endParamIndexArg = try getArgumentByName(argumentList, "end")
542544
let endParamIndex: Int = try getIntLiteralValue(endParamIndexArg)
543545
let nonescapingExprArg = getOptionalArgumentByName(argumentList, "nonescaping")
544-
let nonescaping =
545-
if nonescapingExprArg != nil {
546-
try getBoolLiteralValue(nonescapingExprArg!)
547-
} else {
548-
false
549-
}
546+
let nonescaping = nonescapingExprArg != nil && try getBoolLiteralValue(nonescapingExprArg!)
550547
return EndedBy(
551548
pointerIndex: startParamIndex, endIndex: endParamIndex, nonescaping: nonescaping,
552549
original: ExprSyntax(enumConstructorExpr))
@@ -618,11 +615,10 @@ public struct PointerBoundsMacro: PeerMacro {
618615
let i = pointerArg.pointerIndex
619616
if i < 1 || i > paramCount {
620617
let noteMessage =
621-
if paramCount > 0 {
618+
paramCount > 0 ?
622619
"function \(funcDecl.name) has parameter indices 1..\(paramCount)"
623-
} else {
620+
:
624621
"function \(funcDecl.name) has no parameters"
625-
}
626622
throw DiagnosticError(
627623
"pointer index out of bounds", node: pointerArg.original,
628624
notes: [
@@ -674,13 +670,12 @@ public struct PointerBoundsMacro: PeerMacro {
674670
})
675671
let newSignature = try builder.buildFunctionSignature([:], variant)
676672
let checks =
677-
if variant.skipTrivialCount {
673+
variant.skipTrivialCount ?
678674
[] as [CodeBlockItemSyntax]
679-
} else {
675+
:
680676
try builder.buildBoundsChecks(variant).map { e in
681677
CodeBlockItemSyntax(leadingTrivia: "\n", item: e)
682678
}
683-
}
684679
let call = CodeBlockItemSyntax(
685680
item: CodeBlockItemSyntax.Item(
686681
ReturnStmtSyntax(

0 commit comments

Comments
 (0)