Skip to content

Missing Obsolete attribute for derived types when having async method in an interface #127

@maca88

Description

@maca88

Example:

public interface ObsoleteInterfaceAbstractToken
{
  /// <summary>
  /// Test
  /// </summary>
  /// <returns></returns>
  IEnumerable<int> Test();
#if OBSOLETE
  /// <summary>
  /// Test
  /// </summary>
  /// <param name="cancellationToken">Token</param>
  /// <returns></returns>
  [Obsolete]
  Task<IEnumerable<int>> TestAsync(CancellationToken cancellationToken);
#endif
}

public abstract class ObsoleteInterfaceAbstractTokenDerived : ObsoleteInterfaceAbstractToken
{
  public abstract IEnumerable<int> Test();
}

public class ObsoleteInterfaceAbstractTokenDerived2 : ObsoleteInterfaceAbstractTokenDerived
{
  public override IEnumerable<int> Test()
  {
    yield return 2;
  }
}

Expected:

public abstract partial class ObsoleteInterfaceAbstractTokenDerived : ObsoleteInterfaceAbstractToken
{
  /// <summary>
  /// Test
  /// </summary>
  /// <param name="cancellationToken">Token</param>
  /// <returns></returns>
  [Obsolete]
  public abstract Task<IEnumerable<int>> TestAsync(CancellationToken cancellationToken);
}

public partial class ObsoleteInterfaceAbstractTokenDerived2 : ObsoleteInterfaceAbstractTokenDerived
{
  /// <summary>
  /// Test
  /// </summary>
  /// <param name="cancellationToken">Token</param>
  /// <returns></returns>
  [Obsolete]
  public override Task<IEnumerable<int>> TestAsync(CancellationToken cancellationToken)
  {
    var yields = new List<int>();
    yields.Add(2);
    return Task.FromResult<IEnumerable<int>>(yields);
  }
}

Actual:

public abstract partial class ObsoleteInterfaceAbstractTokenDerived : ObsoleteInterfaceAbstractToken
{
  /// <summary>
  /// Test
  /// </summary>
  /// <param name="cancellationToken">Token</param>
  /// <param name="cancellationToken">A cancellation token that can be used to cancel the work</param>
  /// <returns></returns>
  [Obsolete]
  public abstract Task<IEnumerable<int>> TestAsync(CancellationToken cancellationToken);
}

public partial class ObsoleteInterfaceAbstractTokenDerived2 : ObsoleteInterfaceAbstractTokenDerived
{
  public override Task<IEnumerable<int>> TestAsync(CancellationToken cancellationToken)
  {
    var yields = new List<int>();
    yields.Add(2);
    return Task.FromResult<IEnumerable<int>>(yields);
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions