// ReSharper disable PartialTypeWithSinglePart // ReSharper disable RedundantCast // ReSharper disable UnusedMember.Local namespace TeamCity.CSharpInteractive; using System.Buffers; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Runtime.Versioning; using HostApi; using HostApi.Cmd; using HostApi.Docker; using HostApi.DotNet; using JetBrains.TeamCity.ServiceMessages.Read; using JetBrains.TeamCity.ServiceMessages.Write; using JetBrains.TeamCity.ServiceMessages.Write.Special; using JetBrains.TeamCity.ServiceMessages.Write.Special.Impl.Updater; using Microsoft.Build.Framework; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Scripting; using Microsoft.Extensions.DependencyInjection; using ILogger = NuGet.Common.ILogger; [ExcludeFromCodeCoverage] internal static partial class Composer { private static void Setup() { DI.Setup() .Default(Lifetime.Singleton) #if TOOL .Bind().To() .Bind().To(_ => RunningMode.Tool) #endif #if APPLICATION .Bind().To(_ => RunningMode.Application) #endif .Bind().To(_ => typeof(Composer).Assembly) .Bind().To(_ => new CSharpParseOptions().LanguageVersion) .Bind("RuntimePath").To(_ => Path.GetDirectoryName(typeof(object).Assembly.Location) ?? string.Empty) .Bind("TargetFrameworkMoniker").To(ctx => ctx.Resolve()?.GetCustomAttribute()?.FrameworkName ?? string.Empty) .Bind().To(_ => Process.GetCurrentProcess()) .Bind("ModuleFile").To(ctx => ctx.Resolve().MainModule?.FileName ?? string.Empty) .Bind().To(_ => new CancellationTokenSource()) .Bind().As(Lifetime.Transient).To(ctx => ctx.Resolve().Token) .Bind(typeof(ExitManager)).To() .Bind().To() .Bind().To() .Bind().To() .Bind>().To>() .Bind().Bind().Tags("Default").To() .Bind().Bind().Tags("TeamCity").To() .Bind().To() .Bind().To(ctx => ctx.Resolve>().Instance) .Bind().To(ctx => ctx.Resolve>().Instance) .Bind>("Default").To>() .Bind>("TeamCity").To>() .Bind>().To(ctx => ctx.Resolve>>().Instance); DI.Setup() .Bind().To() .Bind().Bind().Bind().Bind(typeof(Environment)).To() .Bind().To() .Bind().To() .Bind().Bind(typeof(DotNetEnvironment)).To() .Bind().Bind(typeof(DockerEnvironment)).To() .Bind().Bind(typeof(NuGetEnvironment)).To() .Bind().Bind>().Bind().To() .Bind().Tags(typeof(VerbosityLevel)).To() .Bind().To() .Bind().To() .Bind().To() .Bind().To() .Bind>(typeof(LoadFileCodeSource)).To(ctx => new Func(name => { var source = ctx.Resolve(); source.Name = name; return source; })) .Bind>(typeof(LineCodeSource)).To(ctx => new Func(line => { var source = ctx.Resolve(); source.Line = line; return source; })) .Bind().Tags(InteractionMode.Interactive).To() .Bind().Tags(InteractionMode.NonInteractive).To() .Bind().As(Lifetime.Transient).To(ctx => ctx.Resolve().InteractionMode == InteractionMode.Interactive ? ctx.Resolve(InteractionMode.Interactive) : ctx.Resolve(InteractionMode.NonInteractive)) .Bind().To() .Bind().To() .Bind().To(); DI.Setup() .Bind>>().To() .Bind>().To() .Bind>().To() .Bind>>().To() .Bind().To() .Bind().Bind>().To() .Bind().To() .Bind().To() .Bind().To() .Bind().To() .Bind().To() .Bind>().To() .Bind>().As(Lifetime.Transient).To() .Bind().To() .Bind().To() .Bind().Bind(typeof(EnvironmentVariables)).To() .Bind(typeof(Debugger)).To() .Bind().To() .Bind("base").As(Lifetime.Transient).To() .Bind().As(Lifetime.Transient).To() .Bind().To(); DI.Setup() .Bind().To() .Bind().To() .Bind().To() .Bind>().To(_ => MemoryPool.Shared) .Bind().To() .Bind().To() .Bind().Bind().To() .Bind().To() .Bind().As(Lifetime.Transient).To() .Bind().To() .Bind("default").To() .Bind("custom").To() .Root() .Bind>().To() .Bind().To() .Bind("base").To() .Bind().To() .Bind().Bind().To() .Bind().To() .Bind().To() .Bind().To() .Bind().To() .Bind().As(Lifetime.Transient).To() .Bind().As(Lifetime.Transient).To() .Bind().To() .Bind().To(); // Script options factory DI.Setup() .Bind>().Bind>().To(_ => new Setting(LanguageVersion.Default)) .Bind>().Bind>().To(_ => new Setting(OptimizationLevel.Release)) .Bind>().Bind>().To(_ => new Setting((WarningLevel)ScriptOptions.Default.WarningLevel)) .Bind>().Bind>().To(_ => new Setting(ScriptOptions.Default.CheckOverflow ? CheckOverflow.On : CheckOverflow.Off)) .Bind>().Bind>().To(_ => new Setting(ScriptOptions.Default.AllowUnsafe ? AllowUnsafe.On : AllowUnsafe.Off)) .Bind().To() .Bind().Bind().Tags(typeof(AssembliesScriptOptionsProvider)).To() .Bind(typeof(ConfigurableScriptOptionsFactory)).To() .Bind(typeof(ReferencesScriptOptionsFactory)).Bind().To() .Bind(typeof(SourceFileScriptOptionsFactory)).To() .Bind(typeof(MetadataResolverOptionsFactory)).To() .Bind(typeof(ImportsOptionsFactory)).To() .Bind>("REPL Set a C# language version parser").To>() .Bind("REPL Set a C# language version").To>() .Bind(typeof(LanguageVersion)).To() .Bind>("REPL Set an optimization level parser").To>() .Bind("REPL Set an optimization level").To>() .Bind(typeof(OptimizationLevel)).To() .Bind>("REPL Set a warning level parser").To>() .Bind("REPL Set a warning level").To>() .Bind(typeof(WarningLevel)).To() .Bind>("REPL Set an overflow check parser").To>() .Bind("REPL Set an overflow check").To>() .Bind(typeof(CheckOverflow)).To() .Bind>("REPL Set allow unsafe parser").To>() .Bind("REPL Set allow unsafe").To>() .Bind(typeof(AllowUnsafe)).To() .Bind>("REPL Set NuGet restore setting parser").To>() .Bind("REPL Set NuGet restore setting").To>() .Bind(typeof(NuGetRestoreSetting)).To() .Bind().To() .Bind("CSharp").To() .Bind>("REPL Help parser").To() .Bind("REPL Help runner").To() .Bind>("REPL Set verbosity level parser").To>() .Bind("REPL Set verbosity level runner").To>() .Bind>("REPL Add NuGet reference parser").To() .Bind().To() .Bind("REPL Add package reference runner").To(); DI.Setup() .Bind().To() .Bind().As(Lifetime.Transient).To() .Bind("Default").To() .Bind("TeamCity").To() // Public .Bind().To() .Bind().To(ctx => ctx.Resolve>().Instance) .Bind().To() .Bind().To() .Bind().To() .Bind().To() // TeamCity Service messages .Bind().To() .Bind().To() .Bind().Bind().To() .Bind().As(Lifetime.Transient).To(_ => DateTime.Now) .Bind().To() .Bind().To( ctx => ctx.Resolve().CreateWriter( str => ctx.Resolve().WriteToOut((default, str + "\n")))) .Bind().To(); } }