public IEnumerable <string> Generate(string before, string after) { var result = new List <string>(); //parse code var beforeAst = Parse(before); var afterAast = Parse(after); //run tree edit distance var zss = new PythonZss(beforeAst, afterAast); var editDistance = zss.Compute(); //get primary edits var rootAndNonRootEdits = WitnessFunctions.SplitEditsByRootsAndNonRoots(editDistance); //replace insert and delete by update var unparser = new Unparser(); foreach (var edit in rootAndNonRootEdits.Item1) { if (edit is Update) { result.Add("Update " + unparser.Unparse(edit.TargetNode) + " to " + unparser.Unparse(edit.ModifiedNode)); } else if (edit is Insert) { result.Add("Insert " + unparser.Unparse(edit.ModifiedNode)); } } //for each edit, create a hint return(result); }
public static ExampleSpec WitnessPatch(GrammarRule rule, int parameter, ExampleSpec spec) { var examples = new Dictionary <State, object>(); foreach (State input in spec.ProvidedInputs) { var before = (PythonNode)input[rule.Body[0]]; var after = (PythonNode)spec.Examples[input]; var zss = new PythonZss(before, after); var editDistance = zss.Compute(); var rootAndNonRootEdits = SplitEditsByRootsAndNonRoots(editDistance); var edits = ExtractPrimaryEdits(rootAndNonRootEdits, editDistance); //todo fix some big examples that are not working //if (edits.Count > 18) // return null; var patch = new Patch(); edits.ForEach(e => patch.EditSets.Add(new List <Edit>() { e })); examples[input] = patch; } return(new ExampleSpec(examples)); }