< Summary

Information
Class: NexusLabs.Needlr.SemanticKernel.PluginScanners.AssemblySemanticKernelPluginScanner
Assembly: NexusLabs.Needlr.SemanticKernel
File(s): /home/runner/work/needlr/needlr/src/NexusLabs.Needlr.SemanticKernel/PluginScanners/AssemblySemanticKernelPluginScanner.cs
Line coverage
93%
Covered lines: 15
Uncovered lines: 1
Coverable lines: 16
Total lines: 39
Line coverage: 93.7%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ScanForPluginTypes()100%11100%
FromAssemblies(...)100%44100%
HasKernelFunctions(...)100%11100%
SafeGetTypes(...)100%1166.66%

File(s)

/home/runner/work/needlr/needlr/src/NexusLabs.Needlr.SemanticKernel/PluginScanners/AssemblySemanticKernelPluginScanner.cs

#LineLine coverage
 1using Microsoft.SemanticKernel;
 2
 3using System.Diagnostics.CodeAnalysis;
 4using System.Reflection;
 5
 6namespace NexusLabs.Needlr.SemanticKernel.PluginScanners;
 7
 8[RequiresUnreferencedCode("Assembly scanning uses reflection to discover types with [KernelFunction] methods.")]
 9[RequiresDynamicCode("Assembly scanning uses reflection APIs that may require dynamic code generation.")]
 910internal sealed class AssemblySemanticKernelPluginScanner(
 911    IReadOnlyList<Assembly> _assemblies) :
 12    ISemanticKernelPluginScanner
 13{
 14    public IReadOnlyList<Type> ScanForPluginTypes()
 15    {
 916        var list = FromAssemblies(_assemblies)
 917            .Where(HasKernelFunctions)
 918            .Distinct()
 919            .ToArray();
 20
 921        return list;
 22    }
 23
 24    private static IEnumerable<Type> FromAssemblies(IEnumerable<Assembly> assemblies) =>
 925        assemblies
 1026            .Where(a => !a.IsDynamic)
 927            .SelectMany(SafeGetTypes)
 63328            .Where(t => t.IsClass && (!t.IsAbstract || t.IsStatic()));
 29
 30    private static bool HasKernelFunctions(Type t) =>
 60331        t.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
 331532         .Any(m => m.IsDefined(typeof(KernelFunctionAttribute), inherit: true));
 33
 34    private static IEnumerable<Type> SafeGetTypes(Assembly a)
 35    {
 1036        try { return a.GetTypes(); }
 037        catch (ReflectionTypeLoadException ex) { return ex.Types.Where(t => t is not null)!; }
 1038    }
 39}