in TeamCity.CSharpInteractive/ScriptContentReplacer.cs [37:104]
public IEnumerable<string> Replace(IEnumerable<string> lines)
{
var allAssemblies = new HashSet<string>();
var commandsToRun = new List<ICommand>();
foreach (var line in lines)
{
if (string.IsNullOrWhiteSpace(line))
{
continue;
}
var assemblies = new HashSet<string>();
var commands = _commandFactory.Create(_codeSourceFactory(line)).ToArray();
var repl = false;
foreach (var command in commands)
{
switch (command)
{
case AddNuGetReferenceCommand referenceCommand:
repl = true;
if (_nuGetReferenceResolver.TryResolveAssemblies(referenceCommand.PackageId, referenceCommand.VersionRange, out var resolvedAssemblies))
{
foreach (var assembly in resolvedAssemblies.Where(i => !allAssemblies.Contains(i.FilePath)))
{
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
if (_runtimeExplorer.TryFindRuntimeAssembly(assembly.FilePath, out var runtimeAssemblyPath))
{
assemblies.Add(runtimeAssemblyPath);
}
else
{
assemblies.Add(assembly.FilePath);
}
}
}
break;
case ScriptCommand:
case CodeCommand:
break;
default:
repl = true;
commandsToRun.Add(command);
break;
}
}
var newAssemblies = assemblies.Except(allAssemblies).ToArray();
if (!newAssemblies.Any())
{
if (!repl)
{
yield return line;
}
}
else
{
allAssemblies.AddRange(newAssemblies);
var scriptFile = Path.Combine(_environment.GetPath(SpecialFolder.Temp), _uniqueNameGenerator.Generate());
_fileSystem.WriteAllLines(scriptFile, newAssemblies.Select(i => $"#r \"{i}\""));
yield return $"#load \"{scriptFile}\"";
}
}
// ReSharper disable once ReturnValueOfPureMethodIsNotUsed
_commandsRunner.Run(commandsToRun).ToArray();
}