コード例 #1
0
        private IEnumerable <StatementSyntax> CatchBlock(IMethodSymbol methodSymbol, MethodVariables variables)
        {
            var isResult = IsResult(methodSymbol);

            if (isResult)
            {
                foreach (var item in CatchOverrideResultBlock(methodSymbol, variables))
                {
                    yield return(item);
                }
            }

            var ifExpr = BinaryExpression(
                SyntaxKind.EqualsExpression,
                IdentifierName(variables.EXCEPTION_VARIABLE),
                LiteralExpression(SyntaxKind.NullLiteralExpression)
                );

            var exp = Names.CATCH_METHOD.CallMethodSyncExpression(
                IdentifierName(variables.METHOD_NAME_VARIABLE),
                IdentifierName(variables.ARGS_VARIABLE),
                IdentifierName(variables.CATCH_BLOCK_EXCEPTION_VARIABLE)
                );

            yield return(variables.EXCEPTION_VARIABLE.VarEqualsStatement(exp));

            yield return(IfStatement(ifExpr,
                                     Block(ThrowStatement()),
                                     ElseClause(Block(ThrowStatement(IdentifierName(variables.EXCEPTION_VARIABLE))))
                                     ));
        }
コード例 #2
0
        private MethodDeclarationSyntax CreateMethod(IMethodSymbol methodSymbol, CtorBuilderResult ctorResult)
        {
            var variables  = new MethodVariables(methodSymbol);
            var parameters = new MethodParameters(methodSymbol);

            var beforTryBody = BeforeTryBlock(methodSymbol, variables, parameters);
            var tryBody      = TryBlock(methodSymbol, ctorResult, variables, parameters).ToArray();
            var catchBody    = CatchBlock(methodSymbol, variables).ToArray();
            var finalyBody   = FinalyBlock(methodSymbol, variables).ToArray();

            var catchClause = CatchClause()
                              .WithDeclaration(CatchDeclaration(_exceptionSymbols.ToQualifiedTypeName())
                                               .WithIdentifier(Identifier(variables.CATCH_BLOCK_EXCEPTION_VARIABLE)))
                              .WithBlock(Block(catchBody));

            var finalyClause = FinallyClause()
                               .WithBlock(Block(finalyBody));

            var tryBlock = TryStatement()
                           .WithBlock(Block(tryBody))
                           .AddCatches(catchClause)
                           .WithFinally(finalyClause);

            var statements = beforTryBody.Append(tryBlock).ToArray();

            var @body = Block(statements);

            var returnType       = methodSymbol.ReturnType.ToQualifiedTypeName();
            var methodName       = Identifier(methodSymbol.Name);
            var methodModifiers  = GetModifiers(methodSymbol);
            var methodParameters = parameters.Parameters.Select(x => x.Syntax).ToArray();

            return(MethodDeclaration(returnType, methodName)
                   .WithModifiers(methodModifiers)
                   .AddParameterListParameters(methodParameters)
                   .WithBody(@body)
                   );
        }
コード例 #3
0
 private IEnumerable <StatementSyntax> FinalyBlock(IMethodSymbol methodSymbol, MethodVariables variables)
 {
     yield return(Names.FINALY_METHOD.CallMethodSyncStatement(
                      IdentifierName(variables.METHOD_NAME_VARIABLE),
                      IdentifierName(variables.ARGS_VARIABLE),
                      IdentifierName(variables.RESULT_VARIABLE)
                      ));
 }
