Skip to content

Commit b1d41f4

Browse files
partially fixes issue number 6; needs more development for a complete fix
1 parent 804a0d9 commit b1d41f4

File tree

3 files changed

+149
-116
lines changed

3 files changed

+149
-116
lines changed

Sources/HTMLKitUtilities/interpolation/ParseLiteral.swift

Lines changed: 4 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ extension HTMLKitUtilities {
134134
}
135135
return .interpolation(to_single_line(function))
136136
}
137-
if let member:MemberAccessExprSyntax = expression.memberAccess {
138-
return .interpolation(to_single_line(member))
137+
if expression.memberAccess != nil || expression.is(ForceUnwrapExprSyntax.self) {
138+
return .interpolation(to_single_line(expression))
139139
}
140140
if let array:ArrayExprSyntax = expression.array {
141141
let separator:String
@@ -171,125 +171,17 @@ extension HTMLKitUtilities {
171171
}
172172
return .array(results)
173173
}
174-
if let decl:DeclReferenceExprSyntax = expression.as(DeclReferenceExprSyntax.self) {
174+
if let decl:DeclReferenceExprSyntax = expression.declRef {
175175
var string:String = decl.baseName.text, remaining_interpolation:Int = 1
176176
warn_interpolation(context: context, node: expression, string: &string, remaining_interpolation: &remaining_interpolation, lookupFiles: lookupFiles)
177177
if remaining_interpolation > 0 {
178-
return .interpolation("\\(" + string + ")")
178+
return .interpolation(string)
179179
} else {
180180
return .string(string)
181181
}
182182
}
183-
if let unwrap:ForceUnwrapExprSyntax = expression.as(ForceUnwrapExprSyntax.self) {
184-
let merged:String = to_single_line(unwrap)
185-
return .interpolation("\\(" + merged + ")")
186-
}
187183
return nil
188184
}
189-
190-
// MARK: To Single Line
191-
static func to_single_line(_ expression: ExprSyntax) -> String {
192-
if let function:FunctionCallExprSyntax = expression.functionCall {
193-
return to_single_line(function)
194-
} else if let member:MemberAccessExprSyntax = expression.memberAccess {
195-
return to_single_line(member)
196-
} else if let force_unwrap:ForceUnwrapExprSyntax = expression.as(ForceUnwrapExprSyntax.self) {
197-
return to_single_line(force_unwrap) + "!"
198-
} else if let closure:ClosureExprSyntax = expression.as(ClosureExprSyntax.self) {
199-
return to_single_line(closure)
200-
} else {
201-
return "\(expression)"
202-
}
203-
}
204-
static func to_single_line(_ force_unwrap: ForceUnwrapExprSyntax) -> String {
205-
return to_single_line(force_unwrap.expression) + "!"
206-
}
207-
static func to_single_line(_ member: MemberAccessExprSyntax) -> String {
208-
var string:String = "\(member)"
209-
string.removeAll { $0.isWhitespace }
210-
return string
211-
}
212-
static func to_single_line(_ function: FunctionCallExprSyntax) -> String {
213-
var string:String = "\(function.calledExpression)"
214-
string.removeAll { $0.isWhitespace }
215-
var args:String = ""
216-
var is_first:Bool = true
217-
for argument in function.arguments {
218-
var arg:String
219-
if let label = argument.label {
220-
arg = "\(label)"
221-
while arg.first?.isWhitespace ?? false {
222-
arg.removeFirst()
223-
}
224-
if !is_first {
225-
arg.insert(",", at: arg.startIndex)
226-
}
227-
arg += ": "
228-
var expr:String = to_single_line(argument.expression)
229-
while expr.first?.isWhitespace ?? false {
230-
expr.removeFirst()
231-
}
232-
arg += expr
233-
} else {
234-
arg = "\(argument)"
235-
while arg.first?.isWhitespace ?? false {
236-
arg.removeFirst()
237-
}
238-
}
239-
args += arg
240-
is_first = false
241-
}
242-
if let closure:ClosureExprSyntax = function.trailingClosure {
243-
args += to_single_line(closure)
244-
}
245-
args = "(" + args + ")"
246-
return string + args
247-
}
248-
static func to_single_line(_ decl: DeclSyntax) -> String {
249-
return "\(decl)" // TODO: fix?
250-
}
251-
static func to_single_line(_ statement: StmtSyntax) -> String {
252-
return "\(statement)" // TODO: fix?
253-
}
254-
static func to_single_line(_ closure: ClosureExprSyntax) -> String {
255-
var signature:String = "", body:String = ""
256-
if let sig:ClosureSignatureSyntax = closure.signature {
257-
signature = to_single_line(sig)
258-
}
259-
var is_first:Bool = true
260-
for statement in closure.statements {
261-
if !is_first {
262-
body += "; "
263-
}
264-
switch statement.item {
265-
case .decl(let decl): body += to_single_line(decl)
266-
case .expr(let expression): body += to_single_line(expression)
267-
case .stmt(let stmt): body += to_single_line(stmt)
268-
}
269-
is_first = false
270-
}
271-
return "{ " + signature + body + " }"
272-
}
273-
static func to_single_line(_ signature: ClosureSignatureSyntax) -> String {
274-
var string:String = ""
275-
switch signature.parameterClause {
276-
case nil:
277-
break
278-
case .simpleInput(let list):
279-
for i in list {
280-
string += i.name.text
281-
}
282-
break
283-
case .parameterClause(let clause):
284-
string += "("
285-
for i in clause.parameters {
286-
string += "\(i)"
287-
}
288-
string += ")"
289-
break
290-
}
291-
return string + " in "
292-
}
293185
}
294186

