mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
275 lines
5.1 KiB
275 lines
5.1 KiB
using System; |
|
using System.Collections.Generic; |
|
|
|
#nullable enable |
|
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
|
{ |
|
internal class Issue3909 |
|
{ |
|
public abstract class Base |
|
{ |
|
public virtual T? Unconstrained<T>(T? value) |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual T? ReferenceType<T>(T? value) where T : class |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual T? ReferenceTypeNullable<T>(T? value) where T : class? |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual T? NotNull<T>(T? value) where T : notnull |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual T? ValueType<T>(T? value) where T : struct |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual U? ReturnOnly<U>() |
|
{ |
|
return default; |
|
} |
|
|
|
public virtual T?[] Nested<T>(T?[] values) |
|
{ |
|
return values; |
|
} |
|
|
|
public virtual T Identity<T>(T value) |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public sealed class Derived : Base |
|
{ |
|
public override T? Unconstrained<T>(T? value) where T : default |
|
{ |
|
return value; |
|
} |
|
|
|
public override T? ReferenceType<T>(T? value) where T : class |
|
{ |
|
return value; |
|
} |
|
|
|
public override T? ReferenceTypeNullable<T>(T? value) where T : class |
|
{ |
|
return value; |
|
} |
|
|
|
public override T? NotNull<T>(T? value) where T : default |
|
{ |
|
return value; |
|
} |
|
|
|
public override T? ValueType<T>(T? value) |
|
{ |
|
return value; |
|
} |
|
|
|
public override U? ReturnOnly<U>() where U : default |
|
{ |
|
return default; |
|
} |
|
|
|
public override T?[] Nested<T>(T?[] values) where T : default |
|
{ |
|
return values; |
|
} |
|
|
|
public override T Identity<T>(T value) |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public interface IRoundTrip |
|
{ |
|
T? RoundTrip<T>(T? value); |
|
} |
|
|
|
public class ExplicitImpl : IRoundTrip |
|
{ |
|
T? IRoundTrip.RoundTrip<T>(T? value) where T : default |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public class Node |
|
{ |
|
} |
|
|
|
public abstract class ConstrainedBase |
|
{ |
|
public virtual T? ClassType<T>(T? value) where T : Node |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual T? DelegateType<T>(T? value) where T : Delegate |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual T? EnumType<T>(T? value) where T : Enum |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual T? InterfaceType<T>(T? value) where T : IDisposable |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual List<T?> NestedGeneric<T>(List<T?> values) |
|
{ |
|
return values; |
|
} |
|
|
|
public virtual TItem? PartiallyAnnotated<TItem, TOther>(TItem? value, TOther other) |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public sealed class ConstrainedDerived : ConstrainedBase |
|
{ |
|
public override T? ClassType<T>(T? value) where T : class |
|
{ |
|
return value; |
|
} |
|
|
|
public override T? DelegateType<T>(T? value) where T : class |
|
{ |
|
return value; |
|
} |
|
|
|
public override T? EnumType<T>(T? value) where T : default |
|
{ |
|
return value; |
|
} |
|
|
|
public override T? InterfaceType<T>(T? value) where T : default |
|
{ |
|
return value; |
|
} |
|
|
|
public override List<T?> NestedGeneric<T>(List<T?> values) where T : default |
|
{ |
|
return values; |
|
} |
|
|
|
public override TItem? PartiallyAnnotated<TItem, TOther>(TItem? value, TOther other) where TItem : default |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public class ClassTypeChainBase<TOuter> where TOuter : Node |
|
{ |
|
public virtual T? Chained<T>(T? value) where T : TOuter |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public sealed class ClassTypeChainDerived<TOuter> : ClassTypeChainBase<TOuter> where TOuter : Node |
|
{ |
|
public override T? Chained<T>(T? value) where T : class |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public class ReferenceTypeChainBase<TOuter> where TOuter : class |
|
{ |
|
public virtual T? Chained<T>(T? value) where T : TOuter |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public sealed class ReferenceTypeChainDerived<TOuter> : ReferenceTypeChainBase<TOuter> where TOuter : class |
|
{ |
|
public override T? Chained<T>(T? value) where T : default |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public abstract class MethodChainBase |
|
{ |
|
public virtual T? DependentOnClassConstrained<T, U>(T? value, U other) where T : U where U : class |
|
{ |
|
return value; |
|
} |
|
|
|
public virtual T? DependentOnClassType<T, U>(T? value, U other) where T : U where U : Node |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public sealed class MethodChainDerived : MethodChainBase |
|
{ |
|
public override T? DependentOnClassConstrained<T, U>(T? value, U other) where T : default |
|
{ |
|
return value; |
|
} |
|
|
|
public override T? DependentOnClassType<T, U>(T? value, U other) where T : class |
|
{ |
|
return value; |
|
} |
|
} |
|
|
|
public class ContainerBase<TOuter> where TOuter : class |
|
{ |
|
public virtual TOuter? Pick<TItem>(TItem item) |
|
{ |
|
return null; |
|
} |
|
} |
|
|
|
public sealed class ContainerDerived<TOuter> : ContainerBase<TOuter> where TOuter : class |
|
{ |
|
public override TOuter? Pick<TItem>(TItem item) |
|
{ |
|
return null; |
|
} |
|
} |
|
#if CS130 |
|
public class BaseWithAllowsRefStruct |
|
{ |
|
public virtual void Annotated<T>(T? value) where T : allows ref struct |
|
{ |
|
} |
|
|
|
public virtual void Plain<T>(T value) where T : allows ref struct |
|
{ |
|
} |
|
} |
|
|
|
public class DerivedWithAllowsRefStruct : BaseWithAllowsRefStruct |
|
{ |
|
public override void Annotated<T>(T? value) where T : default |
|
{ |
|
} |
|
|
|
public override void Plain<T>(T value) |
|
{ |
|
} |
|
} |
|
#endif |
|
} |
|
}
|
|
|