Beispiel #1
0
        public override SyntaxNode VisitTryStatement(TryStatementSyntax node)
        {
            // Do not add an OperationCanceledException catch block if:
            // - there are no catch blocks (only finally)
            // - there already exists an OperationCanceledException catch block
            // - there are no ancestors of OperationCanceledException being catched
            // - there are no async calls that have a cancellation token argument and there are no guards added
            if (node.Catches.Count == 0 ||
                node.Catches.Any(o => o.Declaration != null && SkipExceptions.Contains(o.Declaration.Type.ToString())) ||
                node.Catches.All(o => o.Declaration != null && !IncludeExceptions.Contains(o.Declaration.Type.ToString())) ||
                !node.Block.DescendantNodes(o => !o.IsFunction()).Any(o => o.HasAnnotations(Annotations.AsyncCallWithTokenOrGuard)))
            {
                return(base.VisitTryStatement(node));
            }

            var catchClause = CatchClause()
                              .WithCatchKeyword(
                Token(TriviaList(node.GetLeadingTrivia().LastOrDefault(o => o.IsKind(SyntaxKind.WhitespaceTrivia))), SyntaxKind.CatchKeyword, TriviaList(Space)))
                              .WithDeclaration(
                CatchDeclaration(_namespaceMetadata.UsingSystem
                                                        ? IdentifierName(nameof(OperationCanceledException))
                                                        : SyntaxNodeExtensions.ConstructNameSyntax($"System.{nameof(OperationCanceledException)}"))
                .WithCloseParenToken(Token(TriviaList(), SyntaxKind.CloseParenToken, TriviaList(Space))))
                              .WithBlock(
                Block(SingletonList <StatementSyntax>(
                          ThrowStatement().WithSemicolonToken(Token(TriviaList(), SyntaxKind.SemicolonToken, TriviaList(Space)))
                          ))
                .WithOpenBraceToken(Token(TriviaList(), SyntaxKind.OpenBraceToken, TriviaList(Space)))
                .WithCloseBraceToken(Token(TriviaList(), SyntaxKind.CloseBraceToken, TriviaList(_eolTrivia)))
                );

            node = node.WithCatches(new SyntaxList <CatchClauseSyntax>(new[] { catchClause }.Concat(node.Catches)));
            return(base.VisitTryStatement(node));
        }
        private FieldDeclarationSyntax GetAsyncLockField(string fieldName, bool isStatic, IMethodOrAccessorTransformationResult result)
        {
            var list = TokenList(Token(TriviaList(result.LeadingWhitespaceTrivia), SyntaxKind.PrivateKeyword, TriviaList(Space)));

            if (isStatic)
            {
                list = list.Add(Token(TriviaList(), SyntaxKind.StaticKeyword, TriviaList(Space)));
            }
            list = list.Add(Token(TriviaList(), SyntaxKind.ReadOnlyKeyword, TriviaList(Space)));
            var lockType = SyntaxNodeExtensions.ConstructNameSyntax(_configuration.AsyncLockFullTypeName, Space);

            return(FieldDeclaration(
                       VariableDeclaration(lockType)
                       .WithVariables(
                           SingletonSeparatedList(
                               VariableDeclarator(
                                   Identifier(TriviaList(), fieldName, TriviaList(Space))
                                   )
                               .WithInitializer(
                                   EqualsValueClause(
                                       ObjectCreationExpression(SyntaxNodeExtensions.ConstructNameSyntax(_configuration.AsyncLockFullTypeName))
                                       .WithArgumentList(ArgumentList())
                                       .WithNewKeyword(Token(TriviaList(), SyntaxKind.NewKeyword, TriviaList(Space)))
                                       )
                                   .WithEqualsToken(Token(TriviaList(), SyntaxKind.EqualsToken, TriviaList(Space)))
                                   )
                               )
                           )
                       )
                   .WithModifiers(list)
                   .WithSemicolonToken(Token(TriviaList(), SyntaxKind.SemicolonToken, TriviaList(result.EndOfLineTrivia))));
        }
Beispiel #3
0
        internal static TypeSyntax CreateTypeSyntax(this ITypeSymbol symbol, bool insideCref = false, bool onlyName = false)
        {
            var predefinedType = symbol.SpecialType.ToPredefinedType();

            if (predefinedType != null)
            {
                return(symbol.IsNullable()
                                        ? (TypeSyntax)SyntaxFactory.NullableType(predefinedType)
                                        : predefinedType);
            }
            return(SyntaxNodeExtensions.ConstructNameSyntax(symbol.ToString(), insideCref: insideCref, onlyName: onlyName));
        }
Beispiel #4
0
 private ReturnStatementSyntax GetReturnTaskCompleted()
 {
     return(ReturnStatement(
                Token(TriviaList(_transformResult.BodyLeadingWhitespaceTrivia), SyntaxKind.ReturnKeyword, TriviaList(Space)),
                MemberAccessExpression(
                    SyntaxKind.SimpleMemberAccessExpression,
                    _namespaceMetadata.TaskConflict
                                         ? SyntaxNodeExtensions.ConstructNameSyntax("System.Threading.Tasks.Task")
                                         : IdentifierName(nameof(Task)),
                    IdentifierName("CompletedTask")),
                Token(TriviaList(), SyntaxKind.SemicolonToken, TriviaList(_transformResult.EndOfLineTrivia))
                ));
 }
