示例#1
0
 static void AddRangeFilter <T>(List <string> lines, RangeSyntax <T> range, string name)
     where T : IComparable <T>
 {
     if (range is not null)
     {
         lines.Add($"{name} {range}");
     }
 }
示例#2
0
            public void Visit(RangeSyntax syntax)
            {
                int           min     = (int)((LiteralSyntax)syntax.Children[0]).Token.Character;
                int           max     = (int)((LiteralSyntax)syntax.Children[1]).Token.Character;
                int           index   = GetRandomNumber(min, max + 1);
                LiteralSyntax literal = new LiteralSyntax(new LiteralToken((char)index));

                literal.Accept(this);
            }
示例#3
0
 public void Visit(RangeSyntax syntax)
 {
     throw new NotImplementedException();
 }
示例#4
0
 private static void ApplyInteractions(IssueFilter filter, BoundKevValueQuery query, RangeSyntax <int> range)
 {
     filter.Interactions = range.Negate(query.IsNegated);
 }
示例#5
0
 private static void ApplyComments(IssueFilter filter, BoundKevValueQuery query, RangeSyntax <int> range)
 {
     filter.Comments = range.Negate(query.IsNegated);
 }
示例#6
0
 private static void ApplyClosed(IssueFilter filter, BoundKevValueQuery query, RangeSyntax <DateTimeOffset> range)
 {
     filter.Closed = range.Negate(query.IsNegated);
 }
示例#7
0
        private static Dictionary <(string Key, string Value), Func <IssueFilter, BoundKevValueQuery, bool> > CreateKeyValueHandlers()
        {
            var result  = new Dictionary <(string Key, string Value), Func <IssueFilter, BoundKevValueQuery, bool> >();
            var methods = typeof(IssueQuery).GetMethods(BindingFlags.Static | BindingFlags.NonPublic);

            foreach (var method in methods)
            {
                var attribute = method.GetCustomAttributesData()
                                .SingleOrDefault(ca => ca.AttributeType == typeof(KeyValueHandlerAttribute));
                if (attribute is null)
                {
                    continue;
                }

                if (attribute.ConstructorArguments.Count != 1)
                {
                    throw new Exception($"Wrong number of arguments for [{nameof(KeyValueHandlerAttribute)}] on {method}");
                }

                if (attribute.ConstructorArguments[0].ArgumentType != typeof(string[]))
                {
                    throw new Exception($"Wrong type of arguments for [{nameof(KeyValueHandlerAttribute)}] on {method}");
                }

                var args = (ICollection <CustomAttributeTypedArgument>)attribute.ConstructorArguments[0].Value;

                if (args.Count == 0)
                {
                    throw new Exception($"Wrong number of arguments for [{nameof(KeyValueHandlerAttribute)}] on {method}");
                }

                var strings    = args.Select(a => (string)a.Value);
                var pairs      = GetKeyValues(strings).ToArray();
                var parameters = method.GetParameters();

                Func <IssueFilter, BoundKevValueQuery, bool> handler;

                if (parameters.Length == 1 && parameters[0].ParameterType == typeof(IssueFilter))
                {
                    handler = (filter, query) =>
                    {
                        method.Invoke(null, new object[] { filter });
                        return(true);
                    };
                }
                else if (parameters.Length == 2 && parameters[0].ParameterType == typeof(IssueFilter) &&
                         parameters[1].ParameterType == typeof(BoundKevValueQuery))
                {
                    handler = (filter, query) =>
                    {
                        method.Invoke(null, new object[] { filter, query });
                        return(true);
                    };
                }
                else if (parameters.Length == 3 && parameters[0].ParameterType == typeof(IssueFilter) &&
                         parameters[1].ParameterType == typeof(BoundKevValueQuery) &&
                         parameters[2].ParameterType == typeof(RangeSyntax <DateTimeOffset>))
                {
                    handler = (filter, query) =>
                    {
                        if (RangeSyntax.ParseDateTimeOffset(query.Value) is RangeSyntax <DateTimeOffset> r)
                        {
                            method.Invoke(null, new object[] { filter, query, r });
                            return(true);
                        }

                        return(false);
                    };
                }
                else if (parameters.Length == 3 && parameters[0].ParameterType == typeof(IssueFilter) &&
                         parameters[1].ParameterType == typeof(BoundKevValueQuery) &&
                         parameters[2].ParameterType == typeof(RangeSyntax <int>))
                {
                    handler = (filter, query) =>
                    {
                        if (RangeSyntax.ParseInt32(query.Value) is RangeSyntax <int> r)
                        {
                            method.Invoke(null, new object[] { filter, query, r });
                            return(true);
                        }

                        return(false);
                    };
                }
                else
                {
                    throw new Exception($"Unexpected signature for {method}");
                }

                foreach (var kv in pairs)
                {
                    result.Add(kv, handler);
                }
            }

            return(result);
        }