@@ -464,6 +464,92 @@ static void dump_qualified_name(StringBuilder& builder, CSS::Selector::SimpleSel
464
464
builder.appendff (" NamespaceType={}, Namespace='{}', Name='{}'" , namespace_type, qualified_name.namespace_ , qualified_name.name .name );
465
465
}
466
466
467
+ static void dump_simple_selector_pseudo_class (StringBuilder& builder, CSS::Selector::SimpleSelector::PseudoClassSelector const & pseudo_class, int indent_levels){
468
+ builder.appendff (" pseudo_class={}" , CSS::pseudo_class_name (pseudo_class.type ));
469
+ auto pseudo_class_metadata = CSS::pseudo_class_metadata (pseudo_class.type );
470
+
471
+ switch (pseudo_class_metadata.parameter_type ) {
472
+ case CSS::PseudoClassMetadata::ParameterType::None:
473
+ break ;
474
+ case CSS::PseudoClassMetadata::ParameterType::ANPlusB:
475
+ case CSS::PseudoClassMetadata::ParameterType::ANPlusBOf: {
476
+ builder.appendff (" (step={}, offset={}" , pseudo_class.nth_child_pattern .step_size , pseudo_class.nth_child_pattern .offset );
477
+ if (!pseudo_class.argument_selector_list .is_empty ()) {
478
+ builder.append (" , selectors=[\n " sv);
479
+ for (auto const & child_selector : pseudo_class.argument_selector_list )
480
+ dump_selector (builder, child_selector, indent_levels + 2 );
481
+ indent (builder, indent_levels + 1 );
482
+ builder.append (" ]" sv);
483
+ }
484
+ builder.append (" )" sv);
485
+ break ;
486
+ }
487
+ case CSS::PseudoClassMetadata::ParameterType::CompoundSelector:
488
+ case CSS::PseudoClassMetadata::ParameterType::ForgivingSelectorList:
489
+ case CSS::PseudoClassMetadata::ParameterType::ForgivingRelativeSelectorList:
490
+ case CSS::PseudoClassMetadata::ParameterType::RelativeSelectorList:
491
+ case CSS::PseudoClassMetadata::ParameterType::SelectorList: {
492
+ builder.append (" ([\n " sv);
493
+ for (auto & child_selector : pseudo_class.argument_selector_list )
494
+ dump_selector (builder, child_selector, indent_levels + 2 );
495
+ indent (builder, indent_levels + 1 );
496
+ builder.append (" ])" sv);
497
+ break ;
498
+ }
499
+ case CSS::PseudoClassMetadata::ParameterType::Ident:
500
+ builder.appendff (" (keyword={})" , string_from_keyword (pseudo_class.keyword .value ()));
501
+ break ;
502
+ case CSS::PseudoClassMetadata::ParameterType::LanguageRanges: {
503
+ builder.append (' (' );
504
+ builder.join (' ,' , pseudo_class.languages );
505
+ builder.append (' )' );
506
+ break ;
507
+ }
508
+ }
509
+ }
510
+
511
+ static void dump_simple_selector_attribute (StringBuilder& builder, CSS::Selector::SimpleSelector::Attribute const & attribute) {
512
+ char const * attribute_match_type_description = " " ;
513
+
514
+ switch (attribute.match_type ) {
515
+ case CSS::Selector::SimpleSelector::Attribute::MatchType::HasAttribute:
516
+ attribute_match_type_description = " HasAttribute" ;
517
+ break ;
518
+ case CSS::Selector::SimpleSelector::Attribute::MatchType::ExactValueMatch:
519
+ attribute_match_type_description = " ExactValueMatch" ;
520
+ break ;
521
+ case CSS::Selector::SimpleSelector::Attribute::MatchType::ContainsWord:
522
+ attribute_match_type_description = " ContainsWord" ;
523
+ break ;
524
+ case CSS::Selector::SimpleSelector::Attribute::MatchType::ContainsString:
525
+ attribute_match_type_description = " ContainsString" ;
526
+ break ;
527
+ case CSS::Selector::SimpleSelector::Attribute::MatchType::StartsWithSegment:
528
+ attribute_match_type_description = " StartsWithSegment" ;
529
+ break ;
530
+ case CSS::Selector::SimpleSelector::Attribute::MatchType::StartsWithString:
531
+ attribute_match_type_description = " StartsWithString" ;
532
+ break ;
533
+ case CSS::Selector::SimpleSelector::Attribute::MatchType::EndsWithString:
534
+ attribute_match_type_description = " EndsWithString" ;
535
+ break ;
536
+ }
537
+
538
+ builder.appendff (" [{}, " , attribute_match_type_description);
539
+ dump_qualified_name (builder, attribute.qualified_name );
540
+ builder.appendff (" , value='{}']" , attribute.value );
541
+ }
542
+
543
+
544
+ static void dump_name_or_qualified_name (StringBuilder& builder, CSS::Selector::SimpleSelector simple_selector) {
545
+
546
+ if (simple_selector.value .has <CSS::Selector::SimpleSelector::Name>()) {
547
+ builder.append (simple_selector.name ());
548
+ } else if (simple_selector.value .has <CSS::Selector::SimpleSelector::QualifiedName>()) {
549
+ dump_qualified_name (builder, simple_selector.qualified_name ());
550
+ }
551
+ }
552
+
467
553
void dump_selector (StringBuilder& builder, CSS::Selector const & selector, int indent_levels)
468
554
{
469
555
indent (builder, indent_levels);
@@ -532,102 +618,37 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector, int in
532
618
533
619
builder.appendff (" {}:" , type_description);
534
620
535
- // FIXME: This is goofy
536
- if (simple_selector.value .has <CSS::Selector::SimpleSelector::Name>()) {
537
- builder.append (simple_selector.name ());
538
- } else if (simple_selector.value .has <CSS::Selector::SimpleSelector::QualifiedName>()) {
539
- dump_qualified_name (builder, simple_selector.qualified_name ());
540
- }
621
+
622
+ dump_name_or_qualified_name (builder, simple_selector);
541
623
542
- if (simple_selector.type == CSS::Selector::SimpleSelector::Type::PseudoClass) {
543
- auto const & pseudo_class = simple_selector.pseudo_class ();
544
-
545
- builder.appendff (" pseudo_class={}" , CSS::pseudo_class_name (pseudo_class.type ));
546
- auto pseudo_class_metadata = CSS::pseudo_class_metadata (pseudo_class.type );
547
-
548
- switch (pseudo_class_metadata.parameter_type ) {
549
- case CSS::PseudoClassMetadata::ParameterType::None:
550
- break ;
551
- case CSS::PseudoClassMetadata::ParameterType::ANPlusB:
552
- case CSS::PseudoClassMetadata::ParameterType::ANPlusBOf: {
553
- builder.appendff (" (step={}, offset={}" , pseudo_class.nth_child_pattern .step_size , pseudo_class.nth_child_pattern .offset );
554
- if (!pseudo_class.argument_selector_list .is_empty ()) {
555
- builder.append (" , selectors=[\n " sv);
556
- for (auto const & child_selector : pseudo_class.argument_selector_list )
557
- dump_selector (builder, child_selector, indent_levels + 2 );
558
- indent (builder, indent_levels + 1 );
559
- builder.append (" ]" sv);
560
- }
561
- builder.append (" )" sv);
562
- break ;
624
+ switch (simple_selector.type ){
625
+ case CSS::Selector::SimpleSelector::Type::PseudoClass:
626
+ {
627
+ auto const & pseudo_class = simple_selector.pseudo_class ();
628
+ dump_simple_selector_pseudo_class (builder, pseudo_class, indent_levels);
563
629
}
564
- case CSS::PseudoClassMetadata::ParameterType::CompoundSelector:
565
- case CSS::PseudoClassMetadata::ParameterType::ForgivingSelectorList:
566
- case CSS::PseudoClassMetadata::ParameterType::ForgivingRelativeSelectorList:
567
- case CSS::PseudoClassMetadata::ParameterType::RelativeSelectorList:
568
- case CSS::PseudoClassMetadata::ParameterType::SelectorList: {
569
- builder.append (" ([\n " sv);
570
- for (auto & child_selector : pseudo_class.argument_selector_list )
571
- dump_selector (builder, child_selector, indent_levels + 2 );
572
- indent (builder, indent_levels + 1 );
573
- builder.append (" ])" sv);
574
- break ;
575
- }
576
- case CSS::PseudoClassMetadata::ParameterType::Ident:
577
- builder.appendff (" (keyword={})" , string_from_keyword (pseudo_class.keyword .value ()));
578
- break ;
579
- case CSS::PseudoClassMetadata::ParameterType::LanguageRanges: {
580
- builder.append (' (' );
581
- builder.join (' ,' , pseudo_class.languages );
582
- builder.append (' )' );
583
- break ;
630
+ break ;
631
+ case CSS::Selector::SimpleSelector::Type::PseudoElement:
632
+ {
633
+ builder.appendff (" pseudo_element={}" , simple_selector.pseudo_element ().name ());
584
634
}
635
+ break ;
636
+ case CSS::Selector::SimpleSelector::Type::Attribute:
637
+ {
638
+ auto const & attribute = simple_selector.attribute ();
639
+ dump_simple_selector_attribute (builder, attribute);
585
640
}
586
- }
587
-
588
- if (simple_selector.type == CSS::Selector::SimpleSelector::Type::PseudoElement) {
589
- builder.appendff (" pseudo_element={}" , simple_selector.pseudo_element ().name ());
590
- }
591
-
592
- if (simple_selector.type == CSS::Selector::SimpleSelector::Type::Attribute) {
593
- auto const & attribute = simple_selector.attribute ();
594
- char const * attribute_match_type_description = " " ;
595
-
596
- switch (attribute.match_type ) {
597
- case CSS::Selector::SimpleSelector::Attribute::MatchType::HasAttribute:
598
- attribute_match_type_description = " HasAttribute" ;
599
- break ;
600
- case CSS::Selector::SimpleSelector::Attribute::MatchType::ExactValueMatch:
601
- attribute_match_type_description = " ExactValueMatch" ;
602
- break ;
603
- case CSS::Selector::SimpleSelector::Attribute::MatchType::ContainsWord:
604
- attribute_match_type_description = " ContainsWord" ;
605
- break ;
606
- case CSS::Selector::SimpleSelector::Attribute::MatchType::ContainsString:
607
- attribute_match_type_description = " ContainsString" ;
608
- break ;
609
- case CSS::Selector::SimpleSelector::Attribute::MatchType::StartsWithSegment:
610
- attribute_match_type_description = " StartsWithSegment" ;
611
- break ;
612
- case CSS::Selector::SimpleSelector::Attribute::MatchType::StartsWithString:
613
- attribute_match_type_description = " StartsWithString" ;
614
- break ;
615
- case CSS::Selector::SimpleSelector::Attribute::MatchType::EndsWithString:
616
- attribute_match_type_description = " EndsWithString" ;
617
- break ;
641
+ break ;
642
+ case CSS::Selector::SimpleSelector::Type::Invalid:
643
+ {
644
+ auto invalid = simple_selector.value .get <CSS::Selector::SimpleSelector::Invalid>();
645
+ builder.append (" '" sv);
646
+ for (auto const & component_value : invalid.component_values )
647
+ builder.append (component_value.to_string ());
648
+ builder.append (" '" sv);
618
649
}
619
-
620
- builder.appendff (" [{}, " , attribute_match_type_description);
621
- dump_qualified_name (builder, attribute.qualified_name );
622
- builder.appendff (" , value='{}']" , attribute.value );
623
- }
624
-
625
- if (simple_selector.type == CSS::Selector::SimpleSelector::Type::Invalid) {
626
- auto invalid = simple_selector.value .get <CSS::Selector::SimpleSelector::Invalid>();
627
- builder.append (" '" sv);
628
- for (auto const & component_value : invalid.component_values )
629
- builder.append (component_value.to_string ());
630
- builder.append (" '" sv);
650
+ break ;
651
+ default : break ;
631
652
}
632
653
633
654
if (i != relative_selector.simple_selectors .size () - 1 )
@@ -637,6 +658,8 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector, int in
637
658
}
638
659
}
639
660
661
+
662
+
640
663
void dump_rule (CSS::CSSRule const & rule)
641
664
{
642
665
StringBuilder builder;
0 commit comments