Beispiel #1
0
            public override DisposeAbstractValue Merge(DisposeAbstractValue value1, DisposeAbstractValue value2)
            {
                if (value1 == null)
                {
                    return(value2);
                }
                else if (value2 == null)
                {
                    return(value1);
                }
                else if (value1.Kind == DisposeAbstractValueKind.NotDisposable || value2.Kind == DisposeAbstractValueKind.NotDisposable)
                {
                    return(DisposeAbstractValue.NotDisposable);
                }
                else if (value1.Kind == DisposeAbstractValueKind.NotDisposed && value2.Kind == DisposeAbstractValueKind.NotDisposed)
                {
                    return(DisposeAbstractValue.NotDisposed);
                }

                DisposeAbstractValueKind kind = value1.Kind == DisposeAbstractValueKind.Disposed && value2.Kind == DisposeAbstractValueKind.Disposed ?
                                                DisposeAbstractValueKind.Disposed :
                                                DisposeAbstractValueKind.MaybeDisposed;

                var mergedDisposingOperations = _disposingOperationsDomain.Merge(value1.DisposingOperations, value2.DisposingOperations);

                if (mergedDisposingOperations.IsEmpty)
                {
                    Debug.Assert(kind == DisposeAbstractValueKind.MaybeDisposed);
                    return(DisposeAbstractValue.Unknown);
                }

                return(new DisposeAbstractValue(mergedDisposingOperations, kind));
            }
        private static void VerifyArguments(ImmutableHashSet <IOperation> disposingOrEscapingOperations, DisposeAbstractValueKind kind)
        {
            Debug.Assert(disposingOrEscapingOperations != null);

            switch (kind)
            {
            case DisposeAbstractValueKind.NotDisposable:
            case DisposeAbstractValueKind.NotDisposed:
                Debug.Assert(disposingOrEscapingOperations.Count == 0);
                break;

            case DisposeAbstractValueKind.Disposed:
                Debug.Assert(disposingOrEscapingOperations.Count > 0);
                break;
            }
        }
 public DisposeAbstractValue(ImmutableHashSet <IOperation> disposingOrEscapingOperations, DisposeAbstractValueKind kind)
 {
     VerifyArguments(disposingOrEscapingOperations, kind);
     DisposingOrEscapingOperations = disposingOrEscapingOperations;
     Kind = kind;
 }
 private DisposeAbstractValue(DisposeAbstractValueKind kind)
     : this(ImmutableHashSet <IOperation> .Empty, kind)
 {
     Debug.Assert(kind != DisposeAbstractValueKind.Disposed);
 }
Beispiel #5
0
        private static void VerifyArguments(ImmutableHashSet <IOperation> disposingOrEscapingOperations, DisposeAbstractValueKind kind)
        {
            switch (kind)
            {
            case DisposeAbstractValueKind.NotDisposable:
            case DisposeAbstractValueKind.NotDisposed:
            case DisposeAbstractValueKind.Invalid:
            case DisposeAbstractValueKind.Unknown:
                Debug.Assert(disposingOrEscapingOperations.IsEmpty);
                break;

            case DisposeAbstractValueKind.Escaped:
            case DisposeAbstractValueKind.Disposed:
            case DisposeAbstractValueKind.MaybeDisposed:
                Debug.Assert(!disposingOrEscapingOperations.IsEmpty);
                break;
            }
        }
Beispiel #6
0
 private DisposeAbstractValue(IOperation disposingOperation, DisposeAbstractValueKind kind)
     : this(ImmutableHashSet.Create(disposingOperation), kind)
 {
 }