private MethodDeclarationSyntax PayloadConstructionMethod(ITestDataRecord tdr)
        {
            TypeSyntax retType = null;

            if (tdr.RecordType.IsAnonymousType())
            {
                retType = AnonymousDictionaryType;
            }
            else if (tdr.RecordType.IsCollection())
            {
                retType = GetCollectionReturnType(tdr.RecordType);
            }
            else
            {
                retType = tdr.RecordType.TypeName(_usings);
            }

            var md = MethodDeclaration(retType, CurrentMethodName);

            var body = PayloadConstructionMethodBody(tdr);

            return(md.WithBody(Block(SeparatedList <StatementSyntax>(body)))
                   .WithModifiers(
                       TokenList(
                           new[]
            {
                Token(SyntaxKind.PrivateKeyword)
            })));

            ;
        }
Пример #2
0
        private IEnumerable <StatementSyntax> PayloadConstructionMethodBody(ITestDataRecord tdr)
        {
            if (tdr.Payload == null)
            {
                yield return(ReturnStatement(LiteralExpression(SyntaxKind.NullLiteralExpression)));

                yield break;
            }

            if (tdr.RecordType.IsInlineable())
            {
                yield return(ReturnStatement(TypeInitConstructor.Construct(tdr.RecordType, tdr.Payload)));

                yield break;
            }
            var ctx = new GenerationContext(_usings);

            if (tdr is AnonymousTestDataRecord anon)
            {
            }

            if (tdr.RecordType.IsEnumerable() || tdr.RecordType.IsTuple())
            {
                var coll =
                    tdr.RecordType.IsTuple()
                        ? SyntaxGeneration.Generator.ProceedTuple(_tgr, tdr.Payload.GetTupleValues(), ctx)
                    : SyntaxGeneration.Generator.ProceedCollection(_tgr, tdr.RecordType, (IEnumerable)tdr.Payload, ctx);

                foreach (var s in ctx.Declarations)
                {
                    yield return(s);
                }

                foreach (var s in ctx.LateBound)
                {
                    yield return(s);
                }

                yield return(ReturnStatement(coll));

                yield break;
            }

            var gen = _tgr.GetGeneratorFor(tdr.RecordType);

            gen.Proceed(tdr.Payload, ctx);
            foreach (var statementSyntax in ctx.Declarations)
            {
                yield return(statementSyntax);
            }

            foreach (var statementSyntax in ctx.LateBound)
            {
                yield return(statementSyntax);
            }
        }
        internal void Proceed(IEnumerable <QueryRecord> queries)
        {
            foreach (var queryRecord in queries)
            {
                ITestDataRecord tdr = null;

                var recordType = typeof(TestDataRecord <>).MakeGenericType(queryRecord.DataType);
                tdr =
                    Activator.CreateInstance(recordType, new[] { queryRecord.Result }) as ITestDataRecord;
                //}
                tdr.Description = queryRecord.Annotation;
                tdr.Hash        = queryRecord.Hash;
                _records.Enqueue(tdr);
            }
        }
Пример #4
0
 internal void Proceed(IEnumerable <QueryRecord> queries)
 {
     foreach (var queryRecord in queries)
     {
         ITestDataRecord tdr = null;
         //if (queryRecord.DataType.IsAnonymousType())
         //{
         //    tdr = AnonymousTestDataRecord.FromAnonymousObject(queryRecord.Result, queryRecord.DataType);
         //}
         //else
         //{
         var recordType = typeof(TestDataRecord <>).MakeGenericType(queryRecord.DataType);
         tdr =
             Activator.CreateInstance(recordType, new[] { queryRecord.Result }) as ITestDataRecord;
         //}
         tdr.Description = queryRecord.Annotation;
         tdr.Hash        = queryRecord.Hash;
         _records.Enqueue(tdr);
     }
 }
        private YieldStatementSyntax ProduceYield(ITestDataRecord trd)
        {
            TypeSyntax type = null;

            if (trd.RecordType.IsAnonymousType())
            {
                type = AnonymousRecordType;
            }
            else if (trd.RecordType.IsCollection() && trd.RecordType.ElementType().IsAnonymousType())
            {
                type = AnonymousCollectionRecordType;
            }
            else
            {
                type = trd.GetType().TypeName(_usings);
            }

            var hash = AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
                                            IdentifierName(nameof(ITestDataRecord.Hash)),
                                            TypeInitConstructor.Construct(typeof(string), trd.Hash));

            var description = AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
                                                   IdentifierName(nameof(ITestDataRecord.Description)),
                                                   TypeInitConstructor.Construct(typeof(string), trd.Description));

            //var data = AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
            //    IdentifierName(nameof(ITestDataRecord<int>.Data)),
            //    InvocationExpression(IdentifierName(CurrentMethodName)));
            var invokeGetData = InvocationExpression(IdentifierName(CurrentMethodName));

            var sto = (new SyntaxNodeOrToken[]
                       { hash, Token(SyntaxKind.CommaToken), description });

            var init = ObjectCreationExpression(type)
                       .WithArgumentList(ArgumentList(SingletonSeparatedList(Argument(invokeGetData))))
                       .WithInitializer(InitializerExpression(SyntaxKind.ObjectInitializerExpression,
                                                              SeparatedList <ExpressionSyntax>(sto)));

            return(YieldStatement(SyntaxKind.YieldReturnStatement,
                                  init));
        }
        private IEnumerable <StatementSyntax> PayloadConstructionMethodBody(ITestDataRecord tdr)
        {
            if (tdr.Payload == null)
            {
                yield return(ReturnStatement(LiteralExpression(SyntaxKind.NullLiteralExpression)));

                yield break;
            }

            if (tdr.RecordType.IsInlineable())
            {
                yield return(ReturnStatement(TypeInitConstructor.Construct(tdr.RecordType, tdr.Payload)));

                yield break;
            }

            var ctx = new GenerationContext(_usings);

            if (tdr.RecordType.IsDictionary())
            {
                var dict = Generator.ProceedDictionary(_tgr, tdr.RecordType, (IDictionary)tdr.Payload, ctx);
                foreach (var s in ctx.Declarations)
                {
                    yield return(s);
                }

                foreach (var s in ctx.LateBound)
                {
                    yield return(s);
                }

                yield return(ReturnStatement(dict));

                yield break;
            }
            else if (tdr.RecordType.IsEnumerable() || tdr.RecordType.IsTuple())
            {
                var coll =
                    tdr.RecordType.IsTuple()
                        ? SyntaxGeneration.Generator.ProceedTuple(_tgr, tdr.Payload.GetTupleValues(), ctx)
                        : SyntaxGeneration.Generator.ProceedCollection(_tgr, tdr.RecordType, (IEnumerable)tdr.Payload,
                                                                       ctx, forceArray: true);

                foreach (var s in ctx.Declarations)
                {
                    yield return(s);
                }

                foreach (var s in ctx.LateBound)
                {
                    yield return(s);
                }

                yield return(ReturnStatement(coll));

                yield break;
            }

            var gen    = _tgr.GetGeneratorFor(tdr.RecordType);
            var result = gen.New(tdr.Payload, ctx);

            while (ctx.Declarations.Count > 0)
            {
                yield return(ctx.Declarations.Dequeue());
            }
            while (ctx.LateBound.Count > 0)
            {
                yield return(ctx.LateBound.Dequeue());
            }
            yield return(ReturnStatement(result));
        }