Exemple #1
0
        public bool Enter(
            FilterOperationField field,
            ObjectFieldNode node,
            IQueryableFilterVisitorContext context,
            out ISyntaxVisitorAction action)
        {
            if (field.Operation.Kind == FilterOperationKind.ArraySome ||
                field.Operation.Kind == FilterOperationKind.ArrayNone ||
                field.Operation.Kind == FilterOperationKind.ArrayAll)
            {
                MemberExpression nestedProperty = Expression.Property(
                    context.GetInstance(),
                    field.Operation.Property);

                context.PushInstance(nestedProperty);

                Type closureType = GetTypeFor(field.Operation);

                context.AddClosure(closureType);
                action = SyntaxVisitor.Continue;
                return(true);
            }
            action = SyntaxVisitor.Skip;
            return(false);
        }
Exemple #2
0
 public SyntaxVisitor(
     ISyntaxVisitorAction defaultResult,
     SyntaxVisitorOptions options = default)
 {
     DefaultAction = defaultResult;
     _options      = options;
 }
 protected override IDocumentValidatorContext OnAfterEnter(
     ISyntaxNode node,
     ISyntaxNode?parent,
     IDocumentValidatorContext context,
     ISyntaxVisitorAction action)
 {
     if (action.IsContinue())
     {
         context.Path.Push(node);
     }
     return(context);
 }
Exemple #4
0
        public bool FilterFieldEnter(
            FilterOperationField field,
            ObjectFieldNode node,
            IQueryableFilterVisitorContext context,
            out ISyntaxVisitorAction action)
        {
            if (fieldEnterHandler == null)
            {
                throw new InvalidOperationException();
            }

            fieldEnterCallCounter++;
            return(fieldEnterHandler(field, node, context, out action));
        }
Exemple #5
0
        protected override ISyntaxVisitorAction Leave(
            ObjectFieldNode node,
            TContext context)
        {
            ISyntaxVisitorAction result = Continue;

            if (context.Fields.Peek() is ISortField field)
            {
                result = OnFieldLeave(context, field, node);
            }

            base.Leave(node, context);

            return(result);
        }
Exemple #6
0
 public bool Enter(
     FilterOperationField field,
     ObjectFieldNode node,
     IQueryableFilterVisitorContext context,
     out ISyntaxVisitorAction action)
 {
     if (field.Operation.Kind == FilterOperationKind.Object)
     {
         MemberExpression nestedProperty = Expression.Property(
             context.GetInstance(),
             field.Operation.Property);
         context.PushInstance(nestedProperty);
         action = SyntaxVisitor.Continue;
         return(true);
     }
     action = SyntaxVisitor.SkipAndLeave;
     return(false);
 }
Exemple #7
0
 protected SyntaxWalker(ISyntaxVisitorAction defaultResult)
     : base(defaultResult)
 {
 }
Exemple #8
0
 public SyntaxVisitor(
     ISyntaxVisitorAction defaultResult,
     SyntaxVisitorOptions options = default)
     : base(defaultResult, options)
 {
 }
 public static bool IsContinue(this ISyntaxVisitorAction action)
 {
     return(action.Kind == SyntaxVisitorActionKind.Continue);
 }
 public static bool IsBreak(this ISyntaxVisitorAction action)
 {
     return(action.Kind == SyntaxVisitorActionKind.Break);
 }
 public static bool IsSkip(this ISyntaxVisitorAction action)
 {
     return(action.Kind == SyntaxVisitorActionKind.Skip);
 }
Exemple #12
0
        public ISyntaxVisitorAction Visit(
            ISyntaxNode node,
            ISyntaxVisitorContext context)
        {
            var levels = new List <List <ISyntaxNode> >();
            List <ISyntaxNode>    ancestors    = _listPool.Get();
            List <ISyntaxNode>    root         = _listPool.Get();
            ISyntaxVisitorContext localContext = context;
            int index = 0;

            root.Push(node);
            levels.Push(root);

            ISyntaxNode?         parent = null;
            ISyntaxVisitorAction result = DefaultAction;

            while (levels.Count > 0)
            {
                bool        isLeaving = levels[index].Count == 0;
                ISyntaxNode?current;

                if (isLeaving)
                {
                    if (index == 0)
                    {
                        break;
                    }

                    _listPool.Return(levels.Pop());
                    current = ancestors.Pop();
                    ancestors.TryPeek(out parent);
                    result       = Leave(current, localContext);
                    localContext = OnAfterLeave(current, parent, ancestors, localContext);
                    index--;
                }
                else
                {
                    current      = levels[index].Pop();
                    localContext = OnBeforeEnter(current, parent, ancestors, localContext);
                    result       = Enter(current, localContext);

                    if (result is ContinueSyntaxVisitorAction)
                    {
                        List <ISyntaxNode> nextLevel = _listPool.Get();
                        nextLevel.AddRange(GetNodes(current, localContext));
                        levels.Push(nextLevel);
                    }
                    else if (result is SkipSyntaxVisitorAction)
                    {
                        levels.Push(_empty);
                    }

                    parent = current;
                    ancestors.Push(current);
                    index++;
                }

                if (result is BreakSyntaxVisitorAction)
                {
                    break;
                }
            }

            if (levels.Count > 0)
            {
                for (int i = 0; i < levels.Count; i++)
                {
                    _listPool.Return(levels[i]);
                }
            }

            _listPool.Return(ancestors);
            return(result);
        }
Exemple #13
0
 public SyntaxVisitor(ISyntaxVisitorAction defaultResult)
 {
     DefaultAction = defaultResult;
 }
 protected SyntaxWalker(
     ISyntaxVisitorAction defaultResult,
     SyntaxVisitorOptions options = default)
     : base(defaultResult, options)
 {
 }
 public SyntaxVisitor(ISyntaxVisitorAction defaultResult)
     : base(defaultResult)
 {
 }