From ee741d440e2ccbe9f17c0e0772150a69326c50ed Mon Sep 17 00:00:00 2001 From: David Driscoll Date: Wed, 27 Nov 2024 13:28:39 -0500 Subject: [PATCH] Fix/bug with generation (#1340) * maybe test results?!? (#1339) * Automatically linting code --------- Co-authored-by: Rocket Understudy <33589210+rsg-bot@users.noreply.github.com> --- .../AssemblyProviders/StatementGeneration.cs | 2 +- .../StatementGeneration.cs | 43 +++------- ...es#Compiled_AssemblyProvider.g.verified.cs | 2 +- ...le_Private_Open_Generic_Types.verified.txt | 47 +++-------- ...es#Compiled_AssemblyProvider.g.verified.cs | 4 +- ...dle_Public_Open_Generic_Types.verified.txt | 79 +++---------------- 6 files changed, 42 insertions(+), 135 deletions(-) diff --git a/src/DependencyInjection.Analyzers/AssemblyProviders/StatementGeneration.cs b/src/DependencyInjection.Analyzers/AssemblyProviders/StatementGeneration.cs index 6bfda1e4f..c7ca3fc86 100644 --- a/src/DependencyInjection.Analyzers/AssemblyProviders/StatementGeneration.cs +++ b/src/DependencyInjection.Analyzers/AssemblyProviders/StatementGeneration.cs @@ -1 +1 @@ -namespace Rocket.Surgery.DependencyInjection.Analyzers.AssemblyProviders; +namespace Rocket.Surgery.DependencyInjection.Analyzers.AssemblyProviders; diff --git a/src/DependencyInjection.Analyzers/StatementGeneration.cs b/src/DependencyInjection.Analyzers/StatementGeneration.cs index 73023adcf..c48f23fb0 100644 --- a/src/DependencyInjection.Analyzers/StatementGeneration.cs +++ b/src/DependencyInjection.Analyzers/StatementGeneration.cs @@ -101,49 +101,30 @@ string lifetime ) { var isServiceTypeAccessible = compilation.IsSymbolAccessibleWithin(serviceType, compilation.Assembly); - var isImplementationTypeAccessible = compilation.IsSymbolAccessibleWithin(implementationType, compilation.Assembly); - return ( isServiceTypeAccessible, serviceTypeExpression, isImplementationTypeAccessible, implementationTypeExpression ) - switch + return ( isServiceTypeAccessible, serviceTypeExpression, implementationTypeExpression ) switch { - (true, TypeOfExpressionSyntax serviceTypeOfExpression, true, TypeOfExpressionSyntax implementationTypeOfExpression) - when serviceType is { IsUnboundGenericType: false } && implementationType is { IsUnboundGenericType: false } => InvocationExpression( + (true, TypeOfExpressionSyntax { Type: { } serviceTypeSyntax }, TypeOfExpressionSyntax { Type: { } implementationTypeSyntax }) + when !IsOpenGenericType(serviceType) + && !IsOpenGenericType(implementationType) + && compilation.IsSymbolAccessibleWithin(implementationType, compilation.Assembly) + => InvocationExpression( MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName("ServiceDescriptor"), GenericName(lifetime) - .WithTypeArgumentList( - TypeArgumentList( - SeparatedList( - [ - serviceTypeOfExpression.Type, - implementationTypeOfExpression.Type, - ] - ) - ) - ) + .WithTypeArgumentList(TypeArgumentList(SeparatedList([serviceTypeSyntax, implementationTypeSyntax]))) ) ), - (true, TypeOfExpressionSyntax - { - Type: not GenericNameSyntax { IsUnboundGenericName: true }, - } serviceTypeOfExpression, _, not TypeOfExpressionSyntax) - when serviceType is { IsUnboundGenericType: false } => InvocationExpression( + (true, TypeOfExpressionSyntax { Type: { } serviceTypeSyntax }, not TypeOfExpressionSyntax) + when !IsOpenGenericType(serviceType) => + InvocationExpression( MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName("ServiceDescriptor"), - GenericName(lifetime) - .WithTypeArgumentList(TypeArgumentList(SeparatedList([serviceTypeOfExpression.Type]))) + GenericName(lifetime).WithTypeArgumentList(TypeArgumentList(SeparatedList([serviceTypeSyntax]))) ) ) - .WithArgumentList( - ArgumentList( - SeparatedList( - [ - Argument(implementationTypeExpression), - ] - ) - ) - ), + .WithArgumentList(ArgumentList(SeparatedList([Argument(implementationTypeExpression)]))), _ => InvocationExpression( MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName("ServiceDescriptor"), IdentifierName(lifetime)) ) diff --git a/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Private_Open_Generic_Types#Compiled_AssemblyProvider.g.verified.cs b/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Private_Open_Generic_Types#Compiled_AssemblyProvider.g.verified.cs index 490f2e8bb..a0ada6ad1 100644 --- a/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Private_Open_Generic_Types#Compiled_AssemblyProvider.g.verified.cs +++ b/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Private_Open_Generic_Types#Compiled_AssemblyProvider.g.verified.cs @@ -31,7 +31,7 @@ Microsoft.Extensions.DependencyInjection.IServiceCollection ICompiledTypeProvide // FilePath: Input0.cs Expression: jwpZbvlWPFRLk7VHxDXpyQ== case 12: services.Add(ServiceDescriptor.Scoped(RootDependencyProject.GetType("RootDependencyProject.Service`1"), RootDependencyProject.GetType("RootDependencyProject.Service`1"))); - services.Add(ServiceDescriptor.Scoped>(RootDependencyProject.GetType("RootDependencyProject.Service`1"))); + services.Add(ServiceDescriptor.Scoped(typeof(global::RootDependencyProject.IService<>), RootDependencyProject.GetType("RootDependencyProject.Service`1"))); break; } diff --git a/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Private_Open_Generic_Types.verified.txt b/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Private_Open_Generic_Types.verified.txt index 9835ca864..3636c9cd1 100644 --- a/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Private_Open_Generic_Types.verified.txt +++ b/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Private_Open_Generic_Types.verified.txt @@ -1,38 +1,5 @@ { - FinalDiagnostics: [ - { - Id: CS7003, - Title: , - Severity: Error, - WarningLevel: 0, - Location: Rocket.Surgery.DependencyInjection.Analyzers/Rocket.Surgery.DependencyInjection.Analyzers.CompiledServiceScanningGenerator/Compiled_AssemblyProvider.g.cs: (32,84)-(32,94), - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS7003), - MessageFormat: Unexpected use of an unbound generic name, - Message: Unexpected use of an unbound generic name, - Category: Compiler, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - }, - { - Id: CS1503, - Title: , - Severity: Error, - WarningLevel: 0, - Location: Rocket.Surgery.DependencyInjection.Analyzers/Rocket.Surgery.DependencyInjection.Analyzers.CompiledServiceScanningGenerator/Compiled_AssemblyProvider.g.cs: (32,96)-(32,160), - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS1503), - MessageFormat: Argument {0}: cannot convert from '{1}' to '{2}', - Message: Argument 1: cannot convert from 'System.Type' to 'System.Func>', - Category: Compiler, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - ], + FinalDiagnostics: [], GeneratorDiagnostics: { Rocket.Surgery.DependencyInjection.Analyzers.CompiledServiceScanningGenerator: [] }, @@ -47,5 +14,17 @@ System.dll, System.Private.CoreLib.dll, System.Runtime.dll + ], + Services: [ + { + Lifetime: Scoped, + ServiceType: RootDependencyProject.Service`1, + ImplementationType: RootDependencyProject.Service`1 + }, + { + Lifetime: Scoped, + ServiceType: RootDependencyProject.IService`1, + ImplementationType: RootDependencyProject.Service`1 + } ] } \ No newline at end of file diff --git a/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Public_Open_Generic_Types#Compiled_AssemblyProvider.g.verified.cs b/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Public_Open_Generic_Types#Compiled_AssemblyProvider.g.verified.cs index dce948de7..638eebf15 100644 --- a/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Public_Open_Generic_Types#Compiled_AssemblyProvider.g.verified.cs +++ b/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Public_Open_Generic_Types#Compiled_AssemblyProvider.g.verified.cs @@ -29,8 +29,8 @@ Microsoft.Extensions.DependencyInjection.IServiceCollection ICompiledTypeProvide { // FilePath: Input0.cs Expression: moR0aszucgKYmnqmVn/i6g== case 21: - services.Add(ServiceDescriptor.Scoped, global::Service<>>()); - services.Add(ServiceDescriptor.Scoped, global::Service<>>()); + services.Add(ServiceDescriptor.Scoped(typeof(global::Service<>), typeof(global::Service<>))); + services.Add(ServiceDescriptor.Scoped(typeof(global::IService<>), typeof(global::Service<>))); break; } diff --git a/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Public_Open_Generic_Types.verified.txt b/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Public_Open_Generic_Types.verified.txt index 7886d7935..c9f8657fb 100644 --- a/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Public_Open_Generic_Types.verified.txt +++ b/test/DependencyInjection.Analyzers.Tests/snapshots/StaticScanningTests.Should_Handle_Public_Open_Generic_Types.verified.txt @@ -1,70 +1,5 @@ { - FinalDiagnostics: [ - { - Id: CS7003, - Title: , - Severity: Error, - WarningLevel: 0, - Location: Rocket.Surgery.DependencyInjection.Analyzers/Rocket.Surgery.DependencyInjection.Analyzers.CompiledServiceScanningGenerator/Compiled_AssemblyProvider.g.cs: (30,62)-(30,71), - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS7003), - MessageFormat: Unexpected use of an unbound generic name, - Message: Unexpected use of an unbound generic name, - Category: Compiler, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - }, - { - Id: CS7003, - Title: , - Severity: Error, - WarningLevel: 0, - Location: Rocket.Surgery.DependencyInjection.Analyzers/Rocket.Surgery.DependencyInjection.Analyzers.CompiledServiceScanningGenerator/Compiled_AssemblyProvider.g.cs: (30,81)-(30,90), - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS7003), - MessageFormat: Unexpected use of an unbound generic name, - Message: Unexpected use of an unbound generic name, - Category: Compiler, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - }, - { - Id: CS7003, - Title: , - Severity: Error, - WarningLevel: 0, - Location: Rocket.Surgery.DependencyInjection.Analyzers/Rocket.Surgery.DependencyInjection.Analyzers.CompiledServiceScanningGenerator/Compiled_AssemblyProvider.g.cs: (31,62)-(31,72), - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS7003), - MessageFormat: Unexpected use of an unbound generic name, - Message: Unexpected use of an unbound generic name, - Category: Compiler, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - }, - { - Id: CS7003, - Title: , - Severity: Error, - WarningLevel: 0, - Location: Rocket.Surgery.DependencyInjection.Analyzers/Rocket.Surgery.DependencyInjection.Analyzers.CompiledServiceScanningGenerator/Compiled_AssemblyProvider.g.cs: (31,82)-(31,91), - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS7003), - MessageFormat: Unexpected use of an unbound generic name, - Message: Unexpected use of an unbound generic name, - Category: Compiler, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - ], + FinalDiagnostics: [], GeneratorDiagnostics: { Rocket.Surgery.DependencyInjection.Analyzers.CompiledServiceScanningGenerator: [] }, @@ -78,5 +13,17 @@ System.dll, System.Private.CoreLib.dll, System.Runtime.dll + ], + Services: [ + { + Lifetime: Scoped, + ServiceType: Service`1, + ImplementationType: Service`1 + }, + { + Lifetime: Scoped, + ServiceType: IService`1, + ImplementationType: Service`1 + } ] } \ No newline at end of file