mirror of
https://github.com/luau-lang/luau.git
synced 2024-11-15 22:35:43 +08:00
77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
|
#!/usr/bin/python
|
||
|
# This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
||
|
|
||
|
# This code can be used to patch Compiler.test.cpp following bytecode changes, based on error output
|
||
|
import sys
|
||
|
import re
|
||
|
|
||
|
(_, filename) = sys.argv
|
||
|
input = sys.stdin.readlines()
|
||
|
|
||
|
errors = []
|
||
|
|
||
|
# 0: looking for error, 1: looking for replacement, 2: collecting replacement, 3: collecting initial text
|
||
|
state = 0
|
||
|
|
||
|
# parse input into errors[] with the state machine; this is using doctest output and expects multi-line match failures
|
||
|
for line in input:
|
||
|
if state == 0:
|
||
|
match = re.match("tests/[^:]+:(\d+): ERROR: CHECK_EQ", line)
|
||
|
if match:
|
||
|
error_line = int(match[1])
|
||
|
state = 1
|
||
|
elif state == 1:
|
||
|
if re.match("\s*values: CHECK_EQ\(\s*$", line):
|
||
|
error_repl = []
|
||
|
state = 2
|
||
|
elif re.match("\s*values: CHECK_EQ", line):
|
||
|
state = 0 # skipping single-line checks since we can't patch them
|
||
|
elif state == 2:
|
||
|
if line.strip() == ",":
|
||
|
error_orig = []
|
||
|
state = 3
|
||
|
else:
|
||
|
error_repl.append(line)
|
||
|
elif state == 3:
|
||
|
if line.strip() == ")":
|
||
|
errors.append((error_line, error_orig, error_repl))
|
||
|
state = 0
|
||
|
else:
|
||
|
error_orig.append(line)
|
||
|
|
||
|
# make sure we fully process each individual check
|
||
|
assert(state == 0)
|
||
|
|
||
|
errors.sort(key = lambda e: e[0])
|
||
|
|
||
|
with open(filename, "r") as fp:
|
||
|
source = fp.readlines()
|
||
|
|
||
|
# patch source text into result[] using errors[]; we expect every match to appear at or after the line error was reported at
|
||
|
result = []
|
||
|
|
||
|
current = 0
|
||
|
index = 0
|
||
|
|
||
|
while index < len(source):
|
||
|
line = source[index]
|
||
|
error = errors[current] if current < len(errors) else None
|
||
|
|
||
|
if not error or index < error[0] or line != error[1][0]:
|
||
|
result.append(line)
|
||
|
index += 1
|
||
|
else:
|
||
|
# validate that the patch has a complete match in source text
|
||
|
for v in range(len(error[1])):
|
||
|
assert(source[index + v] == error[1][v])
|
||
|
|
||
|
result += error[2]
|
||
|
index += len(error[1])
|
||
|
current += 1
|
||
|
|
||
|
# make sure we patch all errors
|
||
|
assert(current == len(errors))
|
||
|
|
||
|
with open(filename, "w") as fp:
|
||
|
fp.writelines(result)
|