@@ -9,6 +9,7 @@ use std::{
99use anyhow:: { anyhow, Context , Result } ;
1010use axum:: Json ;
1111use base64:: { prelude:: BASE64_STANDARD , Engine } ;
12+ use regex:: Regex ;
1213use serde:: { Deserialize , Serialize } ;
1314use tempdir:: TempDir ;
1415
@@ -55,6 +56,9 @@ fn precompile_headers(compile_request: &CompileRequest) -> Result<()> {
5556 || !compile_request
5657 . compiler_options
5758 . contains ( & format ! ( "--std=c++{cpp_version}" ) )
59+ || !compile_request
60+ . source_code
61+ . contains ( "#include <bits/stdc++.h>" )
5862 {
5963 return Ok ( ( ) ) ;
6064 }
@@ -91,15 +95,22 @@ pub fn compile(compile_request: CompileRequest) -> Result<CompileResponse> {
9195
9296 let program_filename: PathBuf = match compile_request. language {
9397 Language :: Cpp => "program.cpp" . into ( ) ,
94- Language :: Java21 => "Main.java" . into ( ) ,
98+ Language :: Java21 => {
99+ let re = Regex :: new ( r"public\s+class\s+(\w+)" ) . unwrap ( ) ;
100+ if let Some ( captures) = re. captures ( & compile_request. source_code ) {
101+ format ! ( "{}.java" , & captures[ 1 ] ) . into ( )
102+ } else {
103+ "Main.java" . into ( ) // fallback, something went wrong
104+ }
105+ }
95106 Language :: Py12 => "program.py" . into ( ) ,
96107 } ;
97108
98109 let mut source_file = File :: create ( tmp_dir. path ( ) . join ( & program_filename) ) ?;
99110 source_file. write_all ( compile_request. source_code . as_bytes ( ) ) ?;
100111 drop ( source_file) ;
101112
102- if let Err ( err) = precompile_headers ( compile_request) {
113+ if let Err ( err) = precompile_headers ( & compile_request) {
103114 println ! ( "Warning: Failed to precompile headers: {err}" ) ;
104115 }
105116
0 commit comments