Exemple #1
0
        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));
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        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));
        }
Exemple #4
0
            /// <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));
            }