Skip to content

Commit 916e441

Browse files
committed
Emit InnerClasses on enum variants too, not just the main enum class, to enable correct processing of enums in IntelliJ.
1 parent a4fb3ac commit 916e441

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

java-linker/src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,14 +766,15 @@ fn run_r8_optimizer(
766766
.arg("--lib")
767767
.arg(java_runtime_lib_path)
768768
.arg("--classfile");
769-
770769
// Add all the *other* input JARs as libraries
771770
for lib_path in library_jar_paths {
772771
cmd.arg("--classpath").arg(lib_path);
773772
}
774773

775774
if release_mode {
776775
cmd.arg("--release"); // Add release mode flag if specified
776+
} else {
777+
cmd.arg("--debug"); // Add debug mode flag if not release
777778
}
778779

779780
// Add the program input JAR (containing app classes) last

src/lower2.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,23 @@ pub fn oomir_to_jvm_bytecode(
173173
interfaces,
174174
} => {
175175
let mut subclasses = Vec::new();
176+
let mut nest_host = None;
177+
// does our class name contain '$'?
178+
let mut potential_nest_host = None;
179+
if dt_name_oomir.contains('$') {
180+
// strip everything after the last '$', including $
181+
let last_dollar_index = dt_name_oomir.rfind('$').unwrap();
182+
potential_nest_host = Some(dt_name_oomir[..last_dollar_index].to_string());
183+
}
176184
for (other_dt_name, _) in &module.data_types {
177185
if other_dt_name.starts_with(&format!("{}$", dt_name_oomir)) {
178186
subclasses.push(other_dt_name.clone());
179187
}
188+
if let Some(potential_nest_host) = &potential_nest_host {
189+
if other_dt_name == potential_nest_host {
190+
nest_host = Some(potential_nest_host.clone());
191+
}
192+
}
180193
}
181194
// Create and serialize the class file for this data type
182195
let dt_bytecode = create_data_type_classfile_for_class(
@@ -188,6 +201,7 @@ pub fn oomir_to_jvm_bytecode(
188201
interfaces.clone(),
189202
&module,
190203
subclasses,
204+
nest_host,
191205
)?;
192206
generated_classes.insert(dt_name_oomir.clone(), dt_bytecode);
193207
}

src/lower2/jvm_gen.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ pub(super) fn create_data_type_classfile_for_class(
9292
implements_interfaces: Vec<String>,
9393
module: &oomir::Module,
9494
subclasses: Vec<String>,
95+
nest_host: Option<String>,
9596
) -> jvm::Result<Vec<u8>> {
9697
let mut cp = ConstantPool::default();
9798

@@ -246,7 +247,7 @@ pub(super) fn create_data_type_classfile_for_class(
246247
}
247248

248249
// --- Add InnerClasses Attribute (for nested/member classes) ---
249-
if !subclasses.is_empty() {
250+
if !subclasses.is_empty() || nest_host.is_some() {
250251
let mut inner_classes_vec: Vec<InnerClass> = Vec::with_capacity(subclasses.len());
251252

252253
for subclass_name in &subclasses {
@@ -283,6 +284,26 @@ pub(super) fn create_data_type_classfile_for_class(
283284
});
284285
}
285286

287+
// If this class has a nest host, add it as well
288+
// make it like [us]=class Host$[us] of class Host
289+
if let Some(nest_host_name) = nest_host {
290+
let class_info_index = class_file.constant_pool.add_class(class_name_jvm)?;
291+
let outer_class_info_index = class_file.constant_pool.add_class(&nest_host_name)?;
292+
let name_index = class_file
293+
.constant_pool
294+
.add_utf8(class_name_jvm
295+
.rsplit('$')
296+
.next()
297+
.unwrap_or(class_name_jvm))?;
298+
let access_flags = NestedClassAccessFlags::PUBLIC | NestedClassAccessFlags::STATIC;
299+
inner_classes_vec.push(InnerClass {
300+
class_info_index,
301+
outer_class_info_index,
302+
name_index,
303+
access_flags,
304+
});
305+
}
306+
286307
let inner_classes_attr_name_index = class_file.constant_pool.add_utf8("InnerClasses")?;
287308
class_file.attributes.push(Attribute::InnerClasses {
288309
name_index: inner_classes_attr_name_index,

0 commit comments

Comments
 (0)