Skip to content

Commit 23b80ac

Browse files
committed
it works
1 parent e21abfe commit 23b80ac

File tree

6 files changed

+882
-789
lines changed

6 files changed

+882
-789
lines changed

Sources/VariadicsGenerator/VariadicsGenerator.swift

Lines changed: 76 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -554,78 +554,83 @@ struct VariadicsGenerator: ParsableCommand {
554554
_ component: R,
555555
transform: @escaping (Substring) -> NewCapture
556556
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
557-
.init(node: .groupTransform(
558-
.capture,
559-
component.regex.root,
560-
CaptureTransform(resultType: NewCapture.self) {
561-
transform($0) as Any
562-
}))
557+
.init(node: .capture(name: nil, nil,
558+
.transform(
559+
CaptureTransform(resultType: NewCapture.self) {
560+
transform($0) as Any
561+
},
562+
component.regex.root)))
563563
}
564564
565565
public func capture<\(genericParams), NewCapture>(
566566
_ component: R,
567567
as reference: Reference<NewCapture>,
568568
transform: @escaping (Substring) -> NewCapture
569569
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
570-
.init(node: .groupTransform(
571-
.capture,
572-
component.regex.root,
573-
CaptureTransform(resultType: NewCapture.self) {
574-
transform($0) as Any
575-
},
576-
reference.id))
570+
.init(node: .capture(name: nil, reference.id,
571+
.transform(
572+
CaptureTransform(resultType: NewCapture.self) {
573+
transform($0) as Any
574+
},
575+
component.regex.root)))
577576
}
578577
579578
public func tryCapture<\(genericParams), NewCapture>(
580579
_ component: R,
581580
transform: @escaping (Substring) throws -> NewCapture
582581
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
583-
.init(node: .groupTransform(
584-
.capture,
585-
component.regex.root,
586-
CaptureTransform(resultType: NewCapture.self) {
587-
try transform($0) as Any
588-
}))
582+
.init(node: .capture(
583+
name: nil,
584+
nil,
585+
.transform(
586+
CaptureTransform(resultType: NewCapture.self) {
587+
try transform($0) as Any
588+
},
589+
component.regex.root)))
589590
}
590591
591592
public func tryCapture<\(genericParams), NewCapture>(
592593
_ component: R,
593594
as reference: Reference<NewCapture>,
594595
transform: @escaping (Substring) throws -> NewCapture
595596
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
596-
.init(node: .groupTransform(
597-
.capture,
598-
component.regex.root,
599-
CaptureTransform(resultType: NewCapture.self) {
600-
try transform($0) as Any
601-
},
602-
reference.id))
597+
.init(node: .capture(
598+
name: nil,
599+
reference.id,
600+
.transform(
601+
CaptureTransform(resultType: NewCapture.self) {
602+
try transform($0) as Any
603+
},
604+
component.regex.root)))
603605
}
604606
605607
public func tryCapture<\(genericParams), NewCapture>(
606608
_ component: R,
607609
transform: @escaping (Substring) -> NewCapture?
608610
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
609-
.init(node: .groupTransform(
610-
.capture,
611-
component.regex.root,
612-
CaptureTransform(resultType: NewCapture.self) {
613-
transform($0) as Any?
614-
}))
611+
.init(node: .capture(
612+
name: nil,
613+
nil,
614+
.transform(
615+
CaptureTransform(resultType: NewCapture.self) {
616+
transform($0) as Any?
617+
},
618+
component.regex.root)))
615619
}
616620
617621
public func tryCapture<\(genericParams), NewCapture>(
618622
_ component: R,
619623
as reference: Reference<NewCapture>,
620624
transform: @escaping (Substring) -> NewCapture?
621625
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
622-
.init(node: .groupTransform(
623-
.capture,
624-
component.regex.root,
625-
CaptureTransform(resultType: NewCapture.self) {
626-
transform($0) as Any?
627-
},
628-
reference.id))
626+
.init(node: .capture(
627+
name: nil,
628+
reference.id,
629+
.transform(
630+
CaptureTransform(resultType: NewCapture.self) {
631+
transform($0) as Any?
632+
},
633+
component.regex.root)))
629634
}
630635
631636
// MARK: - Builder capture arity \(arity)
@@ -647,55 +652,60 @@ struct VariadicsGenerator: ParsableCommand {
647652
@\(concatBuilderName) _ component: () -> R,
648653
transform: @escaping (Substring) -> NewCapture
649654
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
650-
.init(node: .groupTransform(
651-
.capture,
652-
component().regex.root,
653-
CaptureTransform(resultType: NewCapture.self) {
654-
transform($0) as Any
655-
}))
655+
.init(node: .capture(
656+
name: nil,
657+
nil,
658+
.transform(
659+
CaptureTransform(resultType: NewCapture.self) {
660+
transform($0) as Any
661+
},
662+
component().regex.root)))
656663
}
657664
658665
public func tryCapture<\(genericParams), NewCapture>(
659666
as reference: Reference<NewCapture>,
660667
@\(concatBuilderName) _ component: () -> R,
661668
transform: @escaping (Substring) throws -> NewCapture
662669
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
663-
.init(node: .groupTransform(
664-
.capture,
665-
component().regex.root,
666-
CaptureTransform(resultType: NewCapture.self) {
667-
try transform($0) as Any
668-
},
669-
reference.id))
670+
.init(node: .capture(
671+
name: nil,
672+
reference.id,
673+
.transform(
674+
CaptureTransform(resultType: NewCapture.self) {
675+
try transform($0) as Any
676+
},
677+
component().regex.root)))
670678
}
671679
672680
public func tryCapture<\(genericParams), NewCapture>(
673681
@\(concatBuilderName) _ component: () -> R,
674682
transform: @escaping (Substring) -> NewCapture?
675683
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
676-
.init(node: .groupTransform(
677-
.capture,
678-
component().regex.root,
679-
CaptureTransform(resultType: NewCapture.self) {
680-
transform($0) as Any?
681-
}))
684+
.init(node: .capture(
685+
name: nil,
686+
nil,
687+
.transform(
688+
CaptureTransform(resultType: NewCapture.self) {
689+
transform($0) as Any?
690+
},
691+
component().regex.root)))
682692
}
683693
684694
public func tryCapture<\(genericParams), NewCapture>(
685695
as reference: Reference<NewCapture>,
686696
@\(concatBuilderName) _ component: () -> R,
687697
transform: @escaping (Substring) -> NewCapture?
688698
) -> \(regexTypeName)<\(transformedNewMatchType)> \(whereClause) {
689-
.init(node: .groupTransform(
690-
.capture,
691-
component().regex.root,
692-
CaptureTransform(resultType: NewCapture.self) {
693-
transform($0) as Any?
694-
},
695-
reference.id))
699+
.init(node: .capture(
700+
name: nil,
701+
reference.id,
702+
.transform(
703+
CaptureTransform(resultType: NewCapture.self) {
704+
transform($0) as Any?
705+
},
706+
component().regex.root)))
696707
}
697708
698-
699709
""")
700710
}
701711
}

Sources/_StringProcessing/ByteCodeGen.swift

Lines changed: 30 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -299,37 +299,33 @@ extension Compiler.ByteCodeGen {
299299
}
300300
}
301301

302-
mutating func emitCapture(
303-
_ name: String?,
304-
_ refId: ReferenceID?,
305-
_ child: DSLTree.Node
306-
) throws -> CaptureRegister {
307-
let cap = builder.makeCapture(id: refId)
308-
switch child {
309-
case .matcher(_, let m):
310-
emitMatcher(m, into: cap)
311-
312-
default:
313-
builder.buildBeginCapture(cap)
314-
try emitNode(child)
315-
builder.buildEndCapture(cap)
316-
return cap
302+
mutating func emitTransform(
303+
_ t: CaptureTransform,
304+
_ child: DSLTree.Node,
305+
into cap: CaptureRegister
306+
) throws {
307+
let transform = builder.makeTransformFunction {
308+
input, range in
309+
t(input[range])
317310
}
318-
return cap
311+
builder.buildBeginCapture(cap)
312+
try emitNode(child)
313+
builder.buildEndCapture(cap)
314+
builder.buildTransformCapture(cap, transform)
319315
}
320316

321317
mutating func emitNoncapturingGroup(
322318
_ kind: AST.Group.Kind,
323319
_ child: DSLTree.Node
324-
) throws -> CaptureRegister? {
320+
) throws {
325321
assert(!kind.isCapturing)
326322

327323
options.beginScope()
328324
defer { options.endScope() }
329325

330326
if let lookaround = kind.lookaroundKind {
331327
try emitLookaround(lookaround, child)
332-
return nil
328+
return
333329
}
334330

335331
switch kind {
@@ -343,12 +339,10 @@ extension Compiler.ByteCodeGen {
343339
case .changeMatchingOptions(let optionSequence, _):
344340
options.apply(optionSequence)
345341
try emitNode(child)
346-
return nil
347342

348343
default:
349344
// FIXME: Other kinds...
350345
try emitNode(child)
351-
return nil
352346
}
353347
}
354348

@@ -567,8 +561,18 @@ extension Compiler.ByteCodeGen {
567561
try emitConcatenationComponent(child)
568562
}
569563

570-
case let .capture(name, ref, child):
571-
_ = try emitCapture(name, ref, child)
564+
case let .capture(_, refId, child):
565+
let cap = builder.makeCapture(id: refId)
566+
switch child {
567+
case let .matcher(_, m):
568+
emitMatcher(m, into: cap)
569+
case let .transform(t, child):
570+
try emitTransform(t, child, into: cap)
571+
default:
572+
builder.buildBeginCapture(cap)
573+
try emitNode(child)
574+
builder.buildEndCapture(cap)
575+
}
572576

573577
case let .nonCapturingGroup(kind, child):
574578
try emitNoncapturingGroup(kind, child)
@@ -610,27 +614,6 @@ extension Compiler.ByteCodeGen {
610614
case let .convertedRegexLiteral(n, _):
611615
try emitNode(n)
612616

613-
case let .groupTransform(kind, child, t, referenceID):
614-
fatalError()
615-
616-
// // TODO: convert this to just a value-transform node
617-
//
618-
//
619-
// guard let cap = try emitGroup(kind, child, referenceID) else {
620-
// assertionFailure("""
621-
// What does it mean to not have a capture to transform?
622-
// """)
623-
// return
624-
// }
625-
//
626-
// // FIXME: Is this how we want to do it?
627-
// let transform = builder.makeTransformFunction {
628-
// input, range in
629-
// t(input[range])
630-
// }
631-
//
632-
// builder.buildTransformCapture(cap, transform)
633-
634617
case .absentFunction:
635618
throw Unsupported("absent function")
636619
case .consumer:
@@ -639,6 +622,10 @@ extension Compiler.ByteCodeGen {
639622
case let .matcher(_, f):
640623
emitMatcher(f)
641624

625+
case .transform:
626+
throw Unreachable(
627+
"Transforms only directly inside captures")
628+
642629
case .characterPredicate:
643630
throw Unsupported("character predicates")
644631

Sources/_StringProcessing/ConsumerInterface.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@ extension DSLTree.Node {
3939
case .orderedChoice, .conditional, .concatenation,
4040
.capture, .nonCapturingGroup,
4141
.quantification, .trivia, .empty,
42-
.groupTransform, .absentFunction: return nil
42+
.absentFunction: return nil
4343

4444
case .consumer:
4545
fatalError("FIXME: Is this where we handle them?")
4646
case .matcher:
4747
fatalError("FIXME: Is this where we handle them?")
48+
case .transform:
49+
fatalError("FIXME: Is this where we handle them?")
4850
case .characterPredicate:
4951
fatalError("FIXME: Is this where we handle them?")
5052
}

Sources/_StringProcessing/PrintAsPattern.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ extension PrettyPrinter {
160160
case let .customCharacterClass(ccc):
161161
printAsPattern(ccc)
162162

163-
case .groupTransform:
164-
print("/* TODO: group transforms */")
163+
case .transform:
164+
print("/* TODO: transforms */")
165165
case .consumer:
166166
print("/* TODO: consumers */")
167167
case .matcher:

0 commit comments

Comments
 (0)