summaryrefslogtreecommitdiff
path: root/monkey/monkey.py
diff options
context:
space:
mode:
authorTimotej Lazar <timotej.lazar@araneo.org>2015-03-09 18:09:59 +0100
committerAleš Smodiš <aless@guru.si>2015-08-11 14:26:02 +0200
commit9d145715812d63390bee3f1025f0359e7f4c3614 (patch)
tree2baff1c8f99fbd20e503668280daa9001b0367d8 /monkey/monkey.py
parentfdcf3c85991463f8c9b9f876e52f91b9f391e30f (diff)
Move hint message generation to a new function
Diffstat (limited to 'monkey/monkey.py')
-rwxr-xr-xmonkey/monkey.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/monkey/monkey.py b/monkey/monkey.py
index 7c8141c..b6032f7 100755
--- a/monkey/monkey.py
+++ b/monkey/monkey.py
@@ -260,3 +260,44 @@ def fix(name, code, edits, aux_code='', timeout=30, debug=False):
total_time = time.monotonic() - start_time
return '', [], total_time, n_tested
+
+# Return a list of pairs (range, message) describing edits in [path].
+def fix_hints(code, path):
+ program = list(annotate(code))
+
+ messages = []
+ for step_type, idx, a, b in path:
+ if step_type == 'add_rule':
+ msg = 'Add another rule.'
+ start = program[idx].pos
+ end = start
+ elif step_type == 'add_part':
+ msg = 'Add another goal.'
+ start = program[idx].pos
+ end = start
+ elif step_type == 'remove_part':
+ msg = 'Check this goal.'
+ start = program[idx].pos
+ end = idx + len(a) - 1
+ if program[end].type in ('COMMA', 'PERIOD', 'SEMI'):
+ end -= 1
+ end = program[end].pos + len(program[end].val)
+ elif step_type == 'change_part':
+ msg = 'Check this goal.'
+ first = 0
+ while idx+first < len(program)-1 and first < len(a) and first < len(b) and a[first] == b[first]:
+ first += 1
+ last = len(a)-1
+ while last < len(b) and last >= first and a[last] == b[last]:
+ last -= 1
+ start = program[idx+first].pos
+ end = program[idx+last].pos + len(program[idx+last].val)
+ elif step_type == 'remove_rule':
+ msg = 'Check this rule.'
+ start = program[idx].pos
+ end = program[idx + len(a) - 1].pos
+ messages.append(((start, end), msg))
+
+ program[idx:idx+len(a)] = [t.clone(pos=program[idx].pos) for t in b]
+
+ return messages