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)))); }
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)); }
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)) )); }
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()))))); }
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))); }
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)))); }