diff --git a/crates/compiler/gen_llvm/src/llvm/build.rs b/crates/compiler/gen_llvm/src/llvm/build.rs index c9f4359e65c..3154e910c7e 100644 --- a/crates/compiler/gen_llvm/src/llvm/build.rs +++ b/crates/compiler/gen_llvm/src/llvm/build.rs @@ -4324,7 +4324,7 @@ fn expose_function_to_host<'a, 'ctx>( return_layout: InLayout<'a>, layout_ids: &mut LayoutIds<'a>, ) { - let ident_string = symbol.as_str(&env.interns); + let ident_string = symbol.as_unsuffixed_str(&env.interns); let proc_layout = ProcLayout { arguments, @@ -5564,7 +5564,7 @@ pub fn build_procedures<'a>( let getter_fn = function_value_by_func_spec(env, FuncBorrowSpec::Some(*func_spec), symbol); let name = getter_fn.get_name().to_str().unwrap(); - let getter_name = symbol.as_str(&env.interns); + let getter_name = symbol.as_unsuffixed_str(&env.interns); // Add the getter function to the module. let _ = expose_function_to_host_help_c_abi( @@ -5830,7 +5830,7 @@ fn build_procedures_help<'a>( GenTest | WasmGenTest | CliTest => { /* no host, or exposing types is not supported */ } Binary | BinaryDev | BinaryGlue => { for (proc_name, alias_name, hels) in host_exposed_lambda_sets.iter() { - let ident_string = proc_name.name().as_str(&env.interns); + let ident_string = proc_name.name().as_unsuffixed_str(&env.interns); let fn_name: String = format!("{}_{}", ident_string, hels.id.0); expose_alias_to_host( diff --git a/crates/compiler/module/src/symbol.rs b/crates/compiler/module/src/symbol.rs index d14e549109f..a7c9820794a 100644 --- a/crates/compiler/module/src/symbol.rs +++ b/crates/compiler/module/src/symbol.rs @@ -156,6 +156,16 @@ impl Symbol { }) } + pub fn as_unsuffixed_str(self, interns: &Interns) -> &str { + match self.suffix() { + IdentSuffix::None => self.as_str(interns), + IdentSuffix::Bang => { + let str = self.as_str(interns); + &str[..str.len() - 1] + } + } + } + pub const fn as_u64(self) -> u64 { u64::from_ne_bytes(self.to_ne_bytes()) } diff --git a/crates/compiler/mono/src/layout.rs b/crates/compiler/mono/src/layout.rs index 23b05fbc764..6bcb857094b 100644 --- a/crates/compiler/mono/src/layout.rs +++ b/crates/compiler/mono/src/layout.rs @@ -4649,7 +4649,7 @@ impl LayoutId { // Returns something like "#UserApp_foo_1" when given a symbol that interns to "foo" // and a LayoutId of 1. pub fn to_symbol_string(self, symbol: Symbol, interns: &Interns) -> String { - let ident_string = symbol.as_str(interns).trim_end_matches('!'); + let ident_string = symbol.as_unsuffixed_str(interns); let module_string = interns.module_ids.get_name(symbol.module_id()).unwrap(); format!("{}_{}_{}", module_string, ident_string, self.0) } @@ -4657,12 +4657,12 @@ impl LayoutId { // Returns something like "roc__foo_1_exposed" when given a symbol that interns to "foo" // and a LayoutId of 1. pub fn to_exposed_symbol_string(self, symbol: Symbol, interns: &Interns) -> String { - let ident_string = symbol.as_str(interns).trim_end_matches('!'); + let ident_string = symbol.as_unsuffixed_str(interns); format!("roc__{}_{}_exposed", ident_string, self.0) } pub fn to_exposed_generic_symbol_string(self, symbol: Symbol, interns: &Interns) -> String { - let ident_string = symbol.as_str(interns).trim_end_matches('!'); + let ident_string = symbol.as_unsuffixed_str(interns); format!("roc__{}_{}_exposed_generic", ident_string, self.0) } } diff --git a/crates/linker/src/lib.rs b/crates/linker/src/lib.rs index 0906be4118d..210cfa8f2a2 100644 --- a/crates/linker/src/lib.rs +++ b/crates/linker/src/lib.rs @@ -97,7 +97,7 @@ pub fn generate_stub_lib( .exposed_to_host .top_level_values .keys() - .map(|x| x.as_str(&loaded.interns).to_string()) + .map(|x| x.as_unsuffixed_str(&loaded.interns).to_string()) .collect(); let exported_closure_types = loaded @@ -108,7 +108,7 @@ pub fn generate_stub_lib( format!( "{}_{}", x.module_string(&loaded.interns), - x.as_str(&loaded.interns) + x.as_unsuffixed_str(&loaded.interns) ) }) .collect(); @@ -162,7 +162,7 @@ impl ExposedSymbols { let mut custom_names = Vec::new(); for x in exposed_to_host.top_level_values.keys() { - let sym = x.as_str(interns); + let sym = x.as_unsuffixed_str(interns); custom_names.extend([ format!("roc__{sym}_1_exposed"), @@ -170,10 +170,13 @@ impl ExposedSymbols { format!("roc__{sym}_1_exposed_size"), ]); - let exported_closure_types = exposed_to_host - .closure_types - .iter() - .map(|x| format!("{}_{}", x.module_string(interns), x.as_str(interns))); + let exported_closure_types = exposed_to_host.closure_types.iter().map(|x| { + format!( + "{}_{}", + x.module_string(interns), + x.as_unsuffixed_str(interns) + ) + }); for (i, _) in exported_closure_types.enumerate() { custom_names.extend([ @@ -185,7 +188,7 @@ impl ExposedSymbols { } for x in &exposed_to_host.getters { - let sym = x.as_str(interns); + let sym = x.as_unsuffixed_str(interns); custom_names.extend([ sym.to_string(), format!("{sym}_generic"), @@ -194,7 +197,7 @@ impl ExposedSymbols { } for (top_level_value, lambda_set_id) in &exposed_to_host.lambda_sets { - let sym = top_level_value.as_str(interns); + let sym = top_level_value.as_unsuffixed_str(interns); let id = lambda_set_id.0; custom_names.extend([format!("roc__{sym}_{id}_caller")]); }