CoolFace
Apppublic

OSS-forge/CodeQualityEval

sourceHugging Facecc-by-sa-4.0updated 10mo agoView on Hugging Face
12likes
wrap_java_functions.py117 linesDownload Raw Back to 3_Code_Defects_Analysis
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")