private static void ReplaceWithUsing(DocumentEditor editor, InvocationExpressionSyntax invocation, CancellationToken cancellationToken) { if (DisposeCall.TryGetDisposedRootMember(invocation, editor.SemanticModel, cancellationToken, out var root) && editor.SemanticModel.TryGetSymbol(root, cancellationToken, out ILocalSymbol local) && local.TrySingleDeclaration(cancellationToken, out VariableDeclarationSyntax declaration) && invocation.TryFirstAncestor(out ExpressionStatementSyntax expressionStatement) && declaration.Parent is LocalDeclarationStatementSyntax localDeclarationStatement) { if (expressionStatement.Parent is BlockSyntax finallyBlock && finallyBlock.Parent is FinallyClauseSyntax finallyClause && finallyClause.Parent is TryStatementSyntax tryStatement && !tryStatement.Catches.Any()) { if (declaration.Variables.TrySingle(out var declarator) && declarator.Initializer?.Value.IsKind(SyntaxKind.NullLiteralExpression) == true && tryStatement.Block.Statements.TryFirst(out var statement) && statement is ExpressionStatementSyntax assignExpressionStatement && assignExpressionStatement.Expression is AssignmentExpressionSyntax assignment) { editor.ReplaceNode( tryStatement, SyntaxFactory.UsingStatement( SyntaxFactory.VariableDeclaration( SyntaxFactory.ParseTypeName("var"), SyntaxFactory.SingletonSeparatedList( declarator.WithInitializer(SyntaxFactory.EqualsValueClause(assignment.Right)))), null, tryStatement.Block.WithStatements(tryStatement.Block.Statements.RemoveAt(0)))); editor.RemoveNode(localDeclarationStatement); }
private static void Handle(SyntaxNodeAnalysisContext context) { if (!context.IsExcludedFromAnalysis() && context.Node is InvocationExpressionSyntax invocation && DisposeCall.IsIDisposableDispose(invocation, context.SemanticModel, context.CancellationToken) && !invocation.TryFirstAncestorOrSelf <AnonymousFunctionExpressionSyntax>(out _) && DisposeCall.TryGetDisposedRootMember(invocation, context.SemanticModel, context.CancellationToken, out var root)) { if (Disposable.IsCachedOrInjected(root, invocation, context.SemanticModel, context.CancellationToken)) { context.ReportDiagnostic(Diagnostic.Create(IDISP007DontDisposeInjected.Descriptor, invocation.FirstAncestorOrSelf <StatementSyntax>()?.GetLocation() ?? invocation.GetLocation())); } else if (context.SemanticModel.TryGetSymbol(root, context.CancellationToken, out ILocalSymbol local)) { if (IsUsedAfter(local, invocation, context, out var locations)) { context.ReportDiagnostic(Diagnostic.Create(IDISP016DontUseDisposedInstance.Descriptor, invocation.FirstAncestorOrSelf <StatementSyntax>()?.GetLocation() ?? invocation.GetLocation(), additionalLocations: locations)); } if (IsPreferUsing(local, invocation, context)) { context.ReportDiagnostic(Diagnostic.Create(IDISP017PreferUsing.Descriptor, invocation.GetLocation())); } } } }
private static void Handle(SyntaxNodeAnalysisContext context) { if (!context.IsExcludedFromAnalysis() && context.Node is InvocationExpressionSyntax invocation && DisposeCall.IsMatchAny(invocation, context.SemanticModel, context.CancellationToken) && !invocation.TryFirstAncestorOrSelf <AnonymousFunctionExpressionSyntax>(out _) && DisposeCall.TryGetDisposedRootMember(invocation, context.SemanticModel, context.CancellationToken, out var root)) { if (Disposable.IsCachedOrInjectedOnly(root, invocation, context.SemanticModel, context.CancellationToken)) { context.ReportDiagnostic(Diagnostic.Create(Descriptors.IDISP007DoNotDisposeInjected, invocation.FirstAncestorOrSelf <StatementSyntax>()?.GetLocation() ?? invocation.GetLocation())); } if (invocation.Expression is MemberAccessExpressionSyntax { Expression : IdentifierNameSyntax _ } &&