/// <summary> /// 関数呼び出しの履歴をスクリプト形式で列挙します. /// </summary> /// <param name="useReturnValueAsArguments">呼び出しの引数がそれ以前の戻り値と一致する場合に,その戻り値が入った変数を引数として用いるかどうか</param> /// <param name="pauseSpan">前回の処理との間隔がこの値以上あいている場合に開始時刻がコメントとして表示される</param> /// <returns></returns> public string GetSerializedCallHistory(bool useReturnValueAsArguments, bool pickUpCommonArgument, TimeSpan pauseSpan) { ParameterizedHistories history = new ParameterizedHistories(this.EnumerateCallHistory(), new char[] { ' ', ' ', '/', '_' }); VariableReplaceMap pickUpReplaces = new VariableReplaceMap(); ICollection <string> usedVariableNames = new HashSet <string>(); if (useReturnValueAsArguments) { history.ReplaceByResult(ScriptVariableType.List | ScriptVariableType.String, "result", true, VariableNamedState.AllElementsNamed); } if (pickUpCommonArgument) { // 複数回発生した引数を変数に置き換える pickUpReplaces = history.GetDefaultReplacement(2, ScriptVariableType.List | ScriptVariableType.String, 32); history.ReplaceByName(pickUpReplaces, VariableNamedState.AllElementsNamed); } usedVariableNames = history.GetUsedVariableNames(); StringBuilder str = new StringBuilder(); if (pickUpReplaces.Count > 0) { // 複数回発生した引数を変数に置き換えたものの,変数の宣言 str.AppendLine("// Common Arguments"); VariableReplaceMap pickupDependencyResolved = new VariableReplaceMap(); foreach (var pair in from p in pickUpReplaces where usedVariableNames.Contains(p.Value) orderby p.Value select p) { pickupDependencyResolved.Add(pair); } foreach (var pair in pickupDependencyResolved.GetRecursivelyRenamedVariables(ScriptVariableType.List | ScriptVariableType.String)) { str.AppendLine(string.Format("var {0} = {1};", pair.Value, pair.Key.Serialize())); } str.AppendLine(); } // 関数呼び出しの出力 DateTime prev = DateTime.MinValue; int index = 0; foreach (var call in history.Enumerate()) { // 間があいたら実行日時をコメントとして出力 bool showDate = call.CreatedTime - prev >= pauseSpan; if (call.CreatedTime - prev >= pauseSpan) { str.AppendLine("// " + call.CreatedTime.ToString()); } string format = call.GetScriptExpression() + ";"; index++; if (useReturnValueAsArguments) { format = string.Format("var result{0} = {1}", index, format); } str.AppendLine(format); prev = call.CreatedTime; } return(str.ToString()); }