public MixinEvaluationResult(MixinDefinition mixin, MixinCall call, Scope closure, MixinGuardScope guardScope) { this.mixin = mixin; this.call = call; this.closure = closure; this.guardScope = guardScope; }
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)); }
public bool Matches(MixinDefinition mixinDefinition) { return(mixinDefinition.Arity == 0 || mixinDefinition.Parameters.All(p => p.HasDefaultValue || p is VarargsParameter)); }