From cc2e199f8bba3d973124a84ff988993fad71907d Mon Sep 17 00:00:00 2001 From: Daniel Peng Date: Fri, 30 Oct 2026 01:59:35 +0800 Subject: [PATCH] fix: recognize Java declarations before generic imports --- openevolve/utils/code_utils.py | 5 ++++- tests/test_code_utils.py | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/openevolve/utils/code_utils.py b/openevolve/utils/code_utils.py index faf09c0ed..c99ce6808 100644 --- a/openevolve/utils/code_utils.py +++ b/openevolve/utils/code_utils.py @@ -366,7 +366,10 @@ def extract_code_language(code: str) -> str: Detected language or "unknown" """ # Look for common language signatures - if re.search(r"^(import|from|def|class)\s", code, re.MULTILINE): + # Java imports also match Python's generic import signature. + if re.search(r"^(import|from|def|class)\s", code, re.MULTILINE) and not re.search( + r"^(package\s+[\w.]+\s*;|public class\s)", code, re.MULTILINE + ): return "python" elif re.search(r"^(package|import java|public class)", code, re.MULTILINE): return "java" diff --git a/tests/test_code_utils.py b/tests/test_code_utils.py index ac023ab2a..2e5ee7b76 100644 --- a/tests/test_code_utils.py +++ b/tests/test_code_utils.py @@ -9,6 +9,7 @@ apply_diff, apply_diff_blocks, enforce_evolve_blocks, + extract_code_language, extract_diffs, format_diff_summary, parse_evolve_blocks, @@ -19,6 +20,45 @@ class TestCodeUtils(unittest.TestCase): """Tests for code utilities""" + def test_extract_code_language_java(self): + sources = [ + "package demo;\nimport java.util.List;\npublic class Demo {}", + "import java.util.List;\npublic class Demo {}", + "import static java.util.Collections.emptyList;\npublic class Demo {}", + "public class Demo {}", + ] + for source in sources: + with self.subTest(source=source): + self.assertEqual(extract_code_language(source), "java") + + def test_extract_code_language_python(self): + sources = [ + "import os\nprint(os.getcwd())", + "from math import sqrt\nprint(sqrt(4))", + "def solve():\n return 1", + "class Demo:\n pass", + "import java", + "import java.util", + "import java_api", + "from java import util", + 'import os\npackage = "demo"', + ] + for source in sources: + with self.subTest(source=source): + self.assertEqual(extract_code_language(source), "python") + + def test_extract_code_language_other_signatures(self): + sources = [ + ("#include \nint main() { return 0; }", "cpp"), + ("function solve() { return 1; }", "javascript"), + ("fn main() {}", "rust"), + ("SELECT * FROM users;", "sql"), + ("42 + 7", "unknown"), + ] + for source, language in sources: + with self.subTest(language=language): + self.assertEqual(extract_code_language(source), language) + def test_parse_full_rewrite_line_endings(self): for newline in ("\n", "\r\n"): with self.subTest(newline=repr(newline)):