diff --git a/CHANGELOG.md b/CHANGELOG.md index f441ed5d1de..aab09f49273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,24 @@ containing scientific notation or trailing zeros (i.e. `100` and `1e2`). ([ptdewey](https://github.com/ptdewey)) +- Code generation for record constructor functions with arguments has been + changed. They are now generated as named functions instead of anonymous + functions, which allows them to compare equal when referenced. For example: + + ```gleam + pub type Foo { + Wibble + Wobble(String) + } + + pub fn main() { + echo Wibble == Wibble // True + echo Wobble == Wobble // False (previously) -> True + } + ``` + + ([Adi Salimgereyev](https://github.com/abs0luty)) + ### Build tool - The help text displayed by `gleam dev --help`, `gleam test --help`, and diff --git a/compiler-core/src/erlang.rs b/compiler-core/src/erlang.rs index c7d2e73bda7..253e40aa3bf 100644 --- a/compiler-core/src/erlang.rs +++ b/compiler-core/src/erlang.rs @@ -335,8 +335,20 @@ fn register_imports_and_exports( typed_parameters, opaque, external_erlang, + publicity: _, .. }) => { + // Export constructor functions for constructors with arguments + // We need to export even for private types since they're used within the module + for constructor in constructors { + let arity = constructor.arguments.len(); + if arity > 0 { + let constructor_name = constructor_function_name(name, &constructor.name); + + exports.push(atom_string(constructor_name).append("/").append(arity)); + } + } + // Erlang doesn't allow phantom type variables in type definitions but gleam does // so we check the type declaratinon against its constroctors and generate a phantom // value that uses the unused type variables. @@ -460,8 +472,11 @@ fn module_statement<'a>( module_function(function, module, is_internal_module, line_numbers, src_path) } + Definition::CustomType(CustomType { + name, constructors, .. + }) => module_constructors(name, constructors, module, line_numbers), + Definition::TypeAlias(TypeAlias { .. }) - | Definition::CustomType(CustomType { .. }) | Definition::Import(Import { .. }) | Definition::ModuleConstant(ModuleConstant { .. }) => None, } @@ -562,6 +577,45 @@ fn module_function<'a>( )) } +fn module_constructors<'a>( + type_name: &'a EcoString, + constructors: &'a [RecordConstructor>], + module: &'a str, + line_numbers: &'a LineNumbers, +) -> Option<(Document<'a>, Env<'a>)> { + let constructor_functions: Vec<_> = constructors + .iter() + .filter_map(|constructor| { + let arity = constructor.arguments.len(); + if arity == 0 { + return None; + } + + let constructor_name = constructor_function_name(type_name, &constructor.name); + let record_name = to_snake_case(&constructor.name); + let args = incrementing_arguments_list(arity); + + Some(docvec![ + atom_string(constructor_name), + "(", + args.clone(), + ") -> {", + atom_string(record_name), + ", ", + args, + "}.", + ]) + }) + .collect(); + + if constructor_functions.is_empty() { + return None; + } + + let env = Env::new(module, "", line_numbers); + Some((join(constructor_functions, lines(2)), env)) +} + fn file_attribute<'a>( path: EcoString, function: &'a TypedFunction, @@ -1439,18 +1493,28 @@ fn list<'a>(elements: Document<'a>, tail: Option>) -> Document<'a> fn var<'a>(name: &'a str, constructor: &'a ValueConstructor, env: &mut Env<'a>) -> Document<'a> { match &constructor.variant { ValueConstructorVariant::Record { - name: record_name, .. + name: record_name, + module, + .. } => match constructor.type_.deref() { - Type::Fn { arguments, .. } => { - let chars = incrementing_arguments_list(arguments.len()); - "fun(" - .to_doc() - .append(chars.clone()) - .append(") -> {") - .append(atom_string(to_snake_case(record_name))) - .append(", ") - .append(chars) - .append("} end") + Type::Fn { + arguments, return_, .. + } => { + // Extract the type name from the return type + let type_name = return_ + .named_type_name() + .map(|(_, name)| name) + .unwrap_or_else(|| record_name.clone()); + let constructor_name = constructor_function_name(&type_name, record_name); + let module_prefix = if module == env.module { + "fun ".to_doc() + } else { + "fun ".to_doc().append(module_name_atom(module)).append(":") + }; + module_prefix + .append(atom_string(constructor_name)) + .append("/") + .append(arguments.len()) } _ => atom_string(to_snake_case(record_name)), }, @@ -2868,6 +2932,16 @@ fn variable_name(name: &str) -> EcoString { first_uppercased.chain(chars).collect::() } +fn constructor_function_name(type_name: &EcoString, constructor_name: &EcoString) -> EcoString { + // Use type$constructor naming to avoid collisions with regular functions + // e.g., SizedChunk.Last -> sized_chunk$last + eco_format!( + "{}${}", + to_snake_case(type_name), + to_snake_case(constructor_name) + ) +} + /// When rendering a type variable to an erlang type spec we need all type variables with the /// same id to end up with the same name in the generated erlang. /// This function converts a usize into base 26 A-Z for this purpose. diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__field_access_function_call.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__field_access_function_call.snap index 1249841b3df..d3dd36d8980 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__field_access_function_call.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__field_access_function_call.snap @@ -18,11 +18,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['fn_box$fn_box'/1, main/0]). -export_type([fn_box/0]). -type fn_box() :: {fn_box, fun((integer()) -> integer())}. +'fn_box$fn_box'(Field@0) -> {fn_box, Field@0}. + -file("project/test/my/mod.gleam", 6). -spec main() -> integer(). main() -> diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__function_argument_shadowing.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__function_argument_shadowing.snap index 94652ae41ab..4b7077b80b1 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__function_argument_shadowing.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__function_argument_shadowing.snap @@ -16,12 +16,14 @@ pub type Box { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/1]). +-export(['box$box'/1, main/1]). -export_type([box/0]). -type box() :: {box, integer()}. +'box$box'(Field@0) -> {box, Field@0}. + -file("project/test/my/mod.gleam", 1). -spec main(any()) -> fun((integer()) -> box()). main(A) -> - fun(Field@0) -> {box, Field@0} end. + fun 'box$box'/1. diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test11.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test11.snap index 83b9026715d..3bf404736e6 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test11.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test11.snap @@ -10,11 +10,13 @@ pub fn x() { Point(x: 4, y: 6) Point(y: 1, x: 9) } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([x/0]). +-export(['point$point'/2, x/0]). -export_type([point/0]). -type point() :: {point, integer(), integer()}. +'point$point'(Field@0, Field@1) -> {point, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 2). -spec x() -> point(). x() -> diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test12.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test12.snap index 8e02fff59ee..37b2a972caa 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test12.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test12.snap @@ -10,11 +10,13 @@ pub fn x(y) { let Point(a, b) = y a } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([x/1]). +-export(['point$point'/2, x/1]). -export_type([point/0]). -type point() :: {point, integer(), integer()}. +'point$point'(Field@0, Field@1) -> {point, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 2). -spec x(point()) -> integer(). x(Y) -> diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test13.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test13.snap index 00ecae44396..159603caa3d 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test13.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test13.snap @@ -11,11 +11,15 @@ pub type State{ Start(Int) End(Int) } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([build/1, main/0]). +-export(['state$start'/1, 'state$end'/1, build/1, main/0]). -export_type([state/0]). -type state() :: {start, integer()} | {'end', integer()}. +'state$start'(Field@0) -> {start, Field@0}. + +'state$end'(Field@0) -> {'end', Field@0}. + -file("project/test/my/mod.gleam", 2). -spec build(fun((integer()) -> I)) -> I. build(Constructor) -> @@ -24,4 +28,4 @@ build(Constructor) -> -file("project/test/my/mod.gleam", 3). -spec main() -> state(). main() -> - build(fun(Field@0) -> {'end', Field@0} end). + build(fun 'state$end'/1). diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test17.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test17.snap index fb407fcca1f..18e5cc8ac5a 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test17.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test17.snap @@ -12,11 +12,13 @@ pub fn create_user(user_id) { User(age: 22, id: user_id, name: "") } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([create_user/1]). +-export(['user$user'/3, create_user/1]). -export_type([user/0]). -type user() :: {user, integer(), binary(), integer()}. +'user$user'(Field@0, Field@1, Field@2) -> {user, Field@0, Field@1, Field@2}. + -file("project/test/my/mod.gleam", 3). -spec create_user(integer()) -> user(). create_user(User_id) -> diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test19.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test19.snap index 98197aaa666..d3b0a7e78a2 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test19.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test19.snap @@ -10,11 +10,13 @@ pub fn x() { X(x: 1, y: 2.) X(y: 3., x: 4) } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([x/0]). +-export(['x$x'/2, x/0]). -export_type([x/0]). -type x() :: {x, integer(), float()}. +'x$x'(Field@0, Field@1) -> {x, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 2). -spec x() -> x(). x() -> diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test1_1.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test1_1.snap index 6b8b4997e92..c053ea417dc 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test1_1.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test1_1.snap @@ -10,11 +10,13 @@ pub fn pound(x) { Pound(x) } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([pound/1]). +-export(['money$pound'/1, pound/1]). -export_type([money/0]). -type money() :: {pound, integer()}. +'money$pound'(Field@0) -> {pound, Field@0}. + -file("project/test/my/mod.gleam", 2). -spec pound(integer()) -> money(). pound(X) -> diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test22.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test22.snap index ad3d73c9930..6ef6a0f25c7 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test22.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test22.snap @@ -21,11 +21,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([factory/2, main/0]). +-export(['box$box'/1, factory/2, main/0]). -export_type([box/0]). -type box() :: {box, integer()}. +'box$box'(Field@0) -> {box, Field@0}. + -file("project/test/my/mod.gleam", 2). -spec factory(fun((J) -> N), J) -> N. factory(F, I) -> @@ -34,4 +36,4 @@ factory(F, I) -> -file("project/test/my/mod.gleam", 10). -spec main() -> box(). main() -> - factory(fun(Field@0) -> {box, Field@0} end, 0). + factory(fun 'box$box'/1, 0). diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test3.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test3.snap index 09f0aff6b48..e2256f00cfa 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test3.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test3.snap @@ -10,11 +10,13 @@ pub fn y() { fn() { Point }()(4, 6) } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([y/0]). +-export(['point$point'/2, y/0]). -export_type([point/0]). -type point() :: {point, integer(), integer()}. +'point$point'(Field@0, Field@1) -> {point, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 2). -spec y() -> point(). y() -> diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test9.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test9.snap index 0fb22c1706d..46056b77d56 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test9.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__integration_test9.snap @@ -9,11 +9,13 @@ pub type Pair(x, y) { Pair(x: x, y: y) } pub fn x() { Pair(1, 2) Pair(3., 4.) } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([x/0]). +-export(['pair$pair'/2, x/0]). -export_type([pair/2]). -type pair(I, J) :: {pair, I, J}. +'pair$pair'(Field@0, Field@1) -> {pair, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 1). -spec x() -> pair(float(), float()). x() -> diff --git a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__keyword_constructors1.snap b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__keyword_constructors1.snap index 27f70c228a7..264495a347e 100644 --- a/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__keyword_constructors1.snap +++ b/compiler-core/src/erlang/snapshots/gleam_core__erlang__tests__keyword_constructors1.snap @@ -9,6 +9,9 @@ pub type X { Fun(Int) } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). +-export(['x$fun'/1]). -export_type([x/0]). -type x() :: {'fun', integer()}. + +'x$fun'(Field@0) -> {'fun', Field@0}. diff --git a/compiler-core/src/erlang/tests/custom_types.rs b/compiler-core/src/erlang/tests/custom_types.rs index 92c0a4d5c54..9019861c55c 100644 --- a/compiler-core/src/erlang/tests/custom_types.rs +++ b/compiler-core/src/erlang/tests/custom_types.rs @@ -27,3 +27,20 @@ pub fn get(dict: Dict(key, value), key: key) -> Result(value, Nil) "# ); } + +#[test] +fn constructor_equality() { + assert_erl!( + r#" +pub type Comparison { + Wibble + Wobble(String) +} + +pub fn main() { + echo Wibble == Wibble + echo Wobble == Wobble +} +"# + ); +} diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__pub_const_equal_to_record_with_nested_private_function_field.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__pub_const_equal_to_record_with_nested_private_function_field.snap index cae9c30e514..e7010baaf0f 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__pub_const_equal_to_record_with_nested_private_function_field.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__pub_const_equal_to_record_with_nested_private_function_field.snap @@ -23,13 +23,17 @@ expression: "\n fn identity(a) {\n a\n }\n\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([identity/1]). +-export(['mapper$mapper'/1, 'funcs$funcs'/1, identity/1]). -export_type([mapper/1, funcs/1]). -type mapper(I) :: {mapper, fun((I) -> I)}. -type funcs(J) :: {funcs, mapper(J)}. +'mapper$mapper'(Field@0) -> {mapper, Field@0}. + +'funcs$funcs'(Field@0) -> {funcs, Field@0}. + -file("project/test/my/mod.gleam", 2). -spec identity(K) -> K. identity(A) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__pub_const_equal_to_record_with_private_function_field.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__pub_const_equal_to_record_with_private_function_field.snap index 45cc1efee40..1cc6bf664fd 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__pub_const_equal_to_record_with_private_function_field.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__pub_const_equal_to_record_with_private_function_field.snap @@ -19,11 +19,13 @@ expression: "\n fn identity(a) {\n a\n }\n\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([identity/1]). +-export(['mapper$mapper'/1, identity/1]). -export_type([mapper/1]). -type mapper(I) :: {mapper, fun((I) -> I)}. +'mapper$mapper'(Field@0) -> {mapper, Field@0}. + -file("project/test/my/mod.gleam", 2). -spec identity(J) -> J. identity(A) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__record_constructor.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__record_constructor.snap index b9f22703a9d..3d762aa93e3 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__record_constructor.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__record_constructor.snap @@ -18,11 +18,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['x$x'/1, main/0]). -export_type([x/0]). -type x() :: {x, integer()}. +'x$x'(Field@0) -> {x, Field@0}. + -file("project/test/my/mod.gleam", 8). -spec main() -> fun((integer()) -> x()). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__record_constructor_in_tuple.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__record_constructor_in_tuple.snap index 30211393468..5d3ee3a3e2f 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__record_constructor_in_tuple.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__record_constructor_in_tuple.snap @@ -18,11 +18,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['x$x'/1, main/0]). -export_type([x/0]). -type x() :: {x, integer()}. +'x$x'(Field@0) -> {x, Field@0}. + -file("project/test/my/mod.gleam", 8). -spec main() -> {fun((integer()) -> x())}. main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_private_in_internal.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_private_in_internal.snap index c6851a9cd9f..0a98dfc7373 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_private_in_internal.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_private_in_internal.snap @@ -20,11 +20,13 @@ expression: "\n fn identity(a) {\n a\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([identity/1]). +-export(['mapper$mapper'/1, identity/1]). -export_type([mapper/1]). -type mapper(I) :: {mapper, fun((I) -> I)}. +'mapper$mapper'(Field@0) -> {mapper, Field@0}. + -file("project/test/my/mod.gleam", 2). -spec identity(J) -> J. identity(A) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_qualified_pub_const_equal_to_record_with_private_function_field.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_qualified_pub_const_equal_to_record_with_private_function_field.snap index fc2ddd35876..185647335cf 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_qualified_pub_const_equal_to_record_with_private_function_field.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_qualified_pub_const_equal_to_record_with_private_function_field.snap @@ -19,11 +19,13 @@ expression: "\n fn identity(a) {\n a\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([identity/1]). +-export(['mapper$mapper'/1, identity/1]). -export_type([mapper/1]). -type mapper(I) :: {mapper, fun((I) -> I)}. +'mapper$mapper'(Field@0) -> {mapper, Field@0}. + -file("project/test/my/mod.gleam", 2). -spec identity(J) -> J. identity(A) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_unqualified_pub_const_equal_to_record_with_private_function_field.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_unqualified_pub_const_equal_to_record_with_private_function_field.snap index fc2ddd35876..185647335cf 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_unqualified_pub_const_equal_to_record_with_private_function_field.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__consts__use_unqualified_pub_const_equal_to_record_with_private_function_field.snap @@ -19,11 +19,13 @@ expression: "\n fn identity(a) {\n a\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([identity/1]). +-export(['mapper$mapper'/1, identity/1]). -export_type([mapper/1]). -type mapper(I) :: {mapper, fun((I) -> I)}. +'mapper$mapper'(Field@0) -> {mapper, Field@0}. + -file("project/test/my/mod.gleam", 2). -spec identity(J) -> J. identity(A) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__custom_types__constructor_equality.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__custom_types__constructor_equality.snap new file mode 100644 index 00000000000..8d5c33f32f4 --- /dev/null +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__custom_types__constructor_equality.snap @@ -0,0 +1,35 @@ +--- +source: compiler-core/src/erlang/tests/custom_types.rs +expression: "\npub type Comparison {\n Wibble\n Wobble(String)\n}\n\npub fn main() {\n echo Wibble == Wibble\n echo Wobble == Wobble\n}\n" +--- +----- SOURCE CODE + +pub type Comparison { + Wibble + Wobble(String) +} + +pub fn main() { + echo Wibble == Wibble + echo Wobble == Wobble +} + + +----- COMPILED ERLANG +-module(my@mod). +-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). +-define(FILEPATH, "project/test/my/mod.gleam"). +-export(['comparison$wobble'/1, main/0]). +-export_type([comparison/0]). + +-type comparison() :: wibble | {wobble, binary()}. + +'comparison$wobble'(Field@0) -> {wobble, Field@0}. + +-file("project/test/my/mod.gleam", 7). +-spec main() -> boolean(). +main() -> + echo(wibble =:= wibble, nil, 8), + echo(fun 'comparison$wobble'/1 =:= fun 'comparison$wobble'/1, nil, 9). + +% ...omitted code from `templates/echo.erl`... diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__echo__record_update_printed_by_echo_is_wrapped_in_begin_end_block.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__echo__record_update_printed_by_echo_is_wrapped_in_begin_end_block.snap index 7220ef012af..0be9e3c1033 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__echo__record_update_printed_by_echo_is_wrapped_in_begin_end_block.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__echo__record_update_printed_by_echo_is_wrapped_in_begin_end_block.snap @@ -16,11 +16,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['wobble$wobble'/2, main/0]). -export_type([wobble/0]). -type wobble() :: {wobble, integer(), binary()}. +'wobble$wobble'(Field@0, Field@1) -> {wobble, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 4). -spec main() -> wobble(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__clause_guards28.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__clause_guards28.snap index 8bde0cb20db..3319b5b1510 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__clause_guards28.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__clause_guards28.snap @@ -20,11 +20,13 @@ expression: "\n type Test { Test(x: Int, y: Float) }\n pub fn main() {\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['test$test'/2, main/0]). -export_type([test/0]). -type test() :: {test, integer(), float()}. +'test$test'(Field@0, Field@1) -> {test, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 3). -spec main() -> integer(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__field_access.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__field_access.snap index ae14fa52c06..e571e4213d7 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__field_access.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__field_access.snap @@ -23,11 +23,13 @@ expression: "\n pub type Person {\n Person(username: String, nam -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['person$person'/3, main/0]). -export_type([person/0]). -type person() :: {person, binary(), binary(), integer()}. +'person$person'(Field@0, Field@1, Field@2) -> {person, Field@0, Field@1, Field@2}. + -file("project/test/my/mod.gleam", 6). -spec main() -> binary(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__nested_record_access.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__nested_record_access.snap index a273ae972f4..ea21936549b 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__nested_record_access.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__guards__nested_record_access.snap @@ -28,7 +28,7 @@ pub fn a(a: A) { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([a/1]). +-export(['a$a'/1, 'b$b'/1, 'c$c'/1, a/1]). -export_type([a/0, b/0, c/0]). -type a() :: {a, b()}. @@ -37,6 +37,12 @@ pub fn a(a: A) { -type c() :: {c, boolean()}. +'a$a'(Field@0) -> {a, Field@0}. + +'b$b'(Field@0) -> {b, Field@0}. + +'c$c'(Field@0) -> {c, Field@0}. + -file("project/test/my/mod.gleam", 14). -spec a(a()) -> integer(). a(A) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__inlining__inlining_works_properly_with_record_updates.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__inlining__inlining_works_properly_with_record_updates.snap index 849d2da4571..34cdf1ced43 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__inlining__inlining_works_properly_with_record_updates.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__inlining__inlining_works_properly_with_record_updates.snap @@ -21,11 +21,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['wibble$wibble'/2, main/0]). -export_type([wibble/0]). -type wibble() :: {wibble, integer(), integer()}. +'wibble$wibble'(Field@0, Field@1) -> {wibble, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 8). -spec main() -> {ok, wibble()} | {error, any()}. main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__let_assert__constructor_pattern_with_multiple_variables.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__let_assert__constructor_pattern_with_multiple_variables.snap index c46bca92aa7..7ffc44ffa57 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__let_assert__constructor_pattern_with_multiple_variables.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__let_assert__constructor_pattern_with_multiple_variables.snap @@ -17,11 +17,13 @@ pub fn go() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([go/0]). +-export(['wibble$wibble'/2, go/0]). -export_type([wibble/0]). -type wibble() :: {wibble, integer(), float()}. +'wibble$wibble'(Field@0, Field@1) -> {wibble, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 6). -spec go() -> integer(). go() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__pipes__pipe_in_record_update.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__pipes__pipe_in_record_update.snap index 43a9a963b26..ac0ecc60b01 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__pipes__pipe_in_record_update.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__pipes__pipe_in_record_update.snap @@ -19,11 +19,13 @@ pub fn main(x) { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/1]). +-export(['x$x'/2, main/1]). -export_type([x/0]). -type x() :: {x, integer(), integer()}. +'x$x'(Field@0, Field@1) -> {x, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 5). -spec id(I) -> I. id(X) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__nested_record_update.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__nested_record_update.snap index fa809388be7..f172859fa75 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__nested_record_update.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__nested_record_update.snap @@ -20,13 +20,17 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['wibble$wibble'/3, 'wobble$wobble'/2, main/0]). -export_type([wibble/0, wobble/0]). -type wibble() :: {wibble, integer(), wobble(), integer()}. -type wobble() :: {wobble, integer(), integer()}. +'wibble$wibble'(Field@0, Field@1, Field@2) -> {wibble, Field@0, Field@1, Field@2}. + +'wobble$wobble'(Field@0, Field@1) -> {wobble, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 9). -spec main() -> wibble(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__nested_record_update_with_blocks.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__nested_record_update_with_blocks.snap index 5c37d4cec6b..6c1923bff95 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__nested_record_update_with_blocks.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__nested_record_update_with_blocks.snap @@ -19,7 +19,7 @@ pub fn main(a: A) { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/1]). +-export(['a$a'/1, 'b$b'/1, 'c$c'/1, main/1]). -export_type([a/0, b/0, c/0]). -type a() :: {a, b()}. @@ -28,6 +28,12 @@ pub fn main(a: A) { -type c() :: {c, integer()}. +'a$a'(Field@0) -> {a, Field@0}. + +'b$b'(Field@0) -> {b, Field@0}. + +'c$c'(Field@0) -> {c, Field@0}. + -file("project/test/my/mod.gleam", 5). -spec main(a()) -> a(). main(A) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__pipe_update_subject.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__pipe_update_subject.snap index 99b46c2ffd8..f54f16dd247 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__pipe_update_subject.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__pipe_update_subject.snap @@ -18,11 +18,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([identity/1, main/0]). +-export(['thing$thing'/2, identity/1, main/0]). -export_type([thing/0]). -type thing() :: {thing, integer(), integer()}. +'thing$thing'(Field@0, Field@1) -> {thing, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 5). -spec identity(I) -> I. identity(X) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__private_unused_records.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__private_unused_records.snap index 441abd3fd94..e283b0a96d5 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__private_unused_records.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__private_unused_records.snap @@ -17,11 +17,17 @@ pub fn main(x: Int) -> Int { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/1]). +-export(['a$a'/1, main/1]). -export_type([a/0]). -type a() :: {a, integer()}. +'a$a'(Field@0) -> {a, Field@0}. + +'b$b'(Field@0) -> {b, Field@0}. + +'c$c'(Field@0) -> {c, Field@0}. + -file("project/test/my/mod.gleam", 5). -spec main(integer()) -> integer(). main(X) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_access_block.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_access_block.snap index f85cdccca8b..4572779fd13 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_access_block.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_access_block.snap @@ -18,11 +18,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['thing$thing'/2, main/0]). -export_type([thing/0]). -type thing() :: {thing, integer(), integer()}. +'thing$thing'(Field@0, Field@1) -> {thing, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 5). -spec main() -> integer(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants.snap index 92c38f7666f..9bc9f173158 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants.snap @@ -14,11 +14,15 @@ pub fn get_name(person: Person) { person.name } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([get_name/1]). +-export(['person$teacher'/2, 'person$student'/2, get_name/1]). -export_type([person/0]). -type person() :: {teacher, binary(), binary()} | {student, binary(), integer()}. +'person$teacher'(Field@0, Field@1) -> {teacher, Field@0, Field@1}. + +'person$student'(Field@0, Field@1) -> {student, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 6). -spec get_name(person()) -> binary(). get_name(Person) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants_parameterised_types.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants_parameterised_types.snap index cc21c50e69d..5aebe3edc6a 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants_parameterised_types.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants_parameterised_types.snap @@ -15,12 +15,16 @@ pub fn get_age(person: Person) { person.age } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([get_name/1, get_age/1]). +-export(['person$teacher'/3, 'person$student'/2, get_name/1, get_age/1]). -export_type([person/0]). -type person() :: {teacher, binary(), list(integer()), binary()} | {student, binary(), list(integer())}. +'person$teacher'(Field@0, Field@1, Field@2) -> {teacher, Field@0, Field@1, Field@2}. + +'person$student'(Field@0, Field@1) -> {student, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 6). -spec get_name(person()) -> binary(). get_name(Person) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants_positions_other_than_first.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants_positions_other_than_first.snap index c6147867e4e..18b5d2e42aa 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants_positions_other_than_first.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_variants_positions_other_than_first.snap @@ -15,12 +15,16 @@ pub fn get_age(person: Person) { person.age } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([get_name/1, get_age/1]). +-export(['person$teacher'/3, 'person$student'/2, get_name/1, get_age/1]). -export_type([person/0]). -type person() :: {teacher, binary(), integer(), binary()} | {student, binary(), integer()}. +'person$teacher'(Field@0, Field@1, Field@2) -> {teacher, Field@0, Field@1, Field@2}. + +'person$student'(Field@0, Field@1) -> {student, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 6). -spec get_name(person()) -> binary(). get_name(Person) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_with_first_position_different_types.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_with_first_position_different_types.snap index ac38b00cff0..78fb92f9211 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_with_first_position_different_types.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessor_multiple_with_first_position_different_types.snap @@ -14,11 +14,15 @@ pub fn get_age(person: Person) { person.age } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([get_age/1]). +-export(['person$teacher'/2, 'person$student'/2, get_age/1]). -export_type([person/0]). -type person() :: {teacher, nil, integer()} | {student, binary(), integer()}. +'person$teacher'(Field@0, Field@1) -> {teacher, Field@0, Field@1}. + +'person$student'(Field@0, Field@1) -> {student, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 6). -spec get_age(person()) -> integer(). get_age(Person) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessors.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessors.snap index b0b7332fcc5..8bfef64df2a 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessors.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_accessors.snap @@ -13,11 +13,13 @@ pub fn get_name(person: Person) { person.name } -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([get_age/1, get_name/1]). +-export(['person$person'/2, get_age/1, get_name/1]). -export_type([person/0]). -type person() :: {person, binary(), integer()}. +'person$person'(Field@0, Field@1) -> {person, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 3). -spec get_age(person()) -> integer(). get_age(Person) -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread.snap index 22c1bcb7f87..8788e9900f4 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread.snap @@ -19,11 +19,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['triple$triple'/3, main/0]). -export_type([triple/0]). -type triple() :: {triple, integer(), integer(), integer()}. +'triple$triple'(Field@0, Field@1, Field@2) -> {triple, Field@0, Field@1, Field@2}. + -file("project/test/my/mod.gleam", 6). -spec main() -> integer(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread1.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread1.snap index 9328b2f614a..78bab9fcc7b 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread1.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread1.snap @@ -19,11 +19,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['triple$triple'/3, main/0]). -export_type([triple/0]). -type triple() :: {triple, integer(), integer(), integer()}. +'triple$triple'(Field@0, Field@1, Field@2) -> {triple, Field@0, Field@1, Field@2}. + -file("project/test/my/mod.gleam", 6). -spec main() -> integer(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread2.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread2.snap index cca66c40111..db309649041 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread2.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread2.snap @@ -19,11 +19,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['triple$triple'/3, main/0]). -export_type([triple/0]). -type triple() :: {triple, integer(), integer(), integer()}. +'triple$triple'(Field@0, Field@1, Field@2) -> {triple, Field@0, Field@1, Field@2}. + -file("project/test/my/mod.gleam", 6). -spec main() -> integer(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread3.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread3.snap index b21c4bbc2e3..c9aff9d09b6 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread3.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_spread3.snap @@ -20,11 +20,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['triple$triple'/3, main/0]). -export_type([triple/0]). -type triple() :: {triple, integer(), integer(), integer()}. +'triple$triple'(Field@0, Field@1, Field@2) -> {triple, Field@0, Field@1, Field@2}. + -file("project/test/my/mod.gleam", 6). -spec main() -> integer(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates.snap index d9207886dec..a8e409c9204 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates.snap @@ -17,11 +17,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['person$person'/2, main/0]). -export_type([person/0]). -type person() :: {person, binary(), integer()}. +'person$person'(Field@0, Field@1) -> {person, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 4). -spec main() -> person(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates1.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates1.snap index acef2a4bbce..ec6b4b8aaf2 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates1.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates1.snap @@ -17,11 +17,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['person$person'/2, main/0]). -export_type([person/0]). -type person() :: {person, binary(), integer()}. +'person$person'(Field@0, Field@1) -> {person, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 4). -spec main() -> person(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates2.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates2.snap index 400d9472657..97e0b628e1c 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates2.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates2.snap @@ -17,11 +17,13 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['person$person'/2, main/0]). -export_type([person/0]). -type person() :: {person, binary(), integer()}. +'person$person'(Field@0, Field@1) -> {person, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 4). -spec main() -> person(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates3.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates3.snap index 0c070ceff1e..37fcd4d996c 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates3.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates3.snap @@ -20,11 +20,13 @@ fn return_person() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['person$person'/2, main/0]). -export_type([person/0]). -type person() :: {person, binary(), integer()}. +'person$person'(Field@0, Field@1) -> {person, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 9). -spec return_person() -> person(). return_person() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates4.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates4.snap index 6d77b9e6a7e..d2b75925dd8 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates4.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__records__record_updates4.snap @@ -18,13 +18,17 @@ pub fn main() { -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([main/0]). +-export(['car$car'/3, 'person$person'/2, main/0]). -export_type([car/0, person/0]). -type car() :: {car, binary(), binary(), person()}. -type person() :: {person, binary(), integer()}. +'car$car'(Field@0, Field@1, Field@2) -> {car, Field@0, Field@1, Field@2}. + +'person$person'(Field@0, Field@1) -> {person, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 5). -spec main() -> person(). main() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_named_args_count_once.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_named_args_count_once.snap index 3f318f4c4cb..f60018882a2 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_named_args_count_once.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_named_args_count_once.snap @@ -17,11 +17,13 @@ expression: "\n pub type Wibble(a, b) {\n Wibble(a, b)\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([wibble/0]). +-export(['wibble$wibble'/2, wibble/0]). -export_type([wibble/2]). -type wibble(I, J) :: {wibble, I, J}. +'wibble$wibble'(Field@0, Field@1) -> {wibble, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 6). -spec wibble() -> wibble(K, K). wibble() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_nested_named_args_count_once.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_nested_named_args_count_once.snap index 075d3062089..55e3c6912c8 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_nested_named_args_count_once.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_nested_named_args_count_once.snap @@ -17,11 +17,13 @@ expression: "\n pub type Wibble(a, b) {\n Wibble(a, b)\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([wibble/0]). +-export(['wibble$wibble'/2, wibble/0]). -export_type([wibble/2]). -type wibble(I, J) :: {wibble, I, J}. +'wibble$wibble'(Field@0, Field@1) -> {wibble, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 6). -spec wibble() -> wibble(K, wibble(K, any())). wibble() -> diff --git a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_tuple_type_params_count_twice.snap b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_tuple_type_params_count_twice.snap index cdb883c54da..85960380fa5 100644 --- a/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_tuple_type_params_count_twice.snap +++ b/compiler-core/src/erlang/tests/snapshots/gleam_core__erlang__tests__type_params__custom_type_tuple_type_params_count_twice.snap @@ -17,11 +17,13 @@ expression: "\n pub type Wibble(a, b) {\n Wibble(a, b)\n -module(my@mod). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "project/test/my/mod.gleam"). --export([wibble/0]). +-export(['wibble$wibble'/2, wibble/0]). -export_type([wibble/2]). -type wibble(I, J) :: {wibble, I, J}. +'wibble$wibble'(Field@0, Field@1) -> {wibble, Field@0, Field@1}. + -file("project/test/my/mod.gleam", 6). -spec wibble() -> {K, wibble(K, any())}. wibble() -> diff --git a/compiler-core/src/javascript/expression.rs b/compiler-core/src/javascript/expression.rs index 33cbb490620..be7145a3901 100644 --- a/compiler-core/src/javascript/expression.rs +++ b/compiler-core/src/javascript/expression.rs @@ -2648,19 +2648,20 @@ pub(crate) fn record_constructor<'a>( None => docvec!["new ", name, "()"], } } else { - let vars = (0..arity).map(|i| eco_format!("var{i}").to_doc()); - let body = docvec![ - "return ", - construct_record(qualifier, name, vars.clone()), - ";" - ]; - docvec![ - docvec![wrap_arguments(vars), " => {", break_("", " "), body] - .nest(INDENT) - .append(break_("", " ")) - .group(), - "}", - ] + // Reference the exported constructor function to ensure identity equality + // Extract the type name from the function's return type + let type_name = match type_.as_ref() { + Type::Fn { return_, .. } => return_ + .named_type_name() + .map(|(_, name)| name) + .unwrap_or_else(|| name.into()), + _ => name.into(), + }; + + match qualifier { + Some(module) => docvec!["$", module, ".", type_name, "$", name], + None => docvec![type_name, "$", name], + } } } diff --git a/compiler-core/src/javascript/tests/custom_types.rs b/compiler-core/src/javascript/tests/custom_types.rs index 3c1ed30a170..79cb0533ed9 100644 --- a/compiler-core/src/javascript/tests/custom_types.rs +++ b/compiler-core/src/javascript/tests/custom_types.rs @@ -960,3 +960,20 @@ pub fn get(dict: Dict(key, value), key: key) -> Result(value, Nil) "# ); } + +#[test] +fn constructor_equality() { + assert_js!( + r#" +pub type Comparison { + Wibble + Wobble(String) +} + +pub fn main() { + echo Wibble == Wibble + echo Wobble == Wobble +} +"# + ); +} diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__constructor_function_in_guard.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__constructor_function_in_guard.snap index dd96b4ad7a9..e7992692b25 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__constructor_function_in_guard.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__constructor_function_in_guard.snap @@ -1,8 +1,6 @@ --- source: compiler-core/src/javascript/tests/case_clause_guards.rs -assertion_line: 524 expression: "pub fn func(x) {\n case [] {\n _ if [] == [ Ok ] -> True\n _ -> False\n }\n}\n " -snapshot_kind: text --- ----- SOURCE CODE pub fn func(x) { @@ -18,7 +16,7 @@ import { Ok, toList, isEqual } from "../gleam.mjs"; export function func(x) { let $ = toList([]); - if (isEqual(toList([]), toList([(var0) => { return new Ok(var0); }]))) { + if (isEqual(toList([]), toList([Result$Ok]))) { return true; } else { return false; diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__imported_aliased_ok.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__imported_aliased_ok.snap index 240c1abc114..fb751ca1bb4 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__imported_aliased_ok.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__imported_aliased_ok.snap @@ -24,9 +24,9 @@ export const X$Ok = () => new Ok(); export const X$isOk = (value) => value instanceof Ok; export function func() { - let $ = (var0) => { return new Y(var0); }; + let $ = Result$Y; let y = $; - if (isEqual(y, (var0) => { return new Y(var0); })) { + if (isEqual(y, Result$Y)) { return true; } else { return false; diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__imported_ok.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__imported_ok.snap index 3542bfa3490..60603d147c4 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__imported_ok.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__imported_ok.snap @@ -24,8 +24,8 @@ export const X$Ok = () => new Ok(); export const X$isOk = (value) => value instanceof Ok; export function func(x) { - let $ = (var0) => { return new $gleam.Ok(var0); }; - if (isEqual(toList([]), toList([(var0) => { return new Ok(var0); }]))) { + let $ = $gleam.Result$Ok; + if (isEqual(toList([]), toList([Result$Ok]))) { return true; } else { return false; diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__constructor_function_in_constant.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__constructor_function_in_constant.snap index 91ef7ca7dab..66e0bf4f630 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__constructor_function_in_constant.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__constructor_function_in_constant.snap @@ -8,4 +8,4 @@ pub const a = Ok ----- COMPILED JAVASCRIPT import { Ok } from "../gleam.mjs"; -export const a = (var0) => { return new Ok(var0); }; +export const a = Result$Ok; diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__imported_aliased_ok.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__imported_aliased_ok.snap index c21c8911632..60af5cc2d15 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__imported_aliased_ok.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__imported_aliased_ok.snap @@ -20,4 +20,4 @@ export class Ok extends $CustomType {} export const X$Ok = () => new Ok(); export const X$isOk = (value) => value instanceof Ok; -export const y = (var0) => { return new Y(var0); }; +export const y = Result$Y; diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__imported_ok.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__imported_ok.snap index db3d10fa49f..d6465ed904d 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__imported_ok.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__consts__imported_ok.snap @@ -20,4 +20,4 @@ export class Ok extends $CustomType {} export const X$Ok = () => new Ok(); export const X$isOk = (value) => value instanceof Ok; -export const y = (var0) => { return new Ok(var0); }; +export const y = Result$Ok; diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__constructor_as_value.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__constructor_as_value.snap index 5e02b8e730d..4b38a0b38e4 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__constructor_as_value.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__constructor_as_value.snap @@ -16,5 +16,5 @@ pub fn main() { import * as $other from "../other.mjs"; export function main() { - return (var0, var1, var2) => { return new $other.Two(var0, var1, var2); }; + return $other.One$Two; } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__constructor_equality.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__constructor_equality.snap new file mode 100644 index 00000000000..498e825e0c6 --- /dev/null +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__constructor_equality.snap @@ -0,0 +1,56 @@ +--- +source: compiler-core/src/javascript/tests/custom_types.rs +expression: "\npub type Comparison {\n Wibble\n Wobble(String)\n}\n\npub fn main() {\n echo Wibble == Wibble\n echo Wobble == Wobble\n}\n" +--- +----- SOURCE CODE + +pub type Comparison { + Wibble + Wobble(String) +} + +pub fn main() { + echo Wibble == Wibble + echo Wobble == Wobble +} + + +----- COMPILED JAVASCRIPT +import * as $stdlib$dict from "../../gleam_stdlib/dict.mjs"; +import { + Empty as $Empty, + NonEmpty as $NonEmpty, + CustomType as $CustomType, + isEqual, + bitArraySlice, + bitArraySliceToInt, + BitArray as $BitArray, + List as $List, + UtfCodepoint as $UtfCodepoint, +} from "../gleam.mjs"; + +export class Wibble extends $CustomType {} +export const Comparison$Wibble = () => new Wibble(); +export const Comparison$isWibble = (value) => value instanceof Wibble; + +export class Wobble extends $CustomType { + constructor($0) { + super(); + this[0] = $0; + } +} +export const Comparison$Wobble = ($0) => new Wobble($0); +export const Comparison$isWobble = (value) => value instanceof Wobble; +export const Comparison$Wobble$0 = (value) => value[0]; + +export function main() { + echo(new Wibble() instanceof Wibble, undefined, "src/module.gleam", 8); + return echo( + isEqual(Comparison$Wobble, Comparison$Wobble), + undefined, + "src/module.gleam", + 9, + ); +} + +// ...omitted code from `templates/echo.mjs`... diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__long_name_variant_without_labels.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__long_name_variant_without_labels.snap index 883ff16cb89..9b4f328de82 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__long_name_variant_without_labels.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__long_name_variant_without_labels.snap @@ -43,13 +43,5 @@ export const TypeWithALongNameAndSeveralArguments$TypeWithALongNameAndSeveralArg value[4]; export function go() { - return (var0, var1, var2, var3, var4) => { - return new TypeWithALongNameAndSeveralArguments( - var0, - var1, - var2, - var3, - var4, - ); - }; + return TypeWithALongNameAndSeveralArguments$TypeWithALongNameAndSeveralArguments; } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unnamed_fields.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unnamed_fields.snap index adb3a89b092..5f10b3b0a25 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unnamed_fields.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unnamed_fields.snap @@ -43,7 +43,7 @@ export function build(x) { } export function go() { - build((var0) => { return new Ip(var0); }); + build(Ip$Ip); return new Ip("5.6.7.8"); } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unqualified_constructor_as_value.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unqualified_constructor_as_value.snap index d77a7dc3dbb..f51528cf5ef 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unqualified_constructor_as_value.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unqualified_constructor_as_value.snap @@ -17,5 +17,5 @@ import * as $other from "../other.mjs"; import { Two } from "../other.mjs"; export function main() { - return (var0, var1, var2) => { return new Two(var0, var1, var2); }; + return One$Two; } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__aliased_error_fn.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__aliased_error_fn.snap index dbbcf96119f..44d510d2855 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__aliased_error_fn.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__aliased_error_fn.snap @@ -11,5 +11,5 @@ import * as $gleam from "../gleam.mjs"; import { Error as Thing } from "../gleam.mjs"; export function main() { - return (var0) => { return new Thing(var0); }; + return Result$Thing; } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__aliased_ok_fn.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__aliased_ok_fn.snap index 9376c45d269..8f0fd1d026c 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__aliased_ok_fn.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__aliased_ok_fn.snap @@ -11,5 +11,5 @@ import * as $gleam from "../gleam.mjs"; import { Ok as Thing } from "../gleam.mjs"; export function main() { - return (var0) => { return new Thing(var0); }; + return Result$Thing; } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__error_fn.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__error_fn.snap index a726d656032..e20ff66988c 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__error_fn.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__error_fn.snap @@ -9,5 +9,5 @@ pub fn main() { Error } import { Error } from "../gleam.mjs"; export function main() { - return (var0) => { return new Error(var0); }; + return Result$Error; } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__ok_fn.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__ok_fn.snap index a4c58d770c6..1c9015c7705 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__ok_fn.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__ok_fn.snap @@ -9,5 +9,5 @@ pub fn main() { Ok } import { Ok } from "../gleam.mjs"; export function main() { - return (var0) => { return new Ok(var0); }; + return Result$Ok; } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__qualified_error_fn.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__qualified_error_fn.snap index 351b3d56290..4b1212c2e26 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__qualified_error_fn.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__qualified_error_fn.snap @@ -10,5 +10,5 @@ pub fn main() { gleam.Error } import * as $gleam from "../gleam.mjs"; export function main() { - return (var0) => { return new $gleam.Error(var0); }; + return $gleam.Result$Error; } diff --git a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__qualified_ok_fn.snap b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__qualified_ok_fn.snap index f86c48f209d..be90226c69e 100644 --- a/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__qualified_ok_fn.snap +++ b/compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__results__qualified_ok_fn.snap @@ -10,5 +10,5 @@ pub fn main() { gleam.Ok } import * as $gleam from "../gleam.mjs"; export function main() { - return (var0) => { return new $gleam.Ok(var0); }; + return $gleam.Result$Ok; } diff --git a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__erlang_bug_752.snap b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__erlang_bug_752.snap index 99ed9f24104..9d08048e6a8 100644 --- a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__erlang_bug_752.snap +++ b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__erlang_bug_752.snap @@ -15,11 +15,12 @@ expression: "./cases/erlang_bug_752" -module(one). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/one.gleam"). +-export(['one$one'/1]). -export_type([one/1]). -type one(I) :: {one, I}. - +'one$one'(Field@0) -> {one, Field@0}. //// /out/lib/the_package/_gleam_artefacts/two.cache @@ -35,11 +36,12 @@ expression: "./cases/erlang_bug_752" -module(two). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/two.gleam"). +-export(['two$two'/1]). -export_type([two/1]). -type two(K) :: {two, one:one(integer())} | {gleam_phantom, K}. - +'two$two'(Field@0) -> {two, Field@0}. //// /out/lib/the_package/ebin/importy.app diff --git a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__erlang_import.snap b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__erlang_import.snap index 06520a6ecfa..f85851bb7e9 100644 --- a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__erlang_import.snap +++ b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__erlang_import.snap @@ -37,11 +37,12 @@ unbox(X) -> -module(two). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/two.gleam"). +-export(['box$box'/1]). -export_type([box/0]). -type box() :: {box, integer()}. - +'box$box'(Field@0) -> {box, Field@0}. //// /out/lib/the_package/ebin/importy.app diff --git a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__imported_constants.snap b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__imported_constants.snap index a8bdd5d0a2d..08f70fe0789 100644 --- a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__imported_constants.snap +++ b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__imported_constants.snap @@ -15,6 +15,7 @@ expression: "./cases/imported_constants" -module(one). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/one.gleam"). +-export(['b$b'/2, 'user$user'/2]). -export_type([a/0, b/0, user/0]). -type a() :: a. @@ -23,7 +24,9 @@ expression: "./cases/imported_constants" -type user() :: {user, binary(), integer()}. +'b$b'(Field@0, Field@1) -> {b, Field@0, Field@1}. +'user$user'(Field@0, Field@1) -> {user, Field@0, Field@1}. //// /out/lib/the_package/_gleam_artefacts/two.cache diff --git a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__imported_record_constructors.snap b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__imported_record_constructors.snap index eec95435fe2..f4f153eae14 100644 --- a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__imported_record_constructors.snap +++ b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__imported_record_constructors.snap @@ -15,6 +15,7 @@ expression: "./cases/imported_record_constructors" -module(one@one). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/one/one.gleam"). +-export(['b$b'/2, 'user$user'/2]). -export_type([a/0, b/0, user/0]). -type a() :: a. @@ -23,7 +24,9 @@ expression: "./cases/imported_record_constructors" -type user() :: {user, binary(), integer()}. +'b$b'(Field@0, Field@1) -> {b, Field@0, Field@1}. +'user$user'(Field@0, Field@1) -> {user, Field@0, Field@1}. //// /out/lib/the_package/_gleam_artefacts/one@two.cache @@ -39,6 +42,7 @@ expression: "./cases/imported_record_constructors" -module(one@two). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/one/two.gleam"). +-export(['b$b'/2, 'user$user'/2]). -export_type([a/0, b/0, user/0]). -type a() :: a. @@ -47,7 +51,9 @@ expression: "./cases/imported_record_constructors" -type user() :: {user, binary(), integer()}. +'b$b'(Field@0, Field@1) -> {b, Field@0, Field@1}. +'user$user'(Field@0, Field@1) -> {user, Field@0, Field@1}. //// /out/lib/the_package/_gleam_artefacts/two.cache diff --git a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__variable_or_module.snap b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__variable_or_module.snap index 3decf8c1495..eef91ae26e1 100644 --- a/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__variable_or_module.snap +++ b/test-package-compiler/src/snapshots/test_package_compiler__generated_tests__variable_or_module.snap @@ -41,11 +41,13 @@ record_field(Power) -> -module(power). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/power.gleam"). --export([to_int/1]). +-export(['power$power'/1, to_int/1]). -export_type([power/0]). -type power() :: {power, integer()}. +'power$power'(Field@0) -> {power, Field@0}. + -file("src/power.gleam", 6). -spec to_int(power()) -> integer(). to_int(P) ->