@@ -89,11 +89,13 @@ concept CSSUniqueComponentValueVisitors =
89
89
/* *
90
90
* Describes the delimeter to expect before the next component value.
91
91
*/
92
- enum class CSSComponentValueDelimiter {
93
- Comma,
92
+ enum class CSSDelimiter {
94
93
Whitespace,
95
- CommaOrWhitespace ,
94
+ OptionalWhitespace ,
96
95
Solidus,
96
+ Comma,
97
+ CommaOrWhitespace,
98
+ CommaOrWhitespaceOrSolidus,
97
99
None,
98
100
};
99
101
@@ -142,7 +144,7 @@ class CSSSyntaxParser {
142
144
*/
143
145
template <typename ReturnT = std::nullptr_t >
144
146
constexpr ReturnT consumeComponentValue (
145
- CSSComponentValueDelimiter delimiter,
147
+ CSSDelimiter delimiter,
146
148
const CSSComponentValueVisitor<ReturnT> auto &... visitors)
147
149
requires(CSSUniqueComponentValueVisitors<ReturnT, decltype (visitors)...>);
148
150
@@ -172,7 +174,7 @@ class CSSSyntaxParser {
172
174
*/
173
175
template <typename ReturnT = std::nullptr_t >
174
176
constexpr ReturnT peekComponentValue (
175
- CSSComponentValueDelimiter delimiter,
177
+ CSSDelimiter delimiter,
176
178
const CSSComponentValueVisitor<ReturnT> auto &... visitors)
177
179
requires(CSSUniqueComponentValueVisitors<ReturnT, decltype (visitors)...>);
178
180
@@ -229,38 +231,10 @@ struct CSSComponentValueVisitorDispatcher {
229
231
CSSSyntaxParser& parser;
230
232
231
233
constexpr ReturnT consumeComponentValue (
232
- CSSComponentValueDelimiter delimiter,
234
+ CSSDelimiter delimiter,
233
235
const VisitorsT&... visitors) {
234
- switch (delimiter) {
235
- case CSSComponentValueDelimiter::Comma:
236
- parser.consumeWhitespace ();
237
- if (parser.peek ().type () != CSSTokenType::Comma) {
238
- return ReturnT{};
239
- }
240
- parser.consumeToken ();
241
- parser.consumeWhitespace ();
242
- break ;
243
- case CSSComponentValueDelimiter::Whitespace:
244
- parser.consumeWhitespace ();
245
- break ;
246
- case CSSComponentValueDelimiter::CommaOrWhitespace:
247
- parser.consumeWhitespace ();
248
- if (parser.peek ().type () == CSSTokenType::Comma) {
249
- parser.consumeToken ();
250
- }
251
- parser.consumeWhitespace ();
252
- break ;
253
- case CSSComponentValueDelimiter::Solidus:
254
- parser.consumeWhitespace ();
255
- if (parser.peek ().type () != CSSTokenType::Delim ||
256
- parser.peek ().stringValue () != " /" ) {
257
- return ReturnT{};
258
- }
259
- parser.consumeToken ();
260
- parser.consumeWhitespace ();
261
- break ;
262
- case CSSComponentValueDelimiter::None:
263
- break ;
236
+ if (!consumeDelimiter (delimiter)) {
237
+ return {};
264
238
}
265
239
266
240
if (parser.peek ().type () == parser.terminator_ ) {
@@ -301,8 +275,62 @@ struct CSSComponentValueVisitorDispatcher {
301
275
return ReturnT{};
302
276
}
303
277
278
+ /* *
279
+ * Consume a delimiter, returning false if a required delimiter is not found.
280
+ */
281
+ constexpr bool consumeDelimiter (CSSDelimiter delimiter) {
282
+ if (delimiter == CSSDelimiter::None) {
283
+ return true ;
284
+ }
285
+
286
+ bool hasWhiteSpace = parser.peek ().type () == CSSTokenType::WhiteSpace;
287
+ parser.consumeWhitespace ();
288
+
289
+ switch (delimiter) {
290
+ case CSSDelimiter::Comma:
291
+ if (parser.peek ().type () == CSSTokenType::Comma) {
292
+ parser.consumeToken ();
293
+ parser.consumeWhitespace ();
294
+ return true ;
295
+ }
296
+ return false ;
297
+ case CSSDelimiter::Whitespace:
298
+ return hasWhiteSpace;
299
+ case CSSDelimiter::OptionalWhitespace:
300
+ return true ;
301
+ case CSSDelimiter::CommaOrWhitespace:
302
+ if (parser.peek ().type () == CSSTokenType::Comma) {
303
+ parser.consumeToken ();
304
+ parser.consumeWhitespace ();
305
+ return true ;
306
+ }
307
+ return hasWhiteSpace;
308
+ case CSSDelimiter::Solidus:
309
+ if (parser.peek ().type () == CSSTokenType::Delim &&
310
+ parser.peek ().stringValue () == " /" ) {
311
+ parser.consumeToken ();
312
+ parser.consumeWhitespace ();
313
+ return true ;
314
+ }
315
+ return false ;
316
+ case CSSDelimiter::CommaOrWhitespaceOrSolidus:
317
+ if (parser.peek ().type () == CSSTokenType::Comma ||
318
+ (parser.peek ().type () == CSSTokenType::Delim &&
319
+ parser.peek ().stringValue () == " /" )) {
320
+ parser.consumeToken ();
321
+ parser.consumeWhitespace ();
322
+ return true ;
323
+ }
324
+ return hasWhiteSpace;
325
+ case CSSDelimiter::None:
326
+ return true ;
327
+ }
328
+
329
+ return false ;
330
+ }
331
+
304
332
constexpr ReturnT peekComponentValue (
305
- CSSComponentValueDelimiter delimiter,
333
+ CSSDelimiter delimiter,
306
334
const VisitorsT&... visitors) {
307
335
auto originalParser = parser;
308
336
auto ret = consumeComponentValue (delimiter, visitors...);
@@ -393,7 +421,7 @@ struct CSSComponentValueVisitorDispatcher {
393
421
394
422
template <typename ReturnT>
395
423
constexpr ReturnT CSSSyntaxParser::consumeComponentValue (
396
- CSSComponentValueDelimiter delimiter,
424
+ CSSDelimiter delimiter,
397
425
const CSSComponentValueVisitor<ReturnT> auto &... visitors)
398
426
requires(CSSUniqueComponentValueVisitors<ReturnT, decltype (visitors)...>)
399
427
{
@@ -407,13 +435,12 @@ constexpr ReturnT CSSSyntaxParser::consumeComponentValue(
407
435
const CSSComponentValueVisitor<ReturnT> auto &... visitors)
408
436
requires(CSSUniqueComponentValueVisitors<ReturnT, decltype (visitors)...>)
409
437
{
410
- return consumeComponentValue<ReturnT>(
411
- CSSComponentValueDelimiter::None, visitors...);
438
+ return consumeComponentValue<ReturnT>(CSSDelimiter::None, visitors...);
412
439
}
413
440
414
441
template <typename ReturnT>
415
442
constexpr ReturnT CSSSyntaxParser::peekComponentValue (
416
- CSSComponentValueDelimiter delimiter,
443
+ CSSDelimiter delimiter,
417
444
const CSSComponentValueVisitor<ReturnT> auto &... visitors)
418
445
requires(CSSUniqueComponentValueVisitors<ReturnT, decltype (visitors)...>)
419
446
{
@@ -427,8 +454,7 @@ constexpr ReturnT CSSSyntaxParser::peekComponentValue(
427
454
const CSSComponentValueVisitor<ReturnT> auto &... visitors)
428
455
requires(CSSUniqueComponentValueVisitors<ReturnT, decltype (visitors)...>)
429
456
{
430
- return peekComponentValue<ReturnT>(
431
- CSSComponentValueDelimiter::None, visitors...);
457
+ return peekComponentValue<ReturnT>(CSSDelimiter::None, visitors...);
432
458
}
433
459
434
460
} // namespace facebook::react
0 commit comments