ExpandNestedSelectors class

Traverse all rulesets looking for nested ones. If a ruleset is in a declaration group (implies nested selector) then generate new ruleset(s) at level 0 of CSS using selector inheritance syntax (flattens the nesting).

How the AST works for a rule RuleSet and nested rules. First of all a CSS rule RuleSet consist of a selector and a declaration e.g.,

selector {
  declaration
}

AST structure of a RuleSet is:

RuleSet
   SelectorGroup
     List<Selector>
        List<SimpleSelectorSequence>
          Combinator      // +, >, ~, DESCENDENT, or NONE
          SimpleSelector  // class, id, element, namespace, attribute
    DeclarationGroup
      List                // Declaration or RuleSet

For the simple rule:

div + span { color: red; }

the AST RuleSet is:

RuleSet
   SelectorGroup
     List<Selector>
      [0]
        List<SimpleSelectorSequence>
          [0] Combinator = COMBINATOR_NONE
              ElementSelector (name = div)
          [1] Combinator = COMBINATOR_PLUS
              ElementSelector (name = span)
    DeclarationGroup
      List                // Declarations or RuleSets
        [0]
          Declaration (property = color, expression = red)

Usually a SelectorGroup contains 1 Selector. Consider the selectors:

div { color: red; }
a { color: red; }

are equivalent to

div, a { color : red; }

In the above the RuleSet would have a SelectorGroup with 2 selectors e.g.,

RuleSet
   SelectorGroup
     List<Selector>
      [0]
        List<SimpleSelectorSequence>
          [0] Combinator = COMBINATOR_NONE
              ElementSelector (name = div)
      [1]
        List<SimpleSelectorSequence>
          [0] Combinator = COMBINATOR_NONE
              ElementSelector (name = a)
    DeclarationGroup
      List                // Declarations or RuleSets
        [0]
          Declaration (property = color, expression = red)

For a nested rule e.g.,

div {
  color : blue;
  a { color : red; }
}

Would map to the follow CSS rules:

div { color: blue; }
div a { color: red; }

The AST for the former nested rule is:

RuleSet
   SelectorGroup
     List<Selector>
      [0]
        List<SimpleSelectorSequence>
          [0] Combinator = COMBINATOR_NONE
              ElementSelector (name = div)
    DeclarationGroup
      List                // Declarations or RuleSets
        [0]
          Declaration (property = color, expression = blue)
        [1]
          RuleSet
            SelectorGroup
              List<Selector>
                [0]
                  List<SimpleSelectorSequence>
                    [0] Combinator = COMBINATOR_NONE
                        ElementSelector (name = a)
            DeclarationGroup
              List                // Declarations or RuleSets
                [0]
                  Declaration (property = color, expression = red)

Nested rules is a terse mechanism to describe CSS inheritance. The analyzer will flatten and expand the nested rules to it's flatten structure. Using the all parent RuleSets (selector expressions) and applying each nested RuleSet to the list of Selectors in a SelectorGroup.

Then result is a style sheet where all nested rules have been flatten and expanded.

Inheritance

Constructors

ExpandNestedSelectors()

Properties

hashCode int
The hash code for this object.
no setterinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

