Пример #1
0
 public MixinEvaluationResult(MixinDefinition mixin, MixinCall call, Scope closure, MixinGuardScope guardScope)
 {
     this.mixin      = mixin;
     this.call       = call;
     this.closure    = closure;
     this.guardScope = guardScope;
 }
Пример #2
0
        public bool Matches(MixinDefinition mixinDefinition, EvaluationContext context)
        {
            if (!mixinDefinition.Selector.Equals(Selector))
            {
                // Selectors don't match
                return(false);
            }

            bool hasVarargs = mixinDefinition.Parameters.LastOrDefault() is VarargsParameter;

            if (mixinDefinition.Parameters.Count < arguments.Count && !hasVarargs)
            {
                // No match: too many arguments
                return(false);
            }

            var positionalArguments = arguments.OfType <PositionalArgument>().ToList();

            if (!PatternMatch(context, positionalArguments, mixinDefinition.Parameters))
            {
                return(false);
            }

            var namedArguments = arguments.OfType <NamedArgument>().ToList();

            var remainingParameters = mixinDefinition.Parameters.Skip(positionalArguments.Count).OfType <MixinParameter>().ToList();

            var matchedParams = remainingParameters
                                .Where(p => namedArguments.Any(arg => string.Equals(p.Name, arg.ParameterName, StringComparison.OrdinalIgnoreCase)))
                                .ToList();

            if (matchedParams.Count != namedArguments.Count)
            {
                // No match: one or more named arguments had a name that doesn't match a parameter
                return(false);
            }

            // True if any remaining parameters have a default value
            return(remainingParameters.Except(matchedParams).All(p => p.HasDefaultValue));
        }
Пример #3
0
 public bool Matches(MixinDefinition mixinDefinition)
 {
     return(mixinDefinition.Arity == 0 ||
            mixinDefinition.Parameters.All(p => p.HasDefaultValue || p is VarargsParameter));
 }