// ReSharper disable ClassNeverInstantiated.Global namespace TeamCity.CSharpInteractive; using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; internal class ScriptCommandFactory : ICommandFactory { internal static readonly CSharpParseOptions ParseOptions = new(LanguageVersion.Latest, kind: SourceCodeKind.Script); private readonly ILog _log; private readonly IScriptSubmissionAnalyzer _scriptSubmissionAnalyzer; private readonly StringBuilder _scriptBuilder = new(); public ScriptCommandFactory( ILog log, IScriptSubmissionAnalyzer scriptSubmissionAnalyzer) { _log = log; _scriptSubmissionAnalyzer = scriptSubmissionAnalyzer; } public int Order => 0; public IEnumerable Create(ScriptCommand scriptCommand) { _scriptBuilder.AppendLine(scriptCommand.Script); var script = _scriptBuilder.ToString(); if (_scriptSubmissionAnalyzer.IsCompleteSubmission(script, ParseOptions)) { _log.Trace(() => new[] {new Text("Completed submission")}); _scriptBuilder.Clear(); yield return new ScriptCommand(scriptCommand.Name, script, scriptCommand.Internal); yield break; } _log.Trace(() => new[] {new Text("Incomplete submission")}); yield return new CodeCommand(scriptCommand.Internal); } }