private static bool IsReassignedWithCreated(AssignmentExpressionSyntax assignment, SyntaxNodeAnalysisContext context) { if (assignment.FirstAncestor <AccessorDeclarationSyntax>() is AccessorDeclarationSyntax accessor && accessor.IsKind(SyntaxKind.SetAccessorDeclaration) && assignment.Right is IdentifierNameSyntax assignedIdentifier && assignedIdentifier.Identifier.ValueText == "value") { return(false); } if (Disposable.IsAlreadyAssignedWithCreated(assignment.Left, context.SemanticModel, context.CancellationToken, out var assignedSymbol) .IsEither(Result.No, Result.AssumeNo, Result.Unknown)) { return(false); } if (assignedSymbol == KnownSymbol.SerialDisposable.Disposable || assignedSymbol == KnownSymbol.SingleAssignmentDisposable.Disposable) { return(false); } if (Disposable.IsDisposedBefore(assignedSymbol, assignment, context.SemanticModel, context.CancellationToken)) { return(false); } if (FieldOrProperty.TryCreate(assignedSymbol, out var fieldOrProperty) && TestFixture.IsAssignedAndDisposedInSetupAndTearDown(fieldOrProperty, context.Node.FirstAncestor <TypeDeclarationSyntax>(), context.SemanticModel, context.CancellationToken)) { return(false); } if (IsNullChecked(assignedSymbol, assignment, context.SemanticModel, context.CancellationToken)) { return(false); } if (TryGetAssignedLocal(out var local) && Disposable.IsDisposedAfter(local, assignment, context.SemanticModel, context.CancellationToken)) { return(false); } return(true); bool TryGetAssignedLocal(out ILocalSymbol result) { result = null; if (assignment.TryFirstAncestor(out MemberDeclarationSyntax memberDeclaration)) { using (var walker = VariableDeclaratorWalker.Borrow(memberDeclaration)) { return(walker.VariableDeclarators.TrySingle( x => context.SemanticModel.TryGetSymbol( x.Initializer?.Value, context.CancellationToken, out ISymbol symbol) && symbol.Equals(assignedSymbol), out var match) && match.Initializer.Value.IsExecutedBefore(assignment) == ExecutedBefore.Yes && context.SemanticModel.TryGetSymbol(match, context.CancellationToken, out result)); } } return(false); } }