public void ExpressionSlimEntityTypeRecordizer_Enum1_RoslynV1_Regression() { var p = Expression.Parameter(typeof(Persoon1), "p"); var e = Expression.Lambda <Func <Persoon1, bool> >( Expression.Equal( Expression.Convert( Expression.Property(p, "Geslacht"), typeof(int) ), Expression.Convert( // NB: We used to choke on this, because our rewriter wants to erase enum types but didn't know how to // erase constants thereof. Roslyn v1.0 generates the tree below, while C# 5.0 and Roslyn v1.2 // generate a tree with Expression.Constant(0, typeof(int)), which does not require a type // change in our rewriter, so the constant is kept as-is. Expression.Constant(Sex.Male, typeof(Sex)), typeof(int) ) ), p ); var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); var slim = converter.Visit(e); var r = (LambdaExpression)eta.Apply(slim).ToExpression(); var m = (MemberExpression)((UnaryExpression)((BinaryExpression)r.Body).Left).Operand; Assert.AreEqual("contoso://entities/person/sex", m.Member.Name); Assert.AreEqual(typeof(int), ((PropertyInfo)m.Member).PropertyType); }
#pragma warning restore IDE0060 // Remove unused parameter protected static Expression ExpressionRoundtrip(Expression e) { var exprToSlim = new ExpressionToExpressionSlimConverter(); var slimToExpr = new ExpressionSlimToExpressionConverter(); return(slimToExpr.Visit(exprToSlim.Visit(e))); }
private static void AssertRoundtrip(Expression e) { var toSlim = new ExpressionToExpressionSlimConverter(); var toLinq = new ExpressionSlimToExpressionConverter(); var eqComp = new ExpressionEqualityComparer(() => new Comparator()); var s = toSlim.Visit(e); var r = toLinq.Visit(s); Assert.IsTrue(eqComp.Equals(e, r), e.ToString()); }
public void ExpressionSlimEntityTypeRecordizer_Constants_Null() { var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); var slim = converter.Visit(Expression.Constant(value: null, typeof(Qux))); var res = eta.Apply(slim).ToExpression(); Assert.IsNotNull(res); // TODO: semantic equivalence checks Assert.IsTrue(res is ConstantExpression); Assert.IsNull(((ConstantExpression)res).Value); }
public void ExpressionSlimEntityTypeRecordizer_Constants_Errors1() { foreach (var o in new object[] { new Func <Qux, Qux>(x => x), }) { var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); Assert.ThrowsException <InvalidOperationException>(() => eta.Apply(converter.Visit(Expression.Constant(o))).ToExpression()); } }
private static void OneWayParseException(IEnumerable <Expression> expressions, ConstructorInfo deserializerCtor) { var state = new SerializationState(BonsaiVersion.Default); var serializer = new TestBonsaiSerializer(state); var slimifier = new ExpressionToExpressionSlimConverter(); foreach (var expr in expressions) { var slim = slimifier.Visit(expr); var json = serializer.Visit(slim); var deserializer = (BonsaiToExpressionSlimConverter)deserializerCtor.Invoke(new object[] { state.ToJson() }); Assert.ThrowsException <BonsaiParseException>(() => deserializer.Visit(json)); } }
public void ExpressionSlimEntityTypeRecordizer_Enum1() { var e = (Expression <Func <Persoon1, bool> >)(p => p.Geslacht == Sex.Male); var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); var slim = converter.Visit(e); var r = (LambdaExpression)eta.Apply(slim).ToExpression(); var m = (MemberExpression)((UnaryExpression)((BinaryExpression)r.Body).Left).Operand; Assert.AreEqual("contoso://entities/person/sex", m.Member.Name); Assert.AreEqual(typeof(int), ((PropertyInfo)m.Member).PropertyType); }
public void ExpressionSlimEntityTypeRecordizer_Errors() { foreach (var e in new Expression[] { (Expression <Func <Qux> >)(() => new Qux(1) { Baz = 1 }), (Expression <Func <MissingMapping> >)(() => new MissingMapping(1)), (Expression <Func <NonMatchingMapping> >)(() => new NonMatchingMapping(1)), (Expression <Func <DuplicateMapping> >)(() => new DuplicateMapping(1, 2)), }) { var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); Assert.ThrowsException <InvalidOperationException>(() => eta.Apply(converter.Visit(e))); } }
public void ExpressionSlimEntityTypeRecordizer_Enum3_Nullable2() { var p = Expression.Parameter(typeof(Persoon2)); var e = Expression.Equal(Expression.Property(p, "Geslacht"), Expression.Constant(value: null, typeof(Sex?))); var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); var slim = converter.Visit(e); var r = (BinaryExpression)eta.Apply(slim).ToExpression(); var m = (MemberExpression)r.Left; var c = (ConstantExpression)r.Right; Assert.AreEqual("contoso://entities/person/sex", m.Member.Name); Assert.AreEqual(typeof(int?), ((PropertyInfo)m.Member).PropertyType); Assert.AreEqual(typeof(int?), c.Type); Assert.IsNull(c.Value); }
public void ExpressionSlimEntityTypeRecordizer_Enum2() { var e = (Expression <Func <Persoon1, Persoon1> >)(x => x); var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); var slim = converter.Visit(e); var r = (LambdaExpression)eta.Apply(slim).ToExpression(); var t = r.Parameters.Single().Type; Assert.IsTrue(t.IsRecordType()); var ps = t.GetProperties(); var s = ps.Single(p => p.Name == "contoso://entities/person/sex"); Assert.AreEqual(typeof(int), s.PropertyType); }
public void ExpressionSlimEntityTypeRecordizer_Errors() { foreach (var e in new Expression[] { #pragma warning disable IDE0004 // Remove Unnecessary Cast. (Only unnecessary on C# 10 or later.) (Expression <Func <Qux> >)(() => new Qux(1) { Baz = 1 }), (Expression <Func <MissingMapping> >)(() => new MissingMapping(1)), (Expression <Func <NonMatchingMapping> >)(() => new NonMatchingMapping(1)), (Expression <Func <DuplicateMapping> >)(() => new DuplicateMapping(1, 2)), #pragma warning restore IDE0004 // Remove Unnecessary Cast }) { var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); Assert.ThrowsException <InvalidOperationException>(() => eta.Apply(converter.Visit(e))); } }
public void ExpressionSlimEntityTypeRecordizer_Constants_ManOrBoy2() { Expression <Func <IEnumerable <A>, IEnumerable <int> > > f = xs => from x in xs let b = x.B from c in b.Cs let d = c.D where d > 0 let e = new A { B = new B { Cs = new C[] { c, new C { D = d + 1, Es = new List <E> { new E { F = d * d } } } } } } let z = new A { B = { Cs = new C[] { c, new C { D = d + 1, Es ={ new E { F = d * d } } } } } } where e.B.Cs[1].Es[0].F == z.B.Cs[1].Es[0].F select 7 * e.B.Cs.Sum(y => y.D); var g = f.Compile(); var res = g(new[] { new A { B = new B { Cs = new C[] { new C { D = 23 } } } }, new A { B = new B { Cs = new C[] { new C { D = -1 } } } }, new A { B = new B { Cs = new C[] { new C { D = 87 } } } }, }); var eta = new ExpressionSlimEntityTypeRecordizer(); var converter = new ExpressionToExpressionSlimConverter(new DataModelTypeSpace()); var slim = converter.Visit(f); var h = (LambdaExpression)eta.Apply(slim).ToExpression(); var anonA = h.Parameters[0].Type.GetGenericArguments()[0]; var propB = anonA.GetProperty("b"); var anonB = propB.PropertyType; var propCs = anonB.GetProperty("cs"); var anonC = propCs.PropertyType.GetElementType(); var propD = anonC.GetProperty("d"); var c23 = Activator.CreateInstance(anonC); propD.SetValue(c23, 23); var cm1 = Activator.CreateInstance(anonC); propD.SetValue(cm1, -1); var c87 = Activator.CreateInstance(anonC); propD.SetValue(c87, 87); var cs23 = (IList)Array.CreateInstance(anonC, 1); cs23[0] = c23; var csm1 = (IList)Array.CreateInstance(anonC, 1); csm1[0] = cm1; var cs87 = (IList)Array.CreateInstance(anonC, 1); cs87[0] = c87; var b23 = Activator.CreateInstance(anonB); propCs.SetValue(b23, cs23); var bm1 = Activator.CreateInstance(anonB); propCs.SetValue(bm1, csm1); var b87 = Activator.CreateInstance(anonB); propCs.SetValue(b87, cs87); var a23 = Activator.CreateInstance(anonA); propB.SetValue(a23, b23); var am1 = Activator.CreateInstance(anonA); propB.SetValue(am1, bm1); var a87 = Activator.CreateInstance(anonA); propB.SetValue(a87, b87); var inp = (IList)Array.CreateInstance(anonA, 3); inp[0] = a23; inp[1] = am1; inp[2] = a87; var p = CompilerGeneratedNameEliminator.Prettify(h).ToCSharpString(allowCompilerGeneratedNames: true).Replace("<>a__RecordType", "rec").Replace("<>h__TransparentIdentifier", "__t"); Assert.IsTrue(true, p); var output = (IEnumerable <int>)h.Compile().DynamicInvoke(new object[] { inp }); Assert.IsTrue(res.SequenceEqual(output)); }