protected override Expression VisitParameter(ParameterExpression variable) { if (VariableHasNotYetBeenAccessed(variable)) { _accessedVariables.Add(variable); } if (!JoinedAssignedVariables.Contains(variable)) { return(base.VisitParameter(variable)); } var joinedAssignmentData = _constructsByAssignment .Filter(kvp => kvp.Key.Left == variable) .Project(kvp => new { Assignment = kvp.Key, Construct = kvp.Value }) .FirstOrDefault(); if ((joinedAssignmentData == null) || _constructs.Contains(joinedAssignmentData.Construct)) { return(base.VisitParameter(variable)); } // This variable was assigned within a construct but is being accessed // outside of that scope, so the assignment shouldn't be joined: JoinedAssignedVariables.Remove(variable); JoinedAssignments.Remove(joinedAssignmentData.Assignment); _constructsByAssignment.Remove(joinedAssignmentData.Assignment); return(base.VisitParameter(variable)); }
/// <summary> /// Gets the 1-based index of the given <paramref name="variable"/> in the set of unnamed, /// accessed variables of its Type. /// </summary> /// <param name="variable">The variable for which to get the 1-based index.</param> /// <returns>The 1-based index of the given <paramref name="variable"/>.</returns> public int?GetUnnamedVariableNumber(ParameterExpression variable) { var variablesOfType = _analyzer.UnnamedVariablesByType[variable.Type]; if (variablesOfType.Length == 1) { return(null); } return(Array.IndexOf(variablesOfType, variable, 0) + 1); }
public static string Translate(ParameterExpression parameter, TranslationContext context) { var parameterName = parameter.Name; if (parameterName.IsNullOrWhiteSpace()) { var variableNumber = context.GetUnnamedVariableNumber(parameter); parameterName = parameter.Type.GetVariableNameInCamelCase() + variableNumber; } return(_keywords.Contains(parameterName) ? "@" + parameterName : parameterName); }
private static Expression GetReturnStatementBlock(out ParameterExpression existingInts) { existingInts = Expression.Variable(typeof(List <int>), "ints"); var existingIntsEnumerator = Expression.Variable(typeof(List <int> .Enumerator), "enumerator"); var getEnumeratorMethod = existingInts.Type.GetPublicInstanceMethod("GetEnumerator"); var getEnumeratorCall = Expression.Call(existingInts, getEnumeratorMethod); var enumeratorAssignment = Expression.Assign(existingIntsEnumerator, getEnumeratorCall); var enumeratorMoveNextMethod = existingIntsEnumerator.Type.GetPublicInstanceMethod("MoveNext"); var enumeratorMoveNextCall = Expression.Call(existingIntsEnumerator, enumeratorMoveNextMethod); var enumeratorItem = Expression.Variable(typeof(int), "item"); var enumeratorCurrent = Expression.Property(existingIntsEnumerator, "Current"); var itemAssignment = Expression.Assign(enumeratorItem, enumeratorCurrent); var intsAddMethod = existingInts.Type.GetPublicInstanceMethod("Add"); var intsAddCall = Expression.Call(existingInts, intsAddMethod, enumeratorItem); var addItemBlock = Expression.Block( new[] { enumeratorItem }, itemAssignment, intsAddCall); var loopBreakTarget = Expression.Label(typeof(void), "LoopBreak"); var conditionallyAddItems = Expression.Condition( Expression.IsTrue(enumeratorMoveNextCall), addItemBlock, Expression.Break(loopBreakTarget)); var addItemsLoop = Expression.Loop(conditionallyAddItems, loopBreakTarget); var populateExistingInts = Expression.Block( new[] { existingIntsEnumerator }, enumeratorAssignment, addItemsLoop); var conditionFalseBlock = Expression.Block( populateExistingInts, existingInts); var valueConditional = Expression.Condition( Expression.Equal(existingInts, Expression.Default(existingInts.Type)), Expression.New(conditionFalseBlock.Type), conditionFalseBlock); return(valueConditional); }
protected override Expression VisitParameter(ParameterExpression node) { if (!_rethrowFound) { if (node == _catchHandler.Variable) { _usageFound = true; } } else { _rethrowFound = false; } return(base.VisitParameter(node)); }