// { $getField : { field : "y", input : "$x" } } => "$x.y"
            static bool TrySimplifyAsFieldPath(AstGetFieldExpression node, out AstExpression simplified)
            {
                if (node.CanBeConvertedToFieldPath())
                {
                    var path = node.ConvertToFieldPath();
                    simplified = AstExpression.FieldPath(path);
                    return(true);
                }

                simplified = null;
                return(false);
            }
        public override AstNode VisitGetFieldExpression(AstGetFieldExpression node)
        {
            if (TrySimplifyAsFieldPath(node, out var simplified))
            {
                return(simplified);
            }

            if (TrySimplifyAsLet(node, out simplified))
            {
                return(simplified);
            }

            return(base.VisitGetFieldExpression(node));
Beispiel #3
0
            public override AstNode VisitGetFieldExpression(AstGetFieldExpression node)
            {
                if (node.FieldName is AstConstantExpression constantFieldName &&
                    constantFieldName.Value.IsString &&
                    constantFieldName.Value.AsString == "_elements" &&
                    node.Input is AstVarExpression varExpression &&
                    varExpression.Name == "ROOT")
                {
                    throw new UnableToRemoveReferenceToElementsException();
                }

                return(base.VisitGetFieldExpression(node));
            }
            // { $getField : { field : "x", input : <input> } } => { $let : { vars : { this : <input> }, in : "$$this.x" } }
            bool TrySimplifyAsLet(AstGetFieldExpression node, out AstExpression simplified)
            {
                if (node.HasSafeFieldName(out var fieldName))
                {
                    var simplifiedInput = VisitAndConvert(node.Input);
                    var var             = AstExpression.Var("this");
                    var binding         = AstExpression.VarBinding(var, simplifiedInput);
                    simplified = AstExpression.Let(binding, AstExpression.FieldPath($"$$this.{fieldName}"));
                    return(true);
                }

                simplified = null;
                return(false);
            }