public IEnumerable Replace()

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();
    }