public IEnumerable <MethodDeclaration> FindCandidatesViaRefactoringPermutations(TargetInfo left, MethodDeclaration right) { right = right.DeepCopy(); /* * Steps to change one to match the other. * Get the lookup table for left. * Get the lookup table for right. * Loop through left, renaming the corresponding right var as you go (don't worry about collisions yet). * Compare. * * This is essentially a normalization of one to the other. */ Dictionary <string, List <LocalLookupVariable> > left_table = left.GetLookupTableWithParams(); Dictionary <string, List <LocalLookupVariable> > right_table = right.GetLookupTableWithParams(); if (left_table.Keys.Count == right_table.Keys.Count) { IDictionary <string, string> renames = new Dictionary <string, string>(); for (int i = 0; i < left_table.Count; i++) { var left_var_name = left_table.Keys.ToArray()[i]; var right_var_name = right_table.Keys.ToArray()[i]; // current name => new name renames.Add(right_var_name, left_var_name); } RenameLocalVariableRefactoring r = new RenameLocalVariableRefactoring(renames); right.AcceptVisitor(r, null); yield return(right); } }
private MethodDeclaration MakePermutation(MethodDeclaration right, IEnumerable <PrimExpSet> prim_groups) { ResetNameCount(); right = right.DeepCopy(); var rights_primitives = right.AllPrimitiveExpressions(); foreach (var prim_grp in prim_groups) { var param_name = NextName(); var typeRef = new TypeReference(prim_grp.ValueType.FullName); right.Parameters.Add(new ParameterDeclarationExpression(typeRef, param_name)); var replacer = new PrimitiveReplacer(); foreach (var pos in prim_grp.Positions) { replacer.AddReplacement(rights_primitives[pos], new IdentifierExpression(param_name)); } right.AcceptVisitor(replacer, null); } return(right); }