Recursively check if ` ` precedes ` ` in any defs.
(def: &Def)
| 544 | |
| 545 | /// Recursively check if `<number>` precedes `<length>` in any defs. |
| 546 | fn number_precedes_length(def: &Def) -> bool { |
| 547 | match def { |
| 548 | Def::Combinator(children, DefCombinatorStyle::Alternatives) => { |
| 549 | let mut number_pos = None; |
| 550 | let mut length_pos = None; |
| 551 | |
| 552 | for (i, child) in children.iter().enumerate() { |
| 553 | match child { |
| 554 | Def::Type(def_type) => { |
| 555 | let ident = def_type.ident_str(); |
| 556 | if (ident == "Number" || ident == "Integer") && number_pos.is_none() { |
| 557 | number_pos = Some(i); |
| 558 | } else if (ident == "Length" || ident == "LengthPercentage" || ident == "LengthPercentageAuto") |
| 559 | && length_pos.is_none() |
| 560 | { |
| 561 | length_pos = Some(i); |
| 562 | } |
| 563 | } |
| 564 | // Recursively check nested definitions |
| 565 | _ => { |
| 566 | if number_precedes_length(child) { |
| 567 | return true; |
| 568 | } |
| 569 | } |
| 570 | } |
| 571 | } |
| 572 | |
| 573 | // If we found both and number comes first, flag it |
| 574 | if let (Some(num_pos), Some(len_pos)) = (number_pos, length_pos) |
| 575 | && num_pos < len_pos |
| 576 | { |
| 577 | return true; |
| 578 | } |
| 579 | |
| 580 | false |
| 581 | } |
| 582 | Def::Combinator(children, _) => children.iter().any(number_precedes_length), |
| 583 | Def::Group(inner, _) => number_precedes_length(inner), |
| 584 | Def::Optional(inner) => number_precedes_length(inner), |
| 585 | Def::Multiplier(inner, _, _) => number_precedes_length(inner), |
| 586 | Def::Function(_, inner) => number_precedes_length(inner), |
| 587 | Def::AutoOr(inner) | Def::NoneOr(inner) | Def::AutoNoneOr(inner) => number_precedes_length(inner), |
| 588 | // Leaf nodes don't contain the pattern |
| 589 | _ => false, |
| 590 | } |
| 591 | } |
| 592 | |
| 593 | /// Determine which portion(s) of the box model a property affects based on its name |
| 594 | fn determine_box_portion(property_name: &str) -> Option<TokenStream> { |
no test coverage detected