Skip to content

Commit 5c96f4f

Browse files
Fixes #19
1 parent 65edd9f commit 5c96f4f

10 files changed

Lines changed: 124 additions & 22 deletions

File tree

src/AutoRegisterInject.IntegrationTests/AutoRegisterInject.IntegrationTest.Project1/Class1.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Threading.Tasks;
43
using Microsoft.Extensions.DependencyInjection;
54

@@ -10,8 +9,7 @@ public static class Project1
109
public static void Init()
1110
{
1211
var serviceCollection = new ServiceCollection()
13-
.AutoRegister()
14-
.AutoRegisterFromAutoRegisterInjectIntegrationTestProject1();
12+
.AutoRegister();
1513

1614
serviceCollection.BuildServiceProvider();
1715
}
@@ -359,4 +357,25 @@ public void Three(params string[] args)
359357

360358
}
361359
}
360+
361+
// Start issue https://github.com/patrickklaeren/AutoRegisterInject/issues/19
362+
[AutoInterface]
363+
[RegisterKeyedScoped("base")]
364+
public class Test : ITest
365+
{
366+
public string Text()
367+
{
368+
return "Hello World!";
369+
}
370+
}
371+
372+
[RegisterScoped]
373+
public class CachedTest : ITest
374+
{
375+
public string Text()
376+
{
377+
return "Cached Hello World!";
378+
}
379+
}
380+
// End issue https://github.com/patrickklaeren/AutoRegisterInject/issues/19
362381
}

src/AutoRegisterInject.IntegrationTests/AutoRegisterInject.IntegrationTest.Project2/Class1.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ public static class Project2
88
public static void Init()
99
{
1010
var serviceCollection = new ServiceCollection()
11-
.AutoRegister()
1211
.AutoRegisterFromAutoRegisterInjectIntegrationTestProject1()
1312
.AutoRegisterFromAutoRegisterInjectIntegrationTestProject2();
1413

src/AutoRegisterInject.Tests/GenerationTests.AutoInterface.cs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,4 +264,73 @@ await RunGenerator(
264264
EXPECTED_REGISTRATION,
265265
("AutoRegisterInject.IFoo.g.cs", EXPECTED_INTERFACE));
266266
}
267+
268+
[Fact]
269+
public async Task ShouldRegisterOtherImplementorsOfAutoInterface()
270+
{
271+
const string INPUT = @"[AutoInterface]
272+
[RegisterKeyedScoped(""base"")]
273+
public class Test : ITest
274+
{
275+
public string Text() => ""Hello World!"";
276+
}
277+
278+
[RegisterScoped]
279+
public class CachedTest : ITest
280+
{
281+
public string Text() => ""Cached Hello World!"";
282+
}";
283+
284+
const string EXPECTED_REGISTRATION = @"// <auto-generated>
285+
// Automatically generated by AutoRegisterInject.
286+
// Changes made to this file may be lost and may cause undesirable behaviour.
287+
// </auto-generated>
288+
using Microsoft.Extensions.DependencyInjection;
289+
using Microsoft.Extensions.DependencyInjection.Extensions;
290+
291+
/// <summary>
292+
/// AutoRegisterInject service collection extensions
293+
/// </summary>
294+
public static class AutoRegisterInjectServiceCollectionExtension
295+
{
296+
/// <summary>
297+
/// Adds all types registered with AutoRegisterInject attributes to the given
298+
/// service collection from the named assembly
299+
/// </summary>
300+
/// <param name=""serviceCollection"">Service collection to register types with</param>
301+
/// <returns>Service collection with registered types</returns>
302+
public static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRegisterFromTestProject(this Microsoft.Extensions.DependencyInjection.IServiceCollection serviceCollection)
303+
{
304+
return AutoRegister(serviceCollection);
305+
}
306+
307+
/// <summary>
308+
/// Adds all types registered with AutoRegisterInject attributes to the given
309+
/// service collection
310+
/// </summary>
311+
/// <param name=""serviceCollection"">Service collection to register types with</param>
312+
/// <returns>Service collection with registered types</returns>
313+
internal static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRegister(this Microsoft.Extensions.DependencyInjection.IServiceCollection serviceCollection)
314+
{
315+
serviceCollection.AddKeyedScoped<ITest, Test>(""base"");
316+
serviceCollection.AddScoped<ITest, CachedTest>();
317+
return serviceCollection;
318+
}
319+
}";
320+
321+
const string EXPECTED_INTERFACE = @"// <auto-generated>
322+
// Automatically generated by AutoRegisterInject.
323+
// Changes made to this file may be lost and may cause undesirable behaviour.
324+
// </auto-generated>
325+
#nullable enable
326+
public interface ITest
327+
{
328+
string Text();
329+
}";
330+
331+
await RunGenerator(
332+
INPUT,
333+
EXPECTED_REGISTRATION,
334+
("AutoRegisterInject.ITest.g.cs", EXPECTED_INTERFACE));
335+
}
267336
}

src/AutoRegisterInject.Tests/GenerationTests.Cases.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ public static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRe
7171
internal static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRegister(this Microsoft.Extensions.DependencyInjection.IServiceCollection serviceCollection)
7272
{
7373
serviceCollection.AddHostedService<Foo>();
74-
serviceCollection.AddScoped<Bar>();
75-
serviceCollection.AddTransient<Baz>();
76-
serviceCollection.AddSingleton<IBaz, Bang>();
77-
serviceCollection.TryAddScoped<Far>();
78-
serviceCollection.AddKeyedTransient<Faz>(""MyFazKey"");
79-
serviceCollection.TryAddKeyedSingleton<IBaz, Fang>(""MyFangKey"");
74+
serviceCollection.AddScoped<Bar>();
75+
serviceCollection.AddTransient<Baz>();
76+
serviceCollection.AddSingleton<IBaz, Bang>();
77+
serviceCollection.TryAddScoped<Far>();
78+
serviceCollection.AddKeyedTransient<Faz>(""MyFazKey"");
79+
serviceCollection.TryAddKeyedSingleton<IBaz, Fang>(""MyFangKey"");
8080
return serviceCollection;
8181
}
8282
}";

