/// <summary> /// 標準的な引数の置き換えのディクショナリを返します /// </summary> /// <param name="minimumOccurance">置き換え対象とする変数の値の生起回数の条件</param> /// <param name="targetTypes">置き換えの対象とする変数の値の型</param> /// <param name="maxIdentifierLength">置き換える名前のプレフィックス部の最大長</param> /// <returns></returns> public VariableReplaceMap GetDefaultReplacement(int minimumOccurance, ScriptVariableType targetTypes, int maxIdentifierLength) { HashSet <ScriptVariable> replacement = new HashSet <ScriptVariable>(new VariableValueEqualityComparer()); bool replaced = true; while (replaced) { replaced = false; var none = this.GetOccuranceOfVariables(ScriptVariableType.List | targetTypes, VariableNamedState.AnyElementNamed, replacement); var sub = none.Where(p => p.Key.IsTypeOf(targetTypes) && p.Value >= minimumOccurance).ToList(); if (sub.Any()) { int maxOccur = sub.Max(p => p.Value); foreach (var pair in sub.Where(p => p.Value == maxOccur)) { if (replacement.Add(pair.Key)) { replaced = true; } } } } var one = this.GetOccuranceOfVariables(ScriptVariableType.List | targetTypes, VariableNamedState.AllElementsNamed, replacement); var subOne = one.Where(p => p.Key.IsTypeOf(targetTypes) && !p.Key.IsTypeOf(ScriptVariableType.List) && p.Value >= minimumOccurance).ToList(); foreach (var pair in subOne) { if (replacement.Add(pair.Key)) { replaced = true; } } VariableReplaceMap ret = new VariableReplaceMap(); foreach (ScriptVariable v in replacement) { string abbrev = Parse.ScriptParser.ConvertStringIntoIdentifier(v.ToString()); string identifier = abbrev; int index = 0; while (ret.ContainsValue(identifier) || _replacements.ContainsValue(identifier)) { index++; identifier = abbrev + index.ToString(); } ret.AddWithRename(v, identifier, maxIdentifierLength); } return(ret); }