295187
// MARK: LiteralReturnType
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
//
2+
// ToSingleLine.swift
3+
//
4+
//
5+
// Created by Evan Anderson on 11/29/24.
6+
//
7+
8+
import SwiftSyntax
9+
10+
// MARK: To Single Line
11+
extension String {
12+
mutating func stripLeadingAndTrailingWhitespace() {
13+
while first?.isWhitespace ?? false {
14+
removeFirst()
15+
}
16+
while last?.isWhitespace ?? false {
17+
removeLast()
18+
}
19+
}
20+
}
21+
extension HTMLKitUtilities {
22+
static func to_single_line(_ syntax: SyntaxProtocol) -> String {
23+
var string:String = "\(syntax)"
24+
if let decl:DeclSyntax = syntax.as(DeclSyntax.self) {
25+
string = to_single_line(decl)
26+
} else if let expression:ExprSyntax = syntax.as(ExprSyntax.self) {
27+
if let function:FunctionCallExprSyntax = expression.functionCall {
28+
string = to_single_line(function)
29+
} else if let member:MemberAccessExprSyntax = expression.memberAccess {
30+
string = to_single_line(member)
31+
} else if let force_unwrap:ForceUnwrapExprSyntax = expression.as(ForceUnwrapExprSyntax.self) {
32+
string = to_single_line(force_unwrap)
33+
} else if let closure:ClosureExprSyntax = expression.as(ClosureExprSyntax.self) {
34+
string = to_single_line(closure)
35+
}
36+
} else if let stmt:StmtSyntax = syntax.as(StmtSyntax.self) {
37+
string = to_single_line(stmt)
38+
}
39+
string.stripLeadingAndTrailingWhitespace()
40+
return string
41+
}
42+
}
43+
44+
// MARK: Decl to single line
45+
extension HTMLKitUtilities {
46+
static func to_single_line(_ decl: DeclSyntax) -> String {
47+
var string:String = "\(decl)" // TODO: fix?
48+
string.stripLeadingAndTrailingWhitespace()
49+
return string
50+
}
51+
}
52+
53+
// MARK: Expr to single line
54+
extension HTMLKitUtilities {
55+
static func to_single_line(_ force_unwrap: ForceUnwrapExprSyntax) -> String {
56+
return to_single_line(force_unwrap.expression) + "!"
57+
}
58+
static func to_single_line(_ member: MemberAccessExprSyntax) -> String {
59+
var string:String = "\(member)"
60+
string.removeAll { $0.isWhitespace }
61+
return string
62+
}
63+
static func to_single_line(_ function: FunctionCallExprSyntax) -> String {
64+
var args:String = "", is_first:Bool = true
65+
for argument in function.arguments {
66+
var arg:String
67+
if let label:TokenSyntax = argument.label {
68+
arg = label.text
69+
if !is_first {
70+
arg.insert(",", at: arg.startIndex)
71+
}
72+
arg += ": "
73+
} else {
74+
arg = ""
75+
}
76+
arg += to_single_line(argument.expression)
77+
args += arg
78+
is_first = false
79+
}
80+
if let closure:ClosureExprSyntax = function.trailingClosure {
81+
args += to_single_line(closure)
82+
}
83+
for e in function.additionalTrailingClosures {
84+
args += (is_first ? "" : ", ") + to_single_line(e.closure)
85+
is_first = false
86+
}
87+
args = "(" + args + ")"
88+
return to_single_line(function.calledExpression) + args
89+
}
90+
static func to_single_line(_ closure: ClosureExprSyntax) -> String {
91+
var signature:String = ""
92+
if let sig:ClosureSignatureSyntax = closure.signature {
93+
signature = to_single_line(sig)
94+
}
95+
var body:String = "", is_first:Bool = true
96+
for statement in closure.statements {
97+
if !is_first {
98+
body += "; "
99+
}
100+
switch statement.item {
101+
case .decl(let decl): body += to_single_line(decl)
102+
case .expr(let expr): body += to_single_line(expr)
103+
case .stmt(let stmt): body += to_single_line(stmt)
104+
}
105+
is_first = false
106+
}
107+
return "{ " + signature + body + " }"
108+
}
109+
static func to_single_line(_ signature: ClosureSignatureSyntax) -> String {
110+
var string:String = ""
111+
switch signature.parameterClause {
112+
case nil:
113+
break
114+
case .simpleInput(let list):
115+
for i in list {
116+
string += i.name.text
117+
}
118+
case .parameterClause(let clause):
119+
string += "("
120+
for i in clause.parameters {
121+
string += "\(i)"
122+
}
123+
string += ")"
124+
}
125+
return string + " in "
126+
}
127+
}
128+
129+
// MARK: Stmt to single line
130+
extension HTMLKitUtilities {
131+
static func to_single_line(_ statement: StmtSyntax) -> String {
132+
var string:String = "\(statement)" // TODO: fix?
133+
if let expression:ExpressionStmtSyntax = statement.as(ExpressionStmtSyntax.self) {
134+
} else if let labeled:LabeledStmtSyntax = statement.as(LabeledStmtSyntax.self) {
135+
}
136+
string.stripLeadingAndTrailingWhitespace()
137+
return string
138+
}
139+
}

Tests/HTMLKitTests/InterpolationTests.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,13 @@ struct InterpolationTests {
129129

130130
// MARK: multi-line closure
131131
@Test func multiline_closure_interpolation() {
132-
/*var expected_result:String = "<div>Mrs. Puff</div>"
133-
string = #html(div(InterpolationTests.character2 {
134-
let test:String = "Mrs. Puff"
132+
var expected_result:String = "<div>Mrs. Puff</div>"
133+
var string:String = #html(div(InterpolationTests.character2 {
134+
let bro = ""
135+
let yikes:Bool = true
136+
return false ? bro : ""
135137
} ))
136-
#expect(string == expected_result)*/
138+
#expect(string == expected_result)
137139
}
138140

139141
// MARK: multi-line member

0 commit comments

Comments
 (0)