public void MethodGroupAsExtensionMethod()
 {
     Assert.AreEqual(
         "() => (Func<bool>)new[] { 2000, 2004, 2008, 2012 }.Any"
         ,
         ExpressionToCode.ToCode(() => (Func <bool>) new[] { 2000, 2004, 2008, 2012 }.Any));
 }
Esempio n. 2
0
 public void AvoidsImplicitBoxingWhenTargetTypeIsAGenericArgument()
 {
     Assert.AreEqual(
         @"() => StaticTestClass.TwoArgsTwoGeneric(3, new object())",
         ExpressionToCode.ToCode(() => StaticTestClass.TwoArgsTwoGeneric(3, new object()))
         );
 }
Esempio n. 3
0
        static void AppendTo(
            ExpressionToCodeConfiguration config,
            StringBuilder sb,
            List <SubExpressionInfo> nodeInfos,
            StringifiedExpression node,
            ref bool ignoreInitialSpace,
            bool showTopExpressionValue)
        {
            if (node.Text != null)
            {
                var trimmedText = ignoreInitialSpace ? node.Text.TrimStart() : node.Text;
                var pos0        = sb.Length;
                sb.Append(trimmedText);
                ignoreInitialSpace = node.Text.Any() && ExpressionToCode.ShouldIgnoreSpaceAfter(node.Text[node.Text.Length - 1]);
                if (showTopExpressionValue)
                {
                    var valueString = node.OptionalValue == null ? null : ObjectToCodeImpl.ExpressionValueAsCode(config, node.OptionalValue, 0);
                    if (valueString != null)
                    {
                        nodeInfos.Add(new SubExpressionInfo {
                            Location = pos0 + trimmedText.Length / 2, Value = valueString
                        });
                    }
                }
            }

            foreach (var kid in node.Children)
            {
                AppendTo(config, sb, nodeInfos, kid, ref ignoreInitialSpace, showTopExpressionValue || kid.IsConceptualChild);
            }
        }
 public void NestedLambda_UncertainOverload()
 {
     Assert.Equal(
         @"() => Fizz((int x) => true)",
         ExpressionToCode.ToCode(() => Fizz((int x) => true))
         ); //hard case!
 }
 public void NestedLambda_TwoParameters()
 {
     Assert.Equal(
         @"() => new[] { 37, 42 }.Select((x, i) => x * 2)",
         ExpressionToCode.ToCode(() => new[] { 37, 42 }.Select((x, i) => x * 2))
         );
 }
 public void MembersDefault()
 {
     Assert.Equal(
         @"() => default(DateTime).Ticks == 0L",
         ExpressionToCode.ToCode(() => default(DateTime).Ticks == 0L));
     Assert.Equal(
         @"() => default(int[]).Length == 0",
         ExpressionToCode.ToCode(() => default(int[]).Length == 0));
     Assert.Equal(
         @"() => default(Type).GetTypeInfo().IsLayoutSequential",
         ExpressionToCode.ToCode(() => default(Type).GetTypeInfo().IsLayoutSequential));
     Assert.Equal(
         @"() => default(List<int>).Count",
         ExpressionToCode.ToCode(() => default(List <int>).Count));
     Assert.Equal(
         @"() => default(int[]).Clone() == null",
         ExpressionToCode.ToCode(() => default(int[]).Clone() == null));
     //default(Type).IsInstanceOfType(new object()) is not compiled as extension method in .net core!
     Assert.Equal(
         @"() => default(IEnumerable<Type>).Any()",
         ExpressionToCode.ToCode(() => default(IEnumerable <Type>).Any()));
     Assert.Equal(
         @"() => default(List<int>).AsReadOnly()",
         ExpressionToCode.ToCode(() => default(List <int>).AsReadOnly()));
 }
 public void StaticMembers()
 {
     Assert.AreEqual(
         @"() => (DateTime.Now > DateTime.Now + TimeSpan.FromMilliseconds(10.001)).ToString() == ""False""",
         ExpressionToCode.ToCode(
             () => (DateTime.Now > DateTime.Now + TimeSpan.FromMilliseconds(10.001)).ToString() == "False"));
 }
