Skip to content

Commit 3d8d2bf

Browse files
committed
Add ASTBuilder helper for char class set operations
1 parent ed08886 commit 3d8d2bf

File tree

2 files changed

+27
-19
lines changed

2 files changed

+27
-19
lines changed

Sources/_StringProcessing/Utility/ASTBuilder.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,14 @@ func charClass(
319319
return .custom(cc)
320320
}
321321

322+
func setOp(
323+
_ lhs: AST.CustomCharacterClass.Member...,
324+
op: AST.CustomCharacterClass.SetOp,
325+
_ rhs: AST.CustomCharacterClass.Member...
326+
) -> AST.CustomCharacterClass.Member {
327+
.setOperation(lhs, .init(faking: op), rhs)
328+
}
329+
322330
func quote(_ s: String) -> AST.Node {
323331
.quote(.init(s, .fake))
324332
}

Tests/RegexTests/ParseTests.swift

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -522,9 +522,8 @@ extension RegexTests {
522522
parseTest("[a-a]", charClass(range_m("a", "a")))
523523
parseTest("[B-a]", charClass(range_m("B", "a")))
524524

525-
// FIXME: AST builder helpers for custom char class types
526525
parseTest("[a-d--a-c]", charClass(
527-
.setOperation([range_m("a", "d")], .init(faking: .subtraction), [range_m("a", "c")])
526+
setOp(range_m("a", "d"), op: .subtraction, range_m("a", "c"))
528527
))
529528

530529
parseTest("[-]", charClass("-"))
@@ -684,30 +683,31 @@ extension RegexTests {
684683

685684
parseTest(
686685
#"[a[bc]de&&[^bc]\d]+"#,
687-
oneOrMore(of: charClass(
688-
.setOperation(
689-
["a", charClass("b", "c"), "d", "e"],
690-
.init(faking: .intersection),
691-
[charClass("b", "c", inverted: true), atom_m(.escaped(.decimalDigit))]
692-
))))
686+
oneOrMore(of: charClass(setOp(
687+
"a", charClass("b", "c"), "d", "e",
688+
op: .intersection,
689+
charClass("b", "c", inverted: true), atom_m(.escaped(.decimalDigit))
690+
)))
691+
)
693692

694693
parseTest(
695-
"[a&&b]",
696-
charClass(
697-
.setOperation(["a"], .init(faking: .intersection), ["b"])))
694+
"[a&&b]", charClass(setOp("a", op: .intersection, "b"))
695+
)
698696

699697
parseTest(
700698
"[abc--def]",
701-
charClass(.setOperation(["a", "b", "c"], .init(faking: .subtraction), ["d", "e", "f"])))
699+
charClass(setOp("a", "b", "c", op: .subtraction, "d", "e", "f"))
700+
)
702701

703702
// We left-associate for chained operators.
704703
parseTest(
705704
"[ab&&b~~cd]",
706-
charClass(
707-
.setOperation(
708-
[.setOperation(["a", "b"], .init(faking: .intersection), ["b"])],
709-
.init(faking: .symmetricDifference),
710-
["c", "d"])))
705+
charClass(setOp(
706+
setOp("a", "b", op: .intersection, "b"),
707+
op: .symmetricDifference,
708+
"c", "d"
709+
))
710+
)
711711

712712
// Operators are only valid in custom character classes.
713713
parseTest(
@@ -723,11 +723,11 @@ extension RegexTests {
723723

724724
parseTest(
725725
"[ && ]",
726-
charClass(.setOperation([" "], .init(faking: .intersection), [" ", " "]))
726+
charClass(setOp(" ", op: .intersection, " ", " "))
727727
)
728728
parseTest("(?x)[ a && b ]", concat(
729729
changeMatchingOptions(matchingOptions(adding: .extended)),
730-
charClass(.setOperation(["a"], .init(faking: .intersection), ["b"]))
730+
charClass(setOp("a", op: .intersection, "b"))
731731
))
732732

733733
// MARK: Quotes

0 commit comments

Comments
 (0)