fn is_vec_u8(ty: &TypeRef) -> bool {
matches!(
ty,
TypeRef::Vec(inner) if matches!(inner.as_ref(), TypeRef::Primitive(crate::core::ir::PrimitiveType::U8))
)
}
fn is_binary_return_type(ty: &TypeRef) -> bool {
matches!(ty, TypeRef::Bytes) || is_vec_u8(ty)
}
fn is_optional_binary_return_type(ty: &TypeRef) -> bool {
matches!(ty, TypeRef::Optional(inner) if is_binary_return_type(inner))
}
fn is_binary_param_type(ty: &TypeRef) -> bool {
match ty {
TypeRef::Bytes => true,
TypeRef::Vec(inner) => matches!(inner.as_ref(), TypeRef::Primitive(crate::core::ir::PrimitiveType::U8)),
TypeRef::Optional(inner) => is_binary_param_type(inner),
_ => false,
}
}
fn needs_json_deserialize(ty: &TypeRef) -> bool {
match ty {
TypeRef::Named(_) => true,
TypeRef::Optional(inner) => matches!(inner.as_ref(), TypeRef::Named(_)),
TypeRef::Map(_, _) => true,
TypeRef::Vec(inner) => {
!matches!(inner.as_ref(), TypeRef::Primitive(crate::core::ir::PrimitiveType::U8))
}
_ => false,
}
}
fn jni_return_type(ty: &TypeRef) -> &'static str {
match ty {
TypeRef::Unit => "Unit",
TypeRef::Primitive(p) => {
use crate::core::ir::PrimitiveType;
match p {
PrimitiveType::Bool => "Boolean",
PrimitiveType::I8 => "Byte",
PrimitiveType::I16 => "Short",
PrimitiveType::I32 => "Int",
PrimitiveType::I64 => "Long",
PrimitiveType::U8 => "Byte",
PrimitiveType::U16 => "Short",
PrimitiveType::U32 => "Int",
PrimitiveType::U64 => "Long",
PrimitiveType::F32 => "Float",
PrimitiveType::F64 => "Double",
PrimitiveType::Usize | PrimitiveType::Isize => "Long",
}
}
TypeRef::String => "String",
TypeRef::Bytes => "ByteArray",
TypeRef::Optional(inner) if is_binary_return_type(inner) => "ByteArray?",
TypeRef::Optional(_) => "String?",
TypeRef::Named(_) => "String",
TypeRef::Vec(inner) => {
if matches!(inner.as_ref(), TypeRef::Primitive(crate::core::ir::PrimitiveType::U8)) {
"ByteArray"
} else {
"String"
}
}
TypeRef::Map(_, _) => "String",
_ => "Long",
}
}
fn jni_return_type_for_function(ty: &TypeRef, opaque_type_names: &std::collections::HashSet<&str>) -> &'static str {
if let TypeRef::Named(n) = ty {
if opaque_type_names.contains(n.as_str()) {
return "Long";
}
}
jni_return_type(ty)
}
fn jni_params_for_function(
f: &crate::core::ir::FunctionDef,
opaque_type_names: &std::collections::HashSet<&str>,
) -> String {
f.params
.iter()
.map(|p| {
let jni_ty = jni_param_type_for_function(&p.ty, opaque_type_names);
let name = to_lower_camel(&p.name);
format!("{name}: {jni_ty}")
})
.collect::<Vec<_>>()
.join(", ")
}
fn jni_param_type_for_function(ty: &TypeRef, opaque_type_names: &std::collections::HashSet<&str>) -> &'static str {
let base = match ty {
TypeRef::Optional(inner) => inner.as_ref(),
other => other,
};
if let TypeRef::Named(n) = base {
if opaque_type_names.contains(n.as_str()) {
return "Long";
}
}
jni_param_type(ty)
}
fn jni_param_type(ty: &TypeRef) -> &'static str {
if is_binary_param_type(ty) {
return "String";
}
match ty {
TypeRef::Primitive(p) => {
use crate::core::ir::PrimitiveType;
match p {
PrimitiveType::Bool => "Boolean",
PrimitiveType::I8 => "Byte",
PrimitiveType::I16 => "Short",
PrimitiveType::I32 => "Int",
PrimitiveType::I64 => "Long",
PrimitiveType::U8 => "Byte",
PrimitiveType::U16 => "Short",
PrimitiveType::U32 => "Int",
PrimitiveType::U64 => "Long",
PrimitiveType::F32 => "Float",
PrimitiveType::F64 => "Double",
PrimitiveType::Usize | PrimitiveType::Isize => "Long",
}
}
TypeRef::String => "String",
_ => "String",
}
}