Skip to content

Commit 64a9cda

Browse files
committed
Teach precedence.precedence(...) to look in both directions
1 parent 12f1ce3 commit 64a9cda

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

Sources/SwiftOperatorPrecedence/OperatorPrecedence+Folding.swift

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -196,23 +196,22 @@ extension OperatorPrecedence {
196196
return group.associativity
197197
}
198198

199-
if try precedence(
199+
let prec = try precedence(
200200
relating: firstGroup, to: secondGroup,
201201
startSyntax: firstGroupSyntax, endSyntax: secondGroupSyntax,
202202
errorHandler: errorHandler
203-
) == .higherThan {
203+
)
204+
205+
switch prec {
206+
case .higherThan:
204207
return .left
205-
}
206208

207-
if try precedence(
208-
relating: secondGroup, to: firstGroup,
209-
startSyntax: secondGroupSyntax, endSyntax: firstGroupSyntax,
210-
errorHandler: errorHandler
211-
) == .higherThan {
209+
case .lowerThan:
212210
return .right
213-
}
214211

215-
return .none
212+
case .unrelated:
213+
return .none
214+
}
216215
}
217216

218217
/// "Fold" an expression sequence where the left-hand side has been broken

Sources/SwiftOperatorPrecedence/PrecedenceGraph.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@ enum Precedence {
1212
case unrelated
1313
case higherThan
1414
case lowerThan
15+
16+
/// Flip the precedence order around.
17+
var flipped: Precedence {
18+
switch self {
19+
case .unrelated:
20+
return .unrelated
21+
22+
case .higherThan:
23+
return .lowerThan
24+
25+
case .lowerThan:
26+
return .higherThan
27+
}
28+
}
1529
}
1630

1731
/// A graph formed from a set of precedence groups, which can be used to
@@ -114,6 +128,18 @@ struct PrecedenceGraph {
114128
initialGroupName: startGroupName, initialSyntax: startSyntax,
115129
targetGroupName: endGroupName, direction: .higherThan,
116130
errorHandler: errorHandler
117-
) ?? .unrelated
131+
) ?? searchRelationships(
132+
initialGroupName: startGroupName, initialSyntax: startSyntax,
133+
targetGroupName: endGroupName, direction: .lowerThan,
134+
errorHandler: errorHandler
135+
).map {
136+
$0.flipped
137+
} ?? searchRelationships(
138+
initialGroupName: endGroupName, initialSyntax: endSyntax,
139+
targetGroupName: startGroupName, direction: .higherThan,
140+
errorHandler: errorHandler
141+
).map {
142+
$0.flipped
143+
} ?? .unrelated
118144
}
119145
}

0 commit comments

Comments
 (0)