OSS-forge/CodeQualityEval
12
1import os2import json3import re4import string5 6input_path = "1_dataset_sample_100/java_dataset.jsonl"7output_dir = "java_temp_wrapped"8code_field = os.environ.get("CODE_FIELD", "human_code")9 10 11def extract_top_level_type_name(code_str):12 match = re.search(r'public\s+(class|interface|enum)\s+(\w+)', code_str)13 return match.group(2) if match else None14 15def extract_and_clean_package(code_str):16 match = re.search(r'^\s*package\s+[^\n;]+;', code_str, flags=re.MULTILINE)17 package_stmt = match.group(0) if match else ""18 cleaned_code = re.sub(r'^\s*package\s+[^\n;]+;\n?', '', code_str, flags=re.MULTILINE)19 return package_stmt.strip(), cleaned_code.strip()20 21def extract_and_clean_imports(code_str):22 imports = re.findall(r'^\s*import\s+[^\n;]+;', code_str, flags=re.MULTILINE)23 cleaned_code = re.sub(r'^\s*import\s+[^\n;]+;\n?', '', code_str, flags=re.MULTILINE)24 return '\n'.join(imports), cleaned_code.strip()25 26def wrap_code_in_temp_class(code_str, class_name):27 indented = '\n'.join(' ' + line for line in code_str.splitlines())28 return f"public class {class_name} {{\n{indented}\n}}"29 30def sanitize_filename(name):31 allowed = set(string.ascii_letters + string.digits + "_")32 return ''.join(c if c in allowed else "_" for c in name)33 34def rename_class_everywhere(code_str, old_name, new_name):35 # Rename class declaration36 code_str = re.sub(37 rf'\bpublic\s+(class|interface|enum)\s+{old_name}\b',38 rf'public \1 {new_name}',39 code_str,40 count=141 )42 # Rename constructor43 code_str = re.sub(rf'\b{old_name}\s*\(', f'{new_name}(', code_str)44 45 # Rename usages (instantiations, static, cast, vars)46 usage_patterns = [47 rf'\bnew\s+{old_name}\b',48 rf'\b{old_name}\s*\.',49 rf'\({old_name}\)',50 rf'\b{old_name}\s+\w',51 ]52 for pattern in usage_patterns:53 code_str = re.sub(pattern, lambda m: m.group(0).replace(old_name, new_name), code_str)54 55 return code_str56 57def has_orphan_methods(code_str):58 method_pattern = re.compile(59 r'^\s*(public|protected|private)?\s+(static\s+)?[\w<>\[\]]+\s+\w+\s*\([^;]*\)\s*(throws\s+[\w, ]+)?\s*{',60 flags=re.MULTILINE61 )62 return bool(method_pattern.search(code_str))63 64def save_content_to_file(content, filename_base, directory):65 os.makedirs(directory, exist_ok=True)66 file_path = os.path.join(directory, f"{filename_base}.java")67 with open(file_path, "w") as f:68 f.write(content)69 70seen_classnames = dict()71 72with open(input_path, 'r') as f:73 for idx, line in enumerate(f):74 try:75 entry = json.loads(line)76 func_code = entry.get(code_field)77 if func_code:78 package_stmt, code_no_package = extract_and_clean_package(func_code)79 imports_stmt, cleaned_code = extract_and_clean_imports(code_no_package)80 81 # Check if it has a public class and no orphan methods82 top_level_class = re.search(r'^\s*public\s+class\s+\w+', cleaned_code, re.MULTILINE)83 should_wrap = has_orphan_methods(cleaned_code) or not top_level_class84 85 if not should_wrap:86 class_name = extract_top_level_type_name(cleaned_code)87 if class_name:88 count = seen_classnames.get(class_name, 0) + 189 seen_classnames[class_name] = count90 91 if count == 1:92 final_class_name = class_name93 else:94 final_class_name = f"{class_name}_{count}"95 cleaned_code = rename_class_everywhere(cleaned_code, class_name, final_class_name)96 97 filename_base = sanitize_filename(final_class_name)98 final_code = '\n\n'.join(filter(None, [package_stmt, imports_stmt, cleaned_code]))99 else:100 filename_base = f"TempClass{idx}"101 wrapped_code = wrap_code_in_temp_class(cleaned_code, filename_base)102 final_code = '\n\n'.join(filter(None, [package_stmt, imports_stmt, wrapped_code]))103 else:104 filename_base = f"TempClass{idx}"105 wrapped_code = wrap_code_in_temp_class(cleaned_code, filename_base)106 final_code = '\n\n'.join(filter(None, [package_stmt, imports_stmt, wrapped_code]))107 108 save_content_to_file(final_code.strip(), filename_base, output_dir)109 110 except json.JSONDecodeError:111 print(f"Skipping malformed JSON line {idx}")112 except Exception as e:113 print(f"Error processing line {idx}: {e}")114 115# Print how many files were created116num_files = len([f for f in os.listdir(output_dir) if f.endswith(".java")])117print(f"\nSaved {num_files} .java files in: {output_dir}\n")