src/AutoRegisterInject.Tests/GenerationTests.Inheritance.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRe
9292
internal static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRegister(this Microsoft.Extensions.DependencyInjection.IServiceCollection serviceCollection)
9393
{
9494
serviceCollection.AddTransient<Foo>();
95-
serviceCollection.AddScoped<Bar>();
95+
serviceCollection.AddScoped<Bar>();
9696
return serviceCollection;
9797
}
9898
}";
@@ -142,7 +142,7 @@ public static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRe
142142
internal static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRegister(this Microsoft.Extensions.DependencyInjection.IServiceCollection serviceCollection)
143143
{
144144
serviceCollection.AddTransient<Foo>();
145-
serviceCollection.AddScoped<IBar, Bar>();
145+
serviceCollection.AddScoped<IBar, Bar>();
146146
return serviceCollection;
147147
}
148148
}";

src/AutoRegisterInject.Tests/GenerationTests.Partials.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRe
9292
internal static Microsoft.Extensions.DependencyInjection.IServiceCollection AutoRegister(this Microsoft.Extensions.DependencyInjection.IServiceCollection serviceCollection)
9393
{
9494
serviceCollection.AddScoped<Bar>();
95-
serviceCollection.AddSingleton<Bar>();
95+
serviceCollection.AddSingleton<Bar>();
9696
return serviceCollection;
9797
}
9898
}";
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
; Shipped analyzer releases
2+
; https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md
3+
4+
## Release 2.0
5+
6+
### New Rules
7+
8+
Rule ID | Category | Severity | Notes
9+
--------|----------|----------|--------------------
10+
ARI001 | AutoRegisterInject | Error | ARI001_AutoRegisterInject
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
; Unshipped analyzer release
2+
; https://github.com/dotnet/roslyn/blob/main/src/RoslynAnalyzers/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md
3+

src/AutoRegisterInject/AutoRegisterInject.csproj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5+
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
56
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
67
<CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
78
<IsRoslynComponent>true</IsRoslynComponent>
@@ -18,7 +19,7 @@
1819
<RepositoryUrl>https://github.com/patrickklaeren/AutoRegisterInject</RepositoryUrl>
1920
<RepositoryType>git</RepositoryType>
2021
<PackageTags>source generator;dependency injection;dependencies;registration;extensions;ioc</PackageTags>
21-
<Version>2.0.2</Version>
22+
<Version>2.0.3</Version>
2223
</PropertyGroup>
2324

2425
<ItemGroup>
@@ -37,4 +38,9 @@
3738
<None Include="..\..\Icon.png" Pack="true" PackagePath="\" Visible="false" />
3839
</ItemGroup>
3940

41+
<ItemGroup>
42+
<AdditionalFiles Include="AnalyzerReleases.Shipped.md" />
43+
<AdditionalFiles Include="AnalyzerReleases.Unshipped.md" />
44+
</ItemGroup>
45+
4046
</Project>

src/AutoRegisterInject/Generator.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ private static IEnumerable<string> GetRegistrationInterfaces(INamedTypeSymbol sy
191191
.Select(static x => x.ToDisplayString())
192192
.Where(static interfaceName => !IgnoredInterfaces.Contains(interfaceName));
193193

194-
if (HasAutoInterfaceAttribute(symbol) && context.TargetNode is ClassDeclarationSyntax classDeclaration)
194+
if (context.TargetNode is ClassDeclarationSyntax classDeclaration)
195195
{
196196
interfaces = interfaces.Concat(GetAutoInterfaceTypeNames(symbol, classDeclaration));
197197
}
@@ -250,7 +250,7 @@ private static string GetInterfaceMembersSource(INamedTypeSymbol symbol)
250250
.Where(static source => !string.IsNullOrWhiteSpace(source))
251251
.ToArray();
252252

253-
return string.Join(Environment.NewLine, members);
253+
return string.Join("\r\n", members);
254254
}
255255

256256
private static string GetInterfaceMemberSource(ISymbol member)
@@ -397,11 +397,6 @@ private static string GetEventSource(IEventSymbol @event)
397397
return $" event {@event.Type.ToDisplayString()} {@event.Name};";
398398
}
399399

400-
private static bool HasAutoInterfaceAttribute(ISymbol symbol)
401-
{
402-
return symbol.GetAttributes().Any(static attribute => attribute.AttributeClass?.Name == AUTO_INTERFACE_ATTRIBUTE_NAME);
403-
}
404-
405400
private static AutoRegisteredClass CreateRegistration(
406401
string typeName,
407402
AutoRegistrationType registrationType,
@@ -471,7 +466,8 @@ private static void Execute(string assemblyName, ImmutableArray<AutoRegisteredCl
471466
.Select(x => GetRegistration(x.RegistrationType, x.ClassName, x.InterfaceName, x.ServiceKey))
472467
.Where(static x => x is not null);
473468

474-
var formatted = string.Join(Environment.NewLine, registrations);
469+
var indent = new string(' ', 8);
470+
var formatted = string.Join("\r\n" + indent, registrations);
475471
var output = SourceConstants.GENERATE_CLASS_SOURCE.Replace("{0}", assemblyNameForMethod).Replace("{1}", formatted);
476472
context.AddSource("AutoRegisterInject.ServiceCollectionExtension.g.cs", SourceText.From(output, Encoding.UTF8));
477473
return;

0 commit comments

Comments
 (0)