diff --git a/ServiceScan.SourceGenerator.Tests/AddServicesTests.cs b/ServiceScan.SourceGenerator.Tests/AddServicesTests.cs index a9872d8..2c8e67b 100644 --- a/ServiceScan.SourceGenerator.Tests/AddServicesTests.cs +++ b/ServiceScan.SourceGenerator.Tests/AddServicesTests.cs @@ -956,6 +956,7 @@ public class MyService2 : IService { } public class ParentType2 { public class MyService1 : IService { } + private class NestedPrivateService : IService { } // Shouldn't be added as non-accessible } """); diff --git a/ServiceScan.SourceGenerator.Tests/TestServices.cs b/ServiceScan.SourceGenerator.Tests/TestServices.cs index 4c0ce85..4987319 100644 --- a/ServiceScan.SourceGenerator.Tests/TestServices.cs +++ b/ServiceScan.SourceGenerator.Tests/TestServices.cs @@ -3,3 +3,6 @@ public interface IExternalService; public class ExternalService1 : IExternalService { } public class ExternalService2 : IExternalService { } + +// Shouldn't be added as type is not accessible from other assembly +internal class InternalExternalService2 : IExternalService { } \ No newline at end of file diff --git a/ServiceScan.SourceGenerator/DependencyInjectionGenerator.FilterTypes.cs b/ServiceScan.SourceGenerator/DependencyInjectionGenerator.FilterTypes.cs index 65960a0..2543d77 100644 --- a/ServiceScan.SourceGenerator/DependencyInjectionGenerator.FilterTypes.cs +++ b/ServiceScan.SourceGenerator/DependencyInjectionGenerator.FilterTypes.cs @@ -13,6 +13,9 @@ public partial class DependencyInjectionGenerator private static IEnumerable<(INamedTypeSymbol Type, INamedTypeSymbol[]? MatchedAssignableTypes)> FilterTypes (Compilation compilation, AttributeModel attribute, INamedTypeSymbol containingType) { + var semanticModel = compilation.GetSemanticModel(attribute.Location.SourceTree); + var position = attribute.Location.SourceSpan.Start; + var assemblies = GetAssembliesToScan(compilation, attribute, containingType); var assignableToType = attribute.AssignableToTypeName is null @@ -76,6 +79,9 @@ public partial class DependencyInjectionGenerator if (assignableToType != null && !IsAssignableTo(type, assignableToType, out matchedTypes)) continue; + if (!semanticModel.IsAccessible(position, type)) + continue; + yield return (type, matchedTypes); } } diff --git a/ServiceScan.SourceGenerator/DependencyInjectionGenerator.cs b/ServiceScan.SourceGenerator/DependencyInjectionGenerator.cs index 0d46ef6..0ac50ee 100644 --- a/ServiceScan.SourceGenerator/DependencyInjectionGenerator.cs +++ b/ServiceScan.SourceGenerator/DependencyInjectionGenerator.cs @@ -15,11 +15,11 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { context.RegisterPostInitializationOutput(context => { - context.AddSource("ServiceScanAttributes.Generated.cs", SourceText.From(GenerateAttributeSource.Source, Encoding.UTF8)); + context.AddSource("ServiceScanAttributes.Generated.cs", SourceText.From(GenerateAttributeInfo.Source, Encoding.UTF8)); }); var methodProvider = context.SyntaxProvider.ForAttributeWithMetadataName( - "ServiceScan.SourceGenerator.GenerateServiceRegistrationsAttribute", + GenerateAttributeInfo.MetadataName, predicate: static (syntaxNode, ct) => syntaxNode is MethodDeclarationSyntax methodSyntax, transform: static (context, ct) => ParseRegisterMethodModel(context)) .Where(method => method != null); diff --git a/ServiceScan.SourceGenerator/GenerateAttributeSource.cs b/ServiceScan.SourceGenerator/GenerateAttributeInfo.cs similarity index 96% rename from ServiceScan.SourceGenerator/GenerateAttributeSource.cs rename to ServiceScan.SourceGenerator/GenerateAttributeInfo.cs index d288f44..0d7a719 100644 --- a/ServiceScan.SourceGenerator/GenerateAttributeSource.cs +++ b/ServiceScan.SourceGenerator/GenerateAttributeInfo.cs @@ -1,8 +1,10 @@ namespace ServiceScan.SourceGenerator; -internal static class GenerateAttributeSource +internal static class GenerateAttributeInfo { - public static string Source => """ + public const string MetadataName = "ServiceScan.SourceGenerator.GenerateServiceRegistrationsAttribute"; + + public const string Source = """ #nullable enable using System;