private static IEnumerable <InvocationExpressionSyntax> AssertionForNotNull(AssertInstanceReference instance)
        {
            if (AssertionForBool(instance, out var expr))
            {
                yield return(expr);

                yield break;
            }

            if (instance.ActualType.IsInlineable())
            {
                var inlined = TypeInitConstructor.Construct(instance.ActualType, instance.Value, instance.Usings);
                yield return(AssertionEquals(instance.AssertionName, instance.Expression, inlined, $"{instance.Path} has invalid value"));

                yield break;
            }

            if (instance.ActualType.IsDictionary())
            {
                var dicParams = instance.ActualType.GetDictionaryParameters();
                yield return(AssertionEquals(
                                 instance.AssertionName,
                                 MemberAccessExpression(
                                     SyntaxKind.SimpleMemberAccessExpression,
                                     instance.Expression,
                                     IdentifierName(nameof(IDictionary.Count)))
                                 , LiteralExpression(SyntaxKind.NumericLiteralExpression,
                                                     Literal(instance.KeysCount())),
                                 $"{instance.Path} has invalid size"));

                if (dicParams.Item1.IsInlineable())
                {
                    foreach (var dictionaryItem in instance.Dictionary())
                    {
                        foreach (var check in AssertionFor(dictionaryItem))
                        {
                            yield return(check);
                        }
                    }
                }
                yield break;
            }

            if (instance.ActualType.IsEnumerable())
            {
                var arguments = new List <ExpressionSyntax>();
                arguments.Add((instance.Expression));
                arguments.Add((T($"{instance.Path} must be composed correctly")));

                foreach (var lValueTuple in instance.Items())
                {
                    var setOfChecks = AssertionFor(lValueTuple.Item2).ToArray();
                    arguments.Add((WrapIntoLambda(setOfChecks, lValueTuple.Item1)));
                }

                yield return(AssertForCollection(instance.AssertionName, arguments.ToArray()));

                yield break;
            }

            foreach (var property in instance.Properties())
            {
                foreach (var assrt in AssertionFor(property))
                {
                    yield return(assrt);
                }
            }
        }