Skip to content

Commit

Permalink
feat: annotate ReferenceResolver as aot compatible
Browse files Browse the repository at this point in the history
  • Loading branch information
WeihanLi committed Dec 6, 2024
1 parent 7016ff1 commit 23484c3
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 19 deletions.
2 changes: 2 additions & 0 deletions src/ReferenceResolver/AnalyzerReferenceLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ private AnalyzerAssemblyLoader()

public Assembly LoadFromPath(string fullPath)
{
#pragma warning disable IL2026
return Assembly.LoadFrom(fullPath);

Check warning on line 20 in src/ReferenceResolver/AnalyzerReferenceLoader.cs

View workflow job for this annotation

GitHub Actions / windows-build

Replace this call to 'Assembly.LoadFrom' with 'Assembly.Load'. (https://rules.sonarsource.com/csharp/RSPEC-3885)
#pragma warning restore IL2026
}

public void AddDependencyLocation(string fullPath)
Expand Down
22 changes: 11 additions & 11 deletions src/ReferenceResolver/DependencyInjectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using System.Diagnostics.CodeAnalysis;

namespace ReferenceResolver;

Expand All @@ -13,24 +14,23 @@ public static IServiceCollection AddReferenceResolvers(this IServiceCollection s
ArgumentNullException.ThrowIfNull(serviceCollection);
serviceCollection.AddLogging();
serviceCollection.TryAddSingleton<INuGetHelper, NuGetHelper>();
// reference resolver
// reference resolvers
serviceCollection.TryAddSingleton<IReferenceResolverFactory, ReferenceResolverFactory>();
serviceCollection
.TryAddReferenceResolver<FileReferenceResolver>()
.TryAddReferenceResolver<FolderReferenceResolver>()
.TryAddReferenceResolver<FrameworkReferenceResolver>()
.TryAddReferenceResolver<NuGetReferenceResolver>()
.TryAddReferenceResolver<ProjectReferenceResolver>()
;
serviceCollection.TryAddReferenceResolver<FileReferenceResolver>(ReferenceType.LocalFile);
serviceCollection.TryAddReferenceResolver<FolderReferenceResolver>(ReferenceType.LocalFolder);
serviceCollection.TryAddReferenceResolver<FrameworkReferenceResolver>(ReferenceType.FrameworkReference);
serviceCollection.TryAddReferenceResolver<ProjectReferenceResolver>(ReferenceType.ProjectReference);
serviceCollection.TryAddReferenceResolver<NuGetReferenceResolver>(ReferenceType.NuGetPackage);
return serviceCollection;
}

public static IServiceCollection TryAddReferenceResolver<TResolver>(this IServiceCollection serviceCollection)
private static IServiceCollection TryAddReferenceResolver
<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TResolver>
(this IServiceCollection serviceCollection, ReferenceType referenceType)
where TResolver : class, IReferenceResolver
{
ArgumentNullException.ThrowIfNull(serviceCollection);
serviceCollection.TryAddSingleton<TResolver>();
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<IReferenceResolver, TResolver>());
serviceCollection.AddKeyedSingleton<IReferenceResolver, TResolver>(referenceType.ToString());
return serviceCollection;
}
}
1 change: 1 addition & 0 deletions src/ReferenceResolver/ReferenceResolver.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<!-- https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu5104 -->
<NoWarn>$(NoWarn);NU5104</NoWarn>
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
<ItemGroup>
<None Include="README.md" Pack="true" Visible="false" PackagePath="" />
Expand Down
17 changes: 13 additions & 4 deletions src/ReferenceResolver/ReferenceResolverFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,23 @@ public static IReference ParseReference(string referenceWithSchema)

public IReferenceResolver GetResolver(ReferenceType referenceType)
{
if (_serviceProvider is IKeyedServiceProvider keyedServiceProvider)
{
var referenceResolver = keyedServiceProvider.GetKeyedService<IReferenceResolver>(referenceType.ToString());
if (referenceResolver is not null)
{
return referenceResolver;
}
}

return referenceType switch
{
ReferenceType.LocalFile => _serviceProvider.GetServiceOrCreateInstance<FileReferenceResolver>(),
ReferenceType.LocalFolder => _serviceProvider.GetServiceOrCreateInstance<FolderReferenceResolver>(),
ReferenceType.LocalFile => ActivatorUtilities.GetServiceOrCreateInstance<FileReferenceResolver>(_serviceProvider),
ReferenceType.LocalFolder => ActivatorUtilities.GetServiceOrCreateInstance<FolderReferenceResolver>(_serviceProvider),
ReferenceType.NuGetPackage => _serviceProvider.GetService<NuGetReferenceResolver>() ?? new NuGetReferenceResolver(new NuGetHelper(NullLoggerFactory.Instance)),
ReferenceType.FrameworkReference =>
_serviceProvider.GetServiceOrCreateInstance<FrameworkReferenceResolver>(),
ReferenceType.ProjectReference => _serviceProvider.GetServiceOrCreateInstance<ProjectReferenceResolver>(),
ActivatorUtilities.GetServiceOrCreateInstance<FrameworkReferenceResolver>(_serviceProvider),
ReferenceType.ProjectReference => ActivatorUtilities.GetServiceOrCreateInstance<ProjectReferenceResolver>(_serviceProvider),
_ => throw new ArgumentOutOfRangeException(nameof(referenceType))
};
}
Expand Down
13 changes: 9 additions & 4 deletions tests/IntegrationTest/ReferenceResolverExtensionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,16 @@ namespace IntegrationTest;

public class ReferenceResolverExtensionsTests(IServiceProvider serviceProvider)
{
[Fact]
public void ResolversRegisterTest()
[Theory]
[InlineData(ReferenceType.LocalFile)]
[InlineData(ReferenceType.LocalFolder)]
[InlineData(ReferenceType.ProjectReference)]
[InlineData(ReferenceType.FrameworkReference)]
[InlineData(ReferenceType.NuGetPackage)]
public void ResolversResolveTest(ReferenceType referenceType)
{
var resolvers = serviceProvider.GetServices<IReferenceResolver>().ToArray();
Assert.Equal(5, resolvers.Length);
var resolver = serviceProvider.GetKeyedService<IReferenceResolver>(referenceType.ToString());
Assert.NotNull(resolver);
}

[Fact]
Expand Down

0 comments on commit 23484c3

Please sign in to comment.