/// <summary> /// 指定された変換を用いて引数に名前をつけます /// </summary> /// <param name="map">変数の値と,その変数に付ける名前のディクショナリ</param> /// <param name="ignoreState">名前付けをしない条件</param> public void ReplaceByName(IDictionary <ScriptVariable, string> map, VariableNamedState ignoreState) { foreach (var refCall in _histories) { refCall.ReplaceByName(map, ignoreState); } }
/// <summary> /// 指定された変換を用いて引数に名前をつけます /// </summary> /// <param name="map">変数の値と,その変数に付ける名前のディクショナリ</param> /// <param name="ignoreState">名前付けをしない条件</param> public void ReplaceByName(IDictionary <ScriptVariable, string> map, VariableNamedState ignoreState) { foreach (var param in this.Params) { param.ReplaceByName(map, ignoreState); } }
/// <summary> /// この変数の名前付けが指定された状態を満たすかを返します /// </summary> /// <param name="state"></param> /// <returns></returns> public bool SatisfiesNamedState(VariableNamedState state) { if (state == VariableNamedState.AllElementsNamed && this.IsNamed) { return(true); } if (state == VariableNamedState.AnyElementNamed && this.IsNamed) { return(true); } return(false); }
/// <summary> /// 変数の値と,その値が利用されている回数のペアのディクショナリを返します /// </summary> /// <param name="targetTypes">回数を数える変数の値の型</param> /// <param name="ignoreState">回数を数える対象としない条件</param> /// <param name="ignoreVariables">回数を数えない変数の値</param> /// <returns></returns> public IDictionary <ScriptVariable, int> GetOccuranceOfVariables(ScriptVariableType targetTypes, VariableNamedState ignoreState, ICollection <ScriptVariable> ignoreVariables) { Dictionary <ScriptVariable, int> ret = new Dictionary <ScriptVariable, int>(new VariableValueEqualityComparer()); foreach (var refCall in _histories) { getOccuranceOfVariablesAux(ret, refCall.Params, targetTypes, ignoreState, ignoreVariables); } return(ret); }
public void getOccuranceOfVariablesAux(IDictionary <ScriptVariable, int> map, IList <RefScriptVariable> variables, ScriptVariableType targetTypes, VariableNamedState ignoreState, ICollection <ScriptVariable> ignoreVariables) { foreach (var variable in variables) { if (variable.SatisfiesNamedState(ignoreState)) { continue; } if (variable.Value == null) { continue; } if (!variable.Value.IsTypeOf(targetTypes)) { continue; } if (!ignoreVariables.Contains(variable.Value)) { if (!map.ContainsKey(variable.Value)) { map[variable.Value] = 0; } map[variable.Value]++; } RefListVariable list = variable as RefListVariable; RefConcatStringVariable concat = variable as RefConcatStringVariable; if (list != null) { getOccuranceOfVariablesAux(map, list.List, targetTypes, ignoreState, ignoreVariables); } else if (concat != null) { if (concat.Strings.Count == 1 && concat.Strings[0].Word == concat.Value.ToString()) { continue; } foreach (var c in concat.Strings) { if (c.SatisfiesNamedState(ignoreState)) { continue; } StringVariable strVar = new StringVariable(c.Word); if (!ignoreVariables.Contains(strVar)) { if (!map.ContainsKey(strVar)) { map[strVar] = 0; } map[strVar]++; } } } } }
/// <summary> /// 関数の戻り値を用いて引数を変数で置き換えます /// </summary> /// <param name="targetTypes">置き換える対象の変数の値の型</param> /// <param name="resultPrefix">戻り値を受け取る</param> /// <param name="useIndexerOfResult">戻り値のインデクサの値を用いるかどうか</param> /// <param name="ignoreState">置き換えの対象としない条件</param> public void ReplaceByResult(ScriptVariableType targetTypes, string resultPrefix, bool useIndexerOfResult, VariableNamedState ignoreState) { int index = 0; foreach (var refCall in _histories) { refCall.ReplaceByName(_replacements, ignoreState); index++; replaceByResultAux(refCall.Result, _replacements, ConstructResultName(resultPrefix, index), targetTypes); } }
public override IList <string> ReplaceByName(IDictionary <ScriptVariable, string> map, VariableNamedState ignoreState) { List <string> ret = new List <string>(); if (this.SatisfiesNamedState(ignoreState)) { return(ret); } if (this.Value == null) { return(ret); } string name; if (map.TryGetValue(this.Value, out name)) { this.Name = name; ret.Add(name); } foreach (var sub in this.List) { ret.AddRange(sub.ReplaceByName(map, ignoreState)); } return(ret); }
/// <summary> /// 指定された変換を用いて変数に名前をつけます /// </summary> /// <param name="map">変数の値と,その変数に付ける名前のディクショナリ</param> /// <param name="ignoreState">名前付けをしない条件</param> public IList <string> ReplaceByName(IDictionary <ScriptVariable, string> map, VariableNamedState ignoreState) { List <string> ret = new List <string>(); if (this.SatisfiesNamedState(ignoreState)) { return(ret); } string name; if (map.TryGetValue(new StringVariable(this.Word), out name)) { this.Name = name; ret.Add(name); } return(ret); }