@@ -121,7 +121,7 @@ extension PrettyPrinter {
121
121
print ( " /* TODO: conditional */" )
122
122
123
123
case let . quantification( amount, kind, child) :
124
- let amount = amount. ast. _patternBase
124
+ let amountStr = amount. ast. _patternBase
125
125
var kind = kind. ast? . _patternBase ?? " "
126
126
127
127
// If we've updated our quantification behavior, then use that. This
@@ -131,10 +131,10 @@ extension PrettyPrinter {
131
131
kind = quantificationBehavior. _patternBase
132
132
}
133
133
134
- var blockName = " \( amount ) ( \( kind) ) "
134
+ var blockName = " \( amountStr ) ( \( kind) ) "
135
135
136
136
if kind == " .eager " {
137
- blockName = " \( amount ) "
137
+ blockName = " \( amountStr ) "
138
138
}
139
139
140
140
// Special case single child character classes for repetition nodes.
@@ -146,6 +146,20 @@ extension PrettyPrinter {
146
146
// One(.digit)
147
147
// }
148
148
//
149
+ func printAtom( _ pattern: String ) {
150
+ indent ( )
151
+
152
+ if kind != " .eager " {
153
+ blockName. removeLast ( )
154
+ output ( " \( blockName) , " )
155
+ } else {
156
+ output ( " \( blockName) ( " )
157
+ }
158
+
159
+ output ( " \( pattern) ) " )
160
+ terminateLine ( )
161
+ }
162
+
149
163
func printSimpleCCC(
150
164
_ ccc: DSLTree . CustomCharacterClass
151
165
) {
@@ -163,23 +177,42 @@ extension PrettyPrinter {
163
177
terminateLine ( )
164
178
}
165
179
166
- switch child {
167
- case let . customCharacterClass( ccc) :
168
- if ccc. isSimplePrint {
169
- printSimpleCCC ( ccc)
170
- return
171
- }
172
-
173
- break
174
- case let . convertedRegexLiteral( . customCharacterClass( ccc) , _) :
175
- if ccc. isSimplePrint {
176
- printSimpleCCC ( ccc)
177
- return
180
+ // We can only do this for Optionally, ZeroOrMore, and OneOrMore. Cannot
181
+ // do it right now for Repeat.
182
+ if amount. ast. supportsInlineComponent {
183
+ switch child {
184
+ case let . atom( a) :
185
+ if let pattern = a. _patternBase ( & self ) , pattern. canBeWrapped {
186
+ printAtom ( pattern. 0 )
187
+ return
188
+ }
189
+
190
+ break
191
+ case let . customCharacterClass( ccc) :
192
+ if ccc. isSimplePrint {
193
+ printSimpleCCC ( ccc)
194
+ return
195
+ }
196
+
197
+ break
198
+
199
+ case let . convertedRegexLiteral( . atom( a) , _) :
200
+ if let pattern = a. _patternBase ( & self ) , pattern. canBeWrapped {
201
+ printAtom ( pattern. 0 )
202
+ return
203
+ }
204
+
205
+ break
206
+ case let . convertedRegexLiteral( . customCharacterClass( ccc) , _) :
207
+ if ccc. isSimplePrint {
208
+ printSimpleCCC ( ccc)
209
+ return
210
+ }
211
+
212
+ break
213
+ default :
214
+ break
178
215
}
179
-
180
- break
181
- default :
182
- break
183
216
}
184
217
185
218
printBlock ( blockName) { printer in
@@ -939,6 +972,15 @@ extension AST.Quantification.Amount {
939
972
case let . range( n, m) : return " Repeat( \( n. value) ... \( m. value) ) "
940
973
}
941
974
}
975
+
976
+ var supportsInlineComponent : Bool {
977
+ switch self {
978
+ case . zeroOrMore: return true
979
+ case . oneOrMore: return true
980
+ case . zeroOrOne: return true
981
+ default : return false
982
+ }
983
+ }
942
984
}
943
985
944
986
extension AST . Quantification . Kind {
0 commit comments