Skip to content

Commit c49e6e1

Browse files
authored
Merge pull request #1300 from kimdv/kimdv/remove-convenience-initializers
2 parents 08f027d + 9d1db4e commit c49e6e1

File tree

9 files changed

+50
-187
lines changed

9 files changed

+50
-187
lines changed

Sources/SwiftSyntaxBuilder/ConvenienceInitializers.swift

Lines changed: 22 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,26 @@
1313
@_spi(RawSyntax) import SwiftParser
1414
@_spi(RawSyntax) import SwiftSyntax
1515

16+
// MARK: - CustomAttribute
17+
18+
extension AttributeSyntax {
19+
/// A convenience initializer that allows passing in arguments using a result builder
20+
/// and automatically adds parentheses as needed, similar to the convenience
21+
/// initializer for ``FunctionCallExpr``.
22+
public init(
23+
_ attributeName: TypeSyntax,
24+
@TupleExprElementListBuilder argumentList: () -> TupleExprElementListSyntax? = { nil }
25+
) {
26+
let argumentList = argumentList()
27+
self.init(
28+
attributeName: attributeName,
29+
leftParen: argumentList != nil ? .leftParenToken() : nil,
30+
argument: argumentList.map(AttributeSyntax.Argument.argumentList),
31+
rightParen: argumentList != nil ? .rightParenToken() : nil
32+
)
33+
}
34+
}
35+
1636
// MARK: - BinaryOperatorExpr
1737

1838
extension BinaryOperatorExprSyntax {
@@ -51,26 +71,6 @@ extension CatchClauseSyntax {
5171
}
5272
}
5373

54-
// MARK: - CustomAttribute
55-
56-
extension AttributeSyntax {
57-
/// A convenience initializer that allows passing in arguments using a result builder
58-
/// and automatically adds parentheses as needed, similar to the convenience
59-
/// initializer for ``FunctionCallExpr``.
60-
public init(
61-
_ attributeName: TypeSyntax,
62-
@TupleExprElementListBuilder argumentList: () -> TupleExprElementListSyntax? = { nil }
63-
) {
64-
let argumentList = argumentList()
65-
self.init(
66-
attributeName: attributeName,
67-
leftParen: argumentList != nil ? .leftParenToken() : nil,
68-
argument: argumentList.map(AttributeSyntax.Argument.argumentList),
69-
rightParen: argumentList != nil ? .rightParenToken() : nil
70-
)
71-
}
72-
}
73-
7474
// MARK: - DictionaryExpr
7575

