コード例 #1
0
        /// <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);
        }