private void ExtractInvocation(ParameterExpression command, ParameterExpression annotator, MethodCallExpression invex) { if (invex.Object == annotator) { if (invex.Method == AnnotatorMethods.AssertionsMethod) { var conv = Expression.Convert(invex.Arguments[0], typeof(object)); var lamb = Expression.Lambda(conv, command); var le = lamb.Compile(); var cA = new AssertionCheckParameter() { Extractor = le, Type = invex.Arguments[0].Type }; _checkParameters.Add(cA); return; } } var lambda = Expression.Lambda(invex, command).Compile(); var cC = new CommandExtractCheckParameter() { Type = invex.Type, Extractor = lambda }; _checkParameters.Add(cC); }
private ExpressionSyntax MakeAssertions(CommandBase command, AssertionCheckParameter cecp) { var value = cecp.Extractor.DynamicInvoke(command); var statements = new Stack <StatementSyntax>(); const string varName = "x"; statements.Push(ReturnStatement(LiteralExpression(SyntaxKind.TrueLiteralExpression))); if (value == null) { statements.Push(IfReturnFalse(IdentifierName(varName), LiteralExpression(SyntaxKind.NullLiteralExpression))); } else { var tp = value.GetType(); if (tp.IsInlineable()) { var v = TypeInitConstructor.Construct(tp, value); statements.Push(IfReturnFalse(IdentifierName(varName), v)); } else { var assertProps = cecp.PropertiesToAssert; if (assertProps == null || assertProps.Length == 0) { assertProps = tp.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty); } var props = assertProps .Where(x => x.PropertyType.IsInlineable()); foreach (var propertyInfo in props) { var access = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(varName), IdentifierName(propertyInfo.Name)); var propValue = propertyInfo.GetValue(value); var inlinedValue = TypeInitConstructor.Construct(propertyInfo.PropertyType, propValue); statements.Push(IfReturnFalse(access, inlinedValue)); } } } var blk = Block(List(statements)); var lambda = SimpleLambdaExpression(Parameter(Identifier(varName)), blk); return(lambda); }