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