コード例 #1
0
        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);
            }
        }