Esempio n. 8
0
        public void TheVariable_ToNameOf()
        {
            var theVariable = "theValue";
            var actual      = ExpressionToCode.GetNameIn(() => theVariable);

            Assert.Equal("theVariable", actual);
        }
Esempio n. 9
0
 public void ListInitializer2()
 => Assert.Equal(
     @"() => new List<int>(50) { 1, 2, 3 }.Count == 3",
     ExpressionToCode.ToCode(() => new List <int>(50)
 {
     1, 2, 3
 }.Count == 3));
 void AssertInGenericMethodWithIntArg <T>()
 {
     //The expression no longer has any reference to the unbound argument T, so we can't generate the exactly correct code here.
     Assert.AreEqual(
         "() => new List<int>()",
         ExpressionToCode.ToCode(() => new List <T>()));
 }
 public void TypeParameters3()
 {
     Assert.AreEqual(
         @"() => new[] { 1, 2, 3 }.Cast<int>()",
         ExpressionToCode.ToCode(() => new[] { 1, 2, 3 }.Cast <int>())
         ); //should not remove type parameters where these cannot be inferred!
 }
 public void StraightforwardInference()
 {
     Assert.AreEqual(
         @"() => StaticTestClass.Identity(3)",
         ExpressionToCode.ToCode(() => StaticTestClass.Identity(3))
         );
 }
 public void CannotInferOneParam()
 {
     Assert.AreEqual(
         @"() => StaticTestClass.IsType<int, int>(3)",
         ExpressionToCode.ToCode(() => StaticTestClass.IsType <int, int>(3))
         );
 }
Esempio n. 14
0
        public void ArrayLength()
        {
            var arr    = new[] { 1 };
            var actual = ExpressionToCode.ToValuedCode(() => arr.Length);

            Assert.Equal("arr.Length = 1", actual);
        }
Esempio n. 15
0
        public void TheStringVariable()
        {
            var theVariable = "theValue";
            var actual      = ExpressionToCode.ToValuedCode(() => theVariable);

            Assert.Equal("theVariable = theValue", actual);
        }
Esempio n. 16
0
        public void MembersDefault()
        {
#pragma warning disable CS8602 // Dereference of a possibly null reference. - these are false positives, because the code isn't executed, it's stringified.
#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. - these are false positives, because the code isn't executed, it's stringified.
            Assert.Equal(
                @"() => default(DateTime).Ticks == 0L",
                ExpressionToCode.ToCode(() => default(DateTime).Ticks == 0L));
            Assert.Equal(
                @"() => default(int[]).Length == 0",
                ExpressionToCode.ToCode(() => default(int[]).Length == 0));
            Assert.Equal(
                @"() => default(Type).GetTypeInfo().IsLayoutSequential",
                ExpressionToCode.ToCode(() => default(Type).GetTypeInfo().IsLayoutSequential));
            Assert.Equal(
                @"() => default(List<int>).Count",
                ExpressionToCode.ToCode(() => default(List <int>).Count));
            Assert.Equal(
                @"() => default(int[]).Clone() == null",
                ExpressionToCode.ToCode(() => default(int[]).Clone() == null));
            //default(Type).IsInstanceOfType(new object()) is not compiled as extension method in .net core!
            Assert.Equal(
                @"() => default(IEnumerable<Type>).Any()",
                ExpressionToCode.ToCode(() => default(IEnumerable <Type>).Any()));
            Assert.Equal(
                @"() => default(List<int>).AsReadOnly()",
                ExpressionToCode.ToCode(() => default(List <int>).AsReadOnly()));
#pragma warning restore CS8602 // Dereference of a possibly null reference.
#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type.
        }
        public void BlockVariablesTest()
        {
            var        p          = Expression.Parameter(typeof(int), "p");
            var        x          = Expression.Parameter(typeof(int), "x");
            Expression assignment = Expression.Assign(p, x);

            Assert.Equal(@"{ int p; int x; p = x; }", ExpressionToCode.ToCode(Expression.Block(typeof(void), new[] { p, x }, assignment)));
        }
        public void MultipleStatementsBlockTest()
        {
            var        p             = Expression.Parameter(typeof(int), "p");
            Expression assignment    = Expression.Assign(p, Expression.Constant(1));
            Expression addAssignment = Expression.AddAssign(p, Expression.Constant(5));

            Assert.Equal(@"{ int p; p = 1; p += 5; }", ExpressionToCode.ToCode(Expression.Block(typeof(void), new[] { p }, assignment, addAssignment)));
        }
