public void FreeVariableScannerSlim_Find_CatchBlock1() { var p1 = ExpressionSlim.Parameter(SlimType, "p1"); var slimExpr = ExpressionSlim.TryCatch(ExpressionSlim.Empty(), ExpressionSlim.Catch(SlimType, p1)); var free = FreeVariableScannerSlim.Find(slimExpr); Assert.AreEqual(1, free.Count); Assert.IsTrue(free.Contains(p1)); }
public void FreeVariableScannerSlim_Find_Lambda1() { var p1 = ExpressionSlim.Parameter(SlimType, "p1"); var slimExpr = ExpressionSlim.Lambda(p1); var free = FreeVariableScannerSlim.Find(slimExpr); Assert.AreEqual(1, free.Count); Assert.IsTrue(free.Contains(p1)); }
public void FreeVariableScannerSlim_Find_Block2() { var p1 = ExpressionSlim.Parameter(SlimType, "p1"); var p2 = ExpressionSlim.Parameter(SlimType, "p2"); var slimExpr = ExpressionSlim.Block(new[] { p1 }, ExpressionSlim.Add(p1, p2)); var free = FreeVariableScannerSlim.Find(slimExpr); Assert.AreEqual(1, free.Count); Assert.IsTrue(free.Contains(p2)); }
/// <summary> /// Reduces a slim expression to a Linq expression, first mapping slim /// types to types from the expanded definition of the free variables in /// the expression. /// </summary> /// <param name="expression">The expression to reduce.</param> /// <returns>The reduced expression.</returns> public override Expression Reduce(ExpressionSlim expression) { EnsureInvertedTypeSpace(); var freeVariables = FreeVariableScannerSlim.Find(expression); foreach (var free in freeVariables) { var unifications = FindAndUnify(free, _parent._metadata); foreach (var unification in unifications) { _invertedTypeSpace.MapType(unification.Key, unification.Value); } } return(base.Reduce(expression)); }