Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 14 additions & 14 deletions Extensions.sln
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DependencyInjection.Analyze
.editorconfig = src\DependencyInjection.Analyzers.roslyn4.8\.editorconfig
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAssembly", "TestAssembly\TestAssembly.csproj", "{02AB8A28-1BD2-4299-8CBE-760F946399B3}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAssembly", "test\TestAssembly\TestAssembly.csproj", "{969DF33E-A749-463F-AA14-3DE3F7E2F039}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -355,18 +355,18 @@ Global
{F5F65F73-DF54-4536-B9EC-1DBB08BF2876}.Release|x64.Build.0 = Release|Any CPU
{F5F65F73-DF54-4536-B9EC-1DBB08BF2876}.Release|x86.ActiveCfg = Release|Any CPU
{F5F65F73-DF54-4536-B9EC-1DBB08BF2876}.Release|x86.Build.0 = Release|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Debug|x64.ActiveCfg = Debug|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Debug|x64.Build.0 = Debug|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Debug|x86.ActiveCfg = Debug|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Debug|x86.Build.0 = Debug|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Release|Any CPU.Build.0 = Release|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Release|x64.ActiveCfg = Release|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Release|x64.Build.0 = Release|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Release|x86.ActiveCfg = Release|Any CPU
{02AB8A28-1BD2-4299-8CBE-760F946399B3}.Release|x86.Build.0 = Release|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Debug|Any CPU.Build.0 = Debug|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Debug|x64.ActiveCfg = Debug|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Debug|x64.Build.0 = Debug|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Debug|x86.ActiveCfg = Debug|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Debug|x86.Build.0 = Debug|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Release|Any CPU.ActiveCfg = Release|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Release|Any CPU.Build.0 = Release|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Release|x64.ActiveCfg = Release|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Release|x64.Build.0 = Release|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Release|x86.ActiveCfg = Release|Any CPU
{969DF33E-A749-463F-AA14-3DE3F7E2F039}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -397,7 +397,7 @@ Global
{F5F65F73-DF54-4536-B9EC-1DBB08BF2876} = {8FFDF555-DB50-45F9-9A2D-6410F39151C3}
{F1A11F3E-FA52-4502-8241-F71F0C6DF799} = {8FFDF555-DB50-45F9-9A2D-6410F39151C3}
{B7007E5D-3899-442C-8D3A-98907EB4BC41} = {8FFDF555-DB50-45F9-9A2D-6410F39151C3}
{02AB8A28-1BD2-4299-8CBE-760F946399B3} = {DF33E0FB-9790-4654-B60F-8AB22E0CC3D1}
{969DF33E-A749-463F-AA14-3DE3F7E2F039} = {DF33E0FB-9790-4654-B60F-8AB22E0CC3D1}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {439897C2-CCBD-44FE-B2DC-A3E4670ADA59}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
assemblySymbols,
reflectionRequests,
serviceDescriptorRequests,
privateAssemblies,
diagnostics
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ private static string GetCacheFileHash(SourceLocation location, IAssemblySymbol
var cacheKey = $"{kind}-{GetCacheFileHash(location, assemblySymbol)}{Constants.PartialExtension}";
if (partial.TryGetValue(cacheKey, out var text))
{
return new ResolvedSourceLocation(location, text.Expression, [..text.PrivateAssemblies]);
return new(location, text.Expression, [..text.PrivateAssemblies]);
}

var source = factory();
Expand All @@ -76,7 +76,6 @@ ImmutableList<ResolvedSourceLocation> ServiceDescriptorSources
ImmutableDictionary<string, IAssemblySymbol> assemblySymbols,
ImmutableList<ReflectionCollection.Item> reflectionRequests,
ImmutableList<ServiceDescriptorCollection.Item> serviceDescriptorRequests,
HashSet<IAssemblySymbol> globalPrivateAssemblies,
HashSet<Diagnostic> globalDiagnostics
)
{
Expand Down Expand Up @@ -182,7 +181,7 @@ private void GetAssemblyData(
ImmutableDictionary<string, IAssemblySymbol> assemblySymbols
)
{
var skipKey = assembly.MetadataName + Constants.SkipExtension;
var skipKey = (assembly.MetadataName + Constants.SkipExtension);
if (skip.Contains(skipKey))
{
assemblyItems = [];
Expand All @@ -191,7 +190,7 @@ ImmutableDictionary<string, IAssemblySymbol> assemblySymbols
return;
}

var cacheKey = assembly.MetadataName + Constants.AssemblyJsonExtension;
var cacheKey = (assembly.MetadataName + Constants.AssemblyJsonExtension);
if (generatedJson.TryGetValue(cacheKey, out var generatedData))
{
assemblyItems = generatedData.InternalAssemblyRequests.Select(z => GetAssembliesFromData(assemblySymbols, z)).ToImmutableList();
Expand All @@ -201,7 +200,6 @@ ImmutableDictionary<string, IAssemblySymbol> assemblySymbols
return;
}

var assemblyAssemblySourcesBuilder = ImmutableList.CreateBuilder<ResolvedSourceLocation>();
var assemblyBuilder = ImmutableList.CreateBuilder<AssemblyCollection.Item>();
var reflectionBuilder = ImmutableList.CreateBuilder<ReflectionCollection.Item>();
var serviceDescriptorBuilder = ImmutableList.CreateBuilder<ServiceDescriptorCollection.Item>();
Expand All @@ -218,13 +216,6 @@ ImmutableDictionary<string, IAssemblySymbol> assemblySymbols
{
{
var data = GetAssembliesFromString(assemblySymbols, getAssembliesData);
var source = CacheSourceLocation(
data.Location,
assembly,
SourceLocationKind.Assemby,
() => AssemblyCollection.ResolveSources(compilation, [], [data]).SingleOrDefault()
);
if (source is { }) assemblyAssemblySourcesBuilder.Add(source);
assemblyBuilder.Add(data);
}
break;
Expand Down
1 change: 0 additions & 1 deletion src/DependencyInjection.Analyzers/ReflectionCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,6 @@ CancellationToken cancellationToken
var assemblyFilter = new CompiledAssemblyFilter([.. assemblies], source);
var typeFilter = new CompiledTypeFilter(classFilter, [.. typeFilters], source);


var i = new Item(source, assemblyFilter, typeFilter);
items.Add(i);
}
Expand Down
26 changes: 18 additions & 8 deletions test/DependencyInjection.Analyzers.Tests/AssemblyScanningTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public partial class AssemblyScanningTests : GeneratorTest
private string DebuggerDisplay => ToString();

[Test]
[Retry(3)]
[MethodDataSource(typeof(TestData), nameof(TestData.GetTestData))]
public async Task Should_Generate_All_The_Things(TestSource item)
{
Expand All @@ -27,10 +28,12 @@ public async Task Should_Generate_All_The_Things(TestSource item)
await Verify(result.AddCacheFiles())
.AddScrubber(z => z.Replace(item.GetTempDirectory(), "{TempPath}"))
.UseParameters(item.Name)
.HashParameters();
.HashParameters()
.DisableRequireUniquePrefix();
}

[Test]
[Retry(3)]
[DependsOn(nameof(Should_Generate_All_The_Things), ProceedOnFailure = true)]
[MethodDataSource(typeof(TestData), nameof(TestData.GetTestData))]
public async Task Should_Generate_All_The_Things_Using_Cache(TestSource item)
Expand All @@ -45,11 +48,12 @@ public async Task Should_Generate_All_The_Things_Using_Cache(TestSource item)
await Verify(result.AddCacheFiles())
.AddScrubber(z => z.Replace(item.GetTempDirectory(), "{TempPath}"))
.UseParameters(item.Name)
.HashParameters();
.HashParameters()
.DisableRequireUniquePrefix();
}


[Test]
[Retry(3)]
[MethodDataSource(typeof(TestData), nameof(TestData.GetTestData))]
public async Task Should_Generate_All_The_Things_From_Another_Assembly(TestSource item)
{
Expand All @@ -75,10 +79,12 @@ public async Task Should_Generate_All_The_Things_From_Another_Assembly(TestSourc
await Verify(result.AddCacheFiles())
.AddScrubber(z => z.Replace(item.GetTempDirectory(), "{TempPath}"))
.UseParameters(item.Name)
.HashParameters();
.HashParameters()
.DisableRequireUniquePrefix();
}

[Test]
[Retry(3)]
[DependsOn(nameof(Should_Generate_All_The_Things_From_Another_Assembly), ProceedOnFailure = true)]
[MethodDataSource(typeof(TestData), nameof(TestData.GetTestData))]
public async Task Should_Generate_All_The_Things_From_Another_Assembly_Using_Cache(TestSource item)
Expand All @@ -105,11 +111,12 @@ public async Task Should_Generate_All_The_Things_From_Another_Assembly_Using_Cac
await Verify(result.AddCacheFiles())
.AddScrubber(z => z.Replace(item.GetTempDirectory(), "{TempPath}"))
.UseParameters(item.Name)
.HashParameters();
.HashParameters()
.DisableRequireUniquePrefix();
}


[Test]
[Retry(3)]
[MethodDataSource(typeof(TestData), nameof(TestData.GetTestData))]
public async Task Should_Generate_All_The_Things_From_Self_And_Another_Assembly(TestSource item)
{
Expand All @@ -136,10 +143,12 @@ public async Task Should_Generate_All_The_Things_From_Self_And_Another_Assembly(
await Verify(result.AddCacheFiles())
.AddScrubber(z => z.Replace(item.GetTempDirectory(), "{TempPath}"))
.UseParameters(item.Name)
.HashParameters();
.HashParameters()
.DisableRequireUniquePrefix();
}

[Test]
[Retry(3)]
[DependsOn(nameof(Should_Generate_All_The_Things_From_Self_And_Another_Assembly), ProceedOnFailure = true)]
[MethodDataSource(typeof(TestData), nameof(TestData.GetTestData))]
public async Task Should_Generate_All_The_Things_From_Self_And_Another_Assembly_Using_Cache(TestSource item)
Expand Down Expand Up @@ -167,6 +176,7 @@ public async Task Should_Generate_All_The_Things_From_Self_And_Another_Assembly_
await Verify(result.AddCacheFiles())
.AddScrubber(z => z.Replace(item.GetTempDirectory(), "{TempPath}"))
.UseParameters(item.Name)
.HashParameters();
.HashParameters()
.DisableRequireUniquePrefix();
}
}
2 changes: 1 addition & 1 deletion test/DependencyInjection.Analyzers.Tests/GeneratorTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public static GeneratorTestResultsWithCacheFiles AddCacheFiles(this GeneratorTes
{
var projectPath = results.GlobalOptions["build_property.ProjectDir"];
var tempPath = Path.Combine(projectPath, results.GlobalOptions["build_property.IntermediateOutputPath"]);
return new(results, [..Directory.EnumerateFiles(tempPath, "*", SearchOption.AllDirectories).Select(z => new FileInfo(z))]);
return new(results, tempPath);
}

public static GeneratorTestContextBuilder AddCacheOptions(this GeneratorTestContextBuilder builder, string tempPath)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
namespace Rocket.Surgery.DependencyInjection.Analyzers.Tests;

public record GeneratorTestResultsWithServices(GeneratorTestResults Results, IEnumerable<ServiceDescriptor> Services);
public record GeneratorTestResultsWithCacheFiles(GeneratorTestResults Results, IEnumerable<FileInfo> CacheFiles);
public record GeneratorTestResultsWithCacheFiles(GeneratorTestResults Results, string TempDirectory);
54 changes: 31 additions & 23 deletions test/DependencyInjection.Analyzers.Tests/ModuleInitializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ private static ConversionResult Convert(GeneratorTestResultsWithCacheFiles resul
targets.AddRange(item.Value.SyntaxTrees.Select(Selector));
}

var cacheFiles = Directory.EnumerateFiles(result.TempDirectory, "*", SearchOption.AllDirectories).Select(z => new FileInfo(z));

var data = new Dictionary<string, object>
{
["GlobalOptions"] = target.GlobalOptions,
Expand All @@ -144,33 +146,39 @@ private static ConversionResult Convert(GeneratorTestResultsWithCacheFiles resul
.Order(),

["FinalDiagnostics"] = target.FinalDiagnostics.OrderDiagnosticResults(DiagnosticSeverity.Error),
["GeneratorDiagnostics"] = target.Results.ToDictionary(
z => z.Key.FullName!,
z => z.Value.Diagnostics.OrderDiagnosticResults(DiagnosticSeverity.Error)
),
["SkippedAssemblies"] = result
.CacheFiles
["GeneratorDiagnostics"] = target
.Results
.ToDictionary(
z => z.Key.FullName!,
z => z.Value.Diagnostics.OrderDiagnosticResults(
DiagnosticSeverity.Error
)
),
["SkippedAssemblies"] = cacheFiles
.Where(z => z.Extension == Constants.SkipExtension)
.OrderBy(z => z.Name)
.Select(z => Path.GetFileNameWithoutExtension(z.Name))
.ToHashSet(StringComparer.OrdinalIgnoreCase),
// ["PartialsCached"] = result
// .CacheFiles
// .Where(z => z.Extension == Constants.PartialExtension)
// .OrderBy(z => z.Name)
// .ToDictionary(
// z => Path.GetFileNameWithoutExtension(z.Name),
// z =>
// {
// var value = JsonSerializer.Deserialize(
// File.ReadAllText(z.FullName),
// JsonSourceGenerationContext.Default.SavedSourceLocation
// )!;
// return value with { Expression = value.Expression.Replace("\r", "").Trim('\n'), PrivateAssemblies = [..value.PrivateAssemblies.OrderBy(z => z)] };
// }
// ),
["GeneratedCache"] = result
.CacheFiles.Where(z => z.Extension == Constants.AssemblyJsonExtension)
["PartialsCached"] = cacheFiles
.Where(z => z.Extension == Constants.PartialExtension)
.OrderBy(z => z.Name)
.ToDictionary(
z => Path.GetFileNameWithoutExtension(z.Name),
z =>
{
var value = JsonSerializer.Deserialize(
File.ReadAllText(z.FullName),
JsonSourceGenerationContext.Default.SavedSourceLocation
)!;
return value with
{
Expression = value.Expression.Replace("\r", "").Trim('\n'),
PrivateAssemblies = [..value.PrivateAssemblies.OrderBy(z => z)]
};
}
),
["GeneratedCache"] = cacheFiles
.Where(z => z.Extension == Constants.AssemblyJsonExtension)
.OrderBy(z => z.Name)
.ToDictionary(
z => Path.GetFileNameWithoutExtension(z.Name),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\DependencyInjection.Analyzers\Rocket.Surgery.DependencyInjection.Analyzers.csproj" />
<ProjectReference Include="..\..\src\DependencyInjection.Extensions\Rocket.Surgery.DependencyInjection.Extensions.csproj" />
<ProjectReference Include="..\..\TestAssembly\TestAssembly.csproj"/>
<ProjectReference Include="..\TestAssembly\TestAssembly.csproj"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Features" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,18 @@
build_property.IntermediateOutputPath: obj/net9.0,
build_property.ProjectDir: {TempPath}
},
PartialsCached: {
ServiceDescriptor-794233dec4f84d77ce80007b41438587: {
Kind: ServiceDescriptor,
Expression:
{
services.Add(ServiceDescriptor.Scoped<global::TestAssembly.Service, global::TestAssembly.Service>());
services.Add(ServiceDescriptor.Scoped<global::TestAssembly.IService>(a => a.GetRequiredService<global::TestAssembly.Service>()));
services.Add(ServiceDescriptor.Scoped<global::TestAssembly.IServiceB>(a => a.GetRequiredService<global::TestAssembly.Service>()));
},
PrivateAssemblies: null
}
},
References: [
Microsoft.Extensions.DependencyInjection.Abstractions.dll,
mscorlib.dll,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Microsoft.Extensions.DependencyInjection;
using Rocket.Surgery.DependencyInjection;
using Rocket.Surgery.DependencyInjection.Compiled;
using System.Runtime.Loader;

[assembly: System.Reflection.AssemblyMetadata("AssemblyProvider.ServiceDescriptorTypes","{scrubbed}")]
[assembly: Rocket.Surgery.DependencyInjection.Compiled.CompiledTypeProviderAttribute(typeof(CompiledTypeProvider))]
Expand All @@ -33,12 +34,16 @@ Microsoft.Extensions.DependencyInjection.IServiceCollection ICompiledTypeProvide
case 16:
services.Add(ServiceDescriptor.Scoped<global::TestAssembly.IService, global::TestAssembly.Nested.ServiceA>());
services.Add(ServiceDescriptor.Scoped<global::TestAssembly.IService, global::TestAssembly.Service>());
services.Add(ServiceDescriptor.Scoped<global::TestAssembly.IService, global::TestAssembly.ServiceB>());
services.Add(ServiceDescriptor.Scoped(typeof(global::TestAssembly.IService), TestAssembly.GetType("TestAssembly.ServiceB")!));
break;
}

return services;
}

private AssemblyLoadContext _context = AssemblyLoadContext.GetLoadContext(typeof(CompiledTypeProvider).Assembly)!;
private Assembly _TestAssembly;
private Assembly TestAssembly => _TestAssembly ??= _context.LoadFromAssemblyName(new AssemblyName("TestAssembly, Version=version, Culture=neutral, PublicKeyToken=null"));
}
#pragma warning restore CA1002, CA1034, CA1822, CS0105, CS1573, CS8618, CS8669, IL2026, IL2072
#nullable restore
Loading