@@ -127,7 +127,7 @@ extension PrettyPrinter {
127
127
print ( " /* TODO: conditional */" )
128
128
129
129
case let . quantification( amount, kind, child) :
130
- let amount = amount. ast. _patternBase
130
+ let amountStr = amount. ast. _patternBase
131
131
var kind = kind. ast? . _patternBase ?? " "
132
132
133
133
// If we've updated our quantification behavior, then use that. This
@@ -137,10 +137,10 @@ extension PrettyPrinter {
137
137
kind = quantificationBehavior. _patternBase
138
138
}
139
139
140
- var blockName = " \( amount ) ( \( kind) ) "
140
+ var blockName = " \( amountStr ) ( \( kind) ) "
141
141
142
142
if kind == " .eager " {
143
- blockName = " \( amount ) "
143
+ blockName = " \( amountStr ) "
144
144
}
145
145
146
146
// Special case single child character classes for repetition nodes.
@@ -152,6 +152,20 @@ extension PrettyPrinter {
152
152
// One(.digit)
153
153
// }
154
154
//
155
+ func printAtom( _ pattern: String ) {
156
+ indent ( )
157
+
158
+ if kind != " .eager " {
159
+ blockName. removeLast ( )
160
+ output ( " \( blockName) , " )
161
+ } else {
162
+ output ( " \( blockName) ( " )
163
+ }
164
+
165
+ output ( " \( pattern) ) " )
166
+ terminateLine ( )
167
+ }
168
+
155
169
func printSimpleCCC(
156
170
_ ccc: DSLTree . CustomCharacterClass
157
171
) {
@@ -169,23 +183,42 @@ extension PrettyPrinter {
169
183
terminateLine ( )
170
184
}
171
185
172
- switch child {
173
- case let . customCharacterClass( ccc) :
174
- if ccc. isSimplePrint {
175
- printSimpleCCC ( ccc)
176
- return
177
- }
178
-
179
- break
180
- case let . convertedRegexLiteral( . customCharacterClass( ccc) , _) :
181
- if ccc. isSimplePrint {
182
- printSimpleCCC ( ccc)
183
- return
186
+ // We can only do this for Optionally, ZeroOrMore, and OneOrMore. Cannot
187
+ // do it right now for Repeat.
188
+ if amount. ast. supportsInlineComponent {
189
+ switch child {
190
+ case let . atom( a) :
191
+ if let pattern = a. _patternBase ( & self ) , pattern. canBeWrapped {
192
+ printAtom ( pattern. 0 )
193
+ return
194
+ }
195
+
196
+ break
197
+ case let . customCharacterClass( ccc) :
198
+ if ccc. isSimplePrint {
199
+ printSimpleCCC ( ccc)
200
+ return
201
+ }
202
+
203
+ break
204
+
205
+ case let . convertedRegexLiteral( . atom( a) , _) :
206
+ if let pattern = a. _patternBase ( & self ) , pattern. canBeWrapped {
207
+ printAtom ( pattern. 0 )
208
+ return
209
+ }
210
+
211
+ break
212
+ case let . convertedRegexLiteral( . customCharacterClass( ccc) , _) :
213
+ if ccc. isSimplePrint {
214
+ printSimpleCCC ( ccc)
215
+ return
216
+ }
217
+
218
+ break
219
+ default :
220
+ break
184
221
}
185
-
186
- break
187
- default :
188
- break
189
222
}
190
223
191
224
printBlock ( blockName) { printer in
@@ -199,7 +232,11 @@ extension PrettyPrinter {
199
232
}
200
233
201
234
if let pattern = a. _patternBase ( & self ) {
202
- print ( pattern)
235
+ if pattern. canBeWrapped {
236
+ print ( " One( \( pattern. 0 ) ) " )
237
+ } else {
238
+ print ( pattern. 0 )
239
+ }
203
240
}
204
241
205
242
case . trivia:
@@ -391,9 +428,9 @@ extension PrettyPrinter {
391
428
if let lhs = lhs. _patternBase ( & self ) , let rhs = rhs. _patternBase ( & self ) {
392
429
indent ( )
393
430
output ( " ( " )
394
- output ( lhs)
431
+ output ( lhs. 0 )
395
432
output ( " ... " )
396
- output ( rhs)
433
+ output ( rhs. 0 )
397
434
output ( " ) " )
398
435
}
399
436
@@ -939,6 +976,15 @@ extension AST.Quantification.Amount {
939
976
case let . range( n, m) : return " Repeat( \( n. value) ... \( m. value) ) "
940
977
}
941
978
}
979
+
980
+ var supportsInlineComponent : Bool {
981
+ switch self {
982
+ case . zeroOrMore: return true
983
+ case . oneOrMore: return true
984
+ case . zeroOrOne: return true
985
+ default : return false
986
+ }
987
+ }
942
988
}
943
989
944
990
extension AST . Quantification . Kind {
@@ -1033,33 +1079,35 @@ extension DSLTree.CustomCharacterClass {
1033
1079
}
1034
1080
1035
1081
extension DSLTree . Atom {
1036
- func _patternBase( _ printer: inout PrettyPrinter ) -> String ? {
1082
+ func _patternBase(
1083
+ _ printer: inout PrettyPrinter
1084
+ ) -> ( String , canBeWrapped: Bool ) ? {
1037
1085
switch self {
1038
1086
case . any:
1039
- return " .any "
1087
+ return ( " .any " , true )
1040
1088
1041
1089
case let . char( c) :
1042
- return String ( c) . _quoted
1090
+ return ( String ( c) . _quoted, false )
1043
1091
1044
1092
case let . scalar( s) :
1045
1093
let hex = String ( s. value, radix: 16 , uppercase: true )
1046
- return " \\ u{ \( hex) } " . _quoted
1094
+ return ( " \\ u{ \( hex) } " . _quoted, false )
1047
1095
1048
1096
case let . unconverted( a) :
1049
1097
if a. ast. isUnprintableAtom {
1050
- return " #/ \( a. ast. _regexBase) /# "
1098
+ return ( " #/ \( a. ast. _regexBase) /# " , false )
1051
1099
} else {
1052
- return a. ast. _dslBase. 0
1100
+ return a. ast. _dslBase
1053
1101
}
1054
1102
1055
1103
case . assertion( let a) :
1056
- return a. ast. _patternBase
1104
+ return ( a. ast. _patternBase, false )
1057
1105
1058
1106
case . backreference( _) :
1059
- return " /* TOOD: backreferences */"
1107
+ return ( " /* TOOD: backreferences */" , false )
1060
1108
1061
1109
case . symbolicReference:
1062
- return " /* TOOD: symbolic references */"
1110
+ return ( " /* TOOD: symbolic references */" , false )
1063
1111
1064
1112
case . changeMatchingOptions( let matchingOptions) :
1065
1113
for add in matchingOptions. ast. adding {
0 commit comments