Esempio n. 19
0
 public void FormattableStringFactory_IsRenderedAsInterpolation()
 {
     Assert.Equal(
         @"() => Interpolation($""abc"")",
         ExpressionToCode.ToCode(
             () => Interpolation(FormattableStringFactory.Create("abc", new object[] { }))
             ));
 }
        public void AddOperator()
        {
            var x = 0;

            Assert.Equal(
                @"() => 1 + x + 2 == 4",
                ExpressionToCode.ToCode(() => 1 + x + 2 == 4));
        }
Esempio n. 21
0
        public void NullableFlagsEnumComplexConstant()
        {
            SomeFlagsEnum?abc = SomeFlagsEnum.A | SomeFlagsEnum.B | SomeFlagsEnum.C;

            Assert.AreEqual(
                @"() => abc == (SomeFlagsEnum?)(SomeFlagsEnum.AB | SomeFlagsEnum.C)",
                ExpressionToCode.ToCode(() => abc == (SomeFlagsEnum.AB | SomeFlagsEnum.C)));
        }
Esempio n. 22
0
        public void NullableFlagsEnumConstant()
        {
            SomeFlagsEnum?ab = SomeFlagsEnum.A | SomeFlagsEnum.B;

            Assert.AreEqual(
                @"() => ab == (SomeFlagsEnum?)SomeFlagsEnum.AB",
                ExpressionToCode.ToCode(() => ab == SomeFlagsEnum.AB));
        }
        public void IndexerAccess()
        {
            var dict = Enumerable.Range(1, 20).ToDictionary(n => n.ToString());

            Assert.Equal(
                @"() => dict[""3""] == 3",
                ExpressionToCode.ToCode(() => dict["3"] == 3));
        }
Esempio n. 24
0
        public void TheMethod_ToNameOf()
        {
            var x      = 1;
            var y      = "";
            var actual = ExpressionToCode.GetNameIn(() => TheComplexMethod(x, y));

            Assert.Equal("TheComplexMethod", actual);
        }
Esempio n. 25
0
        public void ToValuedCode_ofNull_fails()
        {
            ExpressionToCodeLibTest obj = null;

            Assert.ThrowsAny <InvalidOperationException>(
                () =>
                ExpressionToCode.ToValuedCode(() => obj.TheProperty));
        }
Esempio n. 26
0
        private void BuildQuery(QueryContext c)
        {
            _builder.AppendLine("public " + c.OutputType.GetCompilableTypeName(_rewrittenTypes)
                        + " " + c.Name + "(" + c.InputType.GetCompilableTypeName(_rewrittenTypes) + " request)");
            
            _builder.AppendLine("{");
            _builder++;

            _builder.AppendLine("Console.Write(\".\");");

            // local vars
            foreach (var s in c.TempSymbolsByAlias)
            {
                _builder.AppendLine(s.Value.Type.GetCompilableTypeName(_rewrittenTypes) + " " + s.Key + ";");
            }

            if (c.TempSymbolsByAlias.Count > 0)
                _builder.AppendLine();

            // final query
            var codeBuilder = new ExpressionToCode(c.RootExpression, c);
            var code = codeBuilder.GenCode(_builder.Indent);

            _builder.AppendLine(code + ";");

            _builder--;
            _builder.AppendLine("}");
            _builder.AppendLine();
        }