flatten(StyleSheet styleSheet) → void
Replace the rule set that contains nested rules with the flatten rule sets.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() String
A string representation of this object.
inherited
visitAngleTerm(AngleTerm node) → dynamic
inherited
visitAttributeSelector(AttributeSelector node) → dynamic
inherited
visitBinaryExpression(BinaryExpression node) → dynamic
inherited
visitBorderExpression(BorderExpression node) → dynamic
inherited
visitBoxExpression(BoxExpression node) → dynamic
inherited
visitCalcTerm(CalcTerm node) → dynamic
inherited
visitCharsetDirective(CharsetDirective node) → dynamic
inherited
visitChTerm(ChTerm node) → dynamic
inherited
visitClassSelector(ClassSelector node) → dynamic
inherited
visitCommentDefinition(CommentDefinition node) → dynamic
inherited
visitContentDirective(ContentDirective node) → dynamic
inherited
visitCssComment(CssComment node) → dynamic
inherited
visitDartStyleExpression(DartStyleExpression node) → dynamic
inherited
visitDeclaration(Declaration node) → void
override
visitDeclarationGroup(DeclarationGroup node) → void
override
visitDirective(Directive node) → dynamic
inherited
visitDocumentDirective(DocumentDirective node) → dynamic
inherited
visitElementSelector(ElementSelector node) → dynamic
inherited
visitEmTerm(EmTerm node) → dynamic
inherited
visitExpressions(Expressions node) → dynamic
inherited
visitExtendDeclaration(ExtendDeclaration node) → void
override
visitExTerm(ExTerm node) → dynamic
inherited
visitFontExpression(FontExpression node) → dynamic
inherited
visitFontFaceDirective(FontFaceDirective node) → dynamic
inherited
visitFractionTerm(FractionTerm node) → dynamic
inherited
visitFreqTerm(FreqTerm node) → dynamic
inherited
visitFunctionTerm(FunctionTerm node) → dynamic
inherited
visitGroupTerm(GroupTerm node) → dynamic
inherited
visitHeightExpression(HeightExpression node) → dynamic
inherited
visitHexColorTerm(HexColorTerm node) → dynamic
inherited
visitHostDirective(HostDirective node) → dynamic
inherited
visitIdentifier(Identifier node) → dynamic
inherited
visitIdSelector(IdSelector node) → dynamic
inherited
visitIE8Term(IE8Term node) → dynamic
inherited
visitImportDirective(ImportDirective node) → dynamic
inherited
visitIncludeDirective(IncludeDirective node) → dynamic
inherited
visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) → dynamic
inherited
visitItemTerm(ItemTerm node) → dynamic
inherited
visitKeyFrameBlock(KeyFrameBlock node) → dynamic
inherited
visitKeyFrameDirective(KeyFrameDirective node) → dynamic
inherited
visitLengthTerm(LengthTerm node) → dynamic
inherited
visitLineHeightTerm(LineHeightTerm node) → dynamic
inherited
visitLiteralTerm(LiteralTerm node) → dynamic
inherited
visitMarginExpression(MarginExpression node) → dynamic
inherited
visitMarginGroup(MarginGroup node) → void
override
visitMediaDirective(MediaDirective node) → dynamic
inherited
visitMediaExpression(MediaExpression node) → dynamic
inherited
visitMediaQuery(MediaQuery node) → dynamic
inherited
visitMixinDeclarationDirective(MixinDeclarationDirective node) → dynamic
inherited
visitMixinDefinition(MixinDefinition node) → dynamic
inherited
visitMixinRulesetDirective(MixinRulesetDirective node) → dynamic
inherited
visitNamespaceDirective(NamespaceDirective node) → dynamic
inherited
visitNamespaceSelector(NamespaceSelector node) → dynamic
inherited
visitNegation(Negation node) → dynamic
inherited
visitNegationSelector(NegationSelector node) → dynamic
inherited
visitNoOp(NoOp node) → dynamic
inherited
visitNumberTerm(NumberTerm node) → dynamic
inherited
visitOperatorComma(OperatorComma node) → dynamic
inherited
visitOperatorMinus(OperatorMinus node) → dynamic
inherited
visitOperatorPlus(OperatorPlus node) → dynamic
inherited
visitOperatorSlash(OperatorSlash node) → dynamic
inherited
visitPaddingExpression(PaddingExpression node) → dynamic
inherited
visitPageDirective(PageDirective node) → dynamic
inherited
visitPercentageTerm(PercentageTerm node) → dynamic
inherited
visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) → dynamic
inherited
visitPseudoClassSelector(PseudoClassSelector node) → dynamic
inherited
visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) → dynamic
inherited
visitPseudoElementSelector(PseudoElementSelector node) → dynamic
inherited
visitRemTerm(RemTerm node) → dynamic
inherited
visitResolutionTerm(ResolutionTerm node) → dynamic
inherited
visitRuleSet(RuleSet node) → void
override
visitSelector(Selector node) → dynamic
inherited
visitSelectorExpression(SelectorExpression node) → dynamic
inherited
visitSelectorGroup(SelectorGroup node) → dynamic
inherited
visitSimpleSelector(SimpleSelector node) → dynamic
inherited
visitSimpleSelectorSequence(SimpleSelectorSequence node) → dynamic
inherited
visitStyleSheet(StyleSheet ss) → dynamic
inherited
visitStyletDirective(StyletDirective node) → dynamic
inherited
visitSupportsConditionInParens(SupportsConditionInParens node) → dynamic
inherited
visitSupportsConjunction(SupportsConjunction node) → dynamic
inherited
visitSupportsDirective(SupportsDirective node) → dynamic
inherited
visitSupportsDisjunction(SupportsDisjunction node) → dynamic
inherited
visitSupportsNegation(SupportsNegation node) → dynamic
inherited
visitThisOperator(ThisOperator node) → dynamic
inherited
visitTimeTerm(TimeTerm node) → dynamic
inherited
visitTopLevelProduction(TopLevelProduction node) → dynamic
inherited
visitTree(StyleSheet tree) → dynamic
inherited
visitUnaryExpression(UnaryExpression node) → dynamic
inherited
visitUnicodeRangeTerm(UnicodeRangeTerm node) → dynamic
inherited
visitUnitTerm(UnitTerm node) → dynamic
inherited
visitUriTerm(UriTerm node) → dynamic
inherited
visitVarDefinition(VarDefinition node) → void
override
visitVarDefinitionDirective(VarDefinitionDirective node) → dynamic
inherited
visitVarUsage(VarUsage node) → dynamic
inherited
visitViewportDirective(ViewportDirective node) → dynamic
inherited
visitViewportTerm(ViewportTerm node) → dynamic
inherited
visitWidthExpression(WidthExpression node) → dynamic
inherited
visitWildcard(Wildcard node) → dynamic
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited