public virtual LessNode VisitMixinDefinition(LessParser.MixinDefinitionContext context)
 {
     throw new System.NotImplementedException();
 }
        public override LessNode VisitMixinDefinition(LessParser.MixinDefinitionContext context)
        {
            MixinParameterBase GetParameter(LessParser.MixinDefinitionParamContext param)
            {
                var ellipsis = param.Ellipsis();
                var variable = param.variableName();

                if (variable != null)
                {
                    var paramName = variable.GetText().TrimStart('@');

                    if (ellipsis != null)
                    {
                        return(new NamedVarargsParameter(paramName));
                    }

                    return(new MixinParameter(paramName, null));
                }

                if (ellipsis != null)
                {
                    return(VarargsParameter.Instance);
                }

                var variableDeclaration = param.variableDeclaration();

                if (variableDeclaration != null)
                {
                    var decl = (VariableDeclaration)variableDeclaration.Accept(this);

                    return(new MixinParameter(decl.Name, decl.Value));
                }

                var str = param.@string();

                if (str != null)
                {
                    return(new PatternMatchParameter((LessString)str.Accept(this)));
                }

                var number = param.Number();

                if (number != null)
                {
                    return(new PatternMatchParameter(new Measurement(decimal.Parse(number.GetText()), "")));
                }

                return(new PatternMatchParameter((Identifier)param.identifier().Accept(this)));
            }

            IEnumerable <MixinParameterBase> GetParameters(LessParser.MixinDeclarationContext decl)
            {
                var parameters = decl.mixinDefinitionParam();

                if (parameters == null)
                {
                    yield break;
                }

                foreach (var param in parameters)
                {
                    yield return(GetParameter(param));
                }
            }

            var declaration = context.mixinDeclaration();
            var selector    = (Selector)declaration.selector().Accept(this);
            var ruleBlock   = (RuleBlock)context.block().Accept(this);

            var guard = (MixinGuard)context.mixinGuard()?.Accept(this);

            return(new MixinDefinition(selector, GetParameters(declaration), ruleBlock, guard));
        }