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); }
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; } }
private DisposeAbstractValue(IOperation disposingOperation, DisposeAbstractValueKind kind) : this(ImmutableHashSet.Create(disposingOperation), kind) { }