7676
extension DictionaryExprSyntax {
@@ -173,11 +173,11 @@ extension FunctionCallExprSyntax {
173173
// strings, only literals.
174174
extension FunctionParameterSyntax {
175175
public init(
176-
_ source: String,
176+
_ source: PartialSyntaxNodeString,
177177
for subject: Parser.ParameterSubject
178178
) {
179179
self = performParse(
180-
source: Array(source.utf8),
180+
source: source.sourceText,
181181
parse: {
182182
let raw = RawSyntax($0.parseFunctionParameter(for: subject))
183183
return Syntax(raw: raw).cast(FunctionParameterSyntax.self)
@@ -186,29 +186,6 @@ extension FunctionParameterSyntax {
186186
}
187187
}
188188

189-
// MARK: - IfStmt
190-
191-
extension IfStmtSyntax {
192-
/// A convenience initializer that uses builder closures to express an
193-
/// if body, potentially with a second trailing builder closure for an else
194-
/// body.
195-
public init(
196-
leadingTrivia: Trivia = [],
197-
conditions: ConditionElementListSyntax,
198-
@CodeBlockItemListBuilder body: () -> CodeBlockItemListSyntax,
199-
@CodeBlockItemListBuilder elseBody: () -> CodeBlockItemListSyntax? = { nil }
200-
) {
201-
let generatedElseBody = elseBody()
202-
self.init(
203-
leadingTrivia: leadingTrivia,
204-
conditions: conditions,
205-
body: CodeBlockSyntax(statements: body()),
206-
elseKeyword: generatedElseBody == nil ? nil : .keyword(.else, leadingTrivia: .space),
207-
elseBody: generatedElseBody.map { .codeBlock(CodeBlockSyntax(statements: $0)) }
208-
)
209-
}
210-
}
211-
212189
// MARK: - IntegerLiteralExpr
213190

214191
extension IntegerLiteralExprSyntax: ExpressibleByIntegerLiteral {
@@ -221,20 +198,6 @@ extension IntegerLiteralExprSyntax: ExpressibleByIntegerLiteral {
221198
}
222199
}
223200

224-
// MARK: - MemberAccessExpr
225-
226-
extension MemberAccessExprSyntax {
227-
/// Creates a `MemberAccessExpr` using the provided parameters.
228-
public init(
229-
base: ExprSyntax? = nil,
230-
dot: TokenSyntax = .periodToken(),
231-
name: String,
232-
declNameArguments: DeclNameArgumentsSyntax? = nil
233-
) {
234-
self.init(base: base, dot: dot, name: .identifier(name), declNameArguments: declNameArguments)
235-
}
236-
}
237-
238201
// MARK: - StringLiteralExpr
239202

240203
extension String {
@@ -358,33 +321,6 @@ extension StringLiteralExprSyntax {
358321
}
359322
}
360323

361-
// MARK: - SwitchCase
362-
363-
extension SwitchCaseSyntax {
364-
public init(_ label: SwitchCaseSyntax, @CodeBlockItemListBuilder statementsBuilder: () -> CodeBlockItemListSyntax) {
365-
self = label
366-
self.statements = statementsBuilder()
367-
}
368-
}
369-
370-
// MARK: - TernaryExpr
371-
372-
extension TernaryExprSyntax {
373-
public init<C: ExprSyntaxProtocol, F: ExprSyntaxProtocol, S: ExprSyntaxProtocol>(
374-
if condition: C,
375-
then firstChoice: F,
376-
else secondChoice: S
377-
) {
378-
self.init(
379-
conditionExpression: condition,
380-
questionMark: .infixQuestionMarkToken(leadingTrivia: .space, trailingTrivia: .space),
381-
firstChoice: firstChoice,
382-
colonMark: .colonToken(leadingTrivia: .space),
383-
secondChoice: secondChoice
384-
)
385-
}
386-
}
387-
388324
// MARK: - TupleExprElement
389325

390326
extension TupleExprElementSyntax {
@@ -425,29 +361,6 @@ extension VariableDeclSyntax {
425361
)
426362
}
427363
}
428-
429-
/// Creates a computed property with the given accessor.
430-
public init(
431-
leadingTrivia: Trivia = [],
432-
attributes: AttributeListSyntax? = nil,
433-
modifiers: ModifierListSyntax? = nil,
434-
name: PatternSyntax,
435-
type: TypeAnnotationSyntax,
436-
@CodeBlockItemListBuilder accessor: () -> CodeBlockItemListSyntax
437-
) {
438-
self.init(
439-
leadingTrivia: leadingTrivia,
440-
attributes: attributes?.with(\.trailingTrivia, .space),
441-
modifiers: modifiers,
442-
letOrVarKeyword: .keyword(.var)
443-
) {
444-
PatternBindingSyntax(
445-
pattern: name,
446-
typeAnnotation: type,
447-
accessor: .getter(CodeBlockSyntax(statements: accessor()))
448-
)
449-
}
450-
}
451364
}
452365

453366
//==========================================================================//

Sources/SwiftSyntaxBuilder/SyntaxNodeWithBody.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,15 @@ public extension IfStmtSyntax {
144144
}
145145
}
146146

147+
// MARK: - SwitchCase
148+
149+
extension SwitchCaseSyntax {
150+
public init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder statementsBuilder: () -> CodeBlockItemListSyntax) {
151+
self = SwitchCaseSyntax("\(header)")
152+
self.statements = statementsBuilder()
153+
}
154+
}
155+
147156
// MARK: - SwitchStmtSyntax
148157
// SwitchStmtSyntax is a special scenario as it don't have body or members
149158
// So we cannot conform to `HasTrailingCodeBlock` or `HasTrailingMemberDeclBlock`

Sources/_SwiftSyntaxTestSupport/SyntaxProtocol+Initializer.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ private extension TriviaPiece {
7474
fatalError("Unknown associated value type")
7575
}
7676
return ExprSyntax(
77-
FunctionCallExprSyntax(callee: MemberAccessExprSyntax(name: label!)) {
77+
FunctionCallExprSyntax(callee: ExprSyntax(".\(raw: label!)")) {
7878
TupleExprElementSyntax(expression: arg)
7979
}
8080
)
@@ -137,7 +137,7 @@ extension SyntaxProtocol {
137137
tokenKindArgument = nil
138138
} else if case .keyword(let keyword) = tokenKind {
139139
tokenInitializerName = "keyword"
140-
tokenKindArgument = ExprSyntax(MemberAccessExprSyntax(name: String(describing: keyword)))
140+
tokenKindArgument = ExprSyntax(".\(raw: keyword)")
141141
} else if tokenKind.decomposeToRaw().rawKind.defaultText != nil {
142142
tokenInitializerName = "\(String(describing: tokenKind))Token"
143143
tokenKindArgument = nil
@@ -147,7 +147,7 @@ extension SyntaxProtocol {
147147
tokenKindArgument = ExprSyntax(StringLiteralExprSyntax(content: token.text))
148148
}
149149
return ExprSyntax(
150-
FunctionCallExprSyntax(callee: MemberAccessExprSyntax(name: tokenInitializerName)) {
150+
FunctionCallExprSyntax(callee: ExprSyntax(".\(raw: tokenInitializerName)")) {
151151
if let tokenKindArgument = tokenKindArgument {
152152
TupleExprElementSyntax(expression: tokenKindArgument)
153153
}

Tests/SwiftSyntaxBuilderTest/DoStmtTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ final class DoStmtTests: XCTestCase {
3535
CatchItemListSyntax {
3636
CatchItemSyntax(
3737
pattern: PatternSyntax("Error3"),
38-
whereClause: WhereClauseSyntax(guardResult: MemberAccessExprSyntax(base: "error", name: "isError4"))
38+
whereClause: WhereClauseSyntax(guardResult: ExprSyntax("error.isError4"))
3939
)
4040
}
4141
) {
42-
ThrowStmtSyntax(expression: MemberAccessExprSyntax(base: "Error4", name: "error3"))
42+
ThrowStmtSyntax(expression: ExprSyntax("Error4.error3"))
4343
},
4444
CatchClauseSyntax {
4545
FunctionCallExprSyntax(callee: ExprSyntax("print")) {
@@ -85,11 +85,11 @@ final class DoStmtTests: XCTestCase {
8585
CatchItemListSyntax {
8686
CatchItemSyntax(
8787
pattern: PatternSyntax("Error3"),
88-
whereClause: WhereClauseSyntax(guardResult: MemberAccessExprSyntax(base: "error", name: "isError4"))
88+
whereClause: WhereClauseSyntax(guardResult: ExprSyntax("error.isError4"))
8989
)
9090
}
9191
) {
92-
ThrowStmtSyntax(expression: MemberAccessExprSyntax(base: "Error4", name: "error3"))
92+
ThrowStmtSyntax(expression: ExprSyntax("Error4.error3"))
9393
},
9494
CatchClauseSyntax {
9595
FunctionCallExprSyntax(callee: ExprSyntax("print")) {
@@ -135,11 +135,11 @@ final class DoStmtTests: XCTestCase {
135135
CatchItemListSyntax {
136136
CatchItemSyntax(
137137
pattern: PatternSyntax("Error3"),
138-
whereClause: WhereClauseSyntax(guardResult: MemberAccessExprSyntax(base: "error", name: "isError4"))
138+
whereClause: WhereClauseSyntax(guardResult: ExprSyntax("error.isError4"))
139139
)
140140
}
141141
) {
142-
ThrowStmtSyntax(expression: MemberAccessExprSyntax(base: "Error4", name: "error3"))
142+
ThrowStmtSyntax(expression: ExprSyntax("Error4.error3"))
143143
},
144144
CatchClauseSyntax {
145145
FunctionCallExprSyntax(callee: ExprSyntax("print")) {

Tests/SwiftSyntaxBuilderTest/ExtensionDeclTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ final class ExtensionDeclTests: XCTestCase {
1919
let keywords = ["associatedtype", "class"].map { keyword -> VariableDeclSyntax in
2020
// We need to use `CodeBlock` here to ensure there is braces around.
2121
let body = CodeBlockSyntax {
22-
FunctionCallExprSyntax(callee: MemberAccessExprSyntax(base: "TokenSyntax", name: "\(keyword)Keyword"))
22+
FunctionCallExprSyntax(callee: ExprSyntax("TokenSyntax.\(raw: keyword)Keyword"))
2323
}
2424

2525
return VariableDeclSyntax(

Tests/SwiftSyntaxBuilderTest/IfStmtTests.swift

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -114,30 +114,6 @@ final class IfStmtTests: XCTestCase {
114114
}
115115
}
116116

117-
func testIfElseStmt() {
118-
// Use the convenience initializer from IfStmtConvenienceInitializers
119-
// with an else branch expressed by a second trailing closure.
120-
let buildable = IfStmtSyntax(conditions: ConditionElementListSyntax { BooleanLiteralExprSyntax(true) }) {
121-
FunctionCallExprSyntax(callee: ExprSyntax("print")) {
122-
TupleExprElementSyntax(expression: StringLiteralExprSyntax(content: "Hello from the if-branch!"))
123-
}
124-
} elseBody: {
125-
FunctionCallExprSyntax(callee: ExprSyntax("print")) {
126-
TupleExprElementSyntax(expression: StringLiteralExprSyntax(content: "Hello from the else-branch!"))
127-
}
128-
}
129-
AssertBuildResult(
130-
buildable,
131-
"""
132-
if true {
133-
print("Hello from the if-branch!")
134-
} else {
135-
print("Hello from the else-branch!")
136-
}
137-
"""
138-
)
139-
}
140-
141117
func testIfLetStmt() {
142118
let buildable = IfStmtSyntax(
143119
conditions: ConditionElementListSyntax {

Tests/SwiftSyntaxBuilderTest/MemberAccessTests.swift

Lines changed: 0 additions & 22 deletions
This file was deleted.

Tests/SwiftSyntaxBuilderTest/TernaryExprTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import SwiftSyntaxBuilder
1616

1717
final class TernaryExprTests: XCTestCase {
1818
func testTernaryExpr() {
19-
let buildable = TernaryExprSyntax(if: BooleanLiteralExprSyntax(true), then: ExprSyntax("a"), else: ExprSyntax("b"))
19+
let buildable = ExprSyntax("true ? a : b")
2020
AssertBuildResult(
2121
buildable,
2222
"""

0 commit comments

Comments
 (0)