diff --git a/src/ComputeSharp.SourceGeneration/Extensions/CompilationExtensions.cs b/src/ComputeSharp.SourceGeneration/Extensions/CompilationExtensions.cs index b937a26ba..10714715d 100644 --- a/src/ComputeSharp.SourceGeneration/Extensions/CompilationExtensions.cs +++ b/src/ComputeSharp.SourceGeneration/Extensions/CompilationExtensions.cs @@ -69,41 +69,18 @@ public static bool TryBuildNamedTypeSymbolSet( /// Whether a type with the specified metadata name can be accessed from the given compilation. public static bool HasAccessibleTypeWithMetadataName(this Compilation compilation, string fullyQualifiedMetadataName) { - // Try to get the unique type with this name - INamedTypeSymbol? type = compilation.GetTypeByMetadataName(fullyQualifiedMetadataName); - // If there is only a single matching symbol, check its accessibility - if (type is not null) - { - return type.CanBeAccessedFrom(compilation.Assembly); - } - - // Otherwise, try to get the unique type with this name originally defined in 'compilation' - type ??= compilation.Assembly.GetTypeByMetadataName(fullyQualifiedMetadataName); - - if (type is not null) + if (compilation.GetTypeByMetadataName(fullyQualifiedMetadataName) is INamedTypeSymbol typeSymbol) { - return type.CanBeAccessedFrom(compilation.Assembly); + return compilation.IsSymbolAccessibleWithin(typeSymbol, compilation.Assembly); } - // Otherwise, check whether the type is defined and accessible from any of the referenced assemblies - foreach (IModuleSymbol module in compilation.Assembly.Modules) + // Otherwise, check all available types + foreach (INamedTypeSymbol currentTypeSymbol in compilation.GetTypesByMetadataName(fullyQualifiedMetadataName)) { - foreach (IAssemblySymbol referencedAssembly in module.ReferencedAssemblySymbols) + if (compilation.IsSymbolAccessibleWithin(currentTypeSymbol, compilation.Assembly)) { - if (referencedAssembly.GetTypeByMetadataName(fullyQualifiedMetadataName) is not INamedTypeSymbol currentType) - { - continue; - } - - switch (currentType.GetEffectiveAccessibility()) - { - case Accessibility.Public: - case Accessibility.Internal when referencedAssembly.GivesAccessTo(compilation.Assembly): - return true; - default: - continue; - } + return true; } } diff --git a/src/ComputeSharp.SourceGeneration/Extensions/ISymbolExtensions.cs b/src/ComputeSharp.SourceGeneration/Extensions/ISymbolExtensions.cs index a69c739eb..b0a317243 100644 --- a/src/ComputeSharp.SourceGeneration/Extensions/ISymbolExtensions.cs +++ b/src/ComputeSharp.SourceGeneration/Extensions/ISymbolExtensions.cs @@ -75,57 +75,4 @@ public static bool TryGetAttributeWithFullyQualifiedMetadataName(this ISymbol sy return false; } - - /// - /// Calculates the effective accessibility for a given symbol. - /// - /// The instance to check. - /// The effective accessibility for . - public static Accessibility GetEffectiveAccessibility(this ISymbol symbol) - { - // Start by assuming it's visible - Accessibility visibility = Accessibility.Public; - - // Handle special cases - switch (symbol.Kind) - { - case SymbolKind.Alias: return Accessibility.Private; - case SymbolKind.Parameter: return GetEffectiveAccessibility(symbol.ContainingSymbol); - case SymbolKind.TypeParameter: return Accessibility.Private; - } - - // Traverse the symbol hierarchy to determine the effective accessibility - while (symbol is not null && symbol.Kind != SymbolKind.Namespace) - { - switch (symbol.DeclaredAccessibility) - { - case Accessibility.NotApplicable: - case Accessibility.Private: - return Accessibility.Private; - case Accessibility.Internal: - case Accessibility.ProtectedAndInternal: - visibility = Accessibility.Internal; - break; - } - - symbol = symbol.ContainingSymbol; - } - - return visibility; - } - - /// - /// Checks whether or not a given symbol can be accessed from a specified assembly. - /// - /// The input instance to check. - /// The assembly to check the accessibility of for. - /// Whether can access . - public static bool CanBeAccessedFrom(this ISymbol symbol, IAssemblySymbol assembly) - { - Accessibility accessibility = symbol.GetEffectiveAccessibility(); - - return - accessibility == Accessibility.Public || - (accessibility == Accessibility.Internal && symbol.ContainingAssembly.GivesAccessTo(assembly)); - } } \ No newline at end of file