diff --git a/src/AspectCore.SourceGenerator/AnalyzerReleases.Shipped.md b/src/AspectCore.SourceGenerator/AnalyzerReleases.Shipped.md new file mode 100644 index 00000000..f50bb1fe --- /dev/null +++ b/src/AspectCore.SourceGenerator/AnalyzerReleases.Shipped.md @@ -0,0 +1,2 @@ +; Shipped analyzer releases +; https://github.com/dotnet/roslyn-analyzers/blob/main/src/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md diff --git a/src/AspectCore.SourceGenerator/AnalyzerReleases.Unshipped.md b/src/AspectCore.SourceGenerator/AnalyzerReleases.Unshipped.md new file mode 100644 index 00000000..cbee49a0 --- /dev/null +++ b/src/AspectCore.SourceGenerator/AnalyzerReleases.Unshipped.md @@ -0,0 +1,19 @@ +; Unshipped analyzer release +; https://github.com/dotnet/roslyn-analyzers/blob/main/src/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md + +### New Rules + +Rule ID | Category | Severity | Notes +--------|----------|----------|------- +ACSG001 | AspectCore.SourceGenerator | Warning | Open generic type is not supported for proxy generation. +ACSG002 | AspectCore.SourceGenerator | Warning | Nested type is not supported for proxy generation. +ACSG003 | AspectCore.SourceGenerator | Warning | Event member is not supported for proxy generation. +ACSG004 | AspectCore.SourceGenerator | Warning | Open generic method is not supported for proxy generation. +ACSG005 | AspectCore.SourceGenerator | Error | Cannot generate a proxy for a sealed type. +ACSG006 | AspectCore.SourceGenerator | Error | Type is not accessible to the source generator. +ACSG007 | AspectCore.SourceGenerator | Error | Type has no accessible constructor for a class proxy. +ACSG008 | AspectCore.SourceGenerator | Error | Cannot generate a proxy for a ref struct type. +ACSG009 | AspectCore.SourceGenerator | Warning | byref-like params parameter is not supported for proxy generation. +ACSG010 | AspectCore.SourceGenerator | Warning | byref-like parameter is not supported for proxy generation. +ACSG011 | AspectCore.SourceGenerator | Warning | byref-like return value is not supported for proxy generation. +ACSG0101 | AspectCore.SourceGenerator | Warning | Open generic method falls back to reflection for NativeAOT. diff --git a/src/AspectCore.SourceGenerator/AspectCore.SourceGenerator.csproj b/src/AspectCore.SourceGenerator/AspectCore.SourceGenerator.csproj index 22f34451..3fbad0e2 100644 --- a/src/AspectCore.SourceGenerator/AspectCore.SourceGenerator.csproj +++ b/src/AspectCore.SourceGenerator/AspectCore.SourceGenerator.csproj @@ -31,5 +31,10 @@ + + + + + diff --git a/tests/AspectCore.Core.Tests/DependencyInjection/IssueFixTests.cs b/tests/AspectCore.Core.Tests/DependencyInjection/IssueFixTests.cs index 795d17d6..9df28d95 100644 --- a/tests/AspectCore.Core.Tests/DependencyInjection/IssueFixTests.cs +++ b/tests/AspectCore.Core.Tests/DependencyInjection/IssueFixTests.cs @@ -96,7 +96,7 @@ public void Issue331_ResolveFromServiceResolver_AfterExtraRegistration_StillRetu #region Issue #271: Singleton concurrent construction returns same instance [Fact] - public void Issue271_Singleton_ConcurrentResolution_ReturnsSameInstance() + public async Task Issue271_Singleton_ConcurrentResolution_ReturnsSameInstance() { // Arrange: a singleton service with a slow constructor var context = new ServiceContext(); @@ -126,7 +126,7 @@ public void Issue271_Singleton_ConcurrentResolution_ReturnsSameInstance() results[index] = resolver.Resolve(typeof(ISlowSingletonService)); }); } - Task.WaitAll(tasks); + await Task.WhenAll(tasks); // Assert: all threads should get the same instance var firstResult = results[0]; diff --git a/tests/AspectCore.Extensions.CastleCompat.Tests/AspectContextInvocationAdapterTests.cs b/tests/AspectCore.Extensions.CastleCompat.Tests/AspectContextInvocationAdapterTests.cs index c410e91e..dd277d2a 100644 --- a/tests/AspectCore.Extensions.CastleCompat.Tests/AspectContextInvocationAdapterTests.cs +++ b/tests/AspectCore.Extensions.CastleCompat.Tests/AspectContextInvocationAdapterTests.cs @@ -242,7 +242,7 @@ public void Proxy_Returns_Context_Proxy() } [Fact] - public void ReturnValue_Get_Returns_Context_ReturnValue() + public async Task ReturnValue_Get_Returns_Context_ReturnValue() { var context = CreateRealAspectContext(out _); // The context has ReturnValue=30 from the backing invocation @@ -255,13 +255,13 @@ public void ReturnValue_Get_Returns_Context_ReturnValue() // Don't proceed - just read ReturnValue }); var adapter = new CastleInterceptorAdapter(castleInterceptor); - adapter.Invoke(context, next).GetAwaiter().GetResult(); + await adapter.Invoke(context, next); Assert.Equal(30, captured.ReturnValue); } [Fact] - public void ReturnValue_Set_Updates_Context_ReturnValue() + public async Task ReturnValue_Set_Updates_Context_ReturnValue() { var context = CreateRealAspectContext(out _); AspectDelegate next = ctx => Task.CompletedTask; @@ -273,7 +273,7 @@ public void ReturnValue_Set_Updates_Context_ReturnValue() inv.ReturnValue = 99; }); var adapter = new CastleInterceptorAdapter(castleInterceptor); - adapter.Invoke(context, next).GetAwaiter().GetResult(); + await adapter.Invoke(context, next); Assert.Equal(99, context.ReturnValue); } @@ -387,7 +387,7 @@ public void Proceed_Calls_Next_Delegate() } [Fact] - public void Proceed_Called_Twice_Throws_InvalidOperationException() + public async Task Proceed_Called_Twice_Throws_InvalidOperationException() { var context = CreateRealAspectContext(out _); AspectDelegate next = ctx => Task.CompletedTask; @@ -398,11 +398,11 @@ public void Proceed_Called_Twice_Throws_InvalidOperationException() Assert.Throws(() => inv.Proceed()); }); var adapter = new CastleInterceptorAdapter(castleInterceptor); - adapter.Invoke(context, next).GetAwaiter().GetResult(); + await adapter.Invoke(context, next); } [Fact] - public void Proceed_Synchronous_Faulted_Task_Propagates_Exception() + public async Task Proceed_Synchronous_Faulted_Task_Propagates_Exception() { var context = CreateRealAspectContext(out _); AspectDelegate next = _ => Task.FromException(new InvalidOperationException("test error")); @@ -412,7 +412,7 @@ public void Proceed_Synchronous_Faulted_Task_Propagates_Exception() Assert.Throws(() => inv.Proceed()); }); var adapter = new CastleInterceptorAdapter(castleInterceptor); - adapter.Invoke(context, next).GetAwaiter().GetResult(); + await adapter.Invoke(context, next); } [Fact] @@ -456,7 +456,7 @@ public void CastleInterceptorAdapter_No_AsyncResult_Returns_CompletedTask() // ── CaptureProceedInfo Tests ──────────────────────────────────────── [Fact] - public void CaptureProceedInfo_Invoke_Calls_Proceed() + public async Task CaptureProceedInfo_Invoke_Calls_Proceed() { var context = CreateRealAspectContext(out _); var nextCalled = false; @@ -472,13 +472,13 @@ public void CaptureProceedInfo_Invoke_Calls_Proceed() info.Invoke(); }); var adapter = new CastleInterceptorAdapter(castleInterceptor); - adapter.Invoke(context, next).GetAwaiter().GetResult(); + await adapter.Invoke(context, next); Assert.True(nextCalled); } [Fact] - public void CaptureProceedInfo_Double_Invoke_Throws() + public async Task CaptureProceedInfo_Double_Invoke_Throws() { var context = CreateRealAspectContext(out _); AspectDelegate next = ctx => Task.CompletedTask; @@ -490,7 +490,7 @@ public void CaptureProceedInfo_Double_Invoke_Throws() Assert.Throws(() => info.Invoke()); }); var adapter = new CastleInterceptorAdapter(castleInterceptor); - adapter.Invoke(context, next).GetAwaiter().GetResult(); + await adapter.Invoke(context, next); } // ── CastleInterceptorAdapter Constructor Tests ──────────────────────