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.
211 lines
4.5 KiB
211 lines
4.5 KiB
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this |
|
// software and associated documentation files (the "Software"), to deal in the Software |
|
// without restriction, including without limitation the rights to use, copy, modify, merge, |
|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons |
|
// to whom the Software is furnished to do so, subject to the following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included in all copies or |
|
// substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE |
|
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
|
// DEALINGS IN THE SOFTWARE. |
|
|
|
using System; |
|
using System.IO; |
|
using System.Runtime.InteropServices; |
|
using System.Threading; |
|
|
|
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
|
{ |
|
internal class Using |
|
{ |
|
[StructLayout(LayoutKind.Sequential, Size = 1)] |
|
private struct UsingStruct : IDisposable |
|
{ |
|
public UsingStruct(int i) |
|
{ |
|
Console.WriteLine(i); |
|
} |
|
|
|
void IDisposable.Dispose() |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
|
|
private struct TypeA_Issue3385 : IDisposable |
|
{ |
|
private int dummy; |
|
|
|
public void Dispose() |
|
{ |
|
} |
|
|
|
#if !ROSLYN3 |
|
public static implicit operator TypeB_Issue3385(TypeA_Issue3385 a) |
|
{ |
|
return default(TypeB_Issue3385); |
|
} |
|
#else |
|
public static implicit operator TypeB_Issue3385(in TypeA_Issue3385 a) |
|
{ |
|
return default(TypeB_Issue3385); |
|
} |
|
#endif |
|
} |
|
|
|
private struct TypeB_Issue3385 |
|
{ |
|
private int dummy; |
|
} |
|
|
|
#if CS80 |
|
[StructLayout(LayoutKind.Sequential, Size = 1)] |
|
public ref struct UsingRefStruct |
|
{ |
|
public int i; |
|
|
|
public UsingRefStruct(int i) |
|
{ |
|
this.i = i; |
|
Console.WriteLine(i); |
|
} |
|
|
|
public void Dispose() |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
} |
|
#endif |
|
|
|
#if LEGACY_CSC |
|
// roslyn optimizes out the try-finally; mcs has a compiler bug on using(null-literal) |
|
public void SimpleUsingNullStatement() |
|
{ |
|
using (null) |
|
{ |
|
Console.WriteLine("using (null)"); |
|
} |
|
} |
|
#endif |
|
|
|
public void SimpleUsingExpressionStatement() |
|
{ |
|
using (new MemoryStream()) |
|
{ |
|
Console.WriteLine("using-body"); |
|
} |
|
} |
|
|
|
public void SimpleUsingExpressionStatementWithDeclaration() |
|
{ |
|
using (MemoryStream memoryStream = new MemoryStream()) |
|
{ |
|
memoryStream.WriteByte(42); |
|
Console.WriteLine("using-body: " + memoryStream.Position); |
|
} |
|
} |
|
|
|
public void UsingStatementThatChangesTheVariable() |
|
{ |
|
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); |
|
using (cancellationTokenSource) |
|
{ |
|
cancellationTokenSource = new CancellationTokenSource(); |
|
} |
|
cancellationTokenSource.Cancel(); |
|
} |
|
|
|
public void UsingStatementOnStruct() |
|
{ |
|
using (new UsingStruct(1)) |
|
{ |
|
Console.WriteLine("using-body"); |
|
} |
|
} |
|
|
|
public void UsingStatementOnStructWithVariable() |
|
{ |
|
using (UsingStruct usingStruct = new UsingStruct(2)) |
|
{ |
|
Console.WriteLine("using-body: " + usingStruct); |
|
} |
|
} |
|
|
|
private void UsingStatementOnNullableStruct(UsingStruct? us) |
|
{ |
|
using (us) |
|
{ |
|
Console.WriteLine("using-body: " + us.ToString()); |
|
} |
|
} |
|
|
|
public void GenericUsing<T>(T t) where T : IDisposable |
|
{ |
|
using (t) |
|
{ |
|
Console.WriteLine(t); |
|
} |
|
} |
|
|
|
public void GenericStructUsing<T>(T t) where T : struct, IDisposable |
|
{ |
|
using (t) |
|
{ |
|
Console.WriteLine(t); |
|
} |
|
} |
|
|
|
public void GenericClassUsing<T>(T t) where T : class, IDisposable |
|
{ |
|
using (t) |
|
{ |
|
Console.WriteLine(t); |
|
} |
|
} |
|
|
|
public void GenericNullableUsing<T>(T? t) where T : struct, IDisposable |
|
{ |
|
using (t) |
|
{ |
|
Console.WriteLine(t); |
|
} |
|
} |
|
|
|
#if CS80 |
|
public void UsingRefStruct1(UsingRefStruct s) |
|
{ |
|
using (s) |
|
{ |
|
Console.WriteLine(s.i); |
|
} |
|
} |
|
#endif |
|
|
|
public static void Issue3385() |
|
{ |
|
#if ROSLYN3 |
|
using (TypeA_Issue3385 a = default(TypeA_Issue3385)) |
|
#else |
|
using (TypeA_Issue3385 typeA_Issue = default(TypeA_Issue3385)) |
|
#endif |
|
{ |
|
#if ROSLYN3 |
|
Empty(a); |
|
#else |
|
Empty(typeA_Issue); |
|
#endif |
|
} |
|
} |
|
|
|
private static void Empty(TypeB_Issue3385 b) |
|
{ |
|
} |
|
} |
|
}
|
|
|