public Expression CreateReferenceExpression(ResolveContext rc, Location loc) { Expression expr = null; // // We know the variable name is somewhere in the scope. This generates // an access expression from current block // var pb = rc.CurrentBlock.ParametersBlock; while (true) { if (pb is QueryBlock) { for (int i = pb.Parameters.Count - 1; i >= 0; --i) { var p = pb.Parameters[i]; if (p.Name == Name) { return(pb.GetParameterReference(i, loc)); } var tp = p as QueryBlock.TransparentParameter; while (tp != null) { if (expr == null) { expr = pb.GetParameterReference(i, loc); } else { expr = new TransparentMemberAccess(expr, tp.Name); } if (tp.Identifier == Name) { return(new TransparentMemberAccess(expr, Name)); } if (tp.Parent.Name == Name) { return(new TransparentMemberAccess(expr, Name)); } tp = tp.Parent as QueryBlock.TransparentParameter; } } expr = null; } if (pb == block) { return(null); } pb = pb.Parent.ParametersBlock; } }
public Expression CreateReferenceExpression (ResolveContext rc, Location loc) { Expression expr = null; // // We know the variable name is somewhere in the scope. This generates // an access expression from current block // var pb = rc.CurrentBlock.ParametersBlock; while (true) { if (pb is QueryBlock) { for (int i = pb.Parameters.Count - 1; i >= 0; --i) { var p = pb.Parameters[i]; if (p.Name == Name) return pb.GetParameterReference (i, loc); var tp = p as QueryBlock.TransparentParameter; while (tp != null) { if (expr == null) expr = pb.GetParameterReference (i, loc); else expr = new TransparentMemberAccess (expr, tp.Name); if (tp.Identifier == Name) return new TransparentMemberAccess (expr, Name); if (tp.Parent.Name == Name) return new TransparentMemberAccess (expr, Name); tp = tp.Parent as QueryBlock.TransparentParameter; } } expr = null; } if (pb == block) return null; pb = pb.Parent.ParametersBlock; } }
// // Query parameter reference can include transparent parameters // protected override Expression GetParameterReferenceExpression (string name, Location loc) { Expression expr = base.GetParameterReferenceExpression (name, loc); if (expr != null) return expr; TransparentParameter tp = parameters [0] as TransparentParameter; while (tp != null) { if (tp.Identifier == name) break; TransparentParameter tp_next = tp.Parent as TransparentParameter; if (tp_next == null && tp.Parent.Name == name) break; tp = tp_next; } if (tp != null) { expr = new SimpleName (parameters[0].Name, loc); TransparentParameter tp_cursor = (TransparentParameter) parameters[0]; while (tp_cursor != tp) { tp_cursor = (TransparentParameter) tp_cursor.Parent; expr = new TransparentMemberAccess (expr, tp_cursor.Name); } return new TransparentMemberAccess (expr, name); } return null; }