コード例 #4
0
        private IEnumerable <StatementSyntax> CatchOverrideResultBlock(IMethodSymbol methodSymbol, MethodVariables variables)
        {
            var overrideResult = "overrideResult";

            var isAsync    = IsAsync(methodSymbol);
            var returnType = methodSymbol.ReturnType.ToQualifiedTypeName();

            var overrideResultExpr = Names.CATCH_OVERRIDE_RESULT_METHOD.CallMethodSyncExpression(
                IdentifierName(variables.METHOD_NAME_VARIABLE),
                IdentifierName(variables.ARGS_VARIABLE),
                IdentifierName(variables.CATCH_BLOCK_EXCEPTION_VARIABLE)
                );

            var hasResultInvokeExpr = overrideResult.InvokeSyncGenericExpression(
                method: Names.METHOD_RESULT_HAS_RESULT_METHOD,
                genericType: returnType
                );

            var getResultOrDefaultInvokeExpr = overrideResult.InvokeSyncGenericExpression(
                method: Names.GET_RESULT_OR_DEFAULT,
                genericType: returnType
                );

            var returnExpr = isAsync
                ? AwaitExpression(getResultOrDefaultInvokeExpr)
                : getResultOrDefaultInvokeExpr;

            var exitMethod = Names.EXIT_METHOD.CallMethodSyncStatement(
                IdentifierName(variables.METHOD_NAME_VARIABLE),
                IdentifierName(variables.ARGS_VARIABLE),
                IdentifierName(overrideResult)
                );

            yield return(overrideResult.VarEqualsStatement(overrideResultExpr));

            yield return(IfStatement(hasResultInvokeExpr,
                                     Block(exitMethod, ReturnStatement(returnExpr))
                                     ));
        }
コード例 #5
0
        private IEnumerable <StatementSyntax> TryBlock(IMethodSymbol methodSymbol, CtorBuilderResult ctorResult, MethodVariables variables, MethodParameters args)
        {
            var isResult = IsResult(methodSymbol);
            var isAsync  = IsAsync(methodSymbol);

            yield return(Names.ENTER_METHOD.CallMethodSyncStatement(
                             IdentifierName(variables.METHOD_NAME_VARIABLE),
                             IdentifierName(variables.ARGS_VARIABLE)
                             ));

            var arguments = args.Parameters.Select(x => IdentifierName(x.Name)).ToArray();

            if (isResult)
            {
                var resultExpression = isAsync
                    ? ctorResult.OriginFieldIdentifier.InvokeAwaitExpression(methodSymbol.Name, arguments)
                    : ctorResult.OriginFieldIdentifier.InvokeSyncExpression(methodSymbol.Name, arguments);

                yield return(variables.METHOD_RESULT_VARIABLE.VarEqualsStatement(resultExpression));

                yield return(variables.RESULT_VARIABLE.InvokeSyncStatement(Names.METHOD_RESULT_SET_METHOD, IdentifierName(variables.METHOD_RESULT_VARIABLE)));
            }
            else
            {
                yield return(isAsync
                    ? ctorResult.OriginFieldIdentifier.InvokeAwaitStatement(methodSymbol.Name, arguments)
                    : ctorResult.OriginFieldIdentifier.InvokeSyncStatement(methodSymbol.Name, arguments));
            }

            yield return(Names.EXIT_METHOD.CallMethodSyncStatement(
                             IdentifierName(variables.METHOD_NAME_VARIABLE),
                             IdentifierName(variables.ARGS_VARIABLE),
                             IdentifierName(variables.RESULT_VARIABLE)
                             ));

            if (isResult)
            {
                yield return(ReturnStatement(IdentifierName(variables.METHOD_RESULT_VARIABLE)));
            }
        }
コード例 #6
0
        private IEnumerable <StatementSyntax> BeforeTryBlock(IMethodSymbol methodSymbol, MethodVariables variables, MethodParameters args)
        {
            yield return(variables.METHOD_NAME_VARIABLE.VarEqualsStringStatement(methodSymbol.Name));

            yield return(variables.ARGS_VARIABLE.VarEqualsStatement(_methodArgsSymbols.GlobalTypeName().NewExpression()));

            yield return(variables.RESULT_VARIABLE.VarEqualsStatement(_methodResultSymbols.GlobalTypeName().NewExpression()));

            foreach (var argument in args.Parameters)
            {
                yield return(variables.ARGS_VARIABLE.InvokeSyncStatement(
                                 Names.METHOD_ARGS_SET_METHOD,
                                 argument.OriginalName.AsLiteral(),
                                 IdentifierName(argument.Name)
                                 ));
            }
        }