Skip to content

Commit 990e40d

Browse files
committed
adding paranethesis and more tests
1 parent b31349e commit 990e40d

File tree

5 files changed

+173
-111
lines changed

5 files changed

+173
-111
lines changed

Sources/SyntaxKit/CodeBlock+Generate.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,21 @@ extension CodeBlock {
4545
item = .stmt(stmt)
4646
} else if let expr = self.syntax.as(ExprSyntax.self) {
4747
item = .expr(expr)
48+
} else if let token = self.syntax.as(TokenSyntax.self) {
49+
// Wrap TokenSyntax in DeclReferenceExprSyntax and then in ExprSyntax
50+
let expr = ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier(token.text)))
51+
item = .expr(expr)
52+
} else if let switchCase = self.syntax.as(SwitchCaseSyntax.self) {
53+
// Wrap SwitchCaseSyntax in a SwitchExprSyntax and treat it as an expression
54+
// This is a fallback for when SwitchCase is used standalone
55+
let switchExpr = SwitchExprSyntax(
56+
switchKeyword: .keyword(.switch, trailingTrivia: .space),
57+
subject: ExprSyntax(DeclReferenceExprSyntax(baseName: .identifier("_"))),
58+
leftBrace: .leftBraceToken(leadingTrivia: .space, trailingTrivia: .newline),
59+
cases: SwitchCaseListSyntax([SwitchCaseListSyntax.Element(switchCase)]),
60+
rightBrace: .rightBraceToken(leadingTrivia: .newline)
61+
)
62+
item = .expr(ExprSyntax(switchExpr))
4863
} else {
4964
fatalError(
5065
"Unsupported syntax type at top level: \(type(of: self.syntax)) generating from \(self)")
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
//
2+
// Parenthesized.swift
3+
// SyntaxKit
4+
//
5+
// Created by Leo Dion.
6+
// Copyright © 2025 BrightDigit.
7+
//
8+
// Permission is hereby granted, free of charge, to any person
9+
// obtaining a copy of this software and associated documentation
10+
// files (the “Software”), to deal in the Software without
11+
// restriction, including without limitation the rights to use,
12+
// copy, modify, merge, publish, distribute, sublicense, and/or
13+
// sell copies of the Software, and to permit persons to whom the
14+
// Software is furnished to do so, subject to the following
15+
// conditions:
16+
//
17+
// The above copyright notice and this permission notice shall be
18+
// included in all copies or substantial portions of the Software.
19+
//
20+
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
21+
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
22+
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23+
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24+
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
25+
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27+
// OTHER DEALINGS IN THE SOFTWARE.
28+
//
29+
30+
import SwiftSyntax
31+
32+
/// A code block that wraps its content in parentheses.
33+
public struct Parenthesized: CodeBlock {
34+
private let content: CodeBlock
35+
36+
/// Creates a parenthesized code block.
37+
/// - Parameter content: The code block to wrap in parentheses.
38+
public init(@CodeBlockBuilderResult _ content: () -> [CodeBlock]) {
39+
let blocks = content()
40+
precondition(blocks.count == 1, "Parenthesized expects exactly one code block.")
41+
self.content = blocks[0]
42+
}
43+
44+
public var syntax: SyntaxProtocol {
45+
ExprSyntax(
46+
TupleExprSyntax(
47+
leftParen: .leftParenToken(),
48+
elements: LabeledExprListSyntax([
49+
LabeledExprSyntax(expression: content.expr)
50+
]),
51+
rightParen: .rightParenToken()
52+
)
53+
)
54+
}
55+
}

0 commit comments

Comments
 (0)