Beispiel #5
0
 private InvocationExpressionSyntax WrapInTaskFromException(ExpressionSyntax node)
 {
     return(InvocationExpression(
                MemberAccessExpression(
                    SyntaxKind.SimpleMemberAccessExpression,
                    _namespaceMetadata.TaskConflict
                                                 ? SyntaxNodeExtensions.ConstructNameSyntax("System.Threading.Tasks.Task").WithLeadingTrivia(node.GetLeadingTrivia())
                                                 : IdentifierName(Identifier(TriviaList(node.GetLeadingTrivia()), nameof(Task), TriviaList())),
                    GenericName(
                        Identifier("FromException"))
                    .WithTypeArgumentList(
                        TypeArgumentList(
                            SingletonSeparatedList(
                                _retunTypeSyntax == null
                                                                                 ? PredefinedType(Token(SyntaxKind.ObjectKeyword))
                                                                                 : _retunTypeSyntax.WithoutTrivia())))))
            .WithArgumentList(
                ArgumentList(
                    SingletonSeparatedList(
                        Argument(node.WithoutLeadingTrivia())))));
 }
Beispiel #6
0
        private BlockSyntax WrapInsideTryCatch(BlockSyntax node, bool preserveDirectives)
        {
            var indent          = _transformResult.IndentTrivia.ToFullString();
            var innerBodyTrivia = Whitespace(_transformResult.BodyLeadingWhitespaceTrivia.ToFullString());
            var bodyLeadTrivia  = TriviaList(_transformResult.LeadingWhitespaceTrivia);
            var eolTrivia       = TriviaList(_transformResult.EndOfLineTrivia);

            var tryStatement = TryStatement()
                               .WithTryKeyword(Token(bodyLeadTrivia, SyntaxKind.TryKeyword, eolTrivia))
                               .WithBlock(Block(node.Statements.Skip(_methodResult.Preconditions.Count))
                                          .WithOpenBraceToken(Token(bodyLeadTrivia, SyntaxKind.OpenBraceToken, eolTrivia))
                                          .WithCloseBraceToken(Token(preserveDirectives ? node.CloseBraceToken.LeadingTrivia : bodyLeadTrivia, SyntaxKind.CloseBraceToken, eolTrivia))
                                          )
                               .WithCatches(SingletonList(
                                                CatchClause()
                                                .WithCatchKeyword(Token(bodyLeadTrivia, SyntaxKind.CatchKeyword, TriviaList(Space)))
                                                .WithDeclaration(
                                                    CatchDeclaration(
                                                        _namespaceMetadata.UsingSystem
                                                                        ? IdentifierName(Identifier(TriviaList(), "Exception", TriviaList(Space)))
                                                                        : SyntaxNodeExtensions.ConstructNameSyntax("System.Exception", Space)
                                                        )
                                                    .WithIdentifier(Identifier("ex"))
                                                    .WithCloseParenToken(Token(TriviaList(), SyntaxKind.CloseParenToken, eolTrivia))
                                                    )
                                                .WithBlock(GetCatchBlock(innerBodyTrivia))
                                                ));

            tryStatement = tryStatement.AppendIndent(indent);
            var newStatements = node.Statements.Take(_methodResult.Preconditions.Count).ToList();

            newStatements.Add(tryStatement);

            return(Block(newStatements)
                   .WithOpenBraceToken(node.OpenBraceToken)
                   .WithCloseBraceToken(node.CloseBraceToken
                                        .WithLeadingTrivia(bodyLeadTrivia)));
        }
Beispiel #7
0
 private BlockSyntax GetCatchBlock(SyntaxTrivia innerBodyTrivia)
 {
     return(Block(
                SingletonList <StatementSyntax>(
                    ReturnStatement()
                    .WithExpression(
                        InvocationExpression(
                            MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                _namespaceMetadata.TaskConflict
                                                                                         ? SyntaxNodeExtensions.ConstructNameSyntax("System.Threading.Tasks.Task")
                                                                                         : IdentifierName(nameof(Task)),
                                GenericName(
                                    Identifier("FromException"))
                                .WithTypeArgumentList(
                                    TypeArgumentList(
                                        SingletonSeparatedList(
                                            _retunTypeSyntax == null
                                                                                                                         ? PredefinedType(Token(SyntaxKind.ObjectKeyword))
                                                                                                                         : _retunTypeSyntax.WithoutTrivia())))))
                        .WithArgumentList(
                            ArgumentList(
                                SingletonSeparatedList(
                                    Argument(
                                        IdentifierName("ex"))))))
                    .WithReturnKeyword(Token(TriviaList(innerBodyTrivia), SyntaxKind.ReturnKeyword, TriviaList(Space)))
                    .WithSemicolonToken(Token(TriviaList(), SyntaxKind.SemicolonToken, TriviaList(_transformResult.EndOfLineTrivia)))
                    ))
            .WithOpenBraceToken(Token(TriviaList(_transformResult.LeadingWhitespaceTrivia), SyntaxKind.OpenBraceToken, TriviaList(_transformResult.EndOfLineTrivia)))
            .WithCloseBraceToken(Token(TriviaList(_transformResult.LeadingWhitespaceTrivia), SyntaxKind.CloseBraceToken, TriviaList(_transformResult.EndOfLineTrivia))));
 }