Exemplo n.º 1
0
        protected override IEnumerable <LessNode> EvaluateCore(EvaluationContext context)
        {
            if (Guard?.SatisfiedBy(context) == false)
            {
                yield break;
            }

            var evaluatedSelectors = Selectors.Inherit(context.CurrentScope.Selectors).EvaluateSingle <SelectorList>(context);

            evaluatedSelectors.AddExtenders(context);

            using (context.EnterScope(evaluatedSelectors)) {
                (var rules, var others) = Block.Evaluate(context).Split <Rule, Statement>();

                if (rules.Count > 0)
                {
                    var ruleLookup = new HashSet <Rule>();

                    for (var i = rules.Count - 1; i >= 0; i--)
                    {
                        var r = rules[i];
                        if (ruleLookup.Contains(r))
                        {
                            rules.RemoveAt(i);
                        }
                        else
                        {
                            ruleLookup.Add(r);
                        }
                    }

                    var evaluatedBlock = new RuleBlock(rules);

                    var evaluatedRuleset =
                        new Ruleset(evaluatedSelectors, evaluatedBlock);

                    yield return(evaluatedRuleset);
                }

                foreach (var statement in others)
                {
                    if (statement is Ruleset rs)
                    {
                        context.CurrentScope.Parent.DeclareRuleset(rs);

                        yield return(rs);
                    }
                    else if (statement is MediaBlock media)
                    {
                        yield return(media.Bubble(context));
                    }
                    else if (statement is Stylesheet || statement is ImportStatement)
                    {
                        yield return(statement);
                    }
                    else
                    {
                        throw new EvaluationException($"Unexpected statement type after evaluating rule block: {statement.GetType()}");
                    }
                }
            }
        }