use super::*;
#[derive(Clone, Copy)]
pub(crate) enum NameKind {
Ptr,
Enum,
DataOrValue,
}
#[derive(Clone)]
pub(crate) struct NameSpec {
pub(crate) subpackage: String,
pub(crate) short: String,
pub(crate) name_override: Option<String>,
pub(crate) kind: NameKind,
}
impl JniGenBuilder {
pub fn set_package_prefix(mut self, p: impl Into<String>) -> Self {
let trimmed = p.into().trim_matches('.').trim_matches('/').to_string();
self.decls.package = mangle_kotlin_package(&trimmed);
if self.decls.package != trimmed {
println!(
"cargo:warning=prebindgen: package prefix `{trimmed}` sanitized to `{}` \
(invalid Kotlin package identifier)",
self.decls.package
);
}
self
}
pub fn set_jni_native_init(mut self, code: impl Into<String>) -> Self {
self.decls.jni_native_init = Some(code.into());
self
}
pub fn set_harness_name_mangle<F>(mut self, f: F) -> Self
where
F: Fn(&str) -> String + Send + Sync + 'static,
{
self.decls.harness_name_mangle = Some(Arc::new(f));
self
}
pub fn set_fun_name_mangle<F>(mut self, f: F) -> Self
where
F: Fn(&str, &str) -> String + Send + Sync + 'static,
{
self.decls.fun_name_mangle = Some(Arc::new(f));
self
}
pub fn set_interface_name_mangle<F>(mut self, f: F) -> Self
where
F: Fn(&str, &str) -> String + Send + Sync + 'static,
{
self.decls.interface_name_mangle = Some(Arc::new(f));
self
}
pub fn set_ptr_class_name_mangle<F>(mut self, f: F) -> Self
where
F: Fn(&str, &str) -> String + Send + Sync + 'static,
{
self.decls.ptr_class_name_mangle = Some(Arc::new(f));
self
}
pub fn set_data_class_name_mangle<F>(mut self, f: F) -> Self
where
F: Fn(&str, &str) -> String + Send + Sync + 'static,
{
self.decls.data_class_name_mangle = Some(Arc::new(f));
self
}
pub fn set_enum_name_mangle<F>(mut self, f: F) -> Self
where
F: Fn(&str, &str) -> String + Send + Sync + 'static,
{
self.decls.enum_name_mangle = Some(Arc::new(f));
self
}
pub fn set_method_name_mangle<F>(mut self, f: F) -> Self
where
F: Fn(&str, &str, &str) -> String + Send + Sync + 'static,
{
self.decls.method_name_mangle = Some(Arc::new(f));
self
}
pub fn set_emit_handle_locks(mut self, emit: bool) -> Self {
self.decls.emit_handle_locks = emit;
self
}
}
impl Declarations {
pub(crate) fn fqn_of(&self, spec: &NameSpec) -> String {
let NameSpec {
subpackage,
short,
name_override,
kind,
} = spec;
if let Some(n) = name_override {
return self.resolve_class_fqn(subpackage, n);
}
let package = self.package_name(subpackage);
let mangled = match kind {
NameKind::Ptr => self.mangle_ptr_class(&package, short),
NameKind::Enum => self.mangle_enum(&package, short),
NameKind::DataOrValue => self.mangle_data_class(&package, short),
};
self.resolve_class_fqn(subpackage, &mangled)
}
pub(crate) fn kotlin_fqn(&self, key: &TypeKey) -> Option<String> {
self.types
.get(key)
.and_then(|cfg| cfg.name_spec.as_ref())
.map(|spec| self.fqn_of(spec))
}
pub(crate) fn java_class_prefix(&self) -> String {
self.package.replace('.', "/")
}
pub(crate) fn native_method_symbol(&self, method: &str) -> String {
super::symbol::native_symbol(&self.package, &self.jni_native_class_name(), method)
}
}