Exemplo n.º 1
0
        public static bool FindMember(this System.Type type, string name, BindingFlags flags, out IBinder binder)
        {
            if (type is null)
            {
                binder = null;
                return(false);
            }
            var properties = type.GetProperties(flags);

            for (int i = 0; i < properties.Length; i++)
            {
                var p    = properties[i];
                var data = (System.Attribute[])p.GetCustomAttributes(typeof(RegisterAttribute), false);
                if (data.Length > 0 && data[0].Match(name))
                {
                    binder = new PropertyBinder(p);
                    return(true);
                }
            }

            var fields = type.GetFields(flags);

            for (int i = 0; i < fields.Length; i++)
            {
                var f    = fields[i];
                var data = (System.Attribute[])f.GetCustomAttributes(typeof(RegisterAttribute), false);
                if (data.Length > 0 && data[0].Match(name))
                {
                    binder = new FieldBinder(f);
                    return(true);
                }
            }
            return(FindMember(type.BaseType, name, flags, out binder));
        }
Exemplo n.º 2
0
 internal BindContext(FieldBinder field, MethodBinder method, LocalBinder local, ArgBinder arg)
 {
     this.field  = field;
     this.method = method;
     this.local  = local;
     this.arg    = arg;
 }
Exemplo n.º 3
0
 public FieldData(object relation, int index, TParent parent, TValue value, Delegate binder)
 {
     this.Relation = relation;
     this.Index    = index;
     this.Parent   = parent;
     this.Value    = value;
     this.Binder   = (FieldBinder <TParent, TValue>)binder;
 }
        private Expression Translate(Expression expression)
        {
            var rootQueryable = new RootQueryableFinder().Find(expression);
            var elementType   = ((IQueryable)((ConstantExpression)rootQueryable).Value).ElementType;

            expression = PartialEvaluator.Evaluate(expression, CanBeEvaluatedLocally);

            expression = new FieldBinder().Bind(expression, elementType);
            expression = new QueryBinder(this, expression).Bind(expression);
            expression = new AggregateRewriter().Rewrite(expression);
            expression = new RedundantFieldRemover().Remove(expression);
            expression = new RedundantSubqueryRemover().Remove(expression);

            expression = new OrderByRewriter().Rewrite(expression);
            expression = new RedundantFieldRemover().Remove(expression);
            expression = new RedundantSubqueryRemover().Remove(expression);

            return(expression);
        }
Exemplo n.º 5
0
 public FieldIdTests()
 {
     this.binder = new FieldBinder(this.binderProvider);
 }
Exemplo n.º 6
0
 public RequirednessTests()
 {
     this.binder = new FieldBinder(this.binderProvider);
 }
Exemplo n.º 7
0
 public FieldIdTests()
 {
     this.binder = new FieldBinder(this.containerBinder, this.binderProvider);
 }
Exemplo n.º 8
0
                internal ILData(ILInstructionsAttribute atrib, FieldBinder fields, MethodBinder methods, LocalBinder locals, ArgBinder args, Pass pass)
                {
                    //int ct = 0;
                    this.canEmit             = false;
                    this.localDatas          = new();
                    this.instructionEmitters = new();
                    foreach (var v in locals.arr)
                    {
                        this.localDatas.Add(v);
                    }
                    var stream      = new InstrStream(atrib);
                    var bindContext = new BindContext(fields, methods, locals, args);

                    var labelManager = this.lblMgr = new LabelManager();

                    labelManager.logger = pass.logger;
                    var currentLabels = new List <String>();

                    while (!stream.IsFinished())
                    {
                        while (stream.Read(out LabelToken tok))
                        {
                            stream.Advance(1);
                            currentLabels.Add(tok.name);
                        }

                        if (stream.Read(out Op op))
                        {
                            stream.Advance(1);
                            var emitter = pass.OpToEmitter(op, stream, labelManager.AddCallback, bindContext);
                            if (emitter is null)
                            {
                                //pass.logger.Error("No emitter produced");
                                return;
                            }
                            //pass.logger.Message($"Successfully got emitter");
                            var ctx = new EmitterContext(emitter);
                            //pass.logger.Message($"Successfully got emitcontext");
                            this.instructionEmitters.Add(ctx);
                            //pass.logger.Message($"Successfully added emitcontext, handling labels");
                            foreach (var l in currentLabels)
                            {
                                //pass.logger.Message($"Applying label {l}");
                                if (!labelManager.LabelCreated(l, ctx))
                                {
                                    pass.logger.Error("Duplicate label");
                                    return;
                                }
                            }
                            currentLabels.Clear();
                        }
                        else
                        {
                            pass.logger.Error("Expected Op or Label");
                            return;
                        }
                    }
                    //pass.logger.Message($"{ct++}");
                    pass.logger.Message($"Building emit data successful");
                    this.canEmit = true;
                }
Exemplo n.º 9
0
 public IdentifierTests()
 {
     this.binder = new FieldBinder(this.containerBinder, this.binderProvider);
 }