Skip to content

Commit 5d46f91

Browse files
committed
Add folding for the arrow operator
1 parent cd193bf commit 5d46f91

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

Sources/SwiftOperatorPrecedence/OperatorPrecedence+Folding.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,11 @@ extension OperatorPrecedence {
8080
return "CastingPrecedence"
8181
}
8282

83-
// FIXME: Handle all of the language-defined precedence relationships.
83+
// The arrow operator has fixed precedence.
84+
if expr.is(ArrowExprSyntax.self) {
85+
return "FunctionArrowPrecedence"
86+
}
87+
8488
return nil
8589
}
8690

@@ -155,6 +159,16 @@ extension OperatorPrecedence {
155159
)
156160
}
157161

162+
// An arrow expression (->).
163+
if let arrowExpr = op.as(ArrowExprSyntax.self) {
164+
return ExprSyntax(
165+
InfixOperatorExprSyntax(
166+
leftOperand: lhs,
167+
operatorOperand: ExprSyntax(arrowExpr),
168+
rightOperand: rhs)
169+
)
170+
}
171+
158172
// FIXME: Fallback that we should never need
159173
fatalError("Unknown binary operator")
160174
}

Tests/SwiftOperatorPrecedenceTest/OperatorPrecedence.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,14 @@ public class OperatorPrecedenceTests: XCTestCase {
130130
try opPrecedence.assertExpectedFold("a as c == nil", "((a as c) == nil)")
131131
}
132132

133+
func testArrowExpr() throws {
134+
let opPrecedence = OperatorPrecedence.standardOperators
135+
try opPrecedence.assertExpectedFold(
136+
"a = b -> c -> d",
137+
"(a = (b -> (c -> d)))"
138+
)
139+
}
140+
133141
func testParsedLogicalExprs() throws {
134142
let logicalOperatorSources =
135143
"""

0 commit comments

Comments
 (0)