ParameterDeclaration CreateParameterForCurrentRangeVariable() { var param = new ParameterDeclaration(); if (currentTransparentType.Count == 1) { var clonedRangeVariable = (Identifier)currentTransparentType[0].Item1.Clone(); if (!rangeVariables.ContainsKey(currentTransparentType[0].Item1)) { rangeVariables[currentTransparentType[0].Item1] = param; } param.AddChild(clonedRangeVariable, Roles.Identifier); } else { param.AddChild(Identifier.Create(string.Format(CultureInfo.InvariantCulture, TransparentParameterNameTemplate, currentTransparentParameter++)), Roles.Identifier); } return(param); }
Expression VisitNested(Expression node, ParameterDeclaration transparentParameter) { var oldRangeVariableSubstitutions = activeRangeVariableSubstitutions; try { if (transparentParameter != null && currentTransparentType.Count > 1) { activeRangeVariableSubstitutions = new Dictionary <string, Expression>(activeRangeVariableSubstitutions); foreach (var t in currentTransparentType) { activeRangeVariableSubstitutions[t.Item1.Name] = MakeNestedMemberAccess(new IdentifierExpression(transparentParameter.Name), t.Item2); } } var result = node.AcceptVisitor(this); return((Expression)(result ?? node.Clone())); } finally { activeRangeVariableSubstitutions = oldRangeVariableSubstitutions; } }
Expression AddMemberToCurrentTransparentType(ParameterDeclaration param, Identifier name, Expression value, bool namedExpression) { Expression newAssignment = VisitNested(value, param); if (namedExpression) { newAssignment = new NamedExpression(name.Name, VisitNested(value, param)); if (!rangeVariables.ContainsKey(name)) { rangeVariables[name] = ((NamedExpression)newAssignment).NameToken; } } foreach (var t in currentTransparentType) { t.Item2.Insert(0, param.Name); } currentTransparentType.Add(Tuple.Create(name, new List <string> { name.Name })); return(new AnonymousTypeCreateExpression(new[] { new IdentifierExpression(param.Name), newAssignment })); }
void IAstVisitor.VisitParameterDeclaration(ParameterDeclaration parameterDeclaration) { Visit(EnterParameterDeclaration, LeaveParameterDeclaration, parameterDeclaration); }