in XLM/src/utils.py [0:0]
def convert_filled_arguments(script_model, f, lang, f_name=None):
assert lang in {'java', 'cpp'}
header = []
detokenizer = getattr(code_tokenizer, f'detokenize_{lang}')
arguments_extractor = getattr(code_tokenizer, f'extract_arguments_{lang}')
arguments_gold = arguments_extractor(script_model)
return_type_gold = get_return_type(script_model)
arguments_filled = arguments_extractor(f)
return_type_filled = get_return_type(f)
if arguments_gold[0] == arguments_filled[0]:
return None
if f_name is None:
get_name = getattr(code_tokenizer, f"get_function_name_{lang}")
f_name = get_name(f)
argument_types_gold = [t.strip() for t in arguments_gold[0]]
arguments_strings = [make_arg_string(
arg_type, f'param{i}') for i, arg_type in enumerate(argument_types_gold)]
new_function_lines = [f'static {return_type_gold} f_filled({", ".join(arguments_strings)})',
'{',
]
new_params_strings = []
for param_index, (param_type_gold, param_type_filled) in enumerate(zip(argument_types_gold, arguments_filled[0])):
param_type_filled = param_type_filled.strip()
param_type_gold = param_type_gold.strip()
if param_type_filled == param_type_gold:
new_params_strings.append(f'param{param_index}')
elif lang == 'cpp':
if 'vector' in param_type_filled:
if 'int' not in argument_types_gold:
return None
ints_indices = [i for i, t in enumerate(
argument_types_gold) if t == 'int' and i > param_index]
if any([i > param_index for i in ints_indices]):
array_length_arg = min(
[i for i in ints_indices if i > param_index])
else:
array_length_arg = min(ints_indices)
new_function_lines.append(
f'{param_type_filled.replace("&", "")} vect_param{param_index}(param{param_index}, param{param_index} + param{array_length_arg});')
new_params_strings.append(f'vect_param{param_index}')
elif param_type_filled == 'string' and 'char' in param_type_gold:
new_function_lines.append(
f'{param_type_filled.replace("&", "")} string_param{param_index}(param{param_index});')
new_params_strings.append(f'string_param{param_index}')
elif param_type_gold == 'string' and 'char' in param_type_filled:
new_function_lines.append(
f'char char_arr_param{param_index}[param{param_index}.length() + 1];')
new_function_lines.append(
f'strcopy(char_arr_param{param_index}, param{param_index}.c_str());')
new_params_strings.append(f'char_arr_param{param_index}')
else:
new_params_strings.append(
f'({param_type_filled}) param{param_index}')
elif lang == 'java':
if (param_type_filled == 'String' and 'char' in param_type_gold) or param_type_filled == transform_to_java_object_type(param_type_gold):
new_params_strings.append(
f'{param_type_filled}.valueOf(param{param_index})')
header.append("#include <cstring>")
elif param_type_gold == 'String':
new_params_strings.append(f'param{param_index}.toCharArray()')
else:
new_params_strings.append(
f'({param_type_filled}) param{param_index}')
else:
return None
inner_function_name = 'f_filled_inner'
outer_f_return_string = f'{inner_function_name}({",".join(new_params_strings)})'
if return_type_filled != return_type_gold:
outer_f_return_string = f"({return_type_gold}) {outer_f_return_string}"
new_function_lines += [f'return {outer_f_return_string};', '}']
f = detokenizer(f.replace(f_name, inner_function_name))
return '\n'.join(list(set(header))) + script_model.replace(TOFILL[lang], '\n'.join([f, '\n'] + new_function_lines))