Merge branch 'master' into fsharp-async-task-support
This commit is contained in:
commit
5dd50f12da
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
github: [benaadams]
|
||||
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "nuget" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
||||
41
.github/workflows/pull-request.yaml
vendored
Normal file
41
.github/workflows/pull-request.yaml
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
name: Demystifier PR Build
|
||||
on: pull_request
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: "Build for PR"
|
||||
runs-on: ${{ matrix.os }}
|
||||
env:
|
||||
DOTNET_NOLOGO: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [windows-latest, ubuntu-18.04, macOS-latest]
|
||||
config: [Debug, Release]
|
||||
steps:
|
||||
- name: Clone source
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install .NET Core SDK 2.1
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: '2.1.x'
|
||||
|
||||
- name: Install .NET Core SDK 3.1
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: '3.1.x'
|
||||
|
||||
- name: Install .NET SDK 5.0
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: '5.0.x'
|
||||
|
||||
- name: Get .NET information
|
||||
run: dotnet --info
|
||||
|
||||
- name: "Test"
|
||||
run: dotnet test -c ${{ matrix.config }}
|
||||
|
||||
32
appveyor.yml
32
appveyor.yml
@ -1,32 +0,0 @@
|
||||
image: Visual Studio 2017
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
skip_branch_with_pr: true
|
||||
|
||||
skip_tags: true
|
||||
|
||||
skip_commits:
|
||||
files:
|
||||
- BUILDING.md
|
||||
- CONTRIBUTING.md
|
||||
- ISSUE_TEMPLATE.md
|
||||
- LICENCE
|
||||
- README.md
|
||||
|
||||
nuget:
|
||||
disable_publish_on_pr: true
|
||||
|
||||
build_script:
|
||||
- ps: .\build.ps1 -target appveyor
|
||||
|
||||
test: off
|
||||
|
||||
deploy: off
|
||||
|
||||
artifacts:
|
||||
- path: artifacts/build
|
||||
- path: artifacts/packages
|
||||
- path: artifacts/test
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<IncludeSource>true</IncludeSource>
|
||||
<DebugType>embedded</DebugType>
|
||||
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
@ -21,12 +22,13 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Nerdbank.GitVersioning" Version="3.0.25" PrivateAssets="all" />
|
||||
<PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37" PrivateAssets="all" />
|
||||
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="all" />
|
||||
<PackageReference Include="System.Reflection.Metadata">
|
||||
<Version>1.6.0</Version>
|
||||
<Version>5.0.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" Condition="'$(TargetFramework)' != 'netstandard2.1'" />
|
||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" Condition="'$(TargetFramework)' != 'netstandard2.1'" />
|
||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Label="TestInternalsVisibleTo">
|
||||
|
||||
@ -53,7 +53,7 @@ namespace System.Diagnostics
|
||||
var method = frame.GetMethod();
|
||||
|
||||
// Always show last stackFrame
|
||||
if (!ShowInStackTrace(method) && i < stackFrames.Length - 1)
|
||||
if (method != null && !ShowInStackTrace(method) && i < stackFrames.Length - 1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -62,7 +62,7 @@ namespace System.Diagnostics
|
||||
var row = frame.GetFileLineNumber();
|
||||
var column = frame.GetFileColumnNumber();
|
||||
var ilOffset = frame.GetILOffset();
|
||||
if (string.IsNullOrEmpty(fileName) && ilOffset >= 0)
|
||||
if (method != null && string.IsNullOrEmpty(fileName) && ilOffset >= 0)
|
||||
{
|
||||
// .NET Framework and older versions of mono don't support portable PDBs
|
||||
// so we read it manually to get file name and line information
|
||||
@ -636,6 +636,18 @@ namespace System.Diagnostics
|
||||
{
|
||||
Debug.Assert(method != null);
|
||||
|
||||
// Since .NET 5:
|
||||
// https://github.com/dotnet/runtime/blob/7c18d4d6488dab82124d475d1199def01d1d252c/src/libraries/System.Private.CoreLib/src/System/Diagnostics/StackTrace.cs#L348-L361
|
||||
if ((method.MethodImplementationFlags & MethodImplAttributes.AggressiveInlining) != 0)
|
||||
{
|
||||
// Aggressive Inlines won't normally show in the StackTrace; however for Tier0 Jit and
|
||||
// cross-assembly AoT/R2R these inlines will be blocked until Tier1 Jit re-Jits
|
||||
// them when they will inline. We don't show them in the StackTrace to bring consistency
|
||||
// between this first-pass asm and fully optimized asm.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Since .NET Core 2:
|
||||
if (StackTraceHiddenAttributeType != null)
|
||||
{
|
||||
// Don't show any methods marked with the StackTraceHiddenAttribute
|
||||
@ -653,6 +665,17 @@ namespace System.Diagnostics
|
||||
return true;
|
||||
}
|
||||
|
||||
// Since .NET Core 2:
|
||||
if (StackTraceHiddenAttributeType != null)
|
||||
{
|
||||
// Don't show any methods marked with the StackTraceHiddenAttribute
|
||||
// https://github.com/dotnet/coreclr/pull/14652
|
||||
if (IsStackTraceHidden(type))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (type == typeof(Task<>) && method.Name == "InnerInvoke")
|
||||
{
|
||||
return false;
|
||||
@ -661,8 +684,13 @@ namespace System.Diagnostics
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (type == typeof(Task))
|
||||
if (type == typeof(Task) || type.DeclaringType == typeof(Task))
|
||||
{
|
||||
if (method.Name.Contains(".cctor"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (method.Name)
|
||||
{
|
||||
case "ExecuteWithThreadLocal":
|
||||
@ -670,15 +698,24 @@ namespace System.Diagnostics
|
||||
case "ExecutionContextCallback":
|
||||
case "ExecuteEntry":
|
||||
case "InnerInvoke":
|
||||
case "ExecuteEntryUnsafe":
|
||||
case "ExecuteFromThreadPool":
|
||||
case "s_ecCallback":
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (type == typeof(ExecutionContext))
|
||||
{
|
||||
if (method.Name.Contains(".cctor"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (method.Name)
|
||||
{
|
||||
case "RunInternal":
|
||||
case "Run":
|
||||
case "RunFromThreadPoolDispatchLoop":
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -706,44 +743,33 @@ namespace System.Diagnostics
|
||||
}
|
||||
}
|
||||
|
||||
if (StackTraceHiddenAttributeType != null)
|
||||
// Fallbacks for runtime pre-StackTraceHiddenAttribute
|
||||
if (type == typeof(ExceptionDispatchInfo) && method.Name == "Throw")
|
||||
{
|
||||
// Don't show any types marked with the StackTraceHiddenAttribute
|
||||
// https://github.com/dotnet/coreclr/pull/14652
|
||||
if (IsStackTraceHidden(type))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (type == typeof(TaskAwaiter) ||
|
||||
type == typeof(TaskAwaiter<>) ||
|
||||
type == typeof(ValueTaskAwaiter) ||
|
||||
type == typeof(ValueTaskAwaiter<>) ||
|
||||
type == typeof(ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter) ||
|
||||
type == typeof(ConfiguredValueTaskAwaitable<>.ConfiguredValueTaskAwaiter) ||
|
||||
type == typeof(ConfiguredTaskAwaitable.ConfiguredTaskAwaiter) ||
|
||||
type == typeof(ConfiguredTaskAwaitable<>.ConfiguredTaskAwaiter))
|
||||
{
|
||||
switch (method.Name)
|
||||
{
|
||||
return false;
|
||||
case "HandleNonSuccessAndDebuggerNotification":
|
||||
case "ThrowForNonSuccess":
|
||||
case "ValidateEnd":
|
||||
case "GetResult":
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (type.FullName == "System.ThrowHelper")
|
||||
{
|
||||
// Fallbacks for runtime pre-StackTraceHiddenAttribute
|
||||
if (type == typeof(ExceptionDispatchInfo) && method.Name == "Throw")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (type == typeof(TaskAwaiter) ||
|
||||
type == typeof(TaskAwaiter<>) ||
|
||||
type == typeof(ValueTaskAwaiter) ||
|
||||
type == typeof(ValueTaskAwaiter<>) ||
|
||||
type == typeof(ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter) ||
|
||||
type == typeof(ConfiguredValueTaskAwaitable<>.ConfiguredValueTaskAwaiter) ||
|
||||
type == typeof(ConfiguredTaskAwaitable.ConfiguredTaskAwaiter) ||
|
||||
type == typeof(ConfiguredTaskAwaitable<>.ConfiguredTaskAwaiter))
|
||||
{
|
||||
switch (method.Name)
|
||||
{
|
||||
case "HandleNonSuccessAndDebuggerNotification":
|
||||
case "ThrowForNonSuccess":
|
||||
case "ValidateEnd":
|
||||
case "GetResult":
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (type.FullName == "System.ThrowHelper")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@ -69,9 +69,8 @@ namespace System.Diagnostics
|
||||
}
|
||||
|
||||
var genericPartIndex = type.Name.IndexOf('`');
|
||||
Debug.Assert(genericPartIndex >= 0);
|
||||
|
||||
return type.Name.Substring(0, genericPartIndex);
|
||||
return (genericPartIndex >= 0) ? type.Name.Substring(0, genericPartIndex) : type.Name;
|
||||
}
|
||||
|
||||
private static void ProcessType(StringBuilder builder, Type type, DisplayNameOptions options)
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
|
||||
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>netcoreapp2.1;netcoreapp2.0;net462</TargetFrameworks>
|
||||
<TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net462;net5.0</TargetFrameworks>
|
||||
<Configuration>Release</Configuration>
|
||||
<OutputType>Exe</OutputType>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\Ben.Demystifier\Ben.Demystifier.csproj" />
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.10.12" />
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.12.1" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@ -2,11 +2,14 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using BenchmarkDotNet.Attributes;
|
||||
using BenchmarkDotNet.Attributes.Jobs;
|
||||
using BenchmarkDotNet.Jobs;
|
||||
|
||||
namespace Ben.Demystifier.Benchmarks
|
||||
{
|
||||
[ClrJob, CoreJob]
|
||||
[SimpleJob(RuntimeMoniker.Net48)]
|
||||
[SimpleJob(RuntimeMoniker.NetCoreApp21)]
|
||||
[SimpleJob(RuntimeMoniker.NetCoreApp31)]
|
||||
[SimpleJob(RuntimeMoniker.NetCoreApp50)]
|
||||
[Config(typeof(Config))]
|
||||
public class ExceptionTests
|
||||
{
|
||||
|
||||
@ -43,6 +43,6 @@ namespace Ben.Demystifier.Benchmarks
|
||||
|
||||
internal class Config : ManualConfig
|
||||
{
|
||||
public Config() => Add(new MemoryDiagnoser());
|
||||
public Config() => AddDiagnoser(MemoryDiagnoser.Default);
|
||||
}
|
||||
}
|
||||
|
||||
@ -37,14 +37,28 @@ namespace Ben.Demystifier.Test
|
||||
var trace = string.Join("", stackTrace.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
|
||||
// Remove items that vary between test runners
|
||||
.Where(s =>
|
||||
s != " at Task Ben.Demystifier.Test.DynamicCompilation.DoesNotPreventStackTrace()+() => { }" &&
|
||||
!s.Contains("System.Threading.Tasks.Task.WaitAll")
|
||||
(s != " at Task Ben.Demystifier.Test.DynamicCompilation.DoesNotPreventStackTrace()+() => { }" &&
|
||||
!s.Contains("System.Threading.Tasks.Task.WaitAll"))
|
||||
)
|
||||
.Skip(1)
|
||||
.ToArray())
|
||||
// Remove Full framework back arrow
|
||||
.Replace("<---", "");
|
||||
|
||||
#if NET5_0 || NETCOREAPP3_1
|
||||
var expected = string.Join("", new[] {
|
||||
" ---> System.ArgumentException: Value does not fall within the expected range.",
|
||||
" at async Task Ben.Demystifier.Test.AggregateException.Throw1()",
|
||||
" at async void Ben.Demystifier.Test.AggregateException.DemystifiesAggregateExceptions()+(?) => { }",
|
||||
" --- End of inner exception stack trace ---",
|
||||
" at void Ben.Demystifier.Test.AggregateException.DemystifiesAggregateExceptions()",
|
||||
" ---> (Inner Exception #1) System.NullReferenceException: Object reference not set to an instance of an object.",
|
||||
" at async Task Ben.Demystifier.Test.AggregateException.Throw2()",
|
||||
" at async void Ben.Demystifier.Test.AggregateException.DemystifiesAggregateExceptions()+(?) => { }",
|
||||
" ---> (Inner Exception #2) System.InvalidOperationException: Operation is not valid due to the current state of the object.",
|
||||
" at async Task Ben.Demystifier.Test.AggregateException.Throw3()",
|
||||
" at async void Ben.Demystifier.Test.AggregateException.DemystifiesAggregateExceptions()+(?) => { }"
|
||||
});
|
||||
#else
|
||||
var expected = string.Join("", new[] {
|
||||
" at async Task Ben.Demystifier.Test.AggregateException.Throw1()",
|
||||
" at async void Ben.Demystifier.Test.AggregateException.DemystifiesAggregateExceptions()+(?) => { }",
|
||||
@ -59,7 +73,7 @@ namespace Ben.Demystifier.Test
|
||||
"---> (Inner Exception #2) System.InvalidOperationException: Operation is not valid due to the current state of the object.",
|
||||
" at async Task Ben.Demystifier.Test.AggregateException.Throw3()",
|
||||
" at async void Ben.Demystifier.Test.AggregateException.DemystifiesAggregateExceptions()+(?) => { }"});
|
||||
|
||||
#endif
|
||||
Assert.Equal(expected, trace);
|
||||
}
|
||||
|
||||
|
||||
@ -1,16 +1,18 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>netcoreapp2.1;netcoreapp2.0;net46</TargetFrameworks>
|
||||
<TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">netcoreapp2.1;netcoreapp3.1;net46;net5.0</TargetFrameworks>
|
||||
<TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netcoreapp2.1;netcoreapp3.1;net5.0</TargetFrameworks>
|
||||
<SignAssembly>true</SignAssembly>
|
||||
<AssemblyOriginatorKeyFile>..\..\src\Ben.Demystifier\key.snk</AssemblyOriginatorKeyFile>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.ValueTuple" Version="4.4.0" />
|
||||
<PackageReference Include="xunit" Version="2.3.1" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
|
||||
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -44,6 +44,7 @@ namespace Ben.Demystifier.Test
|
||||
s != " at void System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, object state)" &&
|
||||
s != " at Task Ben.Demystifier.Test.DynamicCompilation.DoesNotPreventStackTrace()+() => { }"
|
||||
)
|
||||
.Select(s => Regex.Replace(s, "lambda_method[0-9]+\\(", "lambda_method("))
|
||||
.ToArray();
|
||||
|
||||
Assert.Equal(
|
||||
|
||||
@ -31,13 +31,24 @@ namespace Ben.Demystifier.Test
|
||||
stackTrace = LineEndingsHelper.RemoveLineEndings(stackTrace);
|
||||
var trace = stackTrace.Split(new[]{Environment.NewLine}, StringSplitOptions.None);
|
||||
|
||||
#if NETCOREAPP3_1 || NET5_0
|
||||
Assert.Equal(
|
||||
new[] {
|
||||
"System.Exception: Exception of type 'System.Exception' was thrown. ---> System.Exception: Exception of type 'System.Exception' was thrown.",
|
||||
"System.Exception: Exception of type 'System.Exception' was thrown.",
|
||||
" ---> System.Exception: Exception of type 'System.Exception' was thrown.",
|
||||
" at Task Ben.Demystifier.Test.NonThrownException.DoesNotPreventThrowStackTrace()+() => { }",
|
||||
" at async Task Ben.Demystifier.Test.NonThrownException.DoesNotPreventThrowStackTrace()",
|
||||
" --- End of inner exception stack trace ---"},
|
||||
trace);
|
||||
#else
|
||||
Assert.Equal(
|
||||
new[] {
|
||||
"System.Exception: Exception of type 'System.Exception' was thrown. ---> System.Exception: Exception of type 'System.Exception' was thrown.",
|
||||
" at Task Ben.Demystifier.Test.NonThrownException.DoesNotPreventThrowStackTrace()+() => { }",
|
||||
" at async Task Ben.Demystifier.Test.NonThrownException.DoesNotPreventThrowStackTrace()",
|
||||
" --- End of inner exception stack trace ---"},
|
||||
trace);
|
||||
#endif
|
||||
|
||||
// Act
|
||||
try
|
||||
@ -54,6 +65,18 @@ namespace Ben.Demystifier.Test
|
||||
stackTrace = LineEndingsHelper.RemoveLineEndings(stackTrace);
|
||||
trace = stackTrace.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
|
||||
|
||||
#if NETCOREAPP3_1 || NET5_0
|
||||
Assert.Equal(
|
||||
new[] {
|
||||
"System.Exception: Exception of type 'System.Exception' was thrown.",
|
||||
" ---> System.Exception: Exception of type 'System.Exception' was thrown.",
|
||||
" at Task Ben.Demystifier.Test.NonThrownException.DoesNotPreventThrowStackTrace()+() => { }",
|
||||
" at async Task Ben.Demystifier.Test.NonThrownException.DoesNotPreventThrowStackTrace()",
|
||||
" --- End of inner exception stack trace ---",
|
||||
" at async Task Ben.Demystifier.Test.NonThrownException.DoesNotPreventThrowStackTrace()"
|
||||
},
|
||||
trace);
|
||||
#else
|
||||
Assert.Equal(
|
||||
new[] {
|
||||
"System.Exception: Exception of type 'System.Exception' was thrown. ---> System.Exception: Exception of type 'System.Exception' was thrown.",
|
||||
@ -63,6 +86,7 @@ namespace Ben.Demystifier.Test
|
||||
" at async Task Ben.Demystifier.Test.NonThrownException.DoesNotPreventThrowStackTrace()"
|
||||
},
|
||||
trace);
|
||||
#endif
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
29
test/Ben.Demystifier.Test/TypeNameTests.cs
Normal file
29
test/Ben.Demystifier.Test/TypeNameTests.cs
Normal file
@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using Xunit;
|
||||
|
||||
namespace Ben.Demystifier.Test
|
||||
{
|
||||
public class TypeNameTests
|
||||
{
|
||||
[Fact]
|
||||
public void NestedGenericTypes()
|
||||
{
|
||||
try
|
||||
{
|
||||
Throw(new Generic<(int, string)>.Nested());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var text = ex.ToStringDemystified();
|
||||
}
|
||||
}
|
||||
|
||||
public void Throw(Generic<(int a, string b)>.Nested nested)
|
||||
{
|
||||
throw null;
|
||||
}
|
||||
}
|
||||
|
||||
public class Generic<T> { public struct Nested { } }
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "0.1.4",
|
||||
"version": "0.2.0",
|
||||
"publicReleaseRefSpec": [
|
||||
"^refs/heads/master$", // we release out of master
|
||||
"^refs/heads/dev$", // we release out of develop
|
||||
|
||||
Loading…
Reference in New Issue
Block a user