BADF00D / DisposableFixer

This is a Visual Studio Extension and NuGet package that should identify and fix problems as memleaks while using IDisposables.
Other
35 stars 7 forks source link

Add support for System.Reactive.Disposables #134

Closed BADF00D closed 4 years ago

BADF00D commented 4 years ago

Prerequisites

Description

The namespace System.Reactive.Disposables contains slots of spacial IDisposables, that needed to be handled differenly.

https://docs.microsoft.com/en-us/previous-versions/dotnet/reactive-extensions/hh229090(v=vs.103)

Source Code

using System.Reactive.Disposables;
using System;
using System.IO;
using System.Reactive.Concurrency;
using System.Threading;
using Reactive.Bindings.Extensions;

namespace DisFixerTest.ReactiveProperty
{
    public class RxStuff : IDisposable
    {
        public BooleanDisposable BooleanDisposable { get; } = new BooleanDisposable();
        public CancellationDisposable CancellationDisposable { get;  } = new CancellationDisposable();
        public CompositeDisposable CompositeDisposable { get;  } = new CompositeDisposable();
        public ContextDisposable ContextDisposable { get; } = new ContextDisposable(SynchronizationContext.Current, new MemoryStream());// no warning for MemoryStream because tracked by ContextDisposable
        public MultipleAssignmentDisposable MultipleAssignmentDisposable { get; } = new MultipleAssignmentDisposable();
        public RefCountDisposable RefCountDisposable { get; } = new RefCountDisposable(new MemoryStream());// no warning for MemoryStream because tracked by RefCountDisposable
        public ScheduledDisposable ScheduledDisposable { get; } = new ScheduledDisposable(TaskPoolScheduler.Default, new MemoryStream());// no warning for MemoryStream because tracked by ScheduledDisposable
        public SerialDisposable SerialDisposable { get; } = new SerialDisposable();
        public SingleAssignmentDisposable SingleAssignmentDisposable { get;  } = new SingleAssignmentDisposable();

        public RxStuff()
        {
            CompositeDisposable.Add(new MemoryStream());
            new MemoryStream().AddTo(CompositeDisposable);
            MultipleAssignmentDisposable.Disposable = new MemoryStream();// no warning because tracked my MultipleAssignmentDisposable, why no warnig now (v2.1.3)?
            SerialDisposable.Disposable = new MemoryStream();// no warning because tracked my SerialDisposable, why no warnig now (v2.1.3)?
            SingleAssignmentDisposable.Disposable = new MemoryStream();// no warning because tracked my SingleAssignmentDisposable, why no warnig now (v2.1.3)?

        }

        public void Dispose()
        {
            BooleanDisposable?.Dispose();
            CancellationDisposable?.Dispose();
            CompositeDisposable?.Dispose();
            ContextDisposable?.Dispose();
            MultipleAssignmentDisposable?.Dispose();
            RefCountDisposable?.Dispose();
            ScheduledDisposable?.Dispose();
            SerialDisposable?.Dispose();
            SingleAssignmentDisposable?.Dispose();
        }
    }
}

Screenshot