Skip to content

Commit ce99872

Browse files
authored
fix cross-interface symbol resolution in Java guest generator (#458)
Signed-off-by: Joel Dice <joel.dice@fermyon.com> Signed-off-by: Joel Dice <joel.dice@fermyon.com>
1 parent d7b8702 commit ce99872

2 files changed

Lines changed: 30 additions & 18 deletions

File tree

crates/gen-guest-teavm-java/src/lib.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ use wit_bindgen_core::{
1010
wit_parser::{
1111
abi::{AbiVariant, Bindgen, Bitcast, Instruction, LiftLower, WasmType},
1212
Case, Docs, Enum, Flags, FlagsRepr, Function, FunctionKind, Int, InterfaceId, Record,
13-
Resolve, Result_, SizeAlign, Tuple, Type, TypeDefKind, TypeId, Union, Variant, WorldId,
13+
Resolve, Result_, SizeAlign, Tuple, Type, TypeDef, TypeDefKind, TypeId, TypeOwner, Union,
14+
Variant, WorldId,
1415
},
1516
Files, InterfaceGenerator as _, Ns, WorldGenerator,
1617
};
@@ -53,6 +54,7 @@ pub struct TeaVmJava {
5354
needs_result: bool,
5455
classes: HashMap<String, String>,
5556
sizes: SizeAlign,
57+
interface_names: HashMap<InterfaceId, String>,
5658
}
5759

5860
impl TeaVmJava {
@@ -85,6 +87,7 @@ impl WorldGenerator for TeaVmJava {
8587
id: InterfaceId,
8688
_files: &mut Files,
8789
) {
90+
self.interface_names.insert(id, name.to_owned());
8891
let mut gen = self.interface(resolve, name);
8992
gen.types(id);
9093

@@ -119,6 +122,7 @@ impl WorldGenerator for TeaVmJava {
119122
id: InterfaceId,
120123
_files: &mut Files,
121124
) {
125+
self.interface_names.insert(id, name.to_owned());
122126
let mut gen = self.interface(resolve, name);
123127
gen.types(id);
124128

@@ -318,10 +322,18 @@ struct InterfaceGenerator<'a> {
318322
}
319323

320324
impl InterfaceGenerator<'_> {
321-
fn qualifier(&self, when: bool) -> String {
325+
fn qualifier(&self, when: bool, ty: &TypeDef) -> String {
326+
if let TypeOwner::Interface(id) = &ty.owner {
327+
if let Some(name) = self.gen.interface_names.get(id) {
328+
if name != self.name {
329+
return format!("{}.", name.to_upper_camel_case());
330+
}
331+
}
332+
}
333+
322334
if when {
323-
let iface = self.name.to_upper_camel_case();
324-
format!("{iface}.")
335+
let name = self.name.to_upper_camel_case();
336+
format!("{name}.")
325337
} else {
326338
String::new()
327339
}
@@ -596,7 +608,7 @@ impl InterfaceGenerator<'_> {
596608
if let Some(name) = &ty.name {
597609
format!(
598610
"{}{}",
599-
self.qualifier(qualifier),
611+
self.qualifier(qualifier, ty),
600612
name.to_upper_camel_case()
601613
)
602614
} else {

crates/gen-guest-teavm-java/tests/codegen.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ use std::path::Path;
44
use std::process::Command;
55

66
macro_rules! codegen_test {
7-
// TODO: should get this test working
8-
(use_across_interfaces $($x:tt)*) => {};
9-
107
($id:ident $name:tt $test:tt) => {
118
#[test]
129
fn $id() {
@@ -35,21 +32,24 @@ fn verify(dir: &Path, name: &str) {
3532
fs::create_dir_all(package_dir).unwrap();
3633

3734
let upper = name.to_upper_camel_case();
38-
for file_name in [
39-
format!("{upper}World.java"),
40-
format!("{upper}.java"),
41-
format!("{upper}Impl.java"),
42-
] {
43-
let src = &dir.join(&file_name);
44-
let dst = &package_dir.join(&file_name);
45-
if src.exists() {
46-
fs::rename(src, dst).unwrap();
35+
36+
let src_files = fs::read_dir(&dir).unwrap().filter_map(|entry| {
37+
let path = entry.unwrap().path();
38+
if let Some("java") = path.extension().map(|ext| ext.to_str().unwrap()) {
39+
Some(path)
40+
} else {
41+
None
4742
}
43+
});
44+
45+
for src in src_files {
46+
let dst = &package_dir.join(src.file_name().unwrap());
47+
fs::rename(src, dst).unwrap();
4848
}
4949

5050
fs::write(
5151
dir.join("pom.xml"),
52-
pom_xml(&[&format!("wit_{snake}.{upper}",)]),
52+
pom_xml(&[&format!("wit_{snake}.{upper}")]),
5353
)
5454
.unwrap();
5555
fs::write(java_dir.join("Main.java"), include_bytes!("Main.java")).unwrap();

0 commit comments

Comments
 (0)