Skip to content

Commit 19a0d5d

Browse files
committed
Add support for including private classes, methods, fields.
1 parent 2d9ebb5 commit 19a0d5d

File tree

5 files changed

+36
-23
lines changed

5 files changed

+36
-23
lines changed

java-spaghetti-gen/src/config.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ pub struct DocPattern {
9090
pub argument_seperator: String,
9191
}
9292

93-
#[derive(Debug, Clone, Deserialize)]
93+
#[derive(Debug, Clone, Deserialize, Default)]
9494
pub struct Rule {
9595
/// What java class(es) to match against. This takes the form of a simple prefix to a JNI path with no wildcards.
9696
///
@@ -105,6 +105,13 @@ pub struct Rule {
105105
#[serde(default)]
106106
pub include: Option<bool>,
107107

108+
#[serde(default)]
109+
pub include_private_classes: Option<bool>,
110+
#[serde(default)]
111+
pub include_private_methods: Option<bool>,
112+
#[serde(default)]
113+
pub include_private_fields: Option<bool>,
114+
108115
#[serde(default)]
109116
pub proxy: Option<bool>,
110117

@@ -115,6 +122,10 @@ pub struct Rule {
115122
#[derive(Debug, Clone)]
116123
pub struct ClassConfig<'a> {
117124
pub include: bool,
125+
126+
pub include_private_classes: bool,
127+
pub include_private_methods: bool,
128+
pub include_private_fields: bool,
118129
pub proxy: bool,
119130
pub doc_pattern: Option<&'a DocPattern>,
120131
}
@@ -150,12 +161,7 @@ impl Config {
150161
serde_yaml::from_str(buffer).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
151162

152163
if config.rules.is_empty() {
153-
config.rules.push(Rule {
154-
prefix: "".to_string(),
155-
include: Some(true),
156-
doc_pattern: None,
157-
proxy: None,
158-
})
164+
config.rules.push(Rule::default())
159165
}
160166

161167
config.output = resolve_file(&config.output, dir);
@@ -199,6 +205,9 @@ impl Config {
199205
pub fn resolve_class(&self, class: &str) -> ClassConfig<'_> {
200206
let mut res = ClassConfig {
201207
include: false,
208+
include_private_classes: false,
209+
include_private_methods: false,
210+
include_private_fields: false,
202211
proxy: false,
203212
doc_pattern: None,
204213
};
@@ -208,6 +217,15 @@ impl Config {
208217
if let Some(include) = r.include {
209218
res.include = include;
210219
}
220+
if let Some(include_private_classes) = r.include_private_classes {
221+
res.include_private_classes = include_private_classes;
222+
}
223+
if let Some(include_private_methods) = r.include_private_methods {
224+
res.include_private_methods = include_private_methods;
225+
}
226+
if let Some(include_private_fields) = r.include_private_fields {
227+
res.include_private_fields = include_private_fields;
228+
}
211229
if let Some(proxy) = r.proxy {
212230
res.proxy = proxy;
213231
}

java-spaghetti-gen/src/emit_rust/class_proxy.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ impl Class {
2020
let mut out = TokenStream::new();
2121
let mut contents = TokenStream::new();
2222

23-
let visibility = if self.java.is_public() { quote!(pub) } else { quote!() };
2423
let rust_name = format_ident!("{}", &self.rust.struct_name);
2524

2625
let object = context
@@ -137,7 +136,7 @@ impl Class {
137136
let native_name = format_ident!("{native_name}");
138137

139138
out.extend(quote!(
140-
#visibility trait #rust_proxy_name: ::std::marker::Send + ::std::marker::Sync + 'static {
139+
pub trait #rust_proxy_name: ::std::marker::Send + ::std::marker::Sync + 'static {
141140
#trait_methods
142141
}
143142

java-spaghetti-gen/src/emit_rust/classes.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,19 @@ impl Class {
9999
"class"
100100
};
101101

102-
let visibility = if self.java.is_public() { quote!(pub) } else { quote!() };
102+
let visibility = if self.java.is_public() || cc.include_private_classes {
103+
quote!(pub)
104+
} else {
105+
quote!()
106+
};
103107
let attributes = match self.java.deprecated() {
104108
true => quote!(#[deprecated] ),
105109
false => quote!(),
106110
};
107111

108112
let docs = match KnownDocsUrl::from_class(&cc, self.java.path()) {
109-
Some(url) => format!("{visibility} {keyword} {url}"),
110-
None => format!("{visibility} {keyword} {}", self.java.path().as_str()),
113+
Some(url) => format!("{keyword} {url}"),
114+
None => format!("{keyword} {}", self.java.path().as_str()),
111115
};
112116

113117
let rust_name = format_ident!("{}", &self.rust.struct_name);
@@ -177,13 +181,13 @@ impl Class {
177181
.java
178182
.methods()
179183
.map(|m| Method::new(&self.java, m))
180-
.filter(|m| m.java.is_public() && !m.java.is_bridge())
184+
.filter(|m| (m.java.is_public() || cc.include_private_methods) && !m.java.is_bridge())
181185
.collect();
182186
let mut fields: Vec<Field> = self
183187
.java
184188
.fields()
185189
.map(|f| Field::new(&self.java, f))
186-
.filter(|f| f.java.is_public())
190+
.filter(|f| f.java.is_public() || cc.include_private_fields)
187191
.collect();
188192

189193
self.resolve_collisions(&mut methods, &fields)?;

java-spaghetti-gen/src/emit_rust/fields.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ impl<'a> Field<'a> {
2929
pub fn emit(&self, context: &Context, cc: &ClassConfig, mod_: &str) -> anyhow::Result<TokenStream> {
3030
let mut emit_reject_reasons = Vec::new();
3131

32-
if !self.java.is_public() {
33-
emit_reject_reasons.push("Non-public field");
34-
}
35-
3632
let descriptor = &self.java.descriptor();
3733

3834
let rust_set_type = emit_rust_type(

java-spaghetti-gen/src/emit_rust/methods.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ impl<'a> Method<'a> {
5353
self.java.name().to_owned()
5454
};
5555

56-
if !self.java.is_public() {
57-
emit_reject_reasons.push("Non-public method");
58-
}
5956
if self.java.is_bridge() {
6057
emit_reject_reasons.push("Bridge method - type erasure");
6158
}
@@ -117,7 +114,6 @@ impl<'a> Method<'a> {
117114

118115
let mut out = TokenStream::new();
119116

120-
let access = if self.java.is_public() { quote!(pub) } else { quote!() };
121117
let attributes = if self.java.deprecated() {
122118
quote!(#[deprecated])
123119
} else {
@@ -157,7 +153,7 @@ impl<'a> Method<'a> {
157153
out.extend(quote!(
158154
#[doc = #docs]
159155
#attributes
160-
#access fn #method_name<'env>(#params_decl) -> ::std::result::Result<#ret_decl, ::java_spaghetti::Local<'env, #throwable>> {
156+
pub fn #method_name<'env>(#params_decl) -> ::std::result::Result<#ret_decl, ::java_spaghetti::Local<'env, #throwable>> {
161157
static __METHOD: ::std::sync::OnceLock<::java_spaghetti::JMethodID> = ::std::sync::OnceLock::new();
162158
unsafe {
163159
let __jni_args = [#params_array];

0 commit comments

Comments
 (0)