示例#1
0
        private ExpressionSyntax ReplaceWithMessage(ExpressionSyntax expression, string whichOrAnd, string renameMethod, string prefix = "", string postfix = "")
        {
            var replacements = new[]
            {
                NodeReplacement.Remove(whichOrAnd),
                NodeReplacement.Remove("Message"),
                NodeReplacement.RemoveOccurrence("Should", occurrence: 2)
            };
            var newExpression = GetNewExpression(expression, replacements);
            var rename        = NodeReplacement.RenameAndExtractArguments(renameMethod, "WithMessage");

            newExpression = GetNewExpression(newExpression, rename);

            ArgumentSyntax newArgument = null;

            switch (rename.Arguments[0].Expression)
            {
            case IdentifierNameSyntax identifier:
                newArgument = SF.Argument(SF.ParseExpression($"$\"{prefix}{{{identifier.Identifier.Text}}}{postfix}\""));
                break;

            case LiteralExpressionSyntax literal:
                newArgument = SF.Argument(SF.ParseExpression($"\"{prefix}{literal.Token.ValueText}{postfix}\""));
                break;
            }

            var replacement = NodeReplacement.WithArguments("WithMessage", rename.Arguments.Replace(rename.Arguments[0], newArgument));

            return(GetNewExpression(newExpression, replacement));
        }
示例#2
0
        public static void NoArgumentNull()
        {
            StatementSyntax ToStatement(IParameterSymbol parameter)
            {
                return(F.IfStatement(
                           F.ParseExpression($"{nameof(ReferenceEquals)}(null, {parameter.Name})"),
                           F.ParseStatement($"throw new {typeof(ArgumentNullException).FullName}(\"{parameter.Name}\");")
                           ));
            }

            CallBinder.StatementSyntax = F.Block(
                from parameter in CallBinder.CallerSymbol.Parameters
                where !parameter.Type.IsValueType
                select ToStatement(parameter)
                );
        }
示例#3
0
文件: Usage.cs 项目: zihotki/Excess
        private SyntaxNode codeExtension(SyntaxNode node, SyntacticalExtension <SyntaxNode> extension)
        {
            if (extension.Kind == ExtensionKind.Code)
            {
                var codeBlock = extension.Body as BlockSyntax;
                Assert.IsNotNull(extension.Body);
                return(codeBlock.AddStatements(
                           new[] {
                    CSharp.ParseStatement("var myFoo = 5;"),
                    CSharp.ParseStatement("bar(myFoo);")
                }));
            }

            Assert.AreEqual(extension.Kind, ExtensionKind.Expression);
            return(CSharp.ParseExpression("bar(7)"));
        }
示例#4
0
        public static BlockSyntax GetInvocationBlockSyntax(string delegateTypeName, string methodName, string parameters,
                                                           IEnumerable <IParameterSymbol> outParameters, ITypeSymbol returnType, SemanticModel semanticModel)
        {
            var    voidType        = semanticModel.Compilation.GetTypeByMetadataName("System.Void");
            bool   returnsVoid     = returnType.Equals(voidType);
            var    statements      = new List <StatementSyntax>();
            string returnStatement = returnsVoid ? string.Empty : "return ";

            statements.Add(SF.ParseStatement($"{delegateTypeName} del;{System.Environment.NewLine}"));

            // Prepare if/else block to determine how uninitialized stubs are handled.
            var ifStrictExpression = SF.ParseExpression("MockBehavior == MockBehavior.Strict");
            var ifStrictTrueSyntax = SF.Block(SF.ParseStatement($"del = _stubs.GetMethodStub<{delegateTypeName}>(\"{methodName}\");{System.Environment.NewLine}"));

            var defaultReturnInvocation = outParameters.Select(p =>
                                                               SF.ParseStatement($"{p.Name} = default ({p.Type.GetGenericName()});")).ToList();

            if (!returnsVoid)
            {
                defaultReturnInvocation.Add(SF.ParseStatement(GetDefaultReturnInvocationStatement(returnType, semanticModel)));
            }
            else
            {
                defaultReturnInvocation.Add(SF.ParseStatement($"return;{System.Environment.NewLine}"));
            }

            var ifTryGetMethodStubExpression = SF.ParseExpression($"!_stubs.TryGetMethodStub<{delegateTypeName}>(\"{methodName}\", out del)");

            var ifStrictFalseSyntax = SF.Block(SF.IfStatement(ifTryGetMethodStubExpression, SF.Block(defaultReturnInvocation)));

            statements.Add(SF.IfStatement(ifStrictExpression, ifStrictTrueSyntax, SF.ElseClause(ifStrictFalseSyntax)));

            // Add default invocation.
            statements.Add(SF.ParseStatement($"{returnStatement}del.Invoke({parameters});{System.Environment.NewLine}"));

            return(SF.Block(statements.ToArray()));
        }