// { $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));
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); }