TeamCity.CSharpInteractive/MetadataResolver.cs (33 lines of code) (raw):

// ReSharper disable ClassWithVirtualMembersNeverInherited.Global namespace TeamCity.CSharpInteractive; using System.Collections.Immutable; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Scripting; internal class MetadataResolver: MetadataReferenceResolver { private static readonly ImmutableArray<PortableExecutableReference> NuGetReferences = ImmutableArray<PortableExecutableReference>.Empty .Add(MetadataReference.CreateFromFile(typeof(MetadataResolver).Assembly.Location)); private readonly Lazy<ScriptMetadataResolver> _baseResolver; public MetadataResolver(IEnvironment environment) => _baseResolver = new Lazy<ScriptMetadataResolver>(() => CreateResolver(environment)); public override bool ResolveMissingAssemblies => _baseResolver.Value.ResolveMissingAssemblies; public override PortableExecutableReference? ResolveMissingAssembly(MetadataReference definition, AssemblyIdentity referenceIdentity) => _baseResolver.Value.ResolveMissingAssembly(definition, referenceIdentity); public override bool Equals(object? other) => _baseResolver.Equals(other); public override int GetHashCode() => _baseResolver.GetHashCode(); public override ImmutableArray<PortableExecutableReference> ResolveReference(string reference, string? baseFilePath, MetadataReferenceProperties properties) => reference.StartsWith("nuget:", StringComparison.CurrentCultureIgnoreCase) ? NuGetReferences : ShouldResolveReferenceInternal(reference, baseFilePath, properties); protected virtual ImmutableArray<PortableExecutableReference> ShouldResolveReferenceInternal(string reference, string? baseFilePath, MetadataReferenceProperties properties) => _baseResolver.Value.ResolveReference(reference, baseFilePath, properties); internal IEnumerable<string> SearchPaths => _baseResolver.Value.SearchPaths; internal string BaseDirectory => _baseResolver.Value.BaseDirectory; private static ScriptMetadataResolver CreateResolver(IEnvironment environment) { var scriptDirectory = Path.GetFullPath(environment.GetPath(SpecialFolder.Script)); var workingDirectory = Path.GetFullPath(environment.GetPath(SpecialFolder.Working)); return ScriptMetadataResolver.Default .WithSearchPaths(scriptDirectory, workingDirectory) .WithBaseDirectory(scriptDirectory); } }