@@ -337,54 +337,94 @@ def wrap_target_calls_with_treesitter(
337337 orig_line = body_lines [line_idx ]
338338 line_indent_str = " " * (len (orig_line ) - len (orig_line .lstrip ()))
339339
340+ is_void = target_return_type == "void"
340341 var_name = f"_cf_result{ iter_id } _{ call_counter } "
342+ receiver = call .get ("receiver" , "this" )
341343 cast_type = _infer_array_cast_type (orig_line )
342- if not cast_type and target_return_type and target_return_type != "void" :
344+ if not cast_type and target_return_type and not is_void :
343345 cast_type = target_return_type
344346 var_with_cast = f"({ cast_type } ){ var_name } " if cast_type else var_name
345347
346- capture_stmt_with_decl = f"var { var_name } = { call ['full_call' ]} ;"
347- capture_stmt_assign = f"{ var_name } = { call ['full_call' ]} ;"
348- if precise_call_timing :
349- serialize_stmt = f"_cf_serializedResult{ iter_id } _{ call_counter } = com.codeflash.Serializer.serialize((Object) { var_name } );"
350- start_stmt = f"_cf_start{ iter_id } _{ call_counter } = System.nanoTime();"
351- end_stmt = f"_cf_end{ iter_id } _{ call_counter } = System.nanoTime();"
348+ if is_void :
349+ bare_call_stmt = f"{ call ['full_call' ]} ;"
350+ if precise_call_timing :
351+ serialize_stmt = f"_cf_serializedResult{ iter_id } _{ call_counter } = com.codeflash.Serializer.serialize((Object) { receiver } );"
352+ start_stmt = f"_cf_start{ iter_id } _{ call_counter } = System.nanoTime();"
353+ end_stmt = f"_cf_end{ iter_id } _{ call_counter } = System.nanoTime();"
354+ else :
355+ serialize_stmt = (
356+ f"_cf_serializedResult{ iter_id } = com.codeflash.Serializer.serialize((Object) { receiver } );"
357+ )
358+ start_stmt = f"_cf_start{ iter_id } = System.nanoTime();"
359+ end_stmt = f"_cf_end{ iter_id } = System.nanoTime();"
352360 else :
353- serialize_stmt = f"_cf_serializedResult{ iter_id } = com.codeflash.Serializer.serialize((Object) { var_name } );"
354- start_stmt = f"_cf_start{ iter_id } = System.nanoTime();"
355- end_stmt = f"_cf_end{ iter_id } = System.nanoTime();"
361+ capture_stmt_with_decl = f"var { var_name } = { call ['full_call' ]} ;"
362+ capture_stmt_assign = f"{ var_name } = { call ['full_call' ]} ;"
363+ if precise_call_timing :
364+ serialize_stmt = f"_cf_serializedResult{ iter_id } _{ call_counter } = com.codeflash.Serializer.serialize((Object) { var_name } );"
365+ start_stmt = f"_cf_start{ iter_id } _{ call_counter } = System.nanoTime();"
366+ end_stmt = f"_cf_end{ iter_id } _{ call_counter } = System.nanoTime();"
367+ else :
368+ serialize_stmt = (
369+ f"_cf_serializedResult{ iter_id } = com.codeflash.Serializer.serialize((Object) { var_name } );"
370+ )
371+ start_stmt = f"_cf_start{ iter_id } = System.nanoTime();"
372+ end_stmt = f"_cf_end{ iter_id } = System.nanoTime();"
356373
357374 if call ["parent_type" ] == "expression_statement" :
358375 es_start = call ["_es_start_char" ]
359376 es_end = call ["_es_end_char" ]
360377 if precise_call_timing :
361378 # No indent on first line — body_text[:es_start] already has leading whitespace.
362379 # Subsequent lines get line_indent_str.
363- var_decls = [
364- f"Object { var_name } = null;" ,
365- f"long _cf_end{ iter_id } _{ call_counter } = -1;" ,
366- f"long _cf_start{ iter_id } _{ call_counter } = 0;" ,
367- f"byte[] _cf_serializedResult{ iter_id } _{ call_counter } = null;" ,
368- ]
380+ if is_void :
381+ var_decls = [
382+ f"long _cf_end{ iter_id } _{ call_counter } = -1;" ,
383+ f"long _cf_start{ iter_id } _{ call_counter } = 0;" ,
384+ f"byte[] _cf_serializedResult{ iter_id } _{ call_counter } = null;" ,
385+ ]
386+ else :
387+ var_decls = [
388+ f"Object { var_name } = null;" ,
389+ f"long _cf_end{ iter_id } _{ call_counter } = -1;" ,
390+ f"long _cf_start{ iter_id } _{ call_counter } = 0;" ,
391+ f"byte[] _cf_serializedResult{ iter_id } _{ call_counter } = null;" ,
392+ ]
369393 start_marker = f'System.out.println("!$######" + _cf_mod{ iter_id } + ":" + _cf_cls{ iter_id } + "." + _cf_test{ iter_id } + ":" + _cf_fn{ iter_id } + ":" + _cf_loop{ iter_id } + ":{ inv_id } " + "######$!");'
370- try_block = [
371- "try {" ,
372- f" { start_stmt } " ,
373- f" { capture_stmt_assign } " ,
374- f" { end_stmt } " ,
375- f" { serialize_stmt } " ,
376- ]
394+ if is_void :
395+ try_block = [
396+ "try {" ,
397+ f" { start_stmt } " ,
398+ f" { bare_call_stmt } " ,
399+ f" { end_stmt } " ,
400+ f" { serialize_stmt } " ,
401+ ]
402+ else :
403+ try_block = [
404+ "try {" ,
405+ f" { start_stmt } " ,
406+ f" { capture_stmt_assign } " ,
407+ f" { end_stmt } " ,
408+ f" { serialize_stmt } " ,
409+ ]
377410 finally_block = _generate_sqlite_write_code (
378411 iter_id , call_counter , "" , class_name , func_name , test_method_name , invocation_id = inv_id
379412 )
380413 all_lines = [* var_decls , start_marker , * try_block , * finally_block ]
381414 replacement = (
382415 all_lines [0 ] + "\n " + "\n " .join (f"{ line_indent_str } { repl_line } " for repl_line in all_lines [1 :])
383416 )
417+ elif is_void :
418+ replacement = f"{ bare_call_stmt } { serialize_stmt } "
384419 else :
385420 replacement = f"{ capture_stmt_with_decl } { serialize_stmt } "
386421 body_text = body_text [:es_start ] + replacement + body_text [es_end :]
387422 else :
423+ if is_void :
424+ # Void calls cannot be embedded in expressions in valid Java — skip instrumentation
425+ logger .warning ("Skipping instrumentation of embedded void call: %s" , call ["full_call" ])
426+ continue
427+
388428 # Embedded call: replace call with variable, then insert capture lines before the line
389429 call_start = call ["_call_start_char" ]
390430 call_end = call ["_call_end_char" ]
@@ -451,6 +491,8 @@ def _collect_calls(
451491 if parent_type == "expression_statement" :
452492 es_start = parent .start_byte - prefix_len
453493 es_end = parent .end_byte - prefix_len
494+ object_node = node .child_by_field_name ("object" )
495+ receiver = analyzer .get_node_text (object_node , wrapper_bytes ) if object_node else "this"
454496 out .append (
455497 {
456498 "start_byte" : start ,
@@ -461,6 +503,7 @@ def _collect_calls(
461503 "in_complex" : _is_inside_complex_expression (node ),
462504 "es_start_byte" : es_start ,
463505 "es_end_byte" : es_end ,
506+ "receiver" : receiver ,
464507 }
465508 )
466509 for child in node .children :
0 commit comments