Skip to content

Commit

Permalink
java: Заготовка трансляции перечислений
Browse files Browse the repository at this point in the history
failures (173):
    expressions::call
    formats::generate_formats_3d_gltf_binary_ksy
    formats::generate_formats_archive_android_bootldr_asus_ksy
    formats::generate_formats_archive_android_bootldr_huawei_ksy
    formats::generate_formats_archive_android_bootldr_qcom_ksy
    formats::generate_formats_archive_android_dto_ksy
    formats::generate_formats_archive_android_img_ksy
    formats::generate_formats_archive_android_sparse_ksy
    formats::generate_formats_archive_cpio_old_le_ksy
    formats::generate_formats_archive_gzip_ksy
    formats::generate_formats_archive_mozilla_mar_ksy
    formats::generate_formats_archive_phar_without_stub_ksy
    formats::generate_formats_archive_rar_ksy
    formats::generate_formats_archive_respack_ksy
    formats::generate_formats_archive_rpm_ksy
    formats::generate_formats_archive_xar_ksy
    formats::generate_formats_archive_zip_ksy
    formats::generate_formats_archive_zisofs_ksy
    formats::generate_formats_common_bcd_ksy
    formats::generate_formats_common_dos_datetime_ksy
    formats::generate_formats_common_vlq_base128_be_ksy
    formats::generate_formats_common_vlq_base128_le_ksy
    formats::generate_formats_database_dbf_ksy
    formats::generate_formats_database_gettext_mo_ksy
    formats::generate_formats_database_sqlite3_ksy
    formats::generate_formats_database_tsm_ksy
    formats::generate_formats_executable_android_nanoapp_header_ksy
    formats::generate_formats_executable_dex_ksy
    formats::generate_formats_executable_dos_mz_ksy
    formats::generate_formats_executable_elf_ksy
    formats::generate_formats_executable_java_class_ksy
    formats::generate_formats_executable_mach_o_fat_ksy
    formats::generate_formats_executable_mach_o_ksy
    formats::generate_formats_executable_microsoft_pe_ksy
    formats::generate_formats_executable_python_pyc_27_ksy
    formats::generate_formats_executable_swf_ksy
    formats::generate_formats_executable_uefi_te_ksy
    formats::generate_formats_filesystem_amlogic_emmc_partitions_ksy
    formats::generate_formats_filesystem_android_super_ksy
    formats::generate_formats_filesystem_apm_partition_table_ksy
    formats::generate_formats_filesystem_btrfs_stream_ksy
    formats::generate_formats_filesystem_cramfs_ksy
    formats::generate_formats_filesystem_ext2_ksy
    formats::generate_formats_filesystem_gpt_partition_table_ksy
    formats::generate_formats_filesystem_iso9660_ksy
    formats::generate_formats_filesystem_luks_ksy
    formats::generate_formats_filesystem_lvm2_ksy
    formats::generate_formats_filesystem_mbr_partition_table_ksy
    formats::generate_formats_filesystem_tr_dos_image_ksy
    formats::generate_formats_filesystem_vdi_ksy
    formats::generate_formats_filesystem_vfat_ksy
    formats::generate_formats_filesystem_vmware_vmdk_ksy
    formats::generate_formats_filesystem_zx_spectrum_tap_ksy
    formats::generate_formats_firmware_broadcom_trx_ksy
    formats::generate_formats_firmware_ines_ksy
    formats::generate_formats_firmware_uimage_ksy
    formats::generate_formats_font_grub2_font_ksy
    formats::generate_formats_font_pcf_font_ksy
    formats::generate_formats_font_ttf_ksy
    formats::generate_formats_game_allegro_dat_ksy
    formats::generate_formats_game_gran_turismo_vol_ksy
    formats::generate_formats_game_heaps_pak_ksy
    formats::generate_formats_game_quake2_md2_ksy
    formats::generate_formats_game_quake_mdl_ksy
    formats::generate_formats_game_quake_pak_ksy
    formats::generate_formats_game_saints_row_2_vpp_pc_ksy
    formats::generate_formats_game_warcraft_2_pud_ksy
    formats::generate_formats_geospatial_shapefile_index_ksy
    formats::generate_formats_geospatial_shapefile_main_ksy
    formats::generate_formats_hardware_dtb_ksy
    formats::generate_formats_hardware_edid_ksy
    formats::generate_formats_hardware_mifare_mifare_classic_ksy
    formats::generate_formats_image_bmp_ksy
    formats::generate_formats_image_dicom_ksy
    formats::generate_formats_image_exif_ksy
    formats::generate_formats_image_gif_ksy
    formats::generate_formats_image_gimp_brush_ksy
    formats::generate_formats_image_icc_4_ksy
    formats::generate_formats_image_ico_ksy
    formats::generate_formats_image_jpeg_ksy
    formats::generate_formats_image_nitf_ksy
    formats::generate_formats_image_pcx_dcx_ksy
    formats::generate_formats_image_pcx_ksy
    formats::generate_formats_image_pif_ksy
    formats::generate_formats_image_png_ksy
    formats::generate_formats_image_psx_tim_ksy
    formats::generate_formats_image_wmf_ksy
    formats::generate_formats_log_mcap_ksy
    formats::generate_formats_log_sudoers_ts_ksy
    formats::generate_formats_log_systemd_journal_ksy
    formats::generate_formats_log_windows_evt_log_ksy
    formats::generate_formats_macos_ds_store_ksy
    formats::generate_formats_macos_mac_os_resource_snd_ksy
    formats::generate_formats_macos_resource_compression_dcmp_2_ksy
    formats::generate_formats_macos_resource_fork_ksy
    formats::generate_formats_media_android_opengl_shaders_cache_ksy
    formats::generate_formats_media_au_ksy
    formats::generate_formats_media_avi_ksy
    formats::generate_formats_media_blender_blend_ksy
    formats::generate_formats_media_creative_voice_file_ksy
    formats::generate_formats_media_genmidi_op2_ksy
    formats::generate_formats_media_id3v1_1_ksy
    formats::generate_formats_media_id3v2_3_ksy
    formats::generate_formats_media_id3v2_4_ksy
    formats::generate_formats_media_magicavoxel_vox_ksy
    formats::generate_formats_media_ogg_ksy
    formats::generate_formats_media_standard_midi_file_ksy
    formats::generate_formats_media_tracker_modules_fasttracker_xm_module_ksy
    formats::generate_formats_media_tracker_modules_s3m_ksy
    formats::generate_formats_media_vp8_ivf_ksy
    formats::generate_formats_media_wav_ksy
    formats::generate_formats_network_bitcoin_transaction_ksy
    formats::generate_formats_network_dime_message_ksy
    formats::generate_formats_network_ethernet_frame_ksy
    formats::generate_formats_network_hccapx_ksy
    formats::generate_formats_network_icmp_packet_ksy
    formats::generate_formats_network_ipv4_packet_ksy
    formats::generate_formats_network_microsoft_network_monitor_v2_ksy
    formats::generate_formats_network_packet_ppi_ksy
    formats::generate_formats_network_pcap_ksy
    formats::generate_formats_network_rtcp_payload_ksy
    formats::generate_formats_network_rtp_packet_ksy
    formats::generate_formats_network_rtpdump_ksy
    formats::generate_formats_network_some_ip_some_ip_container_ksy
    formats::generate_formats_network_some_ip_some_ip_ksy
    formats::generate_formats_network_some_ip_some_ip_sd_entries_ksy
    formats::generate_formats_network_tcp_segment_ksy
    formats::generate_formats_network_websocket_ksy
    formats::generate_formats_scientific_nt_mdt_nt_mdt_pal_ksy
    formats::generate_formats_scientific_spectroscopy_specpr_ksy
    formats::generate_formats_security_efivar_signature_list_ksy
    formats::generate_formats_security_openpgp_message_ksy
    formats::generate_formats_serialization_bson_ksy
    formats::generate_formats_serialization_microsoft_cfb_ksy
    formats::generate_formats_serialization_php_serialized_value_ksy
    formats::generate_formats_serialization_ruby_marshal_ksy
    formats::generate_formats_windows_regf_ksy
    formats::generate_formats_windows_windows_lnk_file_ksy
    formats::generate_formats_windows_windows_minidump_ksy
    formats::generate_test_data_formats_bits_byte_aligned_ksy
    formats::generate_test_data_formats_bits_enum_ksy
    formats::generate_test_data_formats_bits_seq_endian_combo_ksy
    formats::generate_test_data_formats_bits_shift_by_b32_le_ksy
    formats::generate_test_data_formats_bits_shift_by_b64_le_ksy
    formats::generate_test_data_formats_bits_signed_res_b32_be_ksy
    formats::generate_test_data_formats_bits_signed_res_b32_le_ksy
    formats::generate_test_data_formats_bits_signed_shift_b32_le_ksy
    formats::generate_test_data_formats_bits_signed_shift_b64_le_ksy
    formats::generate_test_data_formats_bits_simple_ksy
    formats::generate_test_data_formats_bits_simple_le_ksy
    formats::generate_test_data_formats_bits_unaligned_b32_be_ksy
    formats::generate_test_data_formats_bits_unaligned_b32_le_ksy
    formats::generate_test_data_formats_bits_unaligned_b64_be_ksy
    formats::generate_test_data_formats_bits_unaligned_b64_le_ksy
    formats::generate_test_data_formats_combine_bool_ksy
    formats::generate_test_data_formats_default_bit_endian_mod_ksy
    formats::generate_test_data_formats_default_endian_expr_exception_ksy
    formats::generate_test_data_formats_default_endian_expr_inherited_ksy
    formats::generate_test_data_formats_default_endian_expr_is_be_ksy
    formats::generate_test_data_formats_default_endian_expr_is_le_ksy
    formats::generate_test_data_formats_expr_bits_ksy
    formats::generate_test_data_formats_fixed_contents_ksy
    formats::generate_test_data_formats_fixed_struct_ksy
    formats::generate_test_data_formats_imports_abs_ksy
    formats::generate_test_data_formats_integers_ksy
    formats::generate_test_data_formats_io_local_var_ksy
    formats::generate_test_data_formats_params_pass_bool_ksy
    formats::generate_test_data_formats_repeat_eos_bit_ksy
    formats::generate_test_data_formats_switch_bytearray_ksy
    formats::generate_test_data_formats_ts_packet_header_ksy
    formats::generate_test_data_formats_valid_fail_contents_ksy
    formats::generate_test_data_formats_valid_fail_repeat_contents_ksy
    formats::generate_test_data_formats_valid_optional_id_ksy
  • Loading branch information
Mingun committed Oct 6, 2024
1 parent 4f994b8 commit e611fdd
Showing 1 changed file with 53 additions and 2 deletions.
55 changes: 53 additions & 2 deletions ksc-java/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ use heck::{ToLowerCamelCase, ToShoutySnakeCase, ToUpperCamelCase};
use indexmap::IndexMap;
use ksc::model::expressions::{OwningAttr, OwningEnumRef, OwningNode};
use ksc::model::{
Attribute, AttributeName, Chunk, EnumName, EnumVariantName, Enumerable, FieldName, OptionalName,
Repeat, Root, SeqName, Terminator, TypeName, TypeRef, UserType, Variant,
Attribute, AttributeName, Chunk, Enum, EnumName, EnumVariantName, Enumerable, FieldName,
OptionalName, Repeat, Root, SeqName, Terminator, TypeName, TypeRef, UserType, Variant,
};
use ksc::parser::expressions::ContextVar;
use num_traits::cast::ToPrimitive;
Expand Down Expand Up @@ -170,13 +170,17 @@ impl<'a> TypeGenerator<'a> {

let classes = ty.types.iter().map(|(n, t)| TypeGenerator::new(t).translate(n, t, true));

let enums = ty.enums.iter().map(|(n, e)| self.translate_enum(n, e));

quote! {
#header
public #static_ class #name implements PositionInfo {
#(#fields)*

public final Map<String, Span> _spans = new HashMap<>();

#(#enums)*

#(#classes)*

@Override
Expand Down Expand Up @@ -415,6 +419,53 @@ impl<'a> TypeGenerator<'a> {
}
}

fn translate_enum(&self, name: &EnumName, enum_: &Enum) -> TokenStream {
let java_name = self.translate_enum_name(name);
let elements = enum_.iter().map(|(id, variant)| {
let variant = self.translate_enum_value_name(&variant.name);
// SAFETY: Parsing are always successful because we generate a correct token
let id = Literal::from_str(&format!("{id}L")).unwrap();

quote!(#variant(#id))
});
quote! {
@Generated(id = "#name")
public interface #java_name extends KaitaiEnum {
public enum Known implements #java_name {
#(#elements),*;

private final long value;
private Known(long value) { this.value = value; }
@Override
public long value() { return value; }
}
public static final class Unknown implements #java_name {
private final long value;
private Unknown(long value) { this.value = value; }

@Override
public int ordinal() { return -1; }
@Override
public String name() { return null; }
@Override
public long value() { return value; }
@Override
public String toString() { return "#java_name("+value+")"; }

private static final HashMap<Long, Unknown> unknown = new HashMap<>();
public static #java_name resolve(final long value) {
for (final Known e : Known.values()) {
if (e.value() == value) {
return e;
}
}
return unknown.computeIfAbsent(value, Unknown::new);
}
}
}
}
}

/// Converts kaitai's type name to Java name
fn translate_type_name(&self, name: &TypeName) -> Ident {
Ident::new(&name.to_upper_camel_case(), Span::call_site())
Expand Down

0 comments on commit e611fdd

Please sign in to comment.