@@ -330,7 +330,7 @@ extension DSLTree.Node {
330
330
return ccc. modelCharacterClass
331
331
case let . atom( a) :
332
332
return a. characterClass
333
- case let . characterPredicate( p ) :
333
+ case . characterPredicate:
334
334
// FIXME: Do we make one from this?
335
335
return nil
336
336
default :
@@ -417,8 +417,8 @@ extension AST.Atom.EscapedBuiltin {
417
417
}
418
418
419
419
extension DSLTree . CustomCharacterClass {
420
+ // TODO: Refactor a bit, and... can we drop this type?
420
421
var modelCharacterClass : CharacterClass ? {
421
-
422
422
var result =
423
423
Array < CharacterClass . CharacterSetComponent > ( )
424
424
for m in members {
@@ -445,8 +445,38 @@ extension DSLTree.CustomCharacterClass {
445
445
}
446
446
result. append ( . characterClass( cc) )
447
447
448
- case . intersection, . subtraction, . symmetricDifference:
449
- fatalError ( " TODO " )
448
+ case let . intersection( lhs, rhs) :
449
+ guard let lhs = lhs. modelCharacterClass,
450
+ let rhs = rhs. modelCharacterClass
451
+ else {
452
+ return nil
453
+ }
454
+ result. append ( . setOperation(
455
+ lhs: . characterClass( lhs) ,
456
+ op: . intersection,
457
+ rhs: . characterClass( rhs) ) )
458
+
459
+ case let . subtraction( lhs, rhs) :
460
+ guard let lhs = lhs. modelCharacterClass,
461
+ let rhs = rhs. modelCharacterClass
462
+ else {
463
+ return nil
464
+ }
465
+ result. append ( . setOperation(
466
+ lhs: . characterClass( lhs) ,
467
+ op: . subtraction,
468
+ rhs: . characterClass( rhs) ) )
469
+
470
+ case let . symmetricDifference( lhs, rhs) :
471
+ guard let lhs = lhs. modelCharacterClass,
472
+ let rhs = rhs. modelCharacterClass
473
+ else {
474
+ return nil
475
+ }
476
+ result. append ( . setOperation(
477
+ lhs: . characterClass( lhs) ,
478
+ op: . symmetricDifference,
479
+ rhs: . characterClass( rhs) ) )
450
480
}
451
481
}
452
482
let cc = CharacterClass . custom ( result)
0 commit comments