Skip to content

Commit e8de7ab

Browse files
committed
feat: add language version support across multiple language implementations
1 parent 04b0dbd commit e8de7ab

7 files changed

Lines changed: 27 additions & 3 deletions

File tree

codeflash/api/aiservice.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ def optimize_code(
129129
experiment_metadata: ExperimentMetadata | None = None,
130130
*,
131131
language: str = "python",
132-
language_version: str
133-
| None = None, # TODO:{claude} add language version to the language support and it should be cached
132+
language_version: str | None = None,
134133
module_system: str | None = None,
135134
is_async: bool = False,
136135
n_candidates: int = 5,

codeflash/languages/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,11 @@ def dir_excludes(self) -> frozenset[str]:
322322
"""
323323
...
324324

325+
@property
326+
def language_version(self) -> str | None:
327+
"""The detected language version (e.g., "17" for Java, "ES2022" for JS)."""
328+
...
329+
325330
# === Discovery ===
326331

327332
def discover_functions(

codeflash/languages/java/support.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def __init__(self) -> None:
6464
self._analyzer = get_java_analyzer()
6565
self.line_profiler_agent_arg: str | None = None
6666
self.line_profiler_warmup_iterations: int = 0
67+
self._language_version: str | None = None
6768

6869
@property
6970
def language(self) -> Language:
@@ -93,6 +94,10 @@ def default_file_extension(self) -> str:
9394
def dir_excludes(self) -> frozenset[str]:
9495
return frozenset({"target", "build", ".gradle", ".mvn", ".idea"})
9596

97+
@property
98+
def language_version(self) -> str | None:
99+
return self._language_version
100+
96101
def postprocess_generated_tests(
97102
self, generated_tests: GeneratedTestsList, test_framework: str, project_root: Path, source_file_path: Path
98103
) -> GeneratedTestsList:
@@ -364,6 +369,8 @@ def ensure_runtime_environment(self, project_root: Path) -> bool:
364369
if config is None:
365370
return False
366371

372+
self._language_version = config.java_version
373+
367374
# For now, assume the runtime is available
368375
# A full implementation would check/install the JAR
369376
return True

codeflash/languages/javascript/support.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ def comment_prefix(self) -> str:
6868
def dir_excludes(self) -> frozenset[str]:
6969
return frozenset({"node_modules", "dist", "build", ".next", ".nuxt", "coverage", ".cache", ".turbo", ".vercel"})
7070

71+
@property
72+
def language_version(self) -> str | None:
73+
return None
74+
7175
# === Discovery ===
7276

7377
def discover_functions(

codeflash/languages/python/support.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ def dir_excludes(self) -> frozenset[str]:
107107
}
108108
)
109109

110+
@property
111+
def language_version(self) -> str | None:
112+
return None
113+
110114
# === Discovery ===
111115

112116
def discover_functions(

codeflash/optimization/function_optimizer.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,6 +1451,7 @@ def process_single_candidate(
14511451
optimized_line_profiler_results=best_optimization.line_profiler_test_results["str_out"],
14521452
function_references=function_references,
14531453
language=self.function_to_optimize.language,
1454+
language_version=self.language_support.language_version,
14541455
)
14551456
],
14561457
)
@@ -1512,6 +1513,7 @@ def determine_best_candidate(
15121513
else None,
15131514
is_numerical_code=self.is_numerical_code and not self.args.no_jit_opts,
15141515
language=self.function_to_optimize.language,
1516+
language_version=self.language_support.language_version,
15151517
)
15161518

15171519
processor = CandidateProcessor(
@@ -2139,6 +2141,7 @@ def generate_optimizations(
21392141
self.function_trace_id[:-4] + "EXP0" if run_experiment else self.function_trace_id,
21402142
ExperimentMetadata(id=self.experiment_id, group="control") if run_experiment else None,
21412143
language=self.function_to_optimize.language,
2144+
language_version=self.language_support.language_version,
21422145
is_async=self.function_to_optimize.is_async,
21432146
n_candidates=n_candidates,
21442147
is_numerical_code=is_numerical_code,
@@ -2165,6 +2168,7 @@ def generate_optimizations(
21652168
self.function_trace_id[:-4] + "EXP1",
21662169
ExperimentMetadata(id=self.experiment_id, group="experiment"),
21672170
language=self.function_to_optimize.language,
2171+
language_version=self.language_support.language_version,
21682172
is_async=self.function_to_optimize.is_async,
21692173
n_candidates=n_candidates,
21702174
)

codeflash/verification/verifier.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from codeflash.cli_cmds.console import logger
99
from codeflash.code_utils.code_utils import get_run_tmp_file, module_name_from_file_path
10-
from codeflash.languages import is_java, is_javascript
10+
from codeflash.languages import current_language_support, is_java, is_javascript
1111
from codeflash.verification.verification_utils import ModifyInspiredTests, delete_multiple_if_name_main
1212

1313
if TYPE_CHECKING:
@@ -68,6 +68,7 @@ def generate_tests(
6868
trace_id=function_trace_id,
6969
test_index=test_index,
7070
language=function_to_optimize.language,
71+
language_version=current_language_support().language_version,
7172
module_system=project_module_system,
7273
is_numerical_code=is_numerical_code,
7374
)

0 commit comments

Comments
 (0)