From 6c5f809678e097bbf4d6d45338591ba53063adcc Mon Sep 17 00:00:00 2001 From: Folkert Date: Mon, 6 Dec 2021 09:43:10 +0100 Subject: [PATCH 01/57] cleanup --- compiler/gen_llvm/src/llvm/build.rs | 235 ++++++++++------------- compiler/gen_llvm/src/llvm/build_list.rs | 2 +- 2 files changed, 103 insertions(+), 134 deletions(-) diff --git a/compiler/gen_llvm/src/llvm/build.rs b/compiler/gen_llvm/src/llvm/build.rs index 96f084a49f..a6d39cae39 100644 --- a/compiler/gen_llvm/src/llvm/build.rs +++ b/compiler/gen_llvm/src/llvm/build.rs @@ -2214,6 +2214,24 @@ pub fn allocate_with_refcount_help<'a, 'ctx, 'env>( data_ptr } +macro_rules! dict_key_value_layout { + ($dict_layout:expr) => { + match $dict_layout { + Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => (key_layout, value_layout), + _ => unreachable!("invalid dict layout"), + } + }; +} + +macro_rules! list_element_layout { + ($dict_layout:expr) => { + match $dict_layout { + Layout::Builtin(Builtin::List(list_layout)) => *list_layout, + _ => unreachable!("invalid list layout"), + } + }; +} + fn list_literal<'a, 'ctx, 'env>( env: &Env<'a, 'ctx, 'env>, scope: &Scope<'a, 'ctx>, @@ -5452,17 +5470,15 @@ fn run_low_level<'a, 'ctx, 'env>( let index_1 = load_symbol(scope, &args[1]); let index_2 = load_symbol(scope, &args[2]); - match list_layout { - Layout::Builtin(Builtin::List(element_layout)) => list_swap( - env, - original_wrapper, - index_1.into_int_value(), - index_2.into_int_value(), - element_layout, - update_mode, - ), - _ => unreachable!("Invalid layout {:?} in List.swap", list_layout), - } + let element_layout = list_element_layout!(list_layout); + list_swap( + env, + original_wrapper, + index_1.into_int_value(), + index_2.into_int_value(), + element_layout, + update_mode, + ) } ListSublist => { // List.sublist : List elem, { start : Nat, len : Nat } -> List elem @@ -5477,17 +5493,15 @@ fn run_low_level<'a, 'ctx, 'env>( let start = load_symbol(scope, &args[1]); let len = load_symbol(scope, &args[2]); - match list_layout { - Layout::Builtin(Builtin::List(element_layout)) => list_sublist( - env, - layout_ids, - original_wrapper, - start.into_int_value(), - len.into_int_value(), - element_layout, - ), - _ => unreachable!("Invalid layout {:?} in List.sublist", list_layout), - } + let element_layout = list_element_layout!(list_layout); + list_sublist( + env, + layout_ids, + original_wrapper, + start.into_int_value(), + len.into_int_value(), + element_layout, + ) } ListDropAt => { // List.dropAt : List elem, Nat -> List elem @@ -5498,16 +5512,14 @@ fn run_low_level<'a, 'ctx, 'env>( let count = load_symbol(scope, &args[1]); - match list_layout { - Layout::Builtin(Builtin::List(element_layout)) => list_drop_at( - env, - layout_ids, - original_wrapper, - count.into_int_value(), - element_layout, - ), - _ => unreachable!("Invalid layout {:?} in List.dropAt", list_layout), - } + let element_layout = list_element_layout!(list_layout); + list_drop_at( + env, + layout_ids, + original_wrapper, + count.into_int_value(), + element_layout, + ) } ListPrepend => { // List.prepend : List elem, elem -> List elem @@ -5526,6 +5538,38 @@ fn run_low_level<'a, 'ctx, 'env>( list_join(env, parent, list, outer_list_layout) } + ListGetUnsafe => { + // List.get : List elem, Nat -> [ Ok elem, OutOfBounds ]* + debug_assert_eq!(args.len(), 2); + + let (wrapper_struct, list_layout) = load_symbol_and_layout(scope, &args[0]); + let wrapper_struct = wrapper_struct.into_struct_value(); + let elem_index = load_symbol(scope, &args[1]).into_int_value(); + + list_get_unsafe( + env, + layout_ids, + parent, + list_layout, + elem_index, + wrapper_struct, + ) + } + ListSet => { + let list = load_symbol(scope, &args[0]); + let index = load_symbol(scope, &args[1]); + let (element, element_layout) = load_symbol_and_layout(scope, &args[2]); + + list_set( + env, + layout_ids, + list, + index.into_int_value(), + element, + element_layout, + update_mode, + ) + } NumToStr => { // Num.toStr : Num a -> Str debug_assert_eq!(args.len(), 1); @@ -5807,41 +5851,6 @@ fn run_low_level<'a, 'ctx, 'env>( BasicValueEnum::IntValue(bool_val) } - ListGetUnsafe => { - // List.get : List elem, Nat -> [ Ok elem, OutOfBounds ]* - debug_assert_eq!(args.len(), 2); - - let (wrapper_struct, list_layout) = load_symbol_and_layout(scope, &args[0]); - let wrapper_struct = wrapper_struct.into_struct_value(); - let elem_index = load_symbol(scope, &args[1]).into_int_value(); - - list_get_unsafe( - env, - layout_ids, - parent, - list_layout, - elem_index, - wrapper_struct, - ) - } - ListSet => { - let (list, list_layout) = load_symbol_and_layout(scope, &args[0]); - let (index, _) = load_symbol_and_layout(scope, &args[1]); - let (element, _) = load_symbol_and_layout(scope, &args[2]); - - match list_layout { - Layout::Builtin(Builtin::List(element_layout)) => list_set( - env, - layout_ids, - list, - index.into_int_value(), - element, - element_layout, - update_mode, - ), - _ => unreachable!("invalid dict layout"), - } - } Hash => { debug_assert_eq!(args.len(), 2); let seed = load_symbol(scope, &args[0]); @@ -5873,12 +5882,8 @@ fn run_low_level<'a, 'ctx, 'env>( let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]); let (key, key_layout) = load_symbol_and_layout(scope, &args[1]); - match dict_layout { - Layout::Builtin(Builtin::Dict(_, value_layout)) => { - dict_remove(env, layout_ids, dict, key, key_layout, value_layout) - } - _ => unreachable!("invalid dict layout"), - } + let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); + dict_remove(env, layout_ids, dict, key, key_layout, value_layout) } DictContains => { debug_assert_eq!(args.len(), 2); @@ -5886,12 +5891,8 @@ fn run_low_level<'a, 'ctx, 'env>( let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]); let (key, key_layout) = load_symbol_and_layout(scope, &args[1]); - match dict_layout { - Layout::Builtin(Builtin::Dict(_, value_layout)) => { - dict_contains(env, layout_ids, dict, key, key_layout, value_layout) - } - _ => unreachable!("invalid dict layout"), - } + let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); + dict_contains(env, layout_ids, dict, key, key_layout, value_layout) } DictGetUnsafe => { debug_assert_eq!(args.len(), 2); @@ -5899,36 +5900,24 @@ fn run_low_level<'a, 'ctx, 'env>( let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]); let (key, key_layout) = load_symbol_and_layout(scope, &args[1]); - match dict_layout { - Layout::Builtin(Builtin::Dict(_, value_layout)) => { - dict_get(env, layout_ids, dict, key, key_layout, value_layout) - } - _ => unreachable!("invalid dict layout"), - } + let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); + dict_get(env, layout_ids, dict, key, key_layout, value_layout) } DictKeys => { debug_assert_eq!(args.len(), 1); let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]); - match dict_layout { - Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => { - dict_keys(env, layout_ids, dict, key_layout, value_layout) - } - _ => unreachable!("invalid dict layout"), - } + let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); + dict_keys(env, layout_ids, dict, key_layout, value_layout) } DictValues => { debug_assert_eq!(args.len(), 1); let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]); - match dict_layout { - Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => { - dict_values(env, layout_ids, dict, key_layout, value_layout) - } - _ => unreachable!("invalid dict layout"), - } + let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); + dict_values(env, layout_ids, dict, key_layout, value_layout) } DictUnion => { debug_assert_eq!(args.len(), 2); @@ -5936,12 +5925,8 @@ fn run_low_level<'a, 'ctx, 'env>( let (dict1, dict_layout) = load_symbol_and_layout(scope, &args[0]); let (dict2, _) = load_symbol_and_layout(scope, &args[1]); - match dict_layout { - Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => { - dict_union(env, layout_ids, dict1, dict2, key_layout, value_layout) - } - _ => unreachable!("invalid dict layout"), - } + let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); + dict_union(env, layout_ids, dict1, dict2, key_layout, value_layout) } DictDifference => { debug_assert_eq!(args.len(), 2); @@ -5949,12 +5934,8 @@ fn run_low_level<'a, 'ctx, 'env>( let (dict1, dict_layout) = load_symbol_and_layout(scope, &args[0]); let (dict2, _) = load_symbol_and_layout(scope, &args[1]); - match dict_layout { - Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => { - dict_difference(env, layout_ids, dict1, dict2, key_layout, value_layout) - } - _ => unreachable!("invalid dict layout"), - } + let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); + dict_difference(env, layout_ids, dict1, dict2, key_layout, value_layout) } DictIntersection => { debug_assert_eq!(args.len(), 2); @@ -5962,24 +5943,16 @@ fn run_low_level<'a, 'ctx, 'env>( let (dict1, dict_layout) = load_symbol_and_layout(scope, &args[0]); let (dict2, _) = load_symbol_and_layout(scope, &args[1]); - match dict_layout { - Layout::Builtin(Builtin::Dict(key_layout, value_layout)) => { - dict_intersection(env, layout_ids, dict1, dict2, key_layout, value_layout) - } - _ => unreachable!("invalid dict layout"), - } + let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); + dict_intersection(env, layout_ids, dict1, dict2, key_layout, value_layout) } SetFromList => { debug_assert_eq!(args.len(), 1); let (list, list_layout) = load_symbol_and_layout(scope, &args[0]); - match list_layout { - Layout::Builtin(Builtin::List(key_layout)) => { - set_from_list(env, layout_ids, list, key_layout) - } - _ => unreachable!("invalid dict layout"), - } + let key_layout = list_element_layout!(list_layout); + set_from_list(env, layout_ids, list, key_layout) } ExpectTrue => { debug_assert_eq!(args.len(), 1); @@ -6482,17 +6455,6 @@ pub fn build_num_binop<'a, 'ctx, 'env>( { use roc_mono::layout::Builtin::*; - let float_binop = |float_width| { - build_float_binop( - env, - parent, - float_width, - lhs_arg.into_float_value(), - rhs_arg.into_float_value(), - op, - ) - }; - match lhs_builtin { Int(int_width) => build_int_binop( env, @@ -6503,7 +6465,14 @@ pub fn build_num_binop<'a, 'ctx, 'env>( op, ), - Float(float_width) => float_binop(*float_width), + Float(float_width) => build_float_binop( + env, + parent, + *float_width, + lhs_arg.into_float_value(), + rhs_arg.into_float_value(), + op, + ), Decimal => { build_dec_binop(env, parent, lhs_arg, lhs_layout, rhs_arg, rhs_layout, op) diff --git a/compiler/gen_llvm/src/llvm/build_list.rs b/compiler/gen_llvm/src/llvm/build_list.rs index 78c3d357a9..69cdc5efd9 100644 --- a/compiler/gen_llvm/src/llvm/build_list.rs +++ b/compiler/gen_llvm/src/llvm/build_list.rs @@ -346,7 +346,7 @@ pub fn list_set<'a, 'ctx, 'env>( list: BasicValueEnum<'ctx>, index: IntValue<'ctx>, element: BasicValueEnum<'ctx>, - element_layout: &'a Layout<'a>, + element_layout: &Layout<'a>, update_mode: UpdateMode, ) -> BasicValueEnum<'ctx> { let dec_element_fn = build_dec_wrapper(env, layout_ids, element_layout); From 727f2f6e9348075540e5a5a27056203465d3eb82 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 8 Dec 2021 21:02:38 +0100 Subject: [PATCH 02/57] cleanup --- compiler/gen_llvm/src/llvm/build.rs | 27 ++++-- compiler/gen_llvm/src/llvm/build_list.rs | 103 ++++++++--------------- 2 files changed, 54 insertions(+), 76 deletions(-) diff --git a/compiler/gen_llvm/src/llvm/build.rs b/compiler/gen_llvm/src/llvm/build.rs index a6d39cae39..1e7ddfedb3 100644 --- a/compiler/gen_llvm/src/llvm/build.rs +++ b/compiler/gen_llvm/src/llvm/build.rs @@ -2224,8 +2224,8 @@ macro_rules! dict_key_value_layout { } macro_rules! list_element_layout { - ($dict_layout:expr) => { - match $dict_layout { + ($list_layout:expr) => { + match $list_layout { Layout::Builtin(Builtin::List(list_layout)) => *list_layout, _ => unreachable!("invalid list layout"), } @@ -5416,7 +5416,9 @@ fn run_low_level<'a, 'ctx, 'env>( let (list, list_layout) = load_symbol_and_layout(scope, &args[0]); - list_reverse(env, list, list_layout, update_mode) + let element_layout = list_element_layout!(list_layout); + + list_reverse(env, list, element_layout, update_mode) } ListConcat => { debug_assert_eq!(args.len(), 2); @@ -5425,7 +5427,9 @@ fn run_low_level<'a, 'ctx, 'env>( let second_list = load_symbol(scope, &args[1]); - list_concat(env, parent, first_list, second_list, list_layout) + let element_layout = list_element_layout!(list_layout); + + list_concat(env, first_list, second_list, element_layout) } ListContains => { // List.contains : List elem, elem -> Bool @@ -5536,7 +5540,10 @@ fn run_low_level<'a, 'ctx, 'env>( let (list, outer_list_layout) = load_symbol_and_layout(scope, &args[0]); - list_join(env, parent, list, outer_list_layout) + let inner_list_layout = list_element_layout!(outer_list_layout); + let element_layout = list_element_layout!(inner_list_layout); + + list_join(env, list, element_layout) } ListGetUnsafe => { // List.get : List elem, Nat -> [ Ok elem, OutOfBounds ]* @@ -5546,11 +5553,13 @@ fn run_low_level<'a, 'ctx, 'env>( let wrapper_struct = wrapper_struct.into_struct_value(); let elem_index = load_symbol(scope, &args[1]).into_int_value(); + let element_layout = list_element_layout!(list_layout); + list_get_unsafe( env, layout_ids, parent, - list_layout, + element_layout, elem_index, wrapper_struct, ) @@ -5880,7 +5889,7 @@ fn run_low_level<'a, 'ctx, 'env>( debug_assert_eq!(args.len(), 2); let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]); - let (key, key_layout) = load_symbol_and_layout(scope, &args[1]); + let key = load_symbol(scope, &args[1]); let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); dict_remove(env, layout_ids, dict, key, key_layout, value_layout) @@ -5889,7 +5898,7 @@ fn run_low_level<'a, 'ctx, 'env>( debug_assert_eq!(args.len(), 2); let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]); - let (key, key_layout) = load_symbol_and_layout(scope, &args[1]); + let key = load_symbol(scope, &args[1]); let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); dict_contains(env, layout_ids, dict, key, key_layout, value_layout) @@ -5898,7 +5907,7 @@ fn run_low_level<'a, 'ctx, 'env>( debug_assert_eq!(args.len(), 2); let (dict, dict_layout) = load_symbol_and_layout(scope, &args[0]); - let (key, key_layout) = load_symbol_and_layout(scope, &args[1]); + let key = load_symbol(scope, &args[1]); let (key_layout, value_layout) = dict_key_value_layout!(dict_layout); dict_get(env, layout_ids, dict, key, key_layout, value_layout) diff --git a/compiler/gen_llvm/src/llvm/build_list.rs b/compiler/gen_llvm/src/llvm/build_list.rs index 69cdc5efd9..f2c5351d1b 100644 --- a/compiler/gen_llvm/src/llvm/build_list.rs +++ b/compiler/gen_llvm/src/llvm/build_list.rs @@ -145,47 +145,33 @@ pub fn list_repeat<'a, 'ctx, 'env>( /// List.join : List (List elem) -> List elem pub fn list_join<'a, 'ctx, 'env>( env: &Env<'a, 'ctx, 'env>, - _parent: FunctionValue<'ctx>, outer_list: BasicValueEnum<'ctx>, - outer_list_layout: &Layout<'a>, + element_layout: &Layout<'a>, ) -> BasicValueEnum<'ctx> { - match outer_list_layout { - Layout::Builtin(Builtin::List(Layout::Builtin(Builtin::List(element_layout)))) => { - call_bitcode_fn_returns_list( - env, - &[ - pass_list_cc(env, outer_list), - env.alignment_intvalue(element_layout), - layout_width(env, element_layout), - ], - bitcode::LIST_JOIN, - ) - } - _ => { - unreachable!("Invalid List layout for List.join {:?}", outer_list_layout); - } - } + call_bitcode_fn_returns_list( + env, + &[ + pass_list_cc(env, outer_list), + env.alignment_intvalue(element_layout), + layout_width(env, element_layout), + ], + bitcode::LIST_JOIN, + ) } /// List.reverse : List elem -> List elem pub fn list_reverse<'a, 'ctx, 'env>( env: &Env<'a, 'ctx, 'env>, list: BasicValueEnum<'ctx>, - list_layout: &Layout<'a>, + element_layout: &Layout<'a>, update_mode: UpdateMode, ) -> BasicValueEnum<'ctx> { - let element_layout = match *list_layout { - Layout::Builtin(Builtin::List(elem_layout)) => *elem_layout, - - _ => unreachable!("Invalid layout {:?} in List.reverse", list_layout), - }; - call_bitcode_fn_returns_list( env, &[ pass_list_cc(env, list), - env.alignment_intvalue(&element_layout), - layout_width(env, &element_layout), + env.alignment_intvalue(element_layout), + layout_width(env, element_layout), pass_update_mode(env, update_mode), ], bitcode::LIST_REVERSE, @@ -196,38 +182,27 @@ pub fn list_get_unsafe<'a, 'ctx, 'env>( env: &Env<'a, 'ctx, 'env>, layout_ids: &mut LayoutIds<'a>, parent: FunctionValue<'ctx>, - list_layout: &Layout<'a>, + element_layout: &Layout<'a>, elem_index: IntValue<'ctx>, wrapper_struct: StructValue<'ctx>, ) -> BasicValueEnum<'ctx> { let builder = env.builder; - match list_layout { - Layout::Builtin(Builtin::List(elem_layout)) => { - let elem_type = basic_type_from_layout(env, elem_layout); - let ptr_type = elem_type.ptr_type(AddressSpace::Generic); - // Load the pointer to the array data - let array_data_ptr = load_list_ptr(builder, wrapper_struct, ptr_type); + let elem_type = basic_type_from_layout(env, element_layout); + let ptr_type = elem_type.ptr_type(AddressSpace::Generic); + // Load the pointer to the array data + let array_data_ptr = load_list_ptr(builder, wrapper_struct, ptr_type); - // Assume the bounds have already been checked earlier - // (e.g. by List.get or List.first, which wrap List.#getUnsafe) - let elem_ptr = unsafe { - builder.build_in_bounds_gep(array_data_ptr, &[elem_index], "list_get_element") - }; + // Assume the bounds have already been checked earlier + // (e.g. by List.get or List.first, which wrap List.#getUnsafe) + let elem_ptr = + unsafe { builder.build_in_bounds_gep(array_data_ptr, &[elem_index], "list_get_element") }; - let result = load_roc_value(env, **elem_layout, elem_ptr, "list_get_load_element"); + let result = load_roc_value(env, *element_layout, elem_ptr, "list_get_load_element"); - increment_refcount_layout(env, parent, layout_ids, 1, result, elem_layout); + increment_refcount_layout(env, parent, layout_ids, 1, result, element_layout); - result - } - _ => { - unreachable!( - "Invalid List layout for ListGetUnsafe operation: {:?}", - list_layout - ); - } - } + result } /// List.append : List elem, elem -> List elem @@ -880,26 +855,20 @@ pub fn list_map4<'a, 'ctx, 'env>( /// List.concat : List elem, List elem -> List elem pub fn list_concat<'a, 'ctx, 'env>( env: &Env<'a, 'ctx, 'env>, - _parent: FunctionValue<'ctx>, first_list: BasicValueEnum<'ctx>, second_list: BasicValueEnum<'ctx>, - list_layout: &Layout<'a>, + element_layout: &Layout<'a>, ) -> BasicValueEnum<'ctx> { - match list_layout { - Layout::Builtin(Builtin::List(elem_layout)) => call_bitcode_fn_returns_list( - env, - &[ - pass_list_cc(env, first_list), - pass_list_cc(env, second_list), - env.alignment_intvalue(elem_layout), - layout_width(env, elem_layout), - ], - bitcode::LIST_CONCAT, - ), - _ => { - unreachable!("Invalid List layout for List.concat {:?}", list_layout); - } - } + call_bitcode_fn_returns_list( + env, + &[ + pass_list_cc(env, first_list), + pass_list_cc(env, second_list), + env.alignment_intvalue(element_layout), + layout_width(env, element_layout), + ], + bitcode::LIST_CONCAT, + ) } /// List.any : List elem, \(elem -> Bool) -> Bool From 2f4225eec66197040917d6b995d2749061cf5a50 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Tue, 7 Dec 2021 20:12:57 +0000 Subject: [PATCH 03/57] Add more doc comments to UnionLayout enum --- compiler/mono/src/layout.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/compiler/mono/src/layout.rs b/compiler/mono/src/layout.rs index bad3cc8389..93425b0d2d 100644 --- a/compiler/mono/src/layout.rs +++ b/compiler/mono/src/layout.rs @@ -207,20 +207,24 @@ pub enum UnionLayout<'a> { /// A non-recursive tag union /// e.g. `Result a e : [ Ok a, Err e ]` NonRecursive(&'a [&'a [Layout<'a>]]), - /// A recursive tag union + /// A recursive tag union (general case) /// e.g. `Expr : [ Sym Str, Add Expr Expr ]` Recursive(&'a [&'a [Layout<'a>]]), /// A recursive tag union with just one constructor + /// Optimization: No need to store a tag ID (the payload is "unwrapped") /// e.g. `RoseTree a : [ Tree a (List (RoseTree a)) ]` NonNullableUnwrapped(&'a [Layout<'a>]), - /// A recursive tag union where the non-nullable variant(s) store the tag id + /// A recursive tag union that has an empty variant + /// Optimization: Represent the empty variant as null pointer => no memory usage & fast comparison + /// It has more than one other variant, so they need tag IDs (payloads are "wrapped") /// e.g. `FingerTree a : [ Empty, Single a, More (Some a) (FingerTree (Tuple a)) (Some a) ]` /// see also: https://youtu.be/ip92VMpf_-A?t=164 NullableWrapped { nullable_id: u16, other_tags: &'a [&'a [Layout<'a>]], }, - /// A recursive tag union where the non-nullable variant does NOT store the tag id + /// A recursive tag union with only two variants, where one is empty. + /// Optimizations: Use null for the empty variant AND don't store a tag ID for the other variant. /// e.g. `ConsList a : [ Nil, Cons a (ConsList a) ]` NullableUnwrapped { nullable_id: bool, From 0220f7d9210890aac6a03c2828e80ecc2f84c19d Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Tue, 7 Dec 2021 20:14:22 +0000 Subject: [PATCH 04/57] Remove an assumption of 64-bit pointer alignment --- compiler/gen_llvm/src/llvm/build.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/gen_llvm/src/llvm/build.rs b/compiler/gen_llvm/src/llvm/build.rs index 96f084a49f..2b25d36992 100644 --- a/compiler/gen_llvm/src/llvm/build.rs +++ b/compiler/gen_llvm/src/llvm/build.rs @@ -1754,8 +1754,8 @@ fn tag_pointer_set_tag_id<'a, 'ctx, 'env>( tag_id: u8, pointer: PointerValue<'ctx>, ) -> PointerValue<'ctx> { - // we only have 3 bits, so can encode only 0..7 - debug_assert!(tag_id < 8); + // we only have 3 bits, so can encode only 0..7 (or on 32-bit targets, 2 bits to encode 0..3) + debug_assert!((tag_id as u32) < env.ptr_bytes); let ptr_int = env.ptr_int(); From 73c9c7089a377f23cf0ce7225bef518876cb4491 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Tue, 7 Dec 2021 23:07:27 +0000 Subject: [PATCH 05/57] Fix gen_wasm Let statement for heap-allocating expressions When we allocate on the heap we'll need to force LocalId storage. In that case we don't want CodeBuilder to track the Symbol, even though it has WasmLayout::Primitive. So basically it was always the wrong condition to check, but we got away with it when we had no heap allocations. --- compiler/gen_wasm/src/backend.rs | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 5788943018..6ed6bf065d 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -296,18 +296,12 @@ impl<'a> WasmBackend<'a> { self.build_expr(sym, expr, layout, &sym_storage)?; - // For primitives, we record that this symbol is at the top of the VM stack - // (For other values, we wrote to memory and there's nothing on the VM stack) - if let WasmLayout::Primitive(value_type, size) = wasm_layout { - let vm_state = self.code_builder.set_top_symbol(*sym); - self.storage.symbol_storage_map.insert( - *sym, - StoredValue::VirtualMachineStack { - vm_state, - value_type, - size, - }, - ); + // If this value is stored in the VM stack, we need code_builder to track it + // (since every instruction can change the VM stack) + if let Some(StoredValue::VirtualMachineStack { vm_state, .. }) = + self.storage.symbol_storage_map.get_mut(sym) + { + *vm_state = self.code_builder.set_top_symbol(*sym); } self.symbol_layouts.insert(*sym, *layout); @@ -854,14 +848,14 @@ impl<'a> WasmBackend<'a> { // Not passing it as an argument because I'm trying to match Backend method signatures let storage = self.storage.get(sym).to_owned(); - if let Layout::Struct(field_layouts) = layout { + if matches!(layout, Layout::Struct(_)) { match storage { StoredValue::StackMemory { location, size, .. } => { if size > 0 { let (local_id, struct_offset) = location.local_and_offset(self.storage.stack_frame_pointer); let mut field_offset = struct_offset; - for (field, _) in fields.iter().zip(field_layouts.iter()) { + for field in fields.iter() { field_offset += self.storage.copy_value_to_memory( &mut self.code_builder, local_id, From f6b6d91c56297b954e379405064bd7ed0db00957 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Tue, 7 Dec 2021 23:21:31 +0000 Subject: [PATCH 06/57] More accurate comment for EmptyArray --- compiler/gen_wasm/src/backend.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 6ed6bf065d..441af781ce 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -640,10 +640,9 @@ impl<'a> WasmBackend<'a> { let (local_id, offset) = location.local_and_offset(self.storage.stack_frame_pointer); - // This is a minor cheat. We only need the first two 32 bit - // chunks here. We fill both chunks with zeros, so we - // can simplify things to a single group of 64 bit operations instead of - // doing the below twice for 32 bits. + // This is a minor cheat. + // What we want to write to stack memory is { elements: null, length: 0 } + // But instead of two 32-bit stores, we can do a single 64-bit store. self.code_builder.get_local(local_id); self.code_builder.i64_const(0); self.code_builder.i64_store(Align::Bytes4, offset); From 6a801ebc7e9c4c842599ffb0863a3e0b1d67f44f Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Wed, 8 Dec 2021 20:45:49 +0000 Subject: [PATCH 07/57] gen_wasm: add support for non-recursive Tags --- compiler/gen_wasm/src/backend.rs | 66 +++++++++++++++++-- compiler/test_gen/src/gen_records.rs | 18 +++++ compiler/test_gen/src/gen_tags.rs | 61 ++++++----------- .../src/helpers/from_wasm32_memory.rs | 2 +- compiler/test_gen/src/helpers/wasm.rs | 7 +- 5 files changed, 106 insertions(+), 48 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 441af781ce..1e16445233 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -6,7 +6,7 @@ use roc_module::low_level::LowLevel; use roc_module::symbol::{Interns, Symbol}; use roc_mono::gen_refcount::{RefcountProcGenerator, REFCOUNT_MAX}; use roc_mono::ir::{CallType, Expr, JoinPointId, Literal, Proc, Stmt}; -use roc_mono::layout::{Builtin, Layout, LayoutIds}; +use roc_mono::layout::{Builtin, Layout, LayoutIds, TagIdIntType, UnionLayout}; use crate::layout::{CallConv, ReturnMethod, WasmLayout}; use crate::low_level::{decode_low_level, LowlevelBuildResult}; @@ -24,8 +24,8 @@ use crate::wasm_module::{ LinkingSubSection, LocalId, Signature, SymInfo, ValueType, }; use crate::{ - copy_memory, CopyMemoryConfig, Env, BUILTINS_IMPORT_MODULE_NAME, MEMORY_NAME, PTR_SIZE, - PTR_TYPE, STACK_POINTER_GLOBAL_ID, STACK_POINTER_NAME, + copy_memory, round_up_to_alignment, CopyMemoryConfig, Env, BUILTINS_IMPORT_MODULE_NAME, + MEMORY_NAME, PTR_SIZE, PTR_TYPE, STACK_POINTER_GLOBAL_ID, STACK_POINTER_NAME, }; /// The memory address where the constants data will be loaded during module instantiation. @@ -633,7 +633,7 @@ impl<'a> WasmBackend<'a> { Ok(()) } - Expr::Array { .. } => Err(format!("Expression is not yet implemented {:?}", 2)), + Expr::Array { .. } => Err(format!("Expression is not yet implemented {:?}", expr)), Expr::EmptyArray => { if let StoredValue::StackMemory { location, .. } = storage { @@ -653,10 +653,68 @@ impl<'a> WasmBackend<'a> { } } + Expr::Tag { + tag_layout, + tag_id, + arguments, + .. + } => { + self.build_tag(tag_layout, *tag_id, arguments, storage); + Ok(()) + } + x => Err(format!("Expression is not yet implemented {:?}", x)), } } + fn build_tag( + &mut self, + union_layout: &UnionLayout<'a>, + tag_id: TagIdIntType, + arguments: &'a [Symbol], + stored: &StoredValue, + ) { + match union_layout { + UnionLayout::NonRecursive(tags) => { + let (local_id, offset) = if let StoredValue::StackMemory { location, .. } = stored { + location.local_and_offset(self.storage.stack_frame_pointer) + } else { + panic!("NonRecursive Tag should always be stored in StackMemory"); + }; + + let mut field_offset = offset; + for field_symbol in arguments.iter() { + field_offset += self.storage.copy_value_to_memory( + &mut self.code_builder, + local_id, + field_offset, + *field_symbol, + ); + } + + let tag_field_layouts = &tags[tag_id as usize]; + let alignment_bytes = Layout::Struct(tag_field_layouts).alignment_bytes(PTR_SIZE); + let tag_id_offset = + round_up_to_alignment(field_offset as i32, alignment_bytes as i32) as u32; + let tag_id_align = Align::from(alignment_bytes); + + match tag_id_align { + Align::Bytes1 | Align::Bytes2 | Align::Bytes4 => { + self.code_builder.get_local(local_id); + self.code_builder.i32_const(tag_id as i32); + self.code_builder.i32_store(tag_id_align, tag_id_offset); + } + _ => { + self.code_builder.get_local(local_id); + self.code_builder.i64_const(tag_id as i64); + self.code_builder.i64_store(tag_id_align, tag_id_offset); + } + } + } + _ => unimplemented!("Tag with layout {:?}", union_layout), + } + } + fn build_low_level( &mut self, lowlevel: LowLevel, diff --git a/compiler/test_gen/src/gen_records.rs b/compiler/test_gen/src/gen_records.rs index 4cb8911eaa..c799d09a57 100644 --- a/compiler/test_gen/src/gen_records.rs +++ b/compiler/test_gen/src/gen_records.rs @@ -806,6 +806,24 @@ fn return_nested_record() { ); } +#[test] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] +fn nested_record_load() { + assert_evals_to!( + indoc!( + r#" + x = { a : { b : 0x5 } } + + y = x.a + + y.b + "# + ), + 5, + i64 + ); +} + #[test] #[cfg(any(feature = "gen-llvm"))] fn accessor_twice() { diff --git a/compiler/test_gen/src/gen_tags.rs b/compiler/test_gen/src/gen_tags.rs index 5ae904f95a..f1113a693c 100644 --- a/compiler/test_gen/src/gen_tags.rs +++ b/compiler/test_gen/src/gen_tags.rs @@ -1,16 +1,15 @@ -#![cfg(feature = "gen-llvm")] - #[cfg(feature = "gen-llvm")] use crate::helpers::llvm::assert_evals_to; // #[cfg(feature = "gen-dev")] // use crate::helpers::dev::assert_evals_to; -// #[cfg(feature = "gen-wasm")] -// use crate::helpers::wasm::assert_evals_to; +#[cfg(feature = "gen-wasm")] +use crate::helpers::wasm::assert_evals_to; // use crate::assert_wasm_evals_to as assert_evals_to; use indoc::indoc; +#[allow(unused_imports)] use roc_std::{RocList, RocStr}; #[test] @@ -71,7 +70,7 @@ fn applied_tag_nothing() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn applied_tag_just() { assert_evals_to!( indoc!( @@ -90,7 +89,7 @@ fn applied_tag_just() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn applied_tag_just_ir() { assert_evals_to!( indoc!( @@ -109,7 +108,7 @@ fn applied_tag_just_ir() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn applied_tag_just_enum() { assert_evals_to!( indoc!( @@ -133,7 +132,7 @@ fn applied_tag_just_enum() { } // #[test] -#[cfg(any(feature = "gen-llvm"))] +// #[cfg(any(feature = "gen-llvm"))] // fn raw_result() { // assert_evals_to!( // indoc!( @@ -149,7 +148,7 @@ fn applied_tag_just_enum() { // ); // } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn true_is_true() { assert_evals_to!( indoc!( @@ -166,7 +165,7 @@ fn true_is_true() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn false_is_false() { assert_evals_to!( indoc!( @@ -205,7 +204,7 @@ fn basic_enum() { } // #[test] -#[cfg(any(feature = "gen-llvm"))] +// #[cfg(any(feature = "gen-llvm"))] // fn linked_list_empty() { // assert_evals_to!( // indoc!( @@ -224,7 +223,7 @@ fn basic_enum() { // } // // #[test] -#[cfg(any(feature = "gen-llvm"))] +// #[cfg(any(feature = "gen-llvm"))] // fn linked_list_singleton() { // assert_evals_to!( // indoc!( @@ -243,7 +242,7 @@ fn basic_enum() { // } // // #[test] -#[cfg(any(feature = "gen-llvm"))] +// #[cfg(any(feature = "gen-llvm"))] // fn linked_list_is_empty() { // assert_evals_to!( // indoc!( @@ -264,7 +263,7 @@ fn basic_enum() { // ); // } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn even_odd() { assert_evals_to!( indoc!( @@ -290,7 +289,7 @@ fn even_odd() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn gen_literal_true() { assert_evals_to!( indoc!( @@ -304,7 +303,7 @@ fn gen_literal_true() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn gen_if_float() { assert_evals_to!( indoc!( @@ -792,7 +791,7 @@ fn pattern_matching_unit() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn one_element_tag() { assert_evals_to!( indoc!( @@ -809,7 +808,7 @@ fn one_element_tag() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn nested_tag_union() { assert_evals_to!( indoc!( @@ -830,7 +829,7 @@ fn nested_tag_union() { ); } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn unit_type() { assert_evals_to!( indoc!( @@ -848,24 +847,6 @@ fn unit_type() { ); } -#[test] -#[cfg(any(feature = "gen-llvm"))] -fn nested_record_load() { - assert_evals_to!( - indoc!( - r#" - x = { a : { b : 0x5 } } - - y = x.a - - y.b - "# - ), - 5, - i64 - ); -} - #[test] #[cfg(any(feature = "gen-llvm"))] fn join_point_if() { @@ -949,7 +930,7 @@ fn join_point_with_cond_expr() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn alignment_in_single_tag_construction() { assert_evals_to!(indoc!("Three (1 == 1) 32"), (32i64, true), (i64, bool)); @@ -993,7 +974,7 @@ fn alignment_in_single_tag_pattern_match() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn alignment_in_multi_tag_construction_two() { assert_evals_to!( indoc!( @@ -1011,7 +992,7 @@ fn alignment_in_multi_tag_construction_two() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn alignment_in_multi_tag_construction_three() { assert_evals_to!( indoc!( diff --git a/compiler/test_gen/src/helpers/from_wasm32_memory.rs b/compiler/test_gen/src/helpers/from_wasm32_memory.rs index db59b8ef95..b082e0f28e 100644 --- a/compiler/test_gen/src/helpers/from_wasm32_memory.rs +++ b/compiler/test_gen/src/helpers/from_wasm32_memory.rs @@ -27,7 +27,7 @@ macro_rules! from_wasm_memory_primitive_decode { let raw_ptr = ptr as *mut u8; let slice = unsafe { std::slice::from_raw_parts_mut(raw_ptr, width) }; - let ptr: wasmer::WasmPtr = wasmer::WasmPtr::new(offset as u32); + let ptr: wasmer::WasmPtr = wasmer::WasmPtr::new(offset); let foobar = (ptr.deref(memory, 0, width as u32)).unwrap(); let wasm_slice = unsafe { std::mem::transmute(foobar) }; diff --git a/compiler/test_gen/src/helpers/wasm.rs b/compiler/test_gen/src/helpers/wasm.rs index e5750978e0..73eca6ce4d 100644 --- a/compiler/test_gen/src/helpers/wasm.rs +++ b/compiler/test_gen/src/helpers/wasm.rs @@ -221,7 +221,7 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( } #[allow(dead_code)] -pub fn assert_wasm_evals_to_help(src: &str, expected: T) -> Result +pub fn assert_wasm_evals_to_help(src: &str, phantom: T) -> Result where T: FromWasm32Memory + Wasm32TestResult, { @@ -230,7 +230,7 @@ where // NOTE the stdlib must be in the arena; just taking a reference will segfault let stdlib = arena.alloc(roc_builtins::std::standard_stdlib()); - let instance = crate::helpers::wasm::helper_wasm(&arena, src, stdlib, &expected); + let instance = crate::helpers::wasm::helper_wasm(&arena, src, stdlib, &phantom); let memory = instance.exports.get_memory(MEMORY_NAME).unwrap(); @@ -254,7 +254,8 @@ where #[allow(unused_macros)] macro_rules! assert_wasm_evals_to { ($src:expr, $expected:expr, $ty:ty, $transform:expr) => { - match $crate::helpers::wasm::assert_wasm_evals_to_help::<$ty>($src, $expected) { + let phantom = <$ty>::default(); + match $crate::helpers::wasm::assert_wasm_evals_to_help::<$ty>($src, phantom) { Err(msg) => panic!("{:?}", msg), Ok(actual) => { assert_eq!($transform(actual), $expected) From 1ba654c5b28642b38413371bb8087cc9f52d44de Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Wed, 8 Dec 2021 21:11:10 +0000 Subject: [PATCH 08/57] Change round_up_to_alignment to a macro to work on more Rust types --- compiler/gen_wasm/src/backend.rs | 3 +- compiler/gen_wasm/src/lib.rs | 31 ++++++++++--------- compiler/gen_wasm/src/storage.rs | 2 +- .../gen_wasm/src/wasm_module/code_builder.rs | 2 +- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 1e16445233..f71b09b162 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -694,8 +694,7 @@ impl<'a> WasmBackend<'a> { let tag_field_layouts = &tags[tag_id as usize]; let alignment_bytes = Layout::Struct(tag_field_layouts).alignment_bytes(PTR_SIZE); - let tag_id_offset = - round_up_to_alignment(field_offset as i32, alignment_bytes as i32) as u32; + let tag_id_offset = round_up_to_alignment!(field_offset, alignment_bytes); let tag_id_align = Align::from(alignment_bytes); match tag_id_align { diff --git a/compiler/gen_wasm/src/lib.rs b/compiler/gen_wasm/src/lib.rs index 2b5aba3ecd..48a53dde9b 100644 --- a/compiler/gen_wasm/src/lib.rs +++ b/compiler/gen_wasm/src/lib.rs @@ -175,20 +175,23 @@ pub fn copy_memory(code_builder: &mut CodeBuilder, config: CopyMemoryConfig) { } /// Round up to alignment_bytes (which must be a power of 2) -pub fn round_up_to_alignment(unaligned: i32, alignment_bytes: i32) -> i32 { - if alignment_bytes <= 1 { - return unaligned; - } - if alignment_bytes.count_ones() != 1 { - panic!( - "Cannot align to {} bytes. Not a power of 2.", - alignment_bytes - ); - } - let mut aligned = unaligned; - aligned += alignment_bytes - 1; // if lower bits are non-zero, push it over the next boundary - aligned &= -alignment_bytes; // mask with a flag that has upper bits 1, lower bits 0 - aligned +#[macro_export] +macro_rules! round_up_to_alignment { + ($unaligned: expr, $alignment_bytes: expr) => { + if $alignment_bytes <= 1 { + $unaligned + } else if $alignment_bytes.count_ones() != 1 { + panic!( + "Cannot align to {} bytes. Not a power of 2.", + $alignment_bytes + ); + } else { + let mut aligned = $unaligned; + aligned += $alignment_bytes - 1; // if lower bits are non-zero, push it over the next boundary + aligned &= !$alignment_bytes + 1; // mask with a flag that has upper bits 1, lower bits 0 + aligned + } + }; } pub fn debug_panic(error: E) { diff --git a/compiler/gen_wasm/src/storage.rs b/compiler/gen_wasm/src/storage.rs index 9ae9aee67b..7a79468508 100644 --- a/compiler/gen_wasm/src/storage.rs +++ b/compiler/gen_wasm/src/storage.rs @@ -171,7 +171,7 @@ impl<'a> Storage<'a> { } let offset = - round_up_to_alignment(self.stack_frame_size, *alignment_bytes as i32); + round_up_to_alignment!(self.stack_frame_size, *alignment_bytes as i32); self.stack_frame_size = offset + (*size as i32); diff --git a/compiler/gen_wasm/src/wasm_module/code_builder.rs b/compiler/gen_wasm/src/wasm_module/code_builder.rs index 10e6408cc3..18e92f9d8b 100644 --- a/compiler/gen_wasm/src/wasm_module/code_builder.rs +++ b/compiler/gen_wasm/src/wasm_module/code_builder.rs @@ -442,7 +442,7 @@ impl<'a> CodeBuilder<'a> { if frame_size != 0 { if let Some(frame_ptr_id) = frame_pointer { - let aligned_size = round_up_to_alignment(frame_size, FRAME_ALIGNMENT_BYTES); + let aligned_size = round_up_to_alignment!(frame_size, FRAME_ALIGNMENT_BYTES); self.build_stack_frame_push(aligned_size, frame_ptr_id); self.build_stack_frame_pop(aligned_size, frame_ptr_id); } From 760f4c0ed4777ea3fff04a531f168962f2dc06dd Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Wed, 8 Dec 2021 21:13:08 +0000 Subject: [PATCH 09/57] Add an optional Wasm debug feature - hex memory dump --- compiler/test_gen/src/helpers/wasm.rs | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/compiler/test_gen/src/helpers/wasm.rs b/compiler/test_gen/src/helpers/wasm.rs index 73eca6ce4d..90ae0ab922 100644 --- a/compiler/test_gen/src/helpers/wasm.rs +++ b/compiler/test_gen/src/helpers/wasm.rs @@ -4,6 +4,7 @@ use std::cell::Cell; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; use tempfile::{tempdir, TempDir}; +use wasmer::Memory; use crate::helpers::from_wasm32_memory::FromWasm32Memory; use crate::helpers::wasm32_test_result::Wasm32TestResult; @@ -244,6 +245,10 @@ where _ => panic!(), }; + if false { + crate::helpers::wasm::debug_memory_hex(memory, address, std::mem::size_of::()); + } + let output = ::decode(memory, address as u32); Ok(output) @@ -251,6 +256,30 @@ where } } +/// Print out hex bytes of the test result, and a few words on either side +/// Can be handy for debugging misalignment issues etc. +pub fn debug_memory_hex(memory: &Memory, address: i32, size: usize) { + let memory_words: &[u32] = unsafe { + let memory_bytes = memory.data_unchecked(); + std::mem::transmute(memory_bytes) + }; + + let extra_words = 2; + let offset = (address as usize) / 4; + let start = offset - extra_words; + let end = offset + (size / 4) + extra_words; + + for index in start..end { + let result_marker = if index == offset { "*" } else { " " }; + println!( + "{:x} {} {:08x}", + index * 4, + result_marker, + memory_words[index] + ); + } +} + #[allow(unused_macros)] macro_rules! assert_wasm_evals_to { ($src:expr, $expected:expr, $ty:ty, $transform:expr) => { From 8a1a16454453b40a470795a04425ac384384f962 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Wed, 8 Dec 2021 21:42:48 +0000 Subject: [PATCH 10/57] Prevent >8 bit alignment specifier in Wasm store instruction, which is not allowed --- compiler/gen_wasm/src/backend.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index f71b09b162..01bcdd135b 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -706,7 +706,7 @@ impl<'a> WasmBackend<'a> { _ => { self.code_builder.get_local(local_id); self.code_builder.i64_const(tag_id as i64); - self.code_builder.i64_store(tag_id_align, tag_id_offset); + self.code_builder.i64_store(Align::Bytes8, tag_id_offset); } } } From a25101b37844da576bb0d98378ecb2f07fa373f9 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Wed, 8 Dec 2021 21:55:14 +0000 Subject: [PATCH 11/57] Remove unusable variants from Align enum I discovered today that Wasmer throws an error if you use "higher than natural" alignment in a store instruction. So let's take them out of the enum. --- compiler/gen_wasm/src/wasm_module/code_builder.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/compiler/gen_wasm/src/wasm_module/code_builder.rs b/compiler/gen_wasm/src/wasm_module/code_builder.rs index 18e92f9d8b..759ff7559a 100644 --- a/compiler/gen_wasm/src/wasm_module/code_builder.rs +++ b/compiler/gen_wasm/src/wasm_module/code_builder.rs @@ -84,7 +84,9 @@ impl std::fmt::Debug for VmBlock<'_> { } } -/// Wasm memory alignment. (Rust representation matches Wasm encoding) +/// Wasm memory alignment for load/store instructions. +/// Rust representation matches Wasm encoding. +/// It's an error to specify alignment higher than the "natural" alignment of the instruction #[repr(u8)] #[derive(Clone, Copy, Debug)] pub enum Align { @@ -92,10 +94,6 @@ pub enum Align { Bytes2 = 1, Bytes4 = 2, Bytes8 = 3, - Bytes16 = 4, - Bytes32 = 5, - Bytes64 = 6, - // ... we can add more if we need them ... } impl From for Align { @@ -105,9 +103,6 @@ impl From for Align { 2 => Align::Bytes2, 4 => Align::Bytes4, 8 => Align::Bytes8, - 16 => Align::Bytes16, - 32 => Align::Bytes32, - 64 => Align::Bytes64, _ => panic!("{:?}-byte alignment not supported", x), } } From cf80f510cb7ef012ef5c74c44ca15655cfceb88c Mon Sep 17 00:00:00 2001 From: Anton-4 <17049058+Anton-4@users.noreply.github.com> Date: Thu, 9 Dec 2021 14:55:43 +0100 Subject: [PATCH 12/57] change import for rust analyzer --- cli_utils/Cargo.lock | 1 + compiler/constrain/src/expr.rs | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli_utils/Cargo.lock b/cli_utils/Cargo.lock index 49dbb3fa2c..5fa0d0ee9b 100644 --- a/cli_utils/Cargo.lock +++ b/cli_utils/Cargo.lock @@ -2679,6 +2679,7 @@ dependencies = [ "roc_collections", "roc_module", "roc_mono", + "roc_reporting", "roc_std", ] diff --git a/compiler/constrain/src/expr.rs b/compiler/constrain/src/expr.rs index add695866e..9779cc951d 100644 --- a/compiler/constrain/src/expr.rs +++ b/compiler/constrain/src/expr.rs @@ -14,9 +14,8 @@ use roc_module::ident::{Lowercase, TagName}; use roc_module::symbol::{ModuleId, Symbol}; use roc_region::all::{Located, Region}; use roc_types::subs::Variable; -use roc_types::types::AnnotationSource::{self, *}; use roc_types::types::Type::{self, *}; -use roc_types::types::{Category, PReason, Reason, RecordField}; +use roc_types::types::{AnnotationSource, Category, PReason, Reason, RecordField}; /// This is for constraining Defs #[derive(Default, Debug)] @@ -604,7 +603,7 @@ pub fn constrain_expr( FromAnnotation( name.clone(), *arity, - TypedWhenBranch { + AnnotationSource::TypedWhenBranch { index: Index::zero_based(index), region: ann_source.region(), }, From bab8a0b8a08087c837b919311eb67da03c144602 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 14:52:14 +0000 Subject: [PATCH 13/57] Fix alignment bug --- compiler/gen_wasm/src/backend.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 8cd262b532..3d3112783a 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -675,9 +675,12 @@ impl<'a> WasmBackend<'a> { } let tag_field_layouts = &tags[tag_id as usize]; - let alignment_bytes = Layout::Struct(tag_field_layouts).alignment_bytes(PTR_SIZE); - let tag_id_offset = round_up_to_alignment!(field_offset, alignment_bytes); - let tag_id_align = Align::from(alignment_bytes); + let fields_alignment_bytes = + Layout::Struct(tag_field_layouts).alignment_bytes(PTR_SIZE); + let tag_id_alignment_bytes = union_layout.tag_id_layout().alignment_bytes(PTR_SIZE); + let total_alignment_bytes = fields_alignment_bytes.max(tag_id_alignment_bytes); + let tag_id_offset = round_up_to_alignment!(field_offset, total_alignment_bytes); + let tag_id_align = Align::from(total_alignment_bytes); match tag_id_align { Align::Bytes1 | Align::Bytes2 | Align::Bytes4 => { From f1d411f3ee393475e69ffe3aa1e9f1bef7d7c23b Mon Sep 17 00:00:00 2001 From: Anton-4 <17049058+Anton-4@users.noreply.github.com> Date: Fri, 10 Dec 2021 16:45:32 +0100 Subject: [PATCH 14/57] Added snippet ideas --- editor/snippet-ideas.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/editor/snippet-ideas.md b/editor/snippet-ideas.md index 877bdc0c3b..ea701cea0f 100644 --- a/editor/snippet-ideas.md +++ b/editor/snippet-ideas.md @@ -41,7 +41,13 @@ Fish hooks are used when subvariants should be created e.g.: means - command: current date/datetime + example: current datetime >> `now <- Time.now\n` - command: list range 1 to 5 - + example: >> [ 1, 2, 3, 4, 5 ] + + example: [ 1, 2, 3, 4, 5 ] +- command: use commandline args +- command: post/get/put request +- command: extract float(s)/number/emal addresses from string. regex match float/number/email address/... +- command: execute (bash) command/script +- command: cast/convert/parse list of x to list of y +- command: pattern match/ match/ switch/ case ## AST aware snippets @@ -54,7 +60,7 @@ Snippets are inserted based on type of value on which the cursor is located. * We show a list with all builtin functions for the List type * User chooses contains * We change code to `List.contains people |Blank` -- command: Str to charlist +- command: Str to chars/charlist ## Snippets with Typed Holes @@ -72,11 +78,18 @@ Snippets are inserted based on type of value on which the cursor is located. - command: remove/create file - command: read/write from file - command: concatenate strings +- command: trim (newlines) at end/start/right/left +- command: evaluate predicate for all in slice/list/array +- command: get element at index +- command: get char at index +- command: reverse stirng +- command: lambda/anonymous function - we should auto create type hole commands for all builtins. + example: List has builtins reverse, repeat, len... generated snippet commands should be: * reverse list > List.reverse ^List *^ * repeat list > List.repeat ^elem^ ^Nat^ * len list (fuzzy matches should be length of list) +- append element to list # fuzzy matching @@ -84,7 +97,7 @@ Snippets are inserted based on type of value on which the cursor is located. - hashmap > Dict - map > map (function), Dict - for > map, mapWithIndex, walk, walkBackwards, zip - - apply > map + - apply/for yield > map - fold > walk, walkBackwards - foldl > walkBackwards - foldr > walk @@ -97,3 +110,4 @@ Snippets are inserted based on type of value on which the cursor is located. - [github copilot](https://copilot.github.com/) snippet generation with machine learning - [stackoverflow](https://stackoverflow.com) - [rosetta code](http://www.rosettacode.org/wiki/Rosetta_Code) snippets in many different programming languages. Many [snippets](https://www.rosettacode.org/wiki/Category:Programming_Tasks) are programming contest style problems, but there also problems that demonstrate the use of JSON, SHA-256, read a file line by line... +- check docs of popular languages to cross reference function/snippet names for fuzzy matching From e7d6371d1f190d4f15ec0d7119878e5d5a6e0195 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 16:18:36 +0000 Subject: [PATCH 15/57] Fix unused import that only appears in gen_dev tests --- compiler/test_gen/src/gen_tags.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler/test_gen/src/gen_tags.rs b/compiler/test_gen/src/gen_tags.rs index f1113a693c..d537018c01 100644 --- a/compiler/test_gen/src/gen_tags.rs +++ b/compiler/test_gen/src/gen_tags.rs @@ -8,6 +8,7 @@ use crate::helpers::llvm::assert_evals_to; use crate::helpers::wasm::assert_evals_to; // use crate::assert_wasm_evals_to as assert_evals_to; +#[allow(unused_imports)] use indoc::indoc; #[allow(unused_imports)] use roc_std::{RocList, RocStr}; From 89b374692cccc618359ac87c883aaa9c40a03505 Mon Sep 17 00:00:00 2001 From: Anton-4 <17049058+Anton-4@users.noreply.github.com> Date: Fri, 10 Dec 2021 19:13:01 +0100 Subject: [PATCH 16/57] Added editor ideas --- editor/editor-ideas.md | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/editor/editor-ideas.md b/editor/editor-ideas.md index 194b81c89d..0e384a4e89 100644 --- a/editor/editor-ideas.md +++ b/editor/editor-ideas.md @@ -47,6 +47,8 @@ Nice collection of research on innovative editors, [link](https://futureofcoding * [whitebox debug visualization](https://vimeo.com/483795097) * [Hest](https://ivanish.ca/hest-time-travel/) tool for making highly interactive simulations. * [replit](https://replit.com/) collaborative browser based IDE. +* [paper](https://openreview.net/pdf?id=SJeqs6EFvB) on finding and fixing bugs automatically. +* [specialized editors that can be embedded in main editor](https://elliot.website/editor/) * Say you have a failing test that used to work, it would be very valuable to see all code that was changed that was used only by that test. e.g. you have a test `calculate_sum_test` that only uses the function `add`, when the test fails you should be able to see a diff showing only what changed for the function `add`. It would also be great to have a diff of [expression values](https://homepages.cwi.nl/~storm/livelit/images/bret.png) Bret Victor style. An ambitious project would be to suggest or automatically try fixes based on these diffs. * I think it could be possible to create a minimal reproduction of a program / block of code / code used by a single test. So for a failing unit test I would expect it to extract imports, the platform, types and functions that are necessary to run only that unit test and put them in a standalone roc project. This would be useful for sharing bugs with library+application authors and colleagues, for profiling or debugging with all "clutter" removed. @@ -56,6 +58,11 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * We previuously mentioned showing expression values next to the code. I think when debugging it would be valuable to focus more on these valuas/data. A possible way to do this would be to create scrollable view(without need to jump between files) of inputs and outputs of user defined functions. Clicking on a function could then show the code with the expression values side by side. Having a good overview of how the values change could make it easy to find where exactly things go wrong. - (Machine learning) algorithms to extract and show useful information from debug values. - Ability to mark e.g. a specific record field for tracking(filter out the noise) that is being repeatedly updated throughout the program. +- Ability to collapse/fold debug output coming from specific line. +- search bar to search through printed logs +- Turn an error listed in the console into editable section of code for easy quick fixing. +- Clickable backtrace of functions, user defined functions should be made extra visible. +- VR debugging: render massive curved screen with rectangle showing code (and expression values) for every function in call stack. ### Cool regular editors @@ -126,7 +133,11 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * show example of how to use library function Foo * open google/github/duckduckgo search for error... * show editor plugins for library X - +* commands to control log filtering +* collaps all arms of when +* "complex" filtered search: search for all occurences of `"#` but ignore all like `"#,` +* color this debug print orange +* remove unused imports #### Inspiration @@ -141,7 +152,8 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * Show Roc cheat sheet on start-up. * Plugin that translates short pieces of code from another programming language to Roc. [Relevant research](https://www.youtube.com/watch?v=xTzFJIknh7E). Someone who only knows the R language could get started with Roc with less friction if they could quickly define a list R style (`lst <- c(1,2,3)`) and get it translated to Roc. - * Being able to asses or ask the user for the amount of experience they have with Roc would be a valuable feature for recommending plugins, editor tips, recommending tutorials, automated error search (e.g searching common beginner errors first), ... . + * Being able to asses or ask the user for the amount of experience they have with Roc would be a valuable feature for recommending plugins, editor tips, recommending tutorials, automated error search (e.g searching common beginner errors first), ... . +* Adjust UI based on beginner/novice/expert? ### Productivity features @@ -187,6 +199,18 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * Feature to automatically minimize visibility(exposing values/functions/...) based on usage in tests. Suggested changes can be shown to the user for fine-grained control. * Locally record file/function navigation behavior to offer suggestions where to navigate next. With user permission, this navigation behavior can be shared with their team so that e.g. new members get offered useful suggestions on navigating to the next relevant file. * Intelligent search: "search this folder for ", "search all tests for " +* Show some kind of warning if path str in code does not exist locally. +* repl on panic/error: ability to inspect all values and try executing some things at the location of the error. +* show values in memory on panic/error +* automatic clustering of (text) search results in groups by similarity +* fill screen with little windows of clustered search results +* clustering of examples similar to current code +* ability to easily screenshot a subwindow -> create static duplicate of subwindow +* Show references is a common editor feature, often I only want to see non-recursive references in the case of a recursive function. +* ability to add error you were stuck on but have now solved to error database, to help others in the future. +* For quick navigation and good overview: whole file should be shown as folded tree showing only top level defs. Hovering with mouse should allow you to show and traverse the branches, with a click to keep this view. See also ginkowriter. +* clicking on any output should take you to the place in the code where that output was printed and/or calculated. +* ability to edit printed output in such a way that the appropriate changes are made in the code that produced it. Example: edit json key in output-> code is changed to print this new key. #### Autocomplete @@ -212,7 +236,10 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * [NextJournal](https://nextjournal.com/joe-loco/command-bar?token=DpU6ewNQnLhYtVkwhs9GeX) Discoverable commands and shortcuts. * [Code Ribbon](https://web.eecs.utk.edu/~azh/blog/coderibbon.html) fast navigation between files. Feature suggestion: top and down are filled with suggested files, whereas left and right are manually filled. * [Automatic data transformation based on examples](https://youtu.be/Ej91F1fpmEw). Feature suggestion: use in combination with voice commands: e.g. "only keep time from list of datetimes". - +* [Codesee](https://www.codesee.io/) code base visualization. +* [Loopy](https://dl.acm.org/doi/10.1145/3485530?sid=SCITRUS) interactive program synthesis. +* [bracket guides](https://mobile.twitter.com/elyktrix/status/1461380028609048576) + ### Non-Code Related Inspiration * [Scrivner](https://www.literatureandlatte.com/scrivener/overview) writing app for novelists, screenwriters, and more @@ -250,10 +277,13 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * Select a function to record. * Do a normal run, and save the input and output of the selected function. * Generate a unit test with that input-output pair +* [vitest](https://twitter.com/antfu7/status/1468233216939245579) only run tests that could possibly have changed (because the code they test/use has changed) +* Ability to show in sidebar if code is tested by a test. Clicking on the test in the sidebar should bring you to that test. ### Inspiration * [Haskell language server plugin](https://github.com/haskell/haskell-language-server/blob/master/plugins/hls-eval-plugin/README.md) evaluate code in comments, to test and document functions and to quickly evaluate small expressions. +* [Hazel live test](https://mobile.twitter.com/disconcision/status/1459933500656730112) ## Documentation @@ -265,6 +295,7 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * Library should have cheat sheet with most used/important docs summarized. * With explicit user permission, anonymously track viewing statistics for documentation. Can be used to show most important documentation, report pain points to library authors. * Easy side-by-side docs for multiple versions of library. +* ability to add questions and answers to library documentation ## Tutorials @@ -277,6 +308,7 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * Plugin to translate linux commands like curl to Roc code * Plugin to view diff between two texts +* Plugin to present codebase to new developer or walk co-worker through a problem. Records sequence of filenames and line numbers. ### Inspiration @@ -339,7 +371,7 @@ Thoughts and ideas possibly taken from above inspirations or separate. They rely on eye tracking to move mouse cursor arond. If we employ _some_ voice recognition functions we could make same interface as we could do for consoles where 4+2 buttons and directional pad would suffice. That is 10 phrases that need to be pulled trough as many possible translations so people don't have to pretend that they are from Maine or Texas so they get voice recognition to work. Believe me I was there with Apple's Siri :D That is why we have 10 phrases for movement and management and most basic syntax. - + * Builtin fonts that can be read more easily by those with dyslexia. * Nice backtraces that highlight important information * Ability to show import connection within project visually @@ -358,3 +390,5 @@ Thoughts and ideas possibly taken from above inspirations or separate. * Code coverage visualization: allow to display code in different color when it is covered by test. * Make "maximal privacy version" of editor available for download, next to regular version. This version would not be capable of sharing any usage/user data. * Live code view with wasm editor. This saves bandwidth when pairing. +* [Gingkowriter](https://gingkowriter.com/) structured writing app. +* Performance improvement recommendation: show if code is eligible for tail call optimization or can do in place mutation. From 69e3dce3587520c065007cf00d0f8a5021d10cbd Mon Sep 17 00:00:00 2001 From: Anton-4 <17049058+Anton-4@users.noreply.github.com> Date: Fri, 10 Dec 2021 20:01:30 +0100 Subject: [PATCH 17/57] fix typo --- editor/editor-ideas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editor/editor-ideas.md b/editor/editor-ideas.md index 0e384a4e89..b69b2f4ce3 100644 --- a/editor/editor-ideas.md +++ b/editor/editor-ideas.md @@ -135,7 +135,7 @@ e.g. you have a test `calculate_sum_test` that only uses the function `add`, whe * show editor plugins for library X * commands to control log filtering * collaps all arms of when -* "complex" filtered search: search for all occurences of `"#` but ignore all like `"#,` +* "complex" filtered search: search for all occurrences of `"#` but ignore all like `"#,` * color this debug print orange * remove unused imports From 8a45b1eed839ab5bd40cc5dc509fd17a93771210 Mon Sep 17 00:00:00 2001 From: Brendan Hansknecht Date: Fri, 10 Dec 2021 17:09:49 -0800 Subject: [PATCH 18/57] use ManuallyDrop instead of forget for rust host fx functions --- examples/cli/platform/src/lib.rs | 9 ++---- .../false-interpreter/platform/src/lib.rs | 31 +++++-------------- 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/examples/cli/platform/src/lib.rs b/examples/cli/platform/src/lib.rs index d316e264d8..e072cf5d21 100644 --- a/examples/cli/platform/src/lib.rs +++ b/examples/cli/platform/src/lib.rs @@ -2,7 +2,7 @@ use core::alloc::Layout; use core::ffi::c_void; -use core::mem::MaybeUninit; +use core::mem::{ManuallyDrop, MaybeUninit}; use libc; use roc_std::RocStr; use std::ffi::CStr; @@ -119,13 +119,8 @@ pub extern "C" fn roc_fx_getLine() -> RocStr { } #[no_mangle] -pub extern "C" fn roc_fx_putLine(line: RocStr) -> () { +pub extern "C" fn roc_fx_putLine(line: ManuallyDrop) { let bytes = line.as_slice(); let string = unsafe { std::str::from_utf8_unchecked(bytes) }; println!("{}", string); - - // don't mess with the refcount! - core::mem::forget(line); - - () } diff --git a/examples/false-interpreter/platform/src/lib.rs b/examples/false-interpreter/platform/src/lib.rs index 7fd9ce5cb9..18584164d6 100644 --- a/examples/false-interpreter/platform/src/lib.rs +++ b/examples/false-interpreter/platform/src/lib.rs @@ -2,7 +2,7 @@ use core::alloc::Layout; use core::ffi::c_void; -use core::mem::MaybeUninit; +use core::mem::{ManuallyDrop, MaybeUninit}; use libc; use roc_std::{RocList, RocStr}; use std::env; @@ -141,29 +141,19 @@ pub extern "C" fn roc_fx_getChar() -> u8 { } #[no_mangle] -pub extern "C" fn roc_fx_putLine(line: RocStr) -> () { +pub extern "C" fn roc_fx_putLine(line: ManuallyDrop) { let bytes = line.as_slice(); let string = unsafe { std::str::from_utf8_unchecked(bytes) }; println!("{}", string); std::io::stdout().lock().flush(); - - // don't mess with the refcount! - core::mem::forget(line); - - () } #[no_mangle] -pub extern "C" fn roc_fx_putRaw(line: RocStr) -> () { +pub extern "C" fn roc_fx_putRaw(line: ManuallyDrop) { let bytes = line.as_slice(); let string = unsafe { std::str::from_utf8_unchecked(bytes) }; print!("{}", string); std::io::stdout().lock().flush(); - - // don't mess with the refcount! - core::mem::forget(line); - - () } #[no_mangle] @@ -190,25 +180,23 @@ pub extern "C" fn roc_fx_getFileBytes(br_ptr: *mut BufReader) -> RocList) -> () { +pub extern "C" fn roc_fx_closeFile(br_ptr: *mut BufReader) { unsafe { Box::from_raw(br_ptr); } } #[no_mangle] -pub extern "C" fn roc_fx_openFile(name: RocStr) -> *mut BufReader { +pub extern "C" fn roc_fx_openFile(name: ManuallyDrop) -> *mut BufReader { let f = File::open(name.as_str()).expect("Unable to open file"); let br = BufReader::new(f); - // don't mess with the refcount! - core::mem::forget(name); - Box::into_raw(Box::new(br)) } #[no_mangle] -pub extern "C" fn roc_fx_withFileOpen(name: RocStr, buffer: *const u8) -> () { +pub extern "C" fn roc_fx_withFileOpen(name: ManuallyDrop, buffer: *const u8) { + // TODO: figure out accepting a closure in an fx and passing data to it. // let f = File::open(name.as_str()).expect("Unable to open file"); // let mut br = BufReader::new(f); @@ -216,9 +204,4 @@ pub extern "C" fn roc_fx_withFileOpen(name: RocStr, buffer: *const u8) -> () { // let closure_data_ptr = buffer.offset(8); // call_the_closure(closure_data_ptr); // } - - // // don't mess with the refcount! - // core::mem::forget(name); - - () } From a7fe2e3e5343fd3ab0f410bb207de840089fb556 Mon Sep 17 00:00:00 2001 From: satotake Date: Sat, 11 Dec 2021 08:12:57 +0000 Subject: [PATCH 19/57] Fix llvm Num.toFloat width conversion Close #2156 --- Cargo.lock | 1 + compiler/gen_llvm/Cargo.toml | 1 + compiler/gen_llvm/src/llvm/build.rs | 44 +++++++++++++++++++++++++---- compiler/test_gen/src/gen_num.rs | 44 +++++++++++++++++++++++++++-- 4 files changed, 83 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 97861a3037..88512ab31f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3411,6 +3411,7 @@ dependencies = [ "roc_collections", "roc_module", "roc_mono", + "roc_reporting", "roc_std", "target-lexicon", ] diff --git a/compiler/gen_llvm/Cargo.toml b/compiler/gen_llvm/Cargo.toml index 5ae5f0abac..2c8fb91ab9 100644 --- a/compiler/gen_llvm/Cargo.toml +++ b/compiler/gen_llvm/Cargo.toml @@ -10,6 +10,7 @@ edition = "2018" roc_collections = { path = "../collections" } roc_module = { path = "../module" } roc_builtins = { path = "../builtins" } +roc_reporting = { path = "../../reporting" } roc_mono = { path = "../mono" } roc_std = { path = "../../roc_std" } morphic_lib = { path = "../../vendor/morphic_lib" } diff --git a/compiler/gen_llvm/src/llvm/build.rs b/compiler/gen_llvm/src/llvm/build.rs index f5ea4dcd45..e9e4790433 100644 --- a/compiler/gen_llvm/src/llvm/build.rs +++ b/compiler/gen_llvm/src/llvm/build.rs @@ -62,6 +62,7 @@ use roc_mono::ir::{ ModifyRc, OptLevel, ProcLayout, }; use roc_mono::layout::{Builtin, LambdaSet, Layout, LayoutIds, TagIdIntType, UnionLayout}; +use roc_reporting::internal_error; use target_lexicon::{Architecture, OperatingSystem, Triple}; /// This is for Inkwell's FunctionValue::verify - we want to know the verification @@ -5604,9 +5605,13 @@ fn run_low_level<'a, 'ctx, 'env>( let int_type = convert::int_type_from_int_width(env, *int_width); build_int_unary_op(env, arg.into_int_value(), int_type, op) } - Float(float_width) => { - build_float_unary_op(env, arg.into_float_value(), op, *float_width) - } + Float(float_width) => build_float_unary_op( + env, + layout, + arg.into_float_value(), + op, + *float_width, + ), _ => { unreachable!("Compiler bug: tried to run numeric operation {:?} on invalid builtin layout: ({:?})", op, arg_layout); } @@ -6983,9 +6988,10 @@ fn int_abs_with_overflow<'a, 'ctx, 'env>( fn build_float_unary_op<'a, 'ctx, 'env>( env: &Env<'a, 'ctx, 'env>, + layout: &Layout<'a>, arg: FloatValue<'ctx>, op: LowLevel, - float_width: FloatWidth, + float_width: FloatWidth, // arg width ) -> BasicValueEnum<'ctx> { use roc_module::low_level::LowLevel::*; @@ -6997,7 +7003,35 @@ fn build_float_unary_op<'a, 'ctx, 'env>( NumAbs => env.call_intrinsic(&LLVM_FABS[float_width], &[arg.into()]), NumSqrtUnchecked => env.call_intrinsic(&LLVM_SQRT[float_width], &[arg.into()]), NumLogUnchecked => env.call_intrinsic(&LLVM_LOG[float_width], &[arg.into()]), - NumToFloat => arg.into(), /* Converting from Float to Float is a no-op */ + NumToFloat => { + let return_width = match layout { + Layout::Builtin(Builtin::Float(return_width)) => *return_width, + _ => internal_error!("Layout for returning is not Float : {:?}", layout), + }; + match (float_width, return_width) { + (FloatWidth::F32, FloatWidth::F32) => arg.into(), + (FloatWidth::F32, FloatWidth::F64) => bd.build_cast( + InstructionOpcode::FPExt, + arg, + env.context.f64_type(), + "f32_to_f64", + ), + (FloatWidth::F64, FloatWidth::F32) => bd.build_cast( + InstructionOpcode::FPTrunc, + arg, + env.context.f32_type(), + "f64_to_f32", + ), + (FloatWidth::F64, FloatWidth::F64) => arg.into(), + (FloatWidth::F128, FloatWidth::F128) => arg.into(), + (FloatWidth::F128, _) => { + unimplemented!("I cannot handle F128 with Num.toFloat yet") + } + (_, FloatWidth::F128) => { + unimplemented!("I cannot handle F128 with Num.toFloat yet") + } + } + } NumCeiling => env.builder.build_cast( InstructionOpcode::FPToSI, env.call_intrinsic(&LLVM_CEILING[float_width], &[arg.into()]), diff --git a/compiler/test_gen/src/gen_num.rs b/compiler/test_gen/src/gen_num.rs index b39fdb02f5..5d997a3d43 100644 --- a/compiler/test_gen/src/gen_num.rs +++ b/compiler/test_gen/src/gen_num.rs @@ -1309,7 +1309,7 @@ fn num_to_float() { } #[test] -#[cfg(any(feature = "gen-dev"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-dev"))] fn num_to_float_f64_to_f32() { assert_evals_to!( indoc!( @@ -1328,7 +1328,47 @@ fn num_to_float_f64_to_f32() { } #[test] -#[cfg(any(feature = "gen-wasm", feature = "gen-dev"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-dev"))] +fn num_to_float_f32_to_f32() { + assert_evals_to!( + indoc!( + r#" + + arg : F32 + arg = 9.0 + + ret : F32 + ret = Num.toFloat arg + ret + "# + ), + 9.0, + f32 + ); +} + +#[test] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))] +fn num_to_float_f64_to_f64() { + assert_evals_to!( + indoc!( + r#" + + arg : F64 + arg = 9.0 + + ret : F64 + ret = Num.toFloat arg + ret + "# + ), + 9.0, + f64 + ); +} + +#[test] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))] fn num_to_float_f32_to_f64() { assert_evals_to!( indoc!( From 53d221481e0428d69c3b3e3edd1f007c26a08542 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 17:29:45 +0000 Subject: [PATCH 20/57] Build a Wasm test platform in test_gen --- compiler/test_gen/build.rs | 53 +++++++++++++++++++ .../test_gen/src/helpers/wasm_test_platform.c | 26 +++++++++ 2 files changed, 79 insertions(+) create mode 100644 compiler/test_gen/build.rs create mode 100644 compiler/test_gen/src/helpers/wasm_test_platform.c diff --git a/compiler/test_gen/build.rs b/compiler/test_gen/build.rs new file mode 100644 index 0000000000..2c64270c66 --- /dev/null +++ b/compiler/test_gen/build.rs @@ -0,0 +1,53 @@ +use std::env; +use std::ffi::OsStr; +use std::path::Path; +use std::process::Command; + +pub const PLATFORM_FILENAME: &str = "wasm_test_platform"; +pub const DIRNAME_VAR: &str = "TEST_GEN_OUT"; + +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-changed=src/helpers/{}.c", PLATFORM_FILENAME); + + let out_dir = env::var("OUT_DIR").unwrap(); + + println!("cargo:rustc-env={}={}", DIRNAME_VAR, out_dir); + + run_command( + Path::new("."), + "zig", + [ + "build-obj", + "-target", + "wasm32-wasi", + "-lc", + &format!("src/helpers/{}.c", PLATFORM_FILENAME), + &format!("-femit-bin={}/{}.o", out_dir, PLATFORM_FILENAME), + ], + ); +} + +fn run_command>(path: P, command_str: &str, args: I) +where + I: IntoIterator, + S: AsRef, +{ + let output_result = Command::new(OsStr::new(&command_str)) + .current_dir(path) + .args(args) + .output(); + match output_result { + Ok(output) => match output.status.success() { + true => (), + false => { + let error_str = match std::str::from_utf8(&output.stderr) { + Ok(stderr) => stderr.to_string(), + Err(_) => format!("Failed to run \"{}\"", command_str), + }; + panic!("{} failed: {}", command_str, error_str); + } + }, + Err(reason) => panic!("{} failed: {}", command_str, reason), + } +} diff --git a/compiler/test_gen/src/helpers/wasm_test_platform.c b/compiler/test_gen/src/helpers/wasm_test_platform.c new file mode 100644 index 0000000000..9a3fa2b70e --- /dev/null +++ b/compiler/test_gen/src/helpers/wasm_test_platform.c @@ -0,0 +1,26 @@ +#include + +void *roc_alloc(size_t size, unsigned int alignment) { return malloc(size); } + +void *roc_realloc(void *ptr, size_t new_size, size_t old_size, + unsigned int alignment) +{ + return realloc(ptr, new_size); +} + +void roc_dealloc(void *ptr, unsigned int alignment) { free(ptr); } + +void roc_panic(void *ptr, unsigned int alignment) +{ + char *msg = (char *)ptr; + fprintf(stderr, + "Application crashed with message\n\n %s\n\nShutting down\n", msg); + exit(0); +} + +void *roc_memcpy(void *dest, const void *src, size_t n) +{ + return memcpy(dest, src, n); +} + +void *roc_memset(void *str, int c, size_t n) { return memset(str, c, n); } From aefc6e76a4b6a8e3065f03370cd30dcb82e3d0f0 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 18:33:06 +0000 Subject: [PATCH 21/57] Build a Wasm libc.a from test_gen/build.rs --- compiler/test_gen/build.rs | 50 +++++++++++++++++-- .../test_gen/src/helpers/dummy_libc_program.c | 8 +++ 2 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 compiler/test_gen/src/helpers/dummy_libc_program.c diff --git a/compiler/test_gen/build.rs b/compiler/test_gen/build.rs index 2c64270c66..8b3bc60810 100644 --- a/compiler/test_gen/build.rs +++ b/compiler/test_gen/build.rs @@ -4,15 +4,22 @@ use std::path::Path; use std::process::Command; pub const PLATFORM_FILENAME: &str = "wasm_test_platform"; -pub const DIRNAME_VAR: &str = "TEST_GEN_OUT"; +pub const OUT_DIR_VAR: &str = "TEST_GEN_OUT"; +pub const LIBC_PATH_VAR: &str = "TEST_GEN_WASM_LIBC_PATH"; fn main() { println!("cargo:rerun-if-changed=build.rs"); - println!("cargo:rerun-if-changed=src/helpers/{}.c", PLATFORM_FILENAME); let out_dir = env::var("OUT_DIR").unwrap(); - println!("cargo:rustc-env={}={}", DIRNAME_VAR, out_dir); + println!("cargo:rustc-env={}={}", OUT_DIR_VAR, out_dir); + + build_wasm_test_platform(&out_dir); + build_wasm_libc(&out_dir); +} + +fn build_wasm_test_platform(out_dir: &str) { + println!("cargo:rerun-if-changed=src/helpers/{}.c", PLATFORM_FILENAME); run_command( Path::new("."), @@ -28,7 +35,40 @@ fn main() { ); } -fn run_command>(path: P, command_str: &str, args: I) +fn build_wasm_libc(out_dir: &str) { + let source_path = "src/helpers/dummy_libc_program.c"; + println!("cargo:rerun-if-changed={}", source_path); + let cwd = Path::new("."); + + run_command( + cwd, + "zig", + [ + "build-exe", // must be an executable or it won't compile libc + "-target", + "wasm32-wasi", + "-lc", + source_path, + "-femit-bin=/dev/null", + "--global-cache-dir", + out_dir, + ], + ); + + let libc_path = run_command( + cwd, + "find", + [ + out_dir, + "-name", + "libc.a" + ], + ); + + println!("cargo:rustc-env={}={}", LIBC_PATH_VAR, libc_path); +} + +fn run_command>(path: P, command_str: &str, args: I) -> String where I: IntoIterator, S: AsRef, @@ -39,7 +79,7 @@ where .output(); match output_result { Ok(output) => match output.status.success() { - true => (), + true => std::str::from_utf8(&output.stdout), false => { let error_str = match std::str::from_utf8(&output.stderr) { Ok(stderr) => stderr.to_string(), diff --git a/compiler/test_gen/src/helpers/dummy_libc_program.c b/compiler/test_gen/src/helpers/dummy_libc_program.c new file mode 100644 index 0000000000..79ecd9ce07 --- /dev/null +++ b/compiler/test_gen/src/helpers/dummy_libc_program.c @@ -0,0 +1,8 @@ +#include + +void main() { + printf("Hello, I am a C program and I use libc.\n"); + printf("Would you like to use libc too, but just can't find the right path?\n"); + printf("Well, simply compile me from build.rs using Zig's --global-cache-dir,\n"); + printf("and have libc.a delivered right to your build directory!\n"); +} From 2d4dfb49de347bc644b1d0ad841db00197717616 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 20:50:12 +0000 Subject: [PATCH 22/57] Update Wasm tests to use libc and platform built by build.rs --- compiler/test_gen/build.rs | 18 +--- compiler/test_gen/src/helpers/wasm.rs | 142 ++------------------------ 2 files changed, 15 insertions(+), 145 deletions(-) diff --git a/compiler/test_gen/build.rs b/compiler/test_gen/build.rs index 8b3bc60810..ea3b09abd6 100644 --- a/compiler/test_gen/build.rs +++ b/compiler/test_gen/build.rs @@ -3,9 +3,9 @@ use std::ffi::OsStr; use std::path::Path; use std::process::Command; -pub const PLATFORM_FILENAME: &str = "wasm_test_platform"; -pub const OUT_DIR_VAR: &str = "TEST_GEN_OUT"; -pub const LIBC_PATH_VAR: &str = "TEST_GEN_WASM_LIBC_PATH"; +const PLATFORM_FILENAME: &str = "wasm_test_platform"; +const OUT_DIR_VAR: &str = "TEST_GEN_OUT"; +const LIBC_PATH_VAR: &str = "TEST_GEN_WASM_LIBC_PATH"; fn main() { println!("cargo:rerun-if-changed=build.rs"); @@ -55,15 +55,7 @@ fn build_wasm_libc(out_dir: &str) { ], ); - let libc_path = run_command( - cwd, - "find", - [ - out_dir, - "-name", - "libc.a" - ], - ); + let libc_path = run_command(cwd, "find", [out_dir, "-name", "libc.a"]); println!("cargo:rustc-env={}={}", LIBC_PATH_VAR, libc_path); } @@ -79,7 +71,7 @@ where .output(); match output_result { Ok(output) => match output.status.success() { - true => std::str::from_utf8(&output.stdout), + true => std::str::from_utf8(&output.stdout).unwrap().to_string(), false => { let error_str = match std::str::from_utf8(&output.stderr) { Ok(stderr) => stderr.to_string(), diff --git a/compiler/test_gen/src/helpers/wasm.rs b/compiler/test_gen/src/helpers/wasm.rs index 90ae0ab922..1059847768 100644 --- a/compiler/test_gen/src/helpers/wasm.rs +++ b/compiler/test_gen/src/helpers/wasm.rs @@ -1,5 +1,3 @@ -use bumpalo::collections::vec::Vec; -use bumpalo::Bump; use std::cell::Cell; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; @@ -11,13 +9,13 @@ use crate::helpers::wasm32_test_result::Wasm32TestResult; use roc_builtins::bitcode; use roc_can::builtins::builtin_defs_map; use roc_collections::all::{MutMap, MutSet}; -use roc_gen_wasm::wasm_module::linking::{WasmObjectSymbol, WASM_SYM_UNDEFINED}; -use roc_gen_wasm::wasm_module::sections::{Import, ImportDesc}; -use roc_gen_wasm::wasm_module::{ - CodeBuilder, Export, ExportType, LocalId, Signature, SymInfo, ValueType, WasmModule, -}; use roc_gen_wasm::MEMORY_NAME; +// Should manually match build.rs +const PLATFORM_FILENAME: &str = "wasm_test_platform"; +const OUT_DIR_VAR: &str = "TEST_GEN_OUT"; +const LIBC_PATH_VAR: &str = "TEST_GEN_WASM_LIBC_PATH"; + #[allow(unused_imports)] use roc_mono::ir::PRETTY_PRINT_IR_SYMBOLS; @@ -125,9 +123,6 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( T::insert_test_wrapper(arena, &mut wasm_module, TEST_WRAPPER_NAME, main_fn_index); - // We can either generate the test platform or write an external source file, whatever works - generate_test_platform(&mut wasm_module, arena); - let mut module_bytes = std::vec::Vec::with_capacity(4096); wasm_module.serialize_mut(&mut module_bytes); @@ -163,7 +158,9 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( let final_wasm_file = wasm_build_dir.join("final.wasm"); let app_o_file = wasm_build_dir.join("app.o"); - let libc_a_file = "../gen_wasm/lib/libc.a"; + let test_out_dir = std::env::var(OUT_DIR_VAR).unwrap(); + let test_platform_o = format!("{}/{}.o", test_out_dir, PLATFORM_FILENAME); + let libc_a_file = std::env::var(LIBC_PATH_VAR).unwrap(); // write the module to a file so the linker can access it std::fs::write(&app_o_file, &module_bytes).unwrap(); @@ -173,7 +170,8 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( // input files app_o_file.to_str().unwrap(), bitcode::BUILTINS_WASM32_OBJ_PATH, - libc_a_file, + &test_platform_o, + &libc_a_file, // output "-o", final_wasm_file.to_str().unwrap(), @@ -328,123 +326,3 @@ pub fn identity(value: T) -> T { pub(crate) use assert_evals_to; #[allow(unused_imports)] pub(crate) use assert_wasm_evals_to; - -fn wrap_libc_fn<'a>( - module: &mut WasmModule<'a>, - arena: &'a Bump, - roc_name: &'a str, - libc_name: &'a str, - params: &'a [(ValueType, bool)], - ret_type: Option, -) { - let symbol_table = module.linking.symbol_table_mut(); - - // Type signatures - let mut wrapper_signature = Signature { - param_types: Vec::with_capacity_in(params.len(), arena), - ret_type, - }; - let mut libc_signature = Signature { - param_types: Vec::with_capacity_in(params.len(), arena), - ret_type, - }; - for (ty, used) in params.iter() { - wrapper_signature.param_types.push(*ty); - if *used { - libc_signature.param_types.push(*ty); - } - } - - /* - * Import a function from libc - */ - let libc_signature_index = module.types.insert(libc_signature); - - // Import - let import_index = module.import.entries.len() as u32; - module.import.entries.push(Import { - module: "env", - name: libc_name.to_string(), - description: ImportDesc::Func { - signature_index: libc_signature_index, - }, - }); - - // Linker info - let libc_sym_idx = symbol_table.len() as u32; - symbol_table.push(SymInfo::Function(WasmObjectSymbol::Imported { - flags: WASM_SYM_UNDEFINED, - index: import_index, - })); - - /* - * Export a wrapper function - */ - - // Declaration - let wrapper_sig_index = module.types.insert(wrapper_signature); - module.function.signature_indices.push(wrapper_sig_index); - - // Body - let mut code_builder = CodeBuilder::new(arena); - let mut num_libc_args = 0; - for (i, (_, used)) in params.iter().enumerate() { - if *used { - code_builder.get_local(LocalId(i as u32)); - num_libc_args += 1; - } - } - code_builder.call( - import_index, - libc_sym_idx, - num_libc_args, - ret_type.is_some(), - ); - code_builder.build_fn_header(&[], 0, None); - let wrapper_index = module.code.code_builders.len() as u32; - module.code.code_builders.push(code_builder); - - // Export - module.export.entries.push(Export { - name: roc_name.to_string(), - ty: ExportType::Func, - index: wrapper_index, - }); - - // Linker symbol - symbol_table.push(SymInfo::Function(WasmObjectSymbol::Defined { - flags: 0, - index: wrapper_index, - name: roc_name.to_string(), - })); -} - -fn generate_test_platform<'a>(module: &mut WasmModule<'a>, arena: &'a Bump) { - use ValueType::I32; - - wrap_libc_fn( - module, - arena, - "roc_alloc", - "malloc", - // only the first argument of roc_alloc is passed to malloc - &[(I32, true), (I32, false)], - Some(I32), - ); - wrap_libc_fn( - module, - arena, - "roc_dealloc", - "free", - &[(I32, true), (I32, false)], - None, - ); - wrap_libc_fn( - module, - arena, - "roc_realloc", - "realloc", - &[(I32, true), (I32, false), (I32, true), (I32, false)], - Some(I32), - ); -} From 0fe8575ba3a26fd6641dabc373df66a1a946e869 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 21:35:51 +0000 Subject: [PATCH 23/57] Delete libc.a from gen_wasm --- compiler/gen_wasm/lib/libc.a | Bin 947756 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 compiler/gen_wasm/lib/libc.a diff --git a/compiler/gen_wasm/lib/libc.a b/compiler/gen_wasm/lib/libc.a deleted file mode 100644 index de6e3c2aa4f27dd9f6a2eee27f25ada31039d4e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 947756 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
! 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 (iU|pT`ambRz-31 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%0A)r5IeD^0#z+0KFEGGf3{X@;Yav2 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
  • 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

    1p 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%0DeNI=#x2GDspf^v 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 ABme*a From 544caf0f437da7d1d179df9bd23206e7cf75d121 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 09:28:02 +0000 Subject: [PATCH 24/57] Only run Wasm build steps for test_gen when gen-wasm feature is enabled --- compiler/test_gen/build.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/compiler/test_gen/build.rs b/compiler/test_gen/build.rs index ea3b09abd6..5deedfd52f 100644 --- a/compiler/test_gen/build.rs +++ b/compiler/test_gen/build.rs @@ -9,7 +9,12 @@ const LIBC_PATH_VAR: &str = "TEST_GEN_WASM_LIBC_PATH"; fn main() { println!("cargo:rerun-if-changed=build.rs"); + if feature_is_enabled("gen-wasm") { + build_wasm(); + } +} +fn build_wasm() { let out_dir = env::var("OUT_DIR").unwrap(); println!("cargo:rustc-env={}={}", OUT_DIR_VAR, out_dir); @@ -39,6 +44,7 @@ fn build_wasm_libc(out_dir: &str) { let source_path = "src/helpers/dummy_libc_program.c"; println!("cargo:rerun-if-changed={}", source_path); let cwd = Path::new("."); + let zig_cache_dir = format!("{}/zig-cache-wasm32", out_dir); run_command( cwd, @@ -51,15 +57,23 @@ fn build_wasm_libc(out_dir: &str) { source_path, "-femit-bin=/dev/null", "--global-cache-dir", - out_dir, + &zig_cache_dir, ], ); - let libc_path = run_command(cwd, "find", [out_dir, "-name", "libc.a"]); + let libc_path = run_command(cwd, "find", [&zig_cache_dir, "-name", "libc.a"]); println!("cargo:rustc-env={}={}", LIBC_PATH_VAR, libc_path); } +fn feature_is_enabled(feature_name: &str) -> bool { + let cargo_env_var = format!( + "CARGO_FEATURE_{}", + feature_name.replace("-", "_").to_uppercase() + ); + env::var(cargo_env_var).is_ok() +} + fn run_command>(path: P, command_str: &str, args: I) -> String where I: IntoIterator, From e9343d8b2acb4e76ea08eeb3c5667287190e9525 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 09:33:18 +0000 Subject: [PATCH 25/57] Edit dummy libc program --- compiler/test_gen/src/helpers/dummy_libc_program.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/compiler/test_gen/src/helpers/dummy_libc_program.c b/compiler/test_gen/src/helpers/dummy_libc_program.c index 79ecd9ce07..0d358ef2a7 100644 --- a/compiler/test_gen/src/helpers/dummy_libc_program.c +++ b/compiler/test_gen/src/helpers/dummy_libc_program.c @@ -2,7 +2,6 @@ void main() { printf("Hello, I am a C program and I use libc.\n"); - printf("Would you like to use libc too, but just can't find the right path?\n"); - printf("Well, simply compile me from build.rs using Zig's --global-cache-dir,\n"); - printf("and have libc.a delivered right to your build directory!\n"); + printf("If you compile me, you'll compile libc too. That's handy for cross-compilation including Wasm.\n"); + printf("Use `zig build-exe` with `--global-cache-dir my/build/directory` to put libc.a where you want it.\n"); } From 11118bb555886fe918658a3028cb0299f5ce6d03 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 20:13:46 +0000 Subject: [PATCH 26/57] Remove fprintf from compilation for faster test runs --- compiler/test_gen/src/helpers/wasm_test_platform.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/test_gen/src/helpers/wasm_test_platform.c b/compiler/test_gen/src/helpers/wasm_test_platform.c index 9a3fa2b70e..2201cb8cea 100644 --- a/compiler/test_gen/src/helpers/wasm_test_platform.c +++ b/compiler/test_gen/src/helpers/wasm_test_platform.c @@ -1,5 +1,8 @@ #include +// If any printf is included for compilation, even if unused, test runs take 50% longer +#define DEBUG 0 + void *roc_alloc(size_t size, unsigned int alignment) { return malloc(size); } void *roc_realloc(void *ptr, size_t new_size, size_t old_size, @@ -12,10 +15,12 @@ void roc_dealloc(void *ptr, unsigned int alignment) { free(ptr); } void roc_panic(void *ptr, unsigned int alignment) { +#if DEBUG char *msg = (char *)ptr; fprintf(stderr, "Application crashed with message\n\n %s\n\nShutting down\n", msg); - exit(0); +#endif + exit(1); } void *roc_memcpy(void *dest, const void *src, size_t n) From 031dce61c9732ed0908ff076639095a384821a16 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 15:47:57 +0000 Subject: [PATCH 27/57] Add a stack_size_and_alignment method to Layout --- compiler/mono/src/layout.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/compiler/mono/src/layout.rs b/compiler/mono/src/layout.rs index 93425b0d2d..b06c5bef18 100644 --- a/compiler/mono/src/layout.rs +++ b/compiler/mono/src/layout.rs @@ -846,6 +846,14 @@ impl<'a> Layout<'a> { round_up_to_alignment(width, alignment) } + pub fn stack_size_and_alignment(&self, pointer_size: u32) -> (u32, u32) { + let width = self.stack_size_without_alignment(pointer_size); + let alignment = self.alignment_bytes(pointer_size); + + let size = round_up_to_alignment(width, alignment); + (size, alignment) + } + fn stack_size_without_alignment(&self, pointer_size: u32) -> u32 { use Layout::*; From f3ca3be50754d473ee97a939f0d45134bfe7e08a Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 16:00:02 +0000 Subject: [PATCH 28/57] Add Wasm support for recursive tags, along with GetTagId and UnionAtIndex --- compiler/gen_wasm/src/backend.rs | 365 ++++++++++++++++++++++++++---- compiler/gen_wasm/src/storage.rs | 8 +- compiler/test_gen/src/gen_tags.rs | 50 ++-- 3 files changed, 359 insertions(+), 64 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 3d3112783a..7e922ddd4d 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -643,9 +643,21 @@ impl<'a> WasmBackend<'a> { tag_id, arguments, .. - } => self.build_tag(tag_layout, *tag_id, arguments, storage), + } => self.build_tag(tag_layout, *tag_id, arguments, *sym, storage), - x => todo!("Expression {:?}", x), + Expr::GetTagId { + structure, + union_layout, + } => self.build_get_tag_id(*structure, union_layout, storage), + + Expr::UnionAtIndex { + structure, + tag_id, + union_layout, + index, + } => self.build_union_at_index(*structure, *tag_id, union_layout, *index, *sym), + + _ => todo!("Expression `{}`", expr.to_pretty(100)), } } @@ -654,51 +666,328 @@ impl<'a> WasmBackend<'a> { union_layout: &UnionLayout<'a>, tag_id: TagIdIntType, arguments: &'a [Symbol], + symbol: Symbol, stored: &StoredValue, ) { - match union_layout { - UnionLayout::NonRecursive(tags) => { - let (local_id, offset) = if let StoredValue::StackMemory { location, .. } = stored { - location.local_and_offset(self.storage.stack_frame_pointer) - } else { - internal_error!("NonRecursive Tag should always be stored in StackMemory"); - }; + if union_layout.tag_is_null(tag_id) { + self.code_builder.i32_const(0); + return; + } - let mut field_offset = offset; - for field_symbol in arguments.iter() { - field_offset += self.storage.copy_value_to_memory( - &mut self.code_builder, - local_id, - field_offset, - *field_symbol, - ); + use UnionLayout::*; + let (mut fields_size_aligned, fields_alignment) = match union_layout { + NonRecursive(tags) => Self::union_fields_size_and_alignment(tags), + Recursive(tags) => Self::union_fields_size_and_alignment(tags), + NonNullableUnwrapped(fields) => Self::union_fields_size_and_alignment(&[fields]), + NullableWrapped { other_tags, .. } => Self::union_fields_size_and_alignment(other_tags), + NullableUnwrapped { other_fields, .. } => { + Self::union_fields_size_and_alignment(&[other_fields]) + } + }; + + let stores_tag_id_as_data = union_layout.stores_tag_id_as_data(PTR_SIZE); + let stores_tag_id_in_pointer = union_layout.stores_tag_id_in_pointer(PTR_SIZE); + let id_alignment = union_layout.tag_id_layout().alignment_bytes(PTR_SIZE); + + let (total_size, total_alignment) = if stores_tag_id_as_data { + let alignment = fields_alignment.max(id_alignment); + fields_size_aligned = round_up_to_alignment!(fields_size_aligned, alignment); + let size = fields_size_aligned + alignment; + (size, alignment) + } else { + (fields_size_aligned, fields_alignment) + }; + + // We're going to use the pointer many times, so put it in a local variable + let stored_with_local = + self.storage + .ensure_value_has_local(&mut self.code_builder, symbol, stored.to_owned()); + + let (local_id, data_offset) = match stored_with_local { + StoredValue::StackMemory { location, .. } => { + location.local_and_offset(self.storage.stack_frame_pointer) + } + StoredValue::Local { local_id, .. } => { + // Tag is stored as a pointer to the heap. Call the allocator to get a memory address. + self.allocate_with_refcount(Some(total_size), total_alignment, 1); + self.code_builder.set_local(local_id); + (local_id, 0) + } + StoredValue::VirtualMachineStack { .. } => { + internal_error!("{:?} should have a local variable", symbol) + } + }; + + // Write the field values to memory + let mut field_offset = data_offset; + for field_symbol in arguments.iter() { + field_offset += self.storage.copy_value_to_memory( + &mut self.code_builder, + local_id, + field_offset, + *field_symbol, + ); + } + + // Store the tag ID (if any) + if stores_tag_id_as_data { + let id_offset = data_offset + fields_size_aligned; + let id_align = Align::from(total_alignment); + + self.code_builder.get_local(local_id); + + match id_align { + Align::Bytes1 => { + self.code_builder.i32_const(tag_id as i32); + self.code_builder.i32_store8(id_align, id_offset); } - - let tag_field_layouts = &tags[tag_id as usize]; - let fields_alignment_bytes = - Layout::Struct(tag_field_layouts).alignment_bytes(PTR_SIZE); - let tag_id_alignment_bytes = union_layout.tag_id_layout().alignment_bytes(PTR_SIZE); - let total_alignment_bytes = fields_alignment_bytes.max(tag_id_alignment_bytes); - let tag_id_offset = round_up_to_alignment!(field_offset, total_alignment_bytes); - let tag_id_align = Align::from(total_alignment_bytes); - - match tag_id_align { - Align::Bytes1 | Align::Bytes2 | Align::Bytes4 => { - self.code_builder.get_local(local_id); - self.code_builder.i32_const(tag_id as i32); - self.code_builder.i32_store(tag_id_align, tag_id_offset); - } - _ => { - self.code_builder.get_local(local_id); - self.code_builder.i64_const(tag_id as i64); - self.code_builder.i64_store(Align::Bytes8, tag_id_offset); - } + Align::Bytes2 => { + self.code_builder.i32_const(tag_id as i32); + self.code_builder.i32_store16(id_align, id_offset); + } + Align::Bytes4 => { + self.code_builder.i32_const(tag_id as i32); + self.code_builder.i32_store(id_align, id_offset); + } + Align::Bytes8 => { + self.code_builder.i64_const(tag_id as i64); + self.code_builder.i64_store(id_align, id_offset); } } - _ => todo!("Tag with layout {:?}", union_layout), + } else if stores_tag_id_in_pointer { + self.code_builder.get_local(local_id); + self.code_builder.i32_const(tag_id as i32); + self.code_builder.i32_or(); + self.code_builder.set_local(local_id); } } + fn build_get_tag_id( + &mut self, + structure: Symbol, + union_layout: &UnionLayout<'a>, + tag_id_storage: &StoredValue, + ) { + use UnionLayout::*; + + // Variables to control shared logic + let mut wrapped_tags: Option<&[&[Layout]]> = None; + let mut get_pointer_bits = false; + let mut need_to_close_block = false; + + match union_layout { + NonRecursive(tags) => { + wrapped_tags = Some(*tags); + } + Recursive(tags) => { + if union_layout.stores_tag_id_as_data(PTR_SIZE) { + wrapped_tags = Some(*tags); + } else { + get_pointer_bits = true; + } + } + NonNullableUnwrapped(_) => { + self.code_builder.i32_const(0); + } + NullableWrapped { + nullable_id, + other_tags, + } => { + self.storage + .load_symbols(&mut self.code_builder, &[structure]); + self.code_builder.i32_eqz(); + self.code_builder.if_(BlockType::Value(ValueType::I32)); + self.code_builder.i32_const(*nullable_id as i32); + self.code_builder.else_(); + if union_layout.stores_tag_id_as_data(PTR_SIZE) { + wrapped_tags = Some(*other_tags); + } else { + get_pointer_bits = true; + } + need_to_close_block = true; + } + NullableUnwrapped { nullable_id, .. } => { + self.storage + .load_symbols(&mut self.code_builder, &[structure]); + self.code_builder.i32_eqz(); + self.code_builder.if_(BlockType::Value(ValueType::I32)); + self.code_builder.i32_const(*nullable_id as i32); + self.code_builder.else_(); + self.code_builder.i32_const(!(*nullable_id) as i32); + self.code_builder.end(); + } + } + + // Logic shared between different union layouts + + if let Some(tags) = wrapped_tags { + // Fields are wrapped with a tag ID at the end + + let (id_type, id_size) = + if let StoredValue::VirtualMachineStack { + value_type, size, .. + } = tag_id_storage + { + (value_type, size) + } else { + internal_error!("Unexpected storage for tag ID {:?}", tag_id_storage); + }; + + let (id_offset, id_align_bytes) = Self::union_fields_size_and_alignment(tags); + let id_align = Align::from(id_align_bytes); + + self.storage + .load_symbols(&mut self.code_builder, &[structure]); + + match (id_type, id_size) { + (ValueType::I32, 1) => self.code_builder.i32_load8_u(id_align, id_offset), + (ValueType::I32, 2) => self.code_builder.i32_load16_u(id_align, id_offset), + (ValueType::I32, 4) => self.code_builder.i32_load(id_align, id_offset), + (ValueType::I64, 8) => self.code_builder.i64_load(id_align, id_offset), + _ => internal_error!("Invalid tag ID: type={:?} size={}", id_type, id_size), + } + } else if get_pointer_bits { + self.storage + .load_symbols(&mut self.code_builder, &[structure]); + self.code_builder.i32_const(3); + self.code_builder.i32_and(); + } + + if need_to_close_block { + self.code_builder.end(); + } + } + + fn build_union_at_index( + &mut self, + structure: Symbol, + tag_id: TagIdIntType, + union_layout: &UnionLayout<'a>, + index: u64, + symbol: Symbol, + ) { + use UnionLayout::*; + + debug_assert!(!union_layout.tag_is_null(tag_id)); + + let tag_index = tag_id as usize; + let field_layouts = match union_layout { + NonRecursive(tags) => tags[tag_index], + Recursive(tags) => tags[tag_index], + NonNullableUnwrapped(layouts) => *layouts, + NullableWrapped { other_tags, .. } => other_tags[tag_index], + NullableUnwrapped { other_fields, .. } => *other_fields, + }; + + let field_offset: u32 = field_layouts + .iter() + .take(index as usize) + .map(|field_layout| field_layout.stack_size(PTR_SIZE)) + .sum(); + + // Get pointer and offset to the tag's data + let structure_storage = self.storage.get(&structure).to_owned(); + let stored_with_local = self.storage.ensure_value_has_local( + &mut self.code_builder, + structure, + structure_storage, + ); + let (tag_local_id, tag_offset) = match stored_with_local { + StoredValue::StackMemory { location, .. } => { + location.local_and_offset(self.storage.stack_frame_pointer) + } + StoredValue::Local { local_id, .. } => (local_id, 0), + StoredValue::VirtualMachineStack { .. } => { + internal_error!("{:?} should have a local variable", structure) + } + }; + + let stores_tag_id_in_pointer = union_layout.stores_tag_id_in_pointer(PTR_SIZE); + + let from_ptr = if stores_tag_id_in_pointer { + let ptr = self.storage.create_anonymous_local(ValueType::I32); + self.code_builder.get_local(tag_local_id); + self.code_builder.i32_const(-4); + self.code_builder.i32_and(); + self.code_builder.set_local(ptr); + ptr + } else { + tag_local_id + }; + + let from_offset = tag_offset + field_offset; + self.storage + .copy_value_from_memory(&mut self.code_builder, symbol, from_ptr, from_offset); + } + + fn union_fields_size_and_alignment(variant_field_layouts: &[&[Layout]]) -> (u32, u32) { + let mut size = 0; + let mut alignment_bytes = 0; + for field_layouts in variant_field_layouts { + let mut variant_size = 0; + for layout in field_layouts.iter() { + let (field_size, field_alignment) = layout.stack_size_and_alignment(PTR_SIZE); + variant_size += field_size; + alignment_bytes = alignment_bytes.max(field_alignment); + } + size = size.max(variant_size); + } + size = round_up_to_alignment!(size, alignment_bytes); + (size, alignment_bytes) + } + + /// Allocate heap space and write an initial refcount + /// If the data size is known at compile time, pass it in comptime_data_size. + /// If size is only known at runtime, push *data* size to the VM stack first. + /// Leaves the *data* address on the VM stack + fn allocate_with_refcount( + &mut self, + comptime_data_size: Option, + alignment_bytes: u32, + initial_refcount: u32, + ) { + // Add extra bytes for the refcount + let extra_bytes = alignment_bytes.max(PTR_SIZE); + + if let Some(data_size) = comptime_data_size { + // Data size known at compile time and passed as an argument + self.code_builder + .i32_const((data_size + extra_bytes) as i32); + } else { + // Data size known only at runtime and is on top of VM stack + self.code_builder.i32_const(extra_bytes as i32); + self.code_builder.i32_add(); + } + + // Provide a constant for the alignment argument + self.code_builder.i32_const(alignment_bytes as i32); + + // Call the foreign function. (Zig and C calling conventions are the same for this signature) + let param_types = bumpalo::vec![in self.env.arena; ValueType::I32, ValueType::I32]; + let ret_type = Some(ValueType::I32); + self.call_zig_builtin("roc_alloc", param_types, ret_type); + + // Save the allocation address to a temporary local variable + let local_id = self.storage.create_anonymous_local(ValueType::I32); + self.code_builder.set_local(local_id); + + // Write the initial refcount + let refcount_offset = extra_bytes - PTR_SIZE; + let encoded_refcount = (initial_refcount as i32) - 1 + i32::MIN; + self.code_builder.get_local(local_id); + if refcount_offset != 0 { + self.code_builder.i32_const(refcount_offset as i32); + self.code_builder.i32_add(); + } + self.code_builder.i32_const(encoded_refcount); + self.code_builder.i32_store(Align::Bytes4, refcount_offset); + + // Put the data address on the VM stack + self.code_builder.get_local(local_id); + self.code_builder.i32_const(extra_bytes as i32); + self.code_builder.i32_add(); + } + fn build_low_level( &mut self, lowlevel: LowLevel, diff --git a/compiler/gen_wasm/src/storage.rs b/compiler/gen_wasm/src/storage.rs index 77cdfe332c..a46c25766f 100644 --- a/compiler/gen_wasm/src/storage.rs +++ b/compiler/gen_wasm/src/storage.rs @@ -108,11 +108,17 @@ impl<'a> Storage<'a> { self.stack_frame_size = 0; } - /// Internal use only. If you think you want it externally, you really want `allocate` + /// Internal use only. See `allocate` or `create_anonymous_local` fn get_next_local_id(&self) -> LocalId { LocalId((self.arg_types.len() + self.local_types.len()) as u32) } + pub fn create_anonymous_local(&mut self, value_type: ValueType) -> LocalId { + let id = self.get_next_local_id(); + self.local_types.push(value_type); + id + } + /// Allocate storage for a Roc value /// /// Wasm primitives (i32, i64, f32, f64) are allocated "storage" on the VM stack. diff --git a/compiler/test_gen/src/gen_tags.rs b/compiler/test_gen/src/gen_tags.rs index d537018c01..7d176e4b4e 100644 --- a/compiler/test_gen/src/gen_tags.rs +++ b/compiler/test_gen/src/gen_tags.rs @@ -31,7 +31,7 @@ fn width_and_alignment_u8_u8() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn applied_tag_nothing_ir() { assert_evals_to!( indoc!( @@ -51,7 +51,7 @@ fn applied_tag_nothing_ir() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn applied_tag_nothing() { assert_evals_to!( indoc!( @@ -317,7 +317,7 @@ fn gen_if_float() { ); } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn when_on_nothing() { assert_evals_to!( indoc!( @@ -336,7 +336,7 @@ fn when_on_nothing() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn when_on_just() { assert_evals_to!( indoc!( @@ -355,7 +355,7 @@ fn when_on_just() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn when_on_result() { assert_evals_to!( indoc!( @@ -374,7 +374,7 @@ fn when_on_result() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn when_on_these() { assert_evals_to!( indoc!( @@ -396,7 +396,7 @@ fn when_on_these() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn match_on_two_values() { // this will produce a Chain internally assert_evals_to!( @@ -413,8 +413,8 @@ fn match_on_two_values() { } #[test] -#[cfg(any(feature = "gen-llvm"))] -fn pair_with_guard_pattern() { +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] +fn pair_with_underscore() { assert_evals_to!( indoc!( r#" @@ -430,8 +430,8 @@ fn pair_with_guard_pattern() { } #[test] -#[cfg(any(feature = "gen-llvm"))] -fn result_with_guard_pattern() { +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] +fn result_with_underscore() { // This test revealed an issue with hashing Test values assert_evals_to!( indoc!( @@ -451,7 +451,7 @@ fn result_with_guard_pattern() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn maybe_is_just_not_nested() { assert_evals_to!( indoc!( @@ -476,7 +476,7 @@ fn maybe_is_just_not_nested() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn maybe_is_just_nested() { assert_evals_to!( indoc!( @@ -498,7 +498,7 @@ fn maybe_is_just_nested() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn nested_pattern_match() { assert_evals_to!( indoc!( @@ -535,7 +535,7 @@ fn if_guard_vanilla() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] #[ignore] fn when_on_single_value_tag() { // this fails because the switched-on symbol is not defined @@ -711,7 +711,7 @@ fn if_guard_exhaustiveness() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn when_on_enum() { assert_evals_to!( indoc!( @@ -733,7 +733,7 @@ fn when_on_enum() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn pattern_matching_unit() { assert_evals_to!( indoc!( @@ -849,7 +849,7 @@ fn unit_type() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn join_point_if() { assert_evals_to!( indoc!( @@ -866,7 +866,7 @@ fn join_point_if() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn join_point_when() { assert_evals_to!( indoc!( @@ -892,7 +892,7 @@ fn join_point_when() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn join_point_with_cond_expr() { assert_evals_to!( indoc!( @@ -943,7 +943,7 @@ fn alignment_in_single_tag_construction() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn alignment_in_single_tag_pattern_match() { assert_evals_to!( indoc!( @@ -1010,7 +1010,7 @@ fn alignment_in_multi_tag_construction_three() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn alignment_in_multi_tag_pattern_match() { assert_evals_to!( indoc!( @@ -1049,7 +1049,7 @@ fn alignment_in_multi_tag_pattern_match() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] #[ignore] fn phantom_polymorphic() { // see https://github.com/rtfeldman/roc/issues/786 and below @@ -1075,7 +1075,7 @@ fn phantom_polymorphic() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] #[ignore] fn phantom_polymorphic_record() { // see https://github.com/rtfeldman/roc/issues/786 @@ -1230,7 +1230,7 @@ fn applied_tag_function_linked_list() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] #[should_panic(expected = "")] fn tag_must_be_its_own_type() { assert_evals_to!( From 211a5d9bf3eac786bcf7b66eb93d3040e8508534 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 10 Dec 2021 23:09:05 +0000 Subject: [PATCH 29/57] Fix apparent bug in Layout::is_refcounted It contradicts build_tag in compiler/gen_llvm/src/llvm/build.rs, where we create a NonNullableUnwrapped by calling reserve_with_refcount_union_as_block_of_memory --- compiler/mono/src/layout.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/compiler/mono/src/layout.rs b/compiler/mono/src/layout.rs index b06c5bef18..522aacc921 100644 --- a/compiler/mono/src/layout.rs +++ b/compiler/mono/src/layout.rs @@ -968,14 +968,9 @@ impl<'a> Layout<'a> { use Layout::*; match self { - Union(variant) => { - use UnionLayout::*; + Union(UnionLayout::NonRecursive(_)) => false, - matches!( - variant, - Recursive(_) | NullableWrapped { .. } | NullableUnwrapped { .. } - ) - } + Union(_) => true, RecursivePointer => true, From f54f96281f89cc50510b640b4a43851a5364589f Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 10:36:18 +0000 Subject: [PATCH 30/57] Fix roc_alloc linking. Test passes for recursive Tag --- compiler/gen_wasm/src/lib.rs | 2 +- compiler/test_gen/src/gen_tags.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/gen_wasm/src/lib.rs b/compiler/gen_wasm/src/lib.rs index ecd0b579fd..19c499c32b 100644 --- a/compiler/gen_wasm/src/lib.rs +++ b/compiler/gen_wasm/src/lib.rs @@ -26,7 +26,7 @@ const PTR_TYPE: ValueType = ValueType::I32; pub const STACK_POINTER_GLOBAL_ID: u32 = 0; pub const FRAME_ALIGNMENT_BYTES: i32 = 16; pub const MEMORY_NAME: &str = "memory"; -pub const BUILTINS_IMPORT_MODULE_NAME: &str = "builtins"; +pub const BUILTINS_IMPORT_MODULE_NAME: &str = "env"; pub const STACK_POINTER_NAME: &str = "__stack_pointer"; pub struct Env<'a> { diff --git a/compiler/test_gen/src/gen_tags.rs b/compiler/test_gen/src/gen_tags.rs index 7d176e4b4e..a7ad65518c 100644 --- a/compiler/test_gen/src/gen_tags.rs +++ b/compiler/test_gen/src/gen_tags.rs @@ -1125,7 +1125,7 @@ fn result_never() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn nested_recursive_literal() { assert_evals_to!( indoc!( From c53b3c36866c8045d95673de87bf463538084139 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 11:37:55 +0000 Subject: [PATCH 31/57] Skip refcounting on unimplemented layouts --- compiler/gen_dev/src/lib.rs | 2 +- compiler/gen_wasm/src/backend.rs | 2 +- compiler/mono/src/gen_refcount.rs | 57 ++++++++++++++++++++++--------- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/compiler/gen_dev/src/lib.rs b/compiler/gen_dev/src/lib.rs index d7356dc9a6..cbb808df84 100644 --- a/compiler/gen_dev/src/lib.rs +++ b/compiler/gen_dev/src/lib.rs @@ -163,7 +163,7 @@ trait Backend<'a> { .push((rc_proc_symbol, rc_proc_layout)); } - self.build_stmt(&rc_stmt, ret_layout) + self.build_stmt(rc_stmt, ret_layout) } Stmt::Switch { cond_symbol, diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 7e922ddd4d..e78e6e9ff9 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -523,7 +523,7 @@ impl<'a> WasmBackend<'a> { })); } - self.build_stmt(&rc_stmt, ret_layout); + self.build_stmt(rc_stmt, ret_layout); } x => todo!("statement {:?}", x), diff --git a/compiler/mono/src/gen_refcount.rs b/compiler/mono/src/gen_refcount.rs index 1e492da8f5..99e7be6057 100644 --- a/compiler/mono/src/gen_refcount.rs +++ b/compiler/mono/src/gen_refcount.rs @@ -77,7 +77,17 @@ impl<'a> RefcountProcGenerator<'a> { layout: Layout<'a>, modify: &ModifyRc, following: &'a Stmt<'a>, - ) -> (Stmt<'a>, Option<(Symbol, ProcLayout<'a>)>) { + ) -> (&'a Stmt<'a>, Option<(Symbol, ProcLayout<'a>)>) { + if !Self::layout_is_supported(&layout) { + // Just a warning, so we can decouple backend development from refcounting development. + // When we are closer to completion, we can change it to a panic. + println!( + "WARNING! MEMORY LEAK! Refcounting not yet implemented for Layout {:?}", + layout + ); + return (following, None); + } + let arena = self.arena; match modify { @@ -105,7 +115,7 @@ impl<'a> RefcountProcGenerator<'a> { arguments: arena.alloc([*structure, amount_sym]), }); let call_stmt = Stmt::Let(call_result_empty, call_expr, LAYOUT_UNIT, following); - let rc_stmt = amount_stmt(arena.alloc(call_stmt)); + let rc_stmt = arena.alloc(amount_stmt(arena.alloc(call_stmt))); // Create a linker symbol for the helper proc if this is the first usage let new_proc_info = if is_existing { @@ -140,7 +150,12 @@ impl<'a> RefcountProcGenerator<'a> { arguments: arena.alloc([*structure]), }); - let rc_stmt = Stmt::Let(call_result_empty, call_expr, LAYOUT_UNIT, following); + let rc_stmt = arena.alloc(Stmt::Let( + call_result_empty, + call_expr, + LAYOUT_UNIT, + following, + )); // Create a linker symbol for the helper proc if this is the first usage let new_proc_info = if is_existing { @@ -182,13 +197,19 @@ impl<'a> RefcountProcGenerator<'a> { arguments: arena.alloc([rc_ptr_sym]), }); let call_stmt = Stmt::Let(call_result_empty, call_expr, LAYOUT_UNIT, following); - let rc_stmt = rc_ptr_stmt(arena.alloc(call_stmt)); + let rc_stmt = arena.alloc(rc_ptr_stmt(arena.alloc(call_stmt))); (rc_stmt, None) } } } + // TODO: consider refactoring so that we have just one place to define what's supported + // (Probably by generating procs on the fly instead of all at the end) + fn layout_is_supported(layout: &Layout) -> bool { + matches!(layout, Layout::Builtin(Builtin::Str)) + } + /// Generate refcounting helper procs, each specialized to a particular Layout. /// For example `List (Result { a: Str, b: Int } Str)` would get its own helper /// to update the refcounts on the List, the Result and the strings. @@ -197,20 +218,24 @@ impl<'a> RefcountProcGenerator<'a> { arena: &'a Bump, ident_ids: &mut IdentIds, ) -> Vec<'a, Proc<'a>> { - // Move the vector so we can loop over it safely - let mut procs_to_generate = Vec::with_capacity_in(0, arena); - std::mem::swap(&mut self.procs_to_generate, &mut procs_to_generate); + // Move the vector out of self, so we can loop over it safely + let mut procs_to_generate = + std::mem::replace(&mut self.procs_to_generate, Vec::with_capacity_in(0, arena)); - let mut procs = Vec::with_capacity_in(procs_to_generate.len(), arena); - for (layout, op, proc_symbol) in procs_to_generate.drain(0..) { - let proc = match layout { - Layout::Builtin(Builtin::Str) => self.gen_modify_str(ident_ids, op, proc_symbol), - _ => todo!("Refcounting is not yet implemented for Layout {:?}", layout), - }; - procs.push(proc); - } + let procs_iter = procs_to_generate + .drain(0..) + .map(|(layout, op, proc_symbol)| { + debug_assert!(Self::layout_is_supported(&layout)); + match layout { + Layout::Builtin(Builtin::Str) => { + self.gen_modify_str(ident_ids, op, proc_symbol) + } - procs + _ => todo!("Please update layout_is_supported for {:?}", layout), + } + }); + + Vec::from_iter_in(procs_iter, arena) } /// Find the Symbol of the procedure for this layout and refcount operation, From f8a1f9e8cf3cd571e217e0c24189619ad78727f0 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 11:40:02 +0000 Subject: [PATCH 32/57] Use PhantomData instead of Default in Wasm tests --- compiler/test_gen/src/helpers/wasm.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/compiler/test_gen/src/helpers/wasm.rs b/compiler/test_gen/src/helpers/wasm.rs index 1059847768..f7cb7b2486 100644 --- a/compiler/test_gen/src/helpers/wasm.rs +++ b/compiler/test_gen/src/helpers/wasm.rs @@ -1,6 +1,7 @@ use std::cell::Cell; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; +use std::marker::PhantomData; use tempfile::{tempdir, TempDir}; use wasmer::Memory; @@ -43,7 +44,7 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( arena: &'a bumpalo::Bump, src: &str, stdlib: &'a roc_builtins::std::StdLib, - _result_type_dummy: &T, + _result_type_dummy: PhantomData, ) -> wasmer::Instance { use std::path::{Path, PathBuf}; @@ -132,14 +133,14 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( let store = Store::default(); - // Keep the final .wasm file for debugging with wasm-objdump or wasm2wat - const DEBUG_WASM_FILE: bool = false; + // Keep the output binary for debugging with wasm2wat, wasm-objdump, wasm-validate, wasmer... + const KEEP_WASM_FILE: bool = false; let wasmer_module = { let tmp_dir: TempDir; // directory for normal test runs, deleted when dropped let debug_dir: String; // persistent directory for debugging - let wasm_build_dir: &Path = if DEBUG_WASM_FILE { + let wasm_build_dir: &Path = if KEEP_WASM_FILE { // Directory name based on a hash of the Roc source let mut hash_state = DefaultHasher::new(); src.hash(&mut hash_state); @@ -220,7 +221,7 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( } #[allow(dead_code)] -pub fn assert_wasm_evals_to_help(src: &str, phantom: T) -> Result +pub fn assert_wasm_evals_to_help(src: &str, phantom: PhantomData) -> Result where T: FromWasm32Memory + Wasm32TestResult, { @@ -229,7 +230,7 @@ where // NOTE the stdlib must be in the arena; just taking a reference will segfault let stdlib = arena.alloc(roc_builtins::std::standard_stdlib()); - let instance = crate::helpers::wasm::helper_wasm(&arena, src, stdlib, &phantom); + let instance = crate::helpers::wasm::helper_wasm(&arena, src, stdlib, phantom); let memory = instance.exports.get_memory(MEMORY_NAME).unwrap(); @@ -281,7 +282,7 @@ pub fn debug_memory_hex(memory: &Memory, address: i32, size: usize) { #[allow(unused_macros)] macro_rules! assert_wasm_evals_to { ($src:expr, $expected:expr, $ty:ty, $transform:expr) => { - let phantom = <$ty>::default(); + let phantom = std::marker::PhantomData; match $crate::helpers::wasm::assert_wasm_evals_to_help::<$ty>($src, phantom) { Err(msg) => panic!("{:?}", msg), Ok(actual) => { From 9bf1b9aae37706699b4ed141e11c9022298c039a Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 13:16:22 +0000 Subject: [PATCH 33/57] Fix double-offset bug --- compiler/gen_wasm/src/backend.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index e78e6e9ff9..d81de8bca2 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -975,10 +975,6 @@ impl<'a> WasmBackend<'a> { let refcount_offset = extra_bytes - PTR_SIZE; let encoded_refcount = (initial_refcount as i32) - 1 + i32::MIN; self.code_builder.get_local(local_id); - if refcount_offset != 0 { - self.code_builder.i32_const(refcount_offset as i32); - self.code_builder.i32_add(); - } self.code_builder.i32_const(encoded_refcount); self.code_builder.i32_store(Align::Bytes4, refcount_offset); From 96380d5bfe226637346d7a7716231f0d6391fe25 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 13:20:32 +0000 Subject: [PATCH 34/57] Link compiler_rt.o in wasm tests --- compiler/test_gen/build.rs | 6 ++++++ compiler/test_gen/src/helpers/wasm.rs | 3 +++ 2 files changed, 9 insertions(+) diff --git a/compiler/test_gen/build.rs b/compiler/test_gen/build.rs index 5deedfd52f..9445c3bf6a 100644 --- a/compiler/test_gen/build.rs +++ b/compiler/test_gen/build.rs @@ -6,6 +6,7 @@ use std::process::Command; const PLATFORM_FILENAME: &str = "wasm_test_platform"; const OUT_DIR_VAR: &str = "TEST_GEN_OUT"; const LIBC_PATH_VAR: &str = "TEST_GEN_WASM_LIBC_PATH"; +const COMPILER_RT_PATH_VAR: &str = "TEST_GEN_WASM_COMPILER_RT_PATH"; fn main() { println!("cargo:rerun-if-changed=build.rs"); @@ -62,8 +63,13 @@ fn build_wasm_libc(out_dir: &str) { ); let libc_path = run_command(cwd, "find", [&zig_cache_dir, "-name", "libc.a"]); + let compiler_rt_path = run_command(cwd, "find", [&zig_cache_dir, "-name", "compiler_rt.o"]); println!("cargo:rustc-env={}={}", LIBC_PATH_VAR, libc_path); + println!( + "cargo:rustc-env={}={}", + COMPILER_RT_PATH_VAR, compiler_rt_path + ); } fn feature_is_enabled(feature_name: &str) -> bool { diff --git a/compiler/test_gen/src/helpers/wasm.rs b/compiler/test_gen/src/helpers/wasm.rs index f7cb7b2486..caac7b397e 100644 --- a/compiler/test_gen/src/helpers/wasm.rs +++ b/compiler/test_gen/src/helpers/wasm.rs @@ -16,6 +16,7 @@ use roc_gen_wasm::MEMORY_NAME; const PLATFORM_FILENAME: &str = "wasm_test_platform"; const OUT_DIR_VAR: &str = "TEST_GEN_OUT"; const LIBC_PATH_VAR: &str = "TEST_GEN_WASM_LIBC_PATH"; +const COMPILER_RT_PATH_VAR: &str = "TEST_GEN_WASM_COMPILER_RT_PATH"; #[allow(unused_imports)] use roc_mono::ir::PRETTY_PRINT_IR_SYMBOLS; @@ -162,6 +163,7 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( let test_out_dir = std::env::var(OUT_DIR_VAR).unwrap(); let test_platform_o = format!("{}/{}.o", test_out_dir, PLATFORM_FILENAME); let libc_a_file = std::env::var(LIBC_PATH_VAR).unwrap(); + let compiler_rt_o_file = std::env::var(COMPILER_RT_PATH_VAR).unwrap(); // write the module to a file so the linker can access it std::fs::write(&app_o_file, &module_bytes).unwrap(); @@ -173,6 +175,7 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( bitcode::BUILTINS_WASM32_OBJ_PATH, &test_platform_o, &libc_a_file, + &compiler_rt_o_file, // output "-o", final_wasm_file.to_str().unwrap(), From 9594b05c96e36f92ec752ff3f3d7ad053e2c62e7 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 18:58:03 +0000 Subject: [PATCH 35/57] Add some debug features to gen_wasm --- compiler/gen_wasm/src/backend.rs | 19 +++++++++++++++ .../gen_wasm/src/wasm_module/code_builder.rs | 13 ++++++++++ compiler/test_gen/src/helpers/wasm.rs | 24 ++++++++++++++----- .../test_gen/src/helpers/wasm_test_platform.c | 13 +++++++++- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index d81de8bca2..9f13adc4c2 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -58,6 +58,8 @@ pub struct WasmBackend<'a> { /// how many blocks deep are we (used for jumps) block_depth: u32, joinpoint_label_map: MutMap)>, + + debug_current_proc_index: usize, } impl<'a> WasmBackend<'a> { @@ -149,6 +151,8 @@ impl<'a> WasmBackend<'a> { code_builder: CodeBuilder::new(arena), storage: Storage::new(arena), symbol_layouts: MutMap::default(), + + debug_current_proc_index: 0, } } @@ -203,6 +207,7 @@ impl<'a> WasmBackend<'a> { pub fn build_proc(&mut self, proc: &Proc<'a>) { // println!("\ngenerating procedure {:?}\n", proc.name); + self.debug_current_proc_index += 1; self.start_proc(proc); @@ -1246,4 +1251,18 @@ impl<'a> WasmBackend<'a> { self.code_builder .call(fn_index, linker_symbol_index, num_wasm_args, has_return_val); } + + /// Debug utility + /// + /// if _debug_current_proc_is("#UserApp_foo_1") { + /// self.code_builder._debug_assert_i32(0x1234); + /// } + fn _debug_current_proc_is(&self, linker_name: &'static str) -> bool { + let (_, linker_sym_index) = self.proc_symbols[self.debug_current_proc_index]; + let sym_info = &self.linker_symbols[linker_sym_index as usize]; + match sym_info { + SymInfo::Function(WasmObjectSymbol::Defined { name, .. }) => name == linker_name, + _ => false, + } + } } diff --git a/compiler/gen_wasm/src/wasm_module/code_builder.rs b/compiler/gen_wasm/src/wasm_module/code_builder.rs index 20eb055acd..66b066641f 100644 --- a/compiler/gen_wasm/src/wasm_module/code_builder.rs +++ b/compiler/gen_wasm/src/wasm_module/code_builder.rs @@ -901,4 +901,17 @@ impl<'a> CodeBuilder<'a> { instruction_no_args!(i64_reinterpret_f64, I64REINTERPRETF64, 1, true); instruction_no_args!(f32_reinterpret_i32, F32REINTERPRETI32, 1, true); instruction_no_args!(f64_reinterpret_i64, F64REINTERPRETI64, 1, true); + + /// Generate a debug assertion for an expected i32 value + pub fn _debug_assert_i32(&mut self, expected: i32) { + self.i32_const(expected); + self.i32_eq(); + self.i32_eqz(); + self.if_(BlockType::NoResult); + self.unreachable_(); // Tell Wasm runtime to throw an exception + self.end(); + // It matches. Restore the original value to the VM stack and continue the program. + // We know it matched the expected value, so just use that! + self.i32_const(expected); + } } diff --git a/compiler/test_gen/src/helpers/wasm.rs b/compiler/test_gen/src/helpers/wasm.rs index caac7b397e..8156967354 100644 --- a/compiler/test_gen/src/helpers/wasm.rs +++ b/compiler/test_gen/src/helpers/wasm.rs @@ -247,10 +247,16 @@ where _ => panic!(), }; - if false { + if true { + println!("test_wrapper returned 0x{:x}", address); + println!("Stack:"); crate::helpers::wasm::debug_memory_hex(memory, address, std::mem::size_of::()); } - + if true { + println!("Heap:"); + // Manually provide address and size based on printf in test_platform.c + crate::helpers::wasm::debug_memory_hex(memory, 0x11440, 24); + } let output = ::decode(memory, address as u32); Ok(output) @@ -267,12 +273,17 @@ pub fn debug_memory_hex(memory: &Memory, address: i32, size: usize) { }; let extra_words = 2; - let offset = (address as usize) / 4; - let start = offset - extra_words; - let end = offset + (size / 4) + extra_words; + let result_start = (address as usize) / 4; + let result_end = result_start + ((size + 3) / 4); + let start = result_start - extra_words; + let end = result_end + extra_words; for index in start..end { - let result_marker = if index == offset { "*" } else { " " }; + let result_marker = if index >= result_start && index < result_end { + "|" + } else { + " " + }; println!( "{:x} {} {:08x}", index * 4, @@ -280,6 +291,7 @@ pub fn debug_memory_hex(memory: &Memory, address: i32, size: usize) { memory_words[index] ); } + println!(); } #[allow(unused_macros)] diff --git a/compiler/test_gen/src/helpers/wasm_test_platform.c b/compiler/test_gen/src/helpers/wasm_test_platform.c index 2201cb8cea..8624b5147d 100644 --- a/compiler/test_gen/src/helpers/wasm_test_platform.c +++ b/compiler/test_gen/src/helpers/wasm_test_platform.c @@ -3,7 +3,18 @@ // If any printf is included for compilation, even if unused, test runs take 50% longer #define DEBUG 0 -void *roc_alloc(size_t size, unsigned int alignment) { return malloc(size); } +void *roc_alloc(size_t size, unsigned int alignment) +{ + void *allocated = malloc(size); + if (!allocated) + { + fprintf(stderr, "roc_alloc failed\n"); + exit(1); + } else { + printf("roc_alloc allocated %d bytes at %p\n", size, allocated); + } + return allocated; +} void *roc_realloc(void *ptr, size_t new_size, size_t old_size, unsigned int alignment) From 574eec1d61d328b42962654677e53878884b9136 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sat, 11 Dec 2021 20:19:01 +0000 Subject: [PATCH 36/57] Remove fprintf from compilation for faster test runs --- .../test_gen/src/helpers/wasm_test_platform.c | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/compiler/test_gen/src/helpers/wasm_test_platform.c b/compiler/test_gen/src/helpers/wasm_test_platform.c index 8624b5147d..5f466c707e 100644 --- a/compiler/test_gen/src/helpers/wasm_test_platform.c +++ b/compiler/test_gen/src/helpers/wasm_test_platform.c @@ -3,26 +3,41 @@ // If any printf is included for compilation, even if unused, test runs take 50% longer #define DEBUG 0 +//-------------------------- + void *roc_alloc(size_t size, unsigned int alignment) { void *allocated = malloc(size); +#if DEBUG if (!allocated) { fprintf(stderr, "roc_alloc failed\n"); exit(1); - } else { + } + else + { printf("roc_alloc allocated %d bytes at %p\n", size, allocated); } +#endif return allocated; } +//-------------------------- + void *roc_realloc(void *ptr, size_t new_size, size_t old_size, unsigned int alignment) { return realloc(ptr, new_size); } -void roc_dealloc(void *ptr, unsigned int alignment) { free(ptr); } +//-------------------------- + +void roc_dealloc(void *ptr, unsigned int alignment) +{ + free(ptr); +} + +//-------------------------- void roc_panic(void *ptr, unsigned int alignment) { @@ -34,9 +49,16 @@ void roc_panic(void *ptr, unsigned int alignment) exit(1); } +//-------------------------- + void *roc_memcpy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); } -void *roc_memset(void *str, int c, size_t n) { return memset(str, c, n); } +//-------------------------- + +void *roc_memset(void *str, int c, size_t n) +{ + return memset(str, c, n); +} From 99d12c4f3ef406a67beec253a45db781e603861e Mon Sep 17 00:00:00 2001 From: Folkert Date: Sat, 11 Dec 2021 22:11:50 +0100 Subject: [PATCH 37/57] use env! macro --- compiler/test_gen/src/helpers/wasm.rs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/compiler/test_gen/src/helpers/wasm.rs b/compiler/test_gen/src/helpers/wasm.rs index 1059847768..9ca826f190 100644 --- a/compiler/test_gen/src/helpers/wasm.rs +++ b/compiler/test_gen/src/helpers/wasm.rs @@ -1,4 +1,3 @@ -use std::cell::Cell; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; use tempfile::{tempdir, TempDir}; @@ -13,18 +12,15 @@ use roc_gen_wasm::MEMORY_NAME; // Should manually match build.rs const PLATFORM_FILENAME: &str = "wasm_test_platform"; -const OUT_DIR_VAR: &str = "TEST_GEN_OUT"; -const LIBC_PATH_VAR: &str = "TEST_GEN_WASM_LIBC_PATH"; + +const TEST_OUT_DIR: &str = env!("TEST_GEN_OUT"); +const LIBC_A_FILE: &str = env!("TEST_GEN_WASM_LIBC_PATH"); #[allow(unused_imports)] use roc_mono::ir::PRETTY_PRINT_IR_SYMBOLS; const TEST_WRAPPER_NAME: &str = "test_wrapper"; -std::thread_local! { - static TEST_COUNTER: Cell = Cell::new(0); -} - fn promote_expr_to_module(src: &str) -> String { let mut buffer = String::from("app \"test\" provides [ main ] to \"./platform\"\n\nmain =\n"); @@ -158,9 +154,7 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( let final_wasm_file = wasm_build_dir.join("final.wasm"); let app_o_file = wasm_build_dir.join("app.o"); - let test_out_dir = std::env::var(OUT_DIR_VAR).unwrap(); - let test_platform_o = format!("{}/{}.o", test_out_dir, PLATFORM_FILENAME); - let libc_a_file = std::env::var(LIBC_PATH_VAR).unwrap(); + let test_platform_o = format!("{}/{}.o", TEST_OUT_DIR, PLATFORM_FILENAME); // write the module to a file so the linker can access it std::fs::write(&app_o_file, &module_bytes).unwrap(); @@ -171,7 +165,7 @@ pub fn helper_wasm<'a, T: Wasm32TestResult>( app_o_file.to_str().unwrap(), bitcode::BUILTINS_WASM32_OBJ_PATH, &test_platform_o, - &libc_a_file, + LIBC_A_FILE, // output "-o", final_wasm_file.to_str().unwrap(), From 044a2015bb67a84bade16bab8f7e3fb0e5a85f33 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sun, 12 Dec 2021 08:31:45 +0000 Subject: [PATCH 38/57] Make better use of Layout methods for GetTagId --- compiler/gen_wasm/src/backend.rs | 75 ++++++++++---------------------- 1 file changed, 23 insertions(+), 52 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 9f13adc4c2..495ebe3944 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -1,6 +1,7 @@ use bumpalo::{self, collections::Vec}; use code_builder::Align; +use roc_builtins::bitcode::IntWidth; use roc_collections::all::MutMap; use roc_module::low_level::LowLevel; use roc_module::symbol::{Interns, Symbol}; @@ -653,7 +654,7 @@ impl<'a> WasmBackend<'a> { Expr::GetTagId { structure, union_layout, - } => self.build_get_tag_id(*structure, union_layout, storage), + } => self.build_get_tag_id(*structure, union_layout), Expr::UnionAtIndex { structure, @@ -771,44 +772,24 @@ impl<'a> WasmBackend<'a> { &mut self, structure: Symbol, union_layout: &UnionLayout<'a>, - tag_id_storage: &StoredValue, ) { use UnionLayout::*; - // Variables to control shared logic - let mut wrapped_tags: Option<&[&[Layout]]> = None; - let mut get_pointer_bits = false; let mut need_to_close_block = false; - match union_layout { - NonRecursive(tags) => { - wrapped_tags = Some(*tags); - } - Recursive(tags) => { - if union_layout.stores_tag_id_as_data(PTR_SIZE) { - wrapped_tags = Some(*tags); - } else { - get_pointer_bits = true; - } - } + NonRecursive(_) => {} + Recursive(_) => {} NonNullableUnwrapped(_) => { self.code_builder.i32_const(0); + return; } - NullableWrapped { - nullable_id, - other_tags, - } => { + NullableWrapped { nullable_id, .. } => { self.storage .load_symbols(&mut self.code_builder, &[structure]); self.code_builder.i32_eqz(); self.code_builder.if_(BlockType::Value(ValueType::I32)); self.code_builder.i32_const(*nullable_id as i32); self.code_builder.else_(); - if union_layout.stores_tag_id_as_data(PTR_SIZE) { - wrapped_tags = Some(*other_tags); - } else { - get_pointer_bits = true; - } need_to_close_block = true; } NullableUnwrapped { nullable_id, .. } => { @@ -821,37 +802,27 @@ impl<'a> WasmBackend<'a> { self.code_builder.i32_const(!(*nullable_id) as i32); self.code_builder.end(); } - } + }; - // Logic shared between different union layouts - - if let Some(tags) = wrapped_tags { - // Fields are wrapped with a tag ID at the end - - let (id_type, id_size) = - if let StoredValue::VirtualMachineStack { - value_type, size, .. - } = tag_id_storage - { - (value_type, size) - } else { - internal_error!("Unexpected storage for tag ID {:?}", tag_id_storage); - }; - - let (id_offset, id_align_bytes) = Self::union_fields_size_and_alignment(tags); - let id_align = Align::from(id_align_bytes); + if union_layout.stores_tag_id_as_data(PTR_SIZE) { + let (total_size, total_alignment) = + Layout::Union(*union_layout).stack_size_and_alignment(PTR_SIZE); + let id_offset = total_size - total_alignment; + let id_align = Align::from(total_alignment); self.storage .load_symbols(&mut self.code_builder, &[structure]); - match (id_type, id_size) { - (ValueType::I32, 1) => self.code_builder.i32_load8_u(id_align, id_offset), - (ValueType::I32, 2) => self.code_builder.i32_load16_u(id_align, id_offset), - (ValueType::I32, 4) => self.code_builder.i32_load(id_align, id_offset), - (ValueType::I64, 8) => self.code_builder.i64_load(id_align, id_offset), - _ => internal_error!("Invalid tag ID: type={:?} size={}", id_type, id_size), + match union_layout.tag_id_builtin() { + Builtin::Bool | Builtin::Int(IntWidth::U8) => { + self.code_builder.i32_load8_u(id_align, id_offset) + } + Builtin::Int(IntWidth::U16) => self.code_builder.i32_load16_u(id_align, id_offset), + Builtin::Int(IntWidth::U32) => self.code_builder.i32_load(id_align, id_offset), + Builtin::Int(IntWidth::U64) => self.code_builder.i64_load(id_align, id_offset), + x => internal_error!("Unexpected layout for tag union id {:?}", x), } - } else if get_pointer_bits { + } else if union_layout.stores_tag_id_in_pointer(PTR_SIZE) { self.storage .load_symbols(&mut self.code_builder, &[structure]); self.code_builder.i32_const(3); @@ -912,7 +883,7 @@ impl<'a> WasmBackend<'a> { let from_ptr = if stores_tag_id_in_pointer { let ptr = self.storage.create_anonymous_local(ValueType::I32); self.code_builder.get_local(tag_local_id); - self.code_builder.i32_const(-4); + self.code_builder.i32_const(-4); // 11111111...1100 self.code_builder.i32_and(); self.code_builder.set_local(ptr); ptr @@ -1254,7 +1225,7 @@ impl<'a> WasmBackend<'a> { /// Debug utility /// - /// if _debug_current_proc_is("#UserApp_foo_1") { + /// if self._debug_current_proc_is("#UserApp_foo_1") { /// self.code_builder._debug_assert_i32(0x1234); /// } fn _debug_current_proc_is(&self, linker_name: &'static str) -> bool { From 7cba80efbbaa5c1f1d350f14555d161082bddb18 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sun, 12 Dec 2021 08:36:59 +0000 Subject: [PATCH 39/57] Disable some debug code --- compiler/test_gen/src/helpers/wasm.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/test_gen/src/helpers/wasm.rs b/compiler/test_gen/src/helpers/wasm.rs index aad61ec6c4..1d4e9ddcd2 100644 --- a/compiler/test_gen/src/helpers/wasm.rs +++ b/compiler/test_gen/src/helpers/wasm.rs @@ -242,14 +242,14 @@ where _ => panic!(), }; - if true { + if false { println!("test_wrapper returned 0x{:x}", address); println!("Stack:"); crate::helpers::wasm::debug_memory_hex(memory, address, std::mem::size_of::()); } - if true { + if false { println!("Heap:"); - // Manually provide address and size based on printf in test_platform.c + // Manually provide address and size based on printf in wasm_test_platform.c crate::helpers::wasm::debug_memory_hex(memory, 0x11440, 24); } let output = ::decode(memory, address as u32); From 2a53e2711da13ca11e481e96b7afe4c2bcc7fac3 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sun, 12 Dec 2021 08:41:34 +0000 Subject: [PATCH 40/57] formatting --- compiler/gen_wasm/src/backend.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 495ebe3944..fc4260e670 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -768,11 +768,7 @@ impl<'a> WasmBackend<'a> { } } - fn build_get_tag_id( - &mut self, - structure: Symbol, - union_layout: &UnionLayout<'a>, - ) { + fn build_get_tag_id(&mut self, structure: Symbol, union_layout: &UnionLayout<'a>) { use UnionLayout::*; let mut need_to_close_block = false; From c290bbe7a78c36679738b6552727fd1147988b9a Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sun, 12 Dec 2021 11:51:31 +0000 Subject: [PATCH 41/57] Move layout calculations to layout module --- compiler/gen_wasm/src/backend.rs | 59 ++++++-------------------------- compiler/mono/src/layout.rs | 52 ++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 48 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index fc4260e670..d9e0aefc5d 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -26,8 +26,8 @@ use crate::wasm_module::{ LinkingSubSection, LocalId, Signature, SymInfo, ValueType, }; use crate::{ - copy_memory, round_up_to_alignment, CopyMemoryConfig, Env, BUILTINS_IMPORT_MODULE_NAME, - MEMORY_NAME, PTR_SIZE, PTR_TYPE, STACK_POINTER_GLOBAL_ID, STACK_POINTER_NAME, + copy_memory, CopyMemoryConfig, Env, BUILTINS_IMPORT_MODULE_NAME, MEMORY_NAME, PTR_SIZE, + PTR_TYPE, STACK_POINTER_GLOBAL_ID, STACK_POINTER_NAME, }; /// The memory address where the constants data will be loaded during module instantiation. @@ -645,11 +645,11 @@ impl<'a> WasmBackend<'a> { } Expr::Tag { - tag_layout, + tag_layout: union_layout, tag_id, arguments, .. - } => self.build_tag(tag_layout, *tag_id, arguments, *sym, storage), + } => self.build_tag(union_layout, *tag_id, arguments, *sym, storage), Expr::GetTagId { structure, @@ -680,29 +680,9 @@ impl<'a> WasmBackend<'a> { return; } - use UnionLayout::*; - let (mut fields_size_aligned, fields_alignment) = match union_layout { - NonRecursive(tags) => Self::union_fields_size_and_alignment(tags), - Recursive(tags) => Self::union_fields_size_and_alignment(tags), - NonNullableUnwrapped(fields) => Self::union_fields_size_and_alignment(&[fields]), - NullableWrapped { other_tags, .. } => Self::union_fields_size_and_alignment(other_tags), - NullableUnwrapped { other_fields, .. } => { - Self::union_fields_size_and_alignment(&[other_fields]) - } - }; - let stores_tag_id_as_data = union_layout.stores_tag_id_as_data(PTR_SIZE); let stores_tag_id_in_pointer = union_layout.stores_tag_id_in_pointer(PTR_SIZE); - let id_alignment = union_layout.tag_id_layout().alignment_bytes(PTR_SIZE); - - let (total_size, total_alignment) = if stores_tag_id_as_data { - let alignment = fields_alignment.max(id_alignment); - fields_size_aligned = round_up_to_alignment!(fields_size_aligned, alignment); - let size = fields_size_aligned + alignment; - (size, alignment) - } else { - (fields_size_aligned, fields_alignment) - }; + let (data_size, data_alignment) = union_layout.data_size_and_alignment(PTR_SIZE); // We're going to use the pointer many times, so put it in a local variable let stored_with_local = @@ -715,7 +695,7 @@ impl<'a> WasmBackend<'a> { } StoredValue::Local { local_id, .. } => { // Tag is stored as a pointer to the heap. Call the allocator to get a memory address. - self.allocate_with_refcount(Some(total_size), total_alignment, 1); + self.allocate_with_refcount(Some(data_size), data_alignment, 1); self.code_builder.set_local(local_id); (local_id, 0) } @@ -737,8 +717,8 @@ impl<'a> WasmBackend<'a> { // Store the tag ID (if any) if stores_tag_id_as_data { - let id_offset = data_offset + fields_size_aligned; - let id_align = Align::from(total_alignment); + let id_offset = data_offset + data_size - data_alignment; + let id_align = Align::from(data_alignment); self.code_builder.get_local(local_id); @@ -801,10 +781,9 @@ impl<'a> WasmBackend<'a> { }; if union_layout.stores_tag_id_as_data(PTR_SIZE) { - let (total_size, total_alignment) = - Layout::Union(*union_layout).stack_size_and_alignment(PTR_SIZE); - let id_offset = total_size - total_alignment; - let id_align = Align::from(total_alignment); + let (data_size, data_alignment) = union_layout.data_size_and_alignment(PTR_SIZE); + let id_offset = data_size - data_alignment; + let id_align = Align::from(data_alignment); self.storage .load_symbols(&mut self.code_builder, &[structure]); @@ -892,22 +871,6 @@ impl<'a> WasmBackend<'a> { .copy_value_from_memory(&mut self.code_builder, symbol, from_ptr, from_offset); } - fn union_fields_size_and_alignment(variant_field_layouts: &[&[Layout]]) -> (u32, u32) { - let mut size = 0; - let mut alignment_bytes = 0; - for field_layouts in variant_field_layouts { - let mut variant_size = 0; - for layout in field_layouts.iter() { - let (field_size, field_alignment) = layout.stack_size_and_alignment(PTR_SIZE); - variant_size += field_size; - alignment_bytes = alignment_bytes.max(field_alignment); - } - size = size.max(variant_size); - } - size = round_up_to_alignment!(size, alignment_bytes); - (size, alignment_bytes) - } - /// Allocate heap space and write an initial refcount /// If the data size is known at compile time, pass it in comptime_data_size. /// If size is only known at runtime, push *data* size to the VM stack first. diff --git a/compiler/mono/src/layout.rs b/compiler/mono/src/layout.rs index 522aacc921..33bfed59d2 100644 --- a/compiler/mono/src/layout.rs +++ b/compiler/mono/src/layout.rs @@ -426,6 +426,58 @@ impl<'a> UnionLayout<'a> { // because we store a refcount, the alignment must be at least the size of a pointer allocation.max(pointer_size) } + + /// Size of the data in memory, whether it's stack or heap (for non-null tag ids) + pub fn data_size_and_alignment(&self, pointer_size: u32) -> (u32, u32) { + let id_data_layout = if self.stores_tag_id_as_data(pointer_size) { + Some(self.tag_id_layout()) + } else { + None + }; + + match self { + Self::NonRecursive(tags) => { + Self::data_size_and_alignment_help(tags, id_data_layout, pointer_size) + } + Self::Recursive(tags) => { + Self::data_size_and_alignment_help(tags, id_data_layout, pointer_size) + } + Self::NonNullableUnwrapped(fields) => { + Self::data_size_and_alignment_help(&[fields], id_data_layout, pointer_size) + } + Self::NullableWrapped { other_tags, .. } => { + Self::data_size_and_alignment_help(other_tags, id_data_layout, pointer_size) + } + Self::NullableUnwrapped { other_fields, .. } => { + Self::data_size_and_alignment_help(&[other_fields], id_data_layout, pointer_size) + } + } + } + + fn data_size_and_alignment_help( + variant_field_layouts: &[&[Layout]], + id_data_layout: Option, + pointer_size: u32, + ) -> (u32, u32) { + let mut size = 0; + let mut alignment_bytes = 0; + + for field_layouts in variant_field_layouts { + let mut data = Layout::Struct(field_layouts); + + let fields_and_id; + if let Some(id_layout) = id_data_layout { + fields_and_id = [data, id_layout]; + data = Layout::Struct(&fields_and_id); + } + + let (variant_size, variant_alignment) = data.stack_size_and_alignment(pointer_size); + alignment_bytes = alignment_bytes.max(variant_alignment); + size = size.max(variant_size); + } + + (size, alignment_bytes) + } } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] From d03a51c75baff5d317fdd39dbdef780092fbddb8 Mon Sep 17 00:00:00 2001 From: Jan Van Bruggen Date: Sun, 12 Dec 2021 05:55:46 -0700 Subject: [PATCH 42/57] Rename `base` package to `pf` everywhere, to match tutorial --- cli/tests/fixtures/multi-dep-str/Main.roc | 4 ++-- cli/tests/fixtures/multi-dep-thunk/Main.roc | 4 ++-- compiler/builtins/docs/Num.roc | 6 +++--- compiler/fmt/tests/test_fmt.rs | 2 +- compiler/load/src/file.rs | 8 ++++---- compiler/module/src/symbol.rs | 2 +- compiler/parse/src/header.rs | 2 +- compiler/parse/src/module.rs | 2 +- .../snapshots/pass/full_app_header.header.roc | 4 ++-- .../full_app_header_trailing_commas.header.roc | 4 ++-- docs/tests/insert_syntax_highlighting.rs | 4 ++-- editor/src/editor/resources/strings.rs | 4 ++-- examples/benchmarks/CFold.roc | 6 +++--- examples/benchmarks/Closure.roc | 6 +++--- examples/benchmarks/Deriv.roc | 6 +++--- examples/benchmarks/NQueens.roc | 6 +++--- examples/benchmarks/QuicksortApp.roc | 6 +++--- examples/benchmarks/RBTreeCk.roc | 6 +++--- examples/benchmarks/RBTreeDel.roc | 6 +++--- examples/benchmarks/RBTreeInsert.roc | 6 +++--- examples/benchmarks/TestAStar.roc | 6 +++--- examples/benchmarks/TestBase64.roc | 6 +++--- examples/cli/Echo.roc | 6 +++--- examples/effect/Main.roc | 4 ++-- examples/false-interpreter/Context.roc | 2 +- examples/false-interpreter/False.roc | 6 +++--- examples/fib/Fib.roc | 4 ++-- examples/hello-rust/Hello.roc | 4 ++-- examples/hello-swift/Hello.roc | 4 ++-- examples/hello-web/Hello.roc | 4 ++-- examples/hello-world/Hello.roc | 4 ++-- examples/hello-zig/Hello.roc | 4 ++-- examples/quicksort/Quicksort.roc | 4 ++-- reporting/tests/test_reporting.rs | 16 ++++++++-------- 34 files changed, 84 insertions(+), 84 deletions(-) diff --git a/cli/tests/fixtures/multi-dep-str/Main.roc b/cli/tests/fixtures/multi-dep-str/Main.roc index 60d452bcc8..c0b3365319 100644 --- a/cli/tests/fixtures/multi-dep-str/Main.roc +++ b/cli/tests/fixtures/multi-dep-str/Main.roc @@ -1,7 +1,7 @@ app "multi-dep-str" - packages { base: "platform" } + packages { pf: "platform" } imports [ Dep1 ] - provides [ main ] to base + provides [ main ] to pf main : Str main = Dep1.str1 diff --git a/cli/tests/fixtures/multi-dep-thunk/Main.roc b/cli/tests/fixtures/multi-dep-thunk/Main.roc index ae6243978b..f64c103b02 100644 --- a/cli/tests/fixtures/multi-dep-thunk/Main.roc +++ b/cli/tests/fixtures/multi-dep-thunk/Main.roc @@ -1,7 +1,7 @@ app "multi-dep-thunk" - packages { base: "platform" } + packages { pf: "platform" } imports [ Dep1 ] - provides [ main ] to base + provides [ main ] to pf main : Str main = Dep1.value1 {} diff --git a/compiler/builtins/docs/Num.roc b/compiler/builtins/docs/Num.roc index 10ede5fcd4..bcad1c1208 100644 --- a/compiler/builtins/docs/Num.roc +++ b/compiler/builtins/docs/Num.roc @@ -621,13 +621,13 @@ toStr : Num * -> Str ## Examples: ## ## In some countries (e.g. USA and UK), a comma is used to separate thousands: -## >>> Num.format 1_000_000 { base: Decimal, wholeSep: { mark: ",", places: 3 } } +## >>> Num.format 1_000_000 { pf: Decimal, wholeSep: { mark: ",", places: 3 } } ## ## Sometimes when rendering bits, it's nice to group them into groups of 4: -## >>> Num.format 1_000_000 { base: Binary, wholeSep: { mark: " ", places: 4 } } +## >>> Num.format 1_000_000 { pf: Binary, wholeSep: { mark: " ", places: 4 } } ## ## It's also common to render hexadecimal in groups of 2: -## >>> Num.format 1_000_000 { base: Hexadecimal, wholeSep: { mark: " ", places: 2 } } +## >>> Num.format 1_000_000 { pf: Hexadecimal, wholeSep: { mark: " ", places: 2 } } format : Num *, { diff --git a/compiler/fmt/tests/test_fmt.rs b/compiler/fmt/tests/test_fmt.rs index 286ed735cc..507809b0dd 100644 --- a/compiler/fmt/tests/test_fmt.rs +++ b/compiler/fmt/tests/test_fmt.rs @@ -2625,7 +2625,7 @@ mod test_fmt { fn single_line_app() { module_formats_same(indoc!( r#" - app "Foo" packages { base: "platform" } imports [] provides [ main ] to base"# + app "Foo" packages { pf: "platform" } imports [] provides [ main ] to pf"# )); } diff --git a/compiler/load/src/file.rs b/compiler/load/src/file.rs index 7611f8c94e..bdfc5597fc 100644 --- a/compiler/load/src/file.rs +++ b/compiler/load/src/file.rs @@ -684,7 +684,7 @@ enum HeaderFor<'a> { to_platform: To<'a>, }, PkgConfig { - /// usually `base` + /// usually `pf` config_shorthand: &'a str, /// the type scheme of the main function (required by the platform) /// (currently unused) @@ -2845,7 +2845,7 @@ fn send_header<'a>( // For each of our imports, add an entry to deps_by_name // - // e.g. for `imports [ base.Foo.{ bar } ]`, add `Foo` to deps_by_name + // e.g. for `imports [ pf.Foo.{ bar } ]`, add `Foo` to deps_by_name // // Also build a list of imported_values_to_expose (like `bar` above.) for (qualified_module_name, exposed_idents, region) in imported.into_iter() { @@ -3066,7 +3066,7 @@ fn send_header_two<'a>( // For each of our imports, add an entry to deps_by_name // - // e.g. for `imports [ base.Foo.{ bar } ]`, add `Foo` to deps_by_name + // e.g. for `imports [ pf.Foo.{ bar } ]`, add `Foo` to deps_by_name // // Also build a list of imported_values_to_expose (like `bar` above.) for (qualified_module_name, exposed_idents, region) in imported.into_iter() { @@ -4428,7 +4428,7 @@ fn to_missing_platform_report(module_id: ModuleId, other: PlatformPath) -> Strin alloc.reflow("I could not find a platform based on your input file."), alloc.reflow(r"Does the module header contain an entry that looks like this:"), alloc - .parser_suggestion(" packages { base: \"platform\" }") + .parser_suggestion(" packages { pf: \"platform\" }") .indent(4), alloc.reflow("See also TODO."), ]); diff --git a/compiler/module/src/symbol.rs b/compiler/module/src/symbol.rs index 4f16dba41c..d6e75aadc6 100644 --- a/compiler/module/src/symbol.rs +++ b/compiler/module/src/symbol.rs @@ -359,7 +359,7 @@ impl fmt::Debug for ModuleId { } } -/// base.Task +/// pf.Task /// 1. build mapping from short name to package /// 2. when adding new modules from package we need to register them in some other map (this module id goes with short name) (shortname, module-name) -> moduleId /// 3. pass this around to other modules getting headers parsed. when parsing interfaces we need to use this map to reference shortnames diff --git a/compiler/parse/src/header.rs b/compiler/parse/src/header.rs index abcf0aafd8..0c01805f9f 100644 --- a/compiler/parse/src/header.rs +++ b/compiler/parse/src/header.rs @@ -204,7 +204,7 @@ pub enum ImportsEntry<'a> { Collection<'a, Loc>>, ), - /// e.g. `base.Task` or `base.Task.{ after }` or `base.{ Task.{ Task, after } }` + /// e.g. `pf.Task` or `pf.Task.{ after }` or `pf.{ Task.{ Task, after } }` Package( &'a str, ModuleName<'a>, diff --git a/compiler/parse/src/module.rs b/compiler/parse/src/module.rs index 256a3c18e6..ed5f2528f3 100644 --- a/compiler/parse/src/module.rs +++ b/compiler/parse/src/module.rs @@ -786,7 +786,7 @@ fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>, EImports> { map_with_arena!( and!( and!( - // e.g. `base.` + // e.g. `pf.` maybe!(skip_second!( shortname(), word1(b'.', EImports::ShorthandDot) diff --git a/compiler/parse/tests/snapshots/pass/full_app_header.header.roc b/compiler/parse/tests/snapshots/pass/full_app_header.header.roc index ce81012e75..5d8b13d8bb 100644 --- a/compiler/parse/tests/snapshots/pass/full_app_header.header.roc +++ b/compiler/parse/tests/snapshots/pass/full_app_header.header.roc @@ -1,4 +1,4 @@ app "quicksort" - packages { base: "./platform" } + packages { pf: "./platform" } imports [ foo.Bar.Baz ] - provides [ quicksort ] to base + provides [ quicksort ] to pf diff --git a/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.roc b/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.roc index 7e5398b845..9993a66daa 100644 --- a/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.roc +++ b/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.roc @@ -1,8 +1,8 @@ app "quicksort" - packages { base: "./platform", } + packages { pf: "./platform", } imports [ foo.Bar.{ Baz, FortyTwo, # I'm a happy comment } ] - provides [ quicksort, ] to base + provides [ quicksort, ] to pf diff --git a/docs/tests/insert_syntax_highlighting.rs b/docs/tests/insert_syntax_highlighting.rs index ad75f0a64a..0cc30c2b4a 100644 --- a/docs/tests/insert_syntax_highlighting.rs +++ b/docs/tests/insert_syntax_highlighting.rs @@ -58,9 +58,9 @@ mod insert_doc_syntax_highlighting { pub const HELLO_WORLD: &str = r#" app "test-app" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ main ] to base + provides [ main ] to pf main = "Hello, world!" diff --git a/editor/src/editor/resources/strings.rs b/editor/src/editor/resources/strings.rs index 44f9546811..df130f4bf0 100644 --- a/editor/src/editor/resources/strings.rs +++ b/editor/src/editor/resources/strings.rs @@ -17,9 +17,9 @@ For convenience and consistency, there is only one way to format roc. pub const HELLO_WORLD: &str = r#" app "test-app" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ main ] to base + provides [ main ] to pf main = "Hello, world!" diff --git a/examples/benchmarks/CFold.roc b/examples/benchmarks/CFold.roc index f29be78d9e..2fabe8f693 100644 --- a/examples/benchmarks/CFold.roc +++ b/examples/benchmarks/CFold.roc @@ -1,7 +1,7 @@ app "cfold" - packages { base: "platform" } - imports [base.Task] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task] + provides [ main ] to pf # adapted from https://github.com/koka-lang/koka/blob/master/test/bench/haskell/cfold.hs diff --git a/examples/benchmarks/Closure.roc b/examples/benchmarks/Closure.roc index 8e61ca4dfb..32483b85c8 100644 --- a/examples/benchmarks/Closure.roc +++ b/examples/benchmarks/Closure.roc @@ -1,7 +1,7 @@ app "closure" - packages { base: "platform" } - imports [base.Task] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task] + provides [ main ] to pf # see https://github.com/rtfeldman/roc/issues/985 diff --git a/examples/benchmarks/Deriv.roc b/examples/benchmarks/Deriv.roc index 564163aa5f..506ddeb654 100644 --- a/examples/benchmarks/Deriv.roc +++ b/examples/benchmarks/Deriv.roc @@ -1,7 +1,7 @@ app "deriv" - packages { base: "platform" } - imports [base.Task] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task] + provides [ main ] to pf # based on: https://github.com/koka-lang/koka/blob/master/test/bench/haskell/deriv.hs diff --git a/examples/benchmarks/NQueens.roc b/examples/benchmarks/NQueens.roc index bff4245709..7e0e9c656f 100644 --- a/examples/benchmarks/NQueens.roc +++ b/examples/benchmarks/NQueens.roc @@ -1,7 +1,7 @@ app "nqueens" - packages { base: "platform" } - imports [base.Task] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task] + provides [ main ] to pf main : Task.Task {} [] main = diff --git a/examples/benchmarks/QuicksortApp.roc b/examples/benchmarks/QuicksortApp.roc index a1290d2fae..6f8ffdfec8 100644 --- a/examples/benchmarks/QuicksortApp.roc +++ b/examples/benchmarks/QuicksortApp.roc @@ -1,7 +1,7 @@ app "quicksortapp" - packages { base: "platform" } - imports [base.Task, Quicksort] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task, Quicksort] + provides [ main ] to pf main : Task.Task {} [] main = diff --git a/examples/benchmarks/RBTreeCk.roc b/examples/benchmarks/RBTreeCk.roc index 8f3f735ad3..2eb8a147bf 100644 --- a/examples/benchmarks/RBTreeCk.roc +++ b/examples/benchmarks/RBTreeCk.roc @@ -1,7 +1,7 @@ app "rbtree-ck" - packages { base: "platform" } - imports [base.Task] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task] + provides [ main ] to pf Color : [ Red, Black ] diff --git a/examples/benchmarks/RBTreeDel.roc b/examples/benchmarks/RBTreeDel.roc index 97ebb3bacf..c0717ca7aa 100644 --- a/examples/benchmarks/RBTreeDel.roc +++ b/examples/benchmarks/RBTreeDel.roc @@ -1,7 +1,7 @@ app "rbtree-del" - packages { base: "platform" } - imports [base.Task] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task] + provides [ main ] to pf Color : [ Red, Black ] diff --git a/examples/benchmarks/RBTreeInsert.roc b/examples/benchmarks/RBTreeInsert.roc index d938ecc1d0..cb70816159 100644 --- a/examples/benchmarks/RBTreeInsert.roc +++ b/examples/benchmarks/RBTreeInsert.roc @@ -1,7 +1,7 @@ app "rbtree-insert" - packages { base: "platform" } - imports [base.Task] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task] + provides [ main ] to pf main : Task.Task {} [] main = diff --git a/examples/benchmarks/TestAStar.roc b/examples/benchmarks/TestAStar.roc index f906a2b7bb..4c5b80fe89 100644 --- a/examples/benchmarks/TestAStar.roc +++ b/examples/benchmarks/TestAStar.roc @@ -1,7 +1,7 @@ app "test-astar" - packages { base: "platform" } - imports [base.Task, AStar] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task, AStar] + provides [ main ] to pf main : Task.Task {} [] main = diff --git a/examples/benchmarks/TestBase64.roc b/examples/benchmarks/TestBase64.roc index 3259eb057e..75970f9bc6 100644 --- a/examples/benchmarks/TestBase64.roc +++ b/examples/benchmarks/TestBase64.roc @@ -1,7 +1,7 @@ app "test-base64" - packages { base: "platform" } - imports [base.Task, Base64 ] - provides [ main ] to base + packages { pf: "platform" } + imports [pf.Task, Base64 ] + provides [ main ] to pf IO a : Task.Task a [] diff --git a/examples/cli/Echo.roc b/examples/cli/Echo.roc index 1dbb742a07..0a66aa2b35 100644 --- a/examples/cli/Echo.roc +++ b/examples/cli/Echo.roc @@ -1,9 +1,9 @@ #!/usr/bin/env roc app "echo" - packages { base: "platform" } - imports [ base.Task.{ Task, await }, base.Stdout, base.Stdin ] - provides [ main ] to base + packages { pf: "platform" } + imports [ pf.Task.{ Task, await }, pf.Stdout, pf.Stdin ] + provides [ main ] to pf main : Task {} * main = diff --git a/examples/effect/Main.roc b/examples/effect/Main.roc index 15eb6ef6e8..a0fce9d1fd 100644 --- a/examples/effect/Main.roc +++ b/examples/effect/Main.roc @@ -1,7 +1,7 @@ app "effect-example" - packages { base: "thing/platform-dir" } + packages { pf: "thing/platform-dir" } imports [fx.Effect] - provides [ main ] to base + provides [ main ] to pf main : Effect.Effect {} main = diff --git a/examples/false-interpreter/Context.roc b/examples/false-interpreter/Context.roc index 75c702acd3..42a17d097a 100644 --- a/examples/false-interpreter/Context.roc +++ b/examples/false-interpreter/Context.roc @@ -1,6 +1,6 @@ interface Context exposes [ Context, Data, with, getChar, Option, pushStack, popStack, toStr, inWhileScope ] - imports [ base.File, base.Task.{ Task }, Variable.{ Variable } ] + imports [ pf.File, pf.Task.{ Task }, Variable.{ Variable } ] Option a : [ Some a, None ] diff --git a/examples/false-interpreter/False.roc b/examples/false-interpreter/False.roc index 632b9905cb..87d8fdf979 100644 --- a/examples/false-interpreter/False.roc +++ b/examples/false-interpreter/False.roc @@ -1,8 +1,8 @@ #!/usr/bin/env roc app "false" - packages { base: "platform" } - imports [ base.Task.{ Task }, base.Stdout, base.Stdin, Context.{ Context }, Variable.{ Variable } ] - provides [ main ] to base + packages { pf: "platform" } + imports [ pf.Task.{ Task }, pf.Stdout, pf.Stdin, Context.{ Context }, Variable.{ Variable } ] + provides [ main ] to pf # An interpreter for the False programming language: https://strlen.com/false-language/ # This is just a silly example to test this variety of program. diff --git a/examples/fib/Fib.roc b/examples/fib/Fib.roc index e5098a023b..2bf4489529 100644 --- a/examples/fib/Fib.roc +++ b/examples/fib/Fib.roc @@ -1,7 +1,7 @@ app "fib" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ main ] to base + provides [ main ] to pf main = \n -> fib n 0 1 diff --git a/examples/hello-rust/Hello.roc b/examples/hello-rust/Hello.roc index cd7092308d..19be5569f1 100644 --- a/examples/hello-rust/Hello.roc +++ b/examples/hello-rust/Hello.roc @@ -1,7 +1,7 @@ app "hello-rust" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ main ] to base + provides [ main ] to pf greeting = hi = "Hello" diff --git a/examples/hello-swift/Hello.roc b/examples/hello-swift/Hello.roc index d12af0371a..a733c57efd 100644 --- a/examples/hello-swift/Hello.roc +++ b/examples/hello-swift/Hello.roc @@ -1,7 +1,7 @@ app "hello-swift" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ main ] to base + provides [ main ] to pf main = host = "Swift" diff --git a/examples/hello-web/Hello.roc b/examples/hello-web/Hello.roc index 49f05ceacf..600e119848 100644 --- a/examples/hello-web/Hello.roc +++ b/examples/hello-web/Hello.roc @@ -1,7 +1,7 @@ app "hello-web" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ main ] to base + provides [ main ] to pf greeting = hi = "Hello" diff --git a/examples/hello-world/Hello.roc b/examples/hello-world/Hello.roc index 1fe1406ce5..de5250ff5f 100644 --- a/examples/hello-world/Hello.roc +++ b/examples/hello-world/Hello.roc @@ -1,6 +1,6 @@ app "hello-world" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ main ] to base + provides [ main ] to pf main = "Hello, World!\n" diff --git a/examples/hello-zig/Hello.roc b/examples/hello-zig/Hello.roc index b27d53cf8c..59bff71388 100644 --- a/examples/hello-zig/Hello.roc +++ b/examples/hello-zig/Hello.roc @@ -1,7 +1,7 @@ app "hello-world" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ main ] to base + provides [ main ] to pf greeting = hi = "Hello" diff --git a/examples/quicksort/Quicksort.roc b/examples/quicksort/Quicksort.roc index 08d8320997..4510196998 100644 --- a/examples/quicksort/Quicksort.roc +++ b/examples/quicksort/Quicksort.roc @@ -1,7 +1,7 @@ app "quicksort" - packages { base: "platform" } + packages { pf: "platform" } imports [] - provides [ quicksort ] to base + provides [ quicksort ] to pf quicksort = \originalList -> n = List.len originalList diff --git a/reporting/tests/test_reporting.rs b/reporting/tests/test_reporting.rs index 948860825c..79ff49682d 100644 --- a/reporting/tests/test_reporting.rs +++ b/reporting/tests/test_reporting.rs @@ -6048,9 +6048,9 @@ I need all branches in an `if` to have the same type! indoc!( r#" app "test-base64" - packages { base: "platform" } - imports [base.Task, Base64 ] - provides [ main, @Foo ] to base + packages { pf: "platform" } + imports [pf.Task, Base64 ] + provides [ main, @Foo ] to pf "# ), indoc!( @@ -6059,8 +6059,8 @@ I need all branches in an `if` to have the same type! I am partway through parsing a provides list, but I got stuck here: - 3│ imports [base.Task, Base64 ] - 4│ provides [ main, @Foo ] to base + 3│ imports [pf.Task, Base64 ] + 4│ provides [ main, @Foo ] to pf ^ I was expecting a type name, value name or function name next, like @@ -6116,7 +6116,7 @@ I need all branches in an `if` to have the same type! r#" interface Foobar exposes [ main, @Foo ] - imports [base.Task, Base64 ] + imports [pf.Task, Base64 ] "# ), indoc!( @@ -6144,7 +6144,7 @@ I need all branches in an `if` to have the same type! r#" interface foobar exposes [ main, @Foo ] - imports [base.Task, Base64 ] + imports [pf.Task, Base64 ] "# ), indoc!( @@ -6170,7 +6170,7 @@ I need all branches in an `if` to have the same type! r#" app foobar exposes [ main, @Foo ] - imports [base.Task, Base64 ] + imports [pf.Task, Base64 ] "# ), indoc!( From 4f4bd80ebb5f16f5497721cfc4e71198387f88eb Mon Sep 17 00:00:00 2001 From: Jan Van Bruggen Date: Sun, 12 Dec 2021 06:05:43 -0700 Subject: [PATCH 43/57] Fix some `packages { ... }` braces in tutorial --- TUTORIAL.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TUTORIAL.md b/TUTORIAL.md index 89b7ddf00b..789e66b8b4 100644 --- a/TUTORIAL.md +++ b/TUTORIAL.md @@ -1053,7 +1053,7 @@ Let's take a closer look at the part of `Hello.roc` above `main`: ```coffee app "hello" - packages [ pf: "examples/cli/platform" ] + packages { pf: "examples/cli/platform" } imports [ pf.Stdout ] provides main to pf ``` @@ -1071,12 +1071,12 @@ without running it by running `roc build Hello.roc`. The remaining lines all involve the *platform* this application is built on: ```coffee -packages [ pf: "examples/cli/platform" ] +packages { pf: "examples/cli/platform" } imports [ pf.Stdout ] provides main to pf ``` -The `packages [ pf: "examples/cli/platform" ]` part says two things: +The `packages { pf: "examples/cli/platform" }` part says two things: - We're going to be using a *package* (that is, a collection of modules) called `"examples/cli/platform"` - We're going to name that package `pf` so we can refer to it more concisely in the future. @@ -1099,7 +1099,7 @@ When we write `imports [ pf.Stdout ]`, it specifies that the `Stdout` module comes from the `pf` package. Since `pf` was the name we chose for the `examples/cli/platform` package -(when we wrote `packages [ pf: "examples/cli/platform" ]`), this `imports` line +(when we wrote `packages { pf: "examples/cli/platform" }`), this `imports` line tells the Roc compiler that when we call `Stdout.line`, it should look for that `line` function in the `Stdout` module of the `examples/cli/platform` package. From 136a8c64daaa4f11523c3d0bf0eb116404b0b04a Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Sun, 12 Dec 2021 16:19:06 -0500 Subject: [PATCH 44/57] Add Jan Van Bruggen to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 7053d22e0e..7d5a1e502f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -60,3 +60,4 @@ Yann Simon Shahn Hogan Tankor Smash Matthias Devlamynck +Jan Van Bruggen From f6ec1ebad0ed7b6854a80d130ed6b3e5aaf6d1dc Mon Sep 17 00:00:00 2001 From: Jan Van Bruggen Date: Sun, 12 Dec 2021 17:58:43 -0700 Subject: [PATCH 45/57] Rename `base` to `pf` in testing snapshots --- .../snapshots/pass/full_app_header.header.result-ast | 10 +++++----- .../full_app_header_trailing_commas.header.result-ast | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/compiler/parse/tests/snapshots/pass/full_app_header.header.result-ast b/compiler/parse/tests/snapshots/pass/full_app_header.header.result-ast index ae59f87b1d..e33441e9ea 100644 --- a/compiler/parse/tests/snapshots/pass/full_app_header.header.result-ast +++ b/compiler/parse/tests/snapshots/pass/full_app_header.header.result-ast @@ -4,10 +4,10 @@ App { "quicksort", ), packages: [ - |L 1-1, C 15-33| Entry { - shorthand: "base", + |L 1-1, C 15-31| Entry { + shorthand: "pf", spaces_after_shorthand: [], - package_or_path: |L 1-1, C 21-33| Path( + package_or_path: |L 1-1, C 19-31| Path( PlainLine( "./platform", ), @@ -28,8 +28,8 @@ App { "quicksort", ), ], - to: |L 3-3, C 30-34| ExistingPackage( - "base", + to: |L 3-3, C 30-32| ExistingPackage( + "pf", ), before_header: [], after_app_keyword: [], diff --git a/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.result-ast b/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.result-ast index da4c7707a8..8864727f1b 100644 --- a/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.result-ast +++ b/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.result-ast @@ -4,10 +4,10 @@ App { "quicksort", ), packages: [ - |L 1-1, C 15-33| Entry { - shorthand: "base", + |L 1-1, C 15-31| Entry { + shorthand: "pf", spaces_after_shorthand: [], - package_or_path: |L 1-1, C 21-33| Path( + package_or_path: |L 1-1, C 19-31| Path( PlainLine( "./platform", ), @@ -53,8 +53,8 @@ App { "quicksort", ), ], - to: |L 7-7, C 31-35| ExistingPackage( - "base", + to: |L 7-7, C 31-33| ExistingPackage( + "pf", ), before_header: [], after_app_keyword: [], From 6fcdc46c03586b3d9298e2c73eaad871a248843f Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Sun, 12 Dec 2021 20:28:06 -0800 Subject: [PATCH 46/57] Allow newlines in package entries --- compiler/load/src/file.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/compiler/load/src/file.rs b/compiler/load/src/file.rs index 7611f8c94e..45a1154495 100644 --- a/compiler/load/src/file.rs +++ b/compiler/load/src/file.rs @@ -23,13 +23,14 @@ use roc_mono::ir::{ UpdateModeIds, }; use roc_mono::layout::{Layout, LayoutCache, LayoutProblem}; -use roc_parse::ast::{self, StrLiteral, TypeAnnotation}; +use roc_parse::ast::{self, ExtractSpaces, StrLiteral, TypeAnnotation}; use roc_parse::header::{ ExposesEntry, ImportsEntry, PackageEntry, PackageOrPath, PlatformHeader, To, TypedIdent, }; use roc_parse::module::module_defs; use roc_parse::parser::{self, ParseProblem, Parser, SyntaxError}; use roc_region::all::{Located, Region}; +use roc_reporting::internal_error; use roc_solve::module::SolvedModule; use roc_solve::solve; use roc_types::solved_types::Solved; @@ -2605,9 +2606,9 @@ fn parse_header<'a>( let opt_base_package = packages.iter().find(|loc_package_entry| { let Located { value, .. } = loc_package_entry; - match value { - PackageEntry::Entry { shorthand, .. } => shorthand == &existing_package, - _ => false, + match value.extract_spaces().item { + PackageEntry::Entry { shorthand, .. } => shorthand == existing_package, + _ => internal_error!(), } }); From 594fe9124dca5cc308c7a1b208141895cd492bff Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Sun, 12 Dec 2021 22:08:16 +0000 Subject: [PATCH 47/57] Wasm support for 128-bit number literals, isFinite, ==, and != --- compiler/gen_wasm/src/backend.rs | 88 +++++++++------- compiler/gen_wasm/src/low_level.rs | 160 +++++++++++++++++++++++------ compiler/test_gen/src/gen_num.rs | 12 +-- 3 files changed, 183 insertions(+), 77 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index d9e0aefc5d..2ef65ff5e6 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -977,14 +977,11 @@ impl<'a> WasmBackend<'a> { }; } - StoredValue::StackMemory { location, .. } => match lit { - Literal::Decimal(decimal) => { + StoredValue::StackMemory { location, .. } => { + let mut write128 = |lower_bits, upper_bits| { let (local_id, offset) = location.local_and_offset(self.storage.stack_frame_pointer); - let lower_bits = decimal.0 as i64; - let upper_bits = (decimal.0 >> 64) as i64; - self.code_builder.get_local(local_id); self.code_builder.i64_const(lower_bits); self.code_builder.i64_store(Align::Bytes8, offset); @@ -992,39 +989,56 @@ impl<'a> WasmBackend<'a> { self.code_builder.get_local(local_id); self.code_builder.i64_const(upper_bits); self.code_builder.i64_store(Align::Bytes8, offset + 8); + }; + + match lit { + Literal::Decimal(decimal) => { + let lower_bits = (decimal.0 & 0xffff_ffff_ffff_ffff) as i64; + let upper_bits = (decimal.0 >> 64) as i64; + write128(lower_bits, upper_bits); + } + Literal::Int(x) => { + let lower_bits = (*x & 0xffff_ffff_ffff_ffff) as i64; + let upper_bits = (*x >> 64) as i64; + write128(lower_bits, upper_bits); + } + Literal::Float(_) => { + // Also not implemented in LLVM backend (nor in Rust!) + todo!("f128 type"); + } + Literal::Str(string) => { + let (local_id, offset) = + location.local_and_offset(self.storage.stack_frame_pointer); + + let len = string.len(); + if len < 8 { + let mut stack_mem_bytes = [0; 8]; + stack_mem_bytes[0..len].clone_from_slice(string.as_bytes()); + stack_mem_bytes[7] = 0x80 | (len as u8); + let str_as_int = i64::from_le_bytes(stack_mem_bytes); + + // Write all 8 bytes at once using an i64 + // Str is normally two i32's, but in this special case, we can get away with fewer instructions + self.code_builder.get_local(local_id); + self.code_builder.i64_const(str_as_int); + self.code_builder.i64_store(Align::Bytes4, offset); + } else { + let (linker_sym_index, elements_addr) = + self.lookup_string_constant(string, sym, layout); + + self.code_builder.get_local(local_id); + self.code_builder + .i32_const_mem_addr(elements_addr, linker_sym_index); + self.code_builder.i32_store(Align::Bytes4, offset); + + self.code_builder.get_local(local_id); + self.code_builder.i32_const(string.len() as i32); + self.code_builder.i32_store(Align::Bytes4, offset + 4); + }; + } + _ => not_supported_error(), } - Literal::Str(string) => { - let (local_id, offset) = - location.local_and_offset(self.storage.stack_frame_pointer); - - let len = string.len(); - if len < 8 { - let mut stack_mem_bytes = [0; 8]; - stack_mem_bytes[0..len].clone_from_slice(string.as_bytes()); - stack_mem_bytes[7] = 0x80 | (len as u8); - let str_as_int = i64::from_le_bytes(stack_mem_bytes); - - // Write all 8 bytes at once using an i64 - // Str is normally two i32's, but in this special case, we can get away with fewer instructions - self.code_builder.get_local(local_id); - self.code_builder.i64_const(str_as_int); - self.code_builder.i64_store(Align::Bytes4, offset); - } else { - let (linker_sym_index, elements_addr) = - self.lookup_string_constant(string, sym, layout); - - self.code_builder.get_local(local_id); - self.code_builder - .i32_const_mem_addr(elements_addr, linker_sym_index); - self.code_builder.i32_store(Align::Bytes4, offset); - - self.code_builder.get_local(local_id); - self.code_builder.i32_const(string.len() as i32); - self.code_builder.i32_store(Align::Bytes4, offset + 4); - }; - } - _ => not_supported_error(), - }, + } _ => not_supported_error(), }; diff --git a/compiler/gen_wasm/src/low_level.rs b/compiler/gen_wasm/src/low_level.rs index cd9adaaf24..f64e2d632d 100644 --- a/compiler/gen_wasm/src/low_level.rs +++ b/compiler/gen_wasm/src/low_level.rs @@ -5,7 +5,7 @@ use roc_reporting::internal_error; use crate::layout::{StackMemoryFormat::*, WasmLayout}; use crate::storage::{Storage, StoredValue}; -use crate::wasm_module::{CodeBuilder, ValueType::*}; +use crate::wasm_module::{Align, CodeBuilder, ValueType::*}; pub enum LowlevelBuildResult { Done, @@ -17,7 +17,7 @@ pub fn decode_low_level<'a>( code_builder: &mut CodeBuilder<'a>, storage: &mut Storage<'a>, lowlevel: LowLevel, - args: &'a [Symbol], + args: &[Symbol], ret_layout: &WasmLayout, ) -> LowlevelBuildResult { use LowlevelBuildResult::*; @@ -81,8 +81,6 @@ pub fn decode_low_level<'a>( WasmLayout::Primitive(value_type, size) => match value_type { I32 => { code_builder.i32_add(); - // TODO: is *deliberate* wrapping really in the spirit of things? - // The point of choosing NumAddWrap is to go fast by skipping checks, but we're making it slower. wrap_i32(code_builder, *size); } I64 => code_builder.i64_add(), @@ -347,27 +345,57 @@ pub fn decode_low_level<'a>( }, WasmLayout::StackMemory { .. } => return NotImplemented, }, - NumIsFinite => match ret_layout { - WasmLayout::Primitive(value_type, _) => match value_type { - I32 => code_builder.i32_const(1), - I64 => code_builder.i32_const(1), - F32 => { - code_builder.i32_reinterpret_f32(); - code_builder.i32_const(0x7f800000); - code_builder.i32_and(); - code_builder.i32_const(0x7f800000); - code_builder.i32_ne(); + NumIsFinite => { + use StoredValue::*; + match storage.get(&args[0]) { + VirtualMachineStack { value_type, .. } | Local { value_type, .. } => { + match value_type { + I32 => code_builder.i32_const(1), + I64 => code_builder.i32_const(1), + F32 => { + code_builder.i32_reinterpret_f32(); + code_builder.i32_const(0x7f80_0000); + code_builder.i32_and(); + code_builder.i32_const(0x7f80_0000); + code_builder.i32_ne(); + } + F64 => { + code_builder.i64_reinterpret_f64(); + code_builder.i64_const(0x7ff0_0000_0000_0000); + code_builder.i64_and(); + code_builder.i64_const(0x7ff0_0000_0000_0000); + code_builder.i64_ne(); + } + } } - F64 => { - code_builder.i64_reinterpret_f64(); - code_builder.i64_const(0x7ff0000000000000); - code_builder.i64_and(); - code_builder.i64_const(0x7ff0000000000000); - code_builder.i64_ne(); + StackMemory { + format, location, .. + } => { + let (local_id, offset) = location.local_and_offset(storage.stack_frame_pointer); + + match format { + Int128 => code_builder.i32_const(1), + Float128 => { + code_builder.get_local(local_id); + code_builder.i64_load(Align::Bytes4, offset + 8); + code_builder.i64_const(0x7fff_0000_0000_0000); + code_builder.i64_and(); + code_builder.i64_const(0x7fff_0000_0000_0000); + code_builder.i64_ne(); + } + Decimal => { + code_builder.get_local(local_id); + code_builder.i64_load(Align::Bytes4, offset + 8); + code_builder.i64_const(0x7100_0000_0000_0000); + code_builder.i64_and(); + code_builder.i64_const(0x7100_0000_0000_0000); + code_builder.i64_ne(); + } + DataStructure => return NotImplemented, + } } - }, - WasmLayout::StackMemory { .. } => return NotImplemented, - }, + } + } NumAtan => { let width = float_width_from_layout(ret_layout); return BuiltinCall(&bitcode::NUM_ATAN[width]); @@ -468,16 +496,77 @@ pub fn decode_low_level<'a>( WasmLayout::StackMemory { .. } => return NotImplemented, } } - Eq => match storage.get(&args[0]) { - StoredValue::VirtualMachineStack { value_type, .. } - | StoredValue::Local { value_type, .. } => match value_type { - I32 => code_builder.i32_eq(), - I64 => code_builder.i64_eq(), - F32 => code_builder.f32_eq(), - F64 => code_builder.f64_eq(), - }, - StoredValue::StackMemory { .. } => return NotImplemented, - }, + Eq => { + use StoredValue::*; + match storage.get(&args[0]).to_owned() { + VirtualMachineStack { value_type, .. } | Local { value_type, .. } => { + match value_type { + I32 => code_builder.i32_eq(), + I64 => code_builder.i64_eq(), + F32 => code_builder.f32_eq(), + F64 => code_builder.f64_eq(), + } + } + StackMemory { + format, + location: location0, + .. + } => { + if let StackMemory { + location: location1, + .. + } = storage.get(&args[1]).to_owned() + { + let stack_frame_pointer = storage.stack_frame_pointer; + let compare_bytes = |code_builder: &mut CodeBuilder| { + let (local0, offset0) = location0.local_and_offset(stack_frame_pointer); + let (local1, offset1) = location1.local_and_offset(stack_frame_pointer); + + code_builder.get_local(local0); + code_builder.i64_load(Align::Bytes8, offset0); + code_builder.get_local(local1); + code_builder.i64_load(Align::Bytes8, offset1); + code_builder.i64_eq(); + + code_builder.get_local(local0); + code_builder.i64_load(Align::Bytes8, offset0 + 8); + code_builder.get_local(local1); + code_builder.i64_load(Align::Bytes8, offset1 + 8); + code_builder.i64_eq(); + + code_builder.i32_and(); + }; + + match format { + Float128 | Decimal => { + // Check both args are finite AND bytes are identical + let first = [args[0]]; + let second = [args[1]]; + decode_low_level( + code_builder, + storage, + LowLevel::NumIsFinite, + &first, + ret_layout, + ); + decode_low_level( + code_builder, + storage, + LowLevel::NumIsFinite, + &second, + ret_layout, + ); + code_builder.i32_and(); + compare_bytes(code_builder); + code_builder.i32_and(); + } + Int128 => compare_bytes(code_builder), + DataStructure => return NotImplemented, + } + } + } + } + } NotEq => match storage.get(&args[0]) { StoredValue::VirtualMachineStack { value_type, .. } | StoredValue::Local { value_type, .. } => match value_type { @@ -486,7 +575,10 @@ pub fn decode_low_level<'a>( F32 => code_builder.f32_ne(), F64 => code_builder.f64_ne(), }, - StoredValue::StackMemory { .. } => return NotImplemented, + StoredValue::StackMemory { .. } => { + decode_low_level(code_builder, storage, LowLevel::Eq, args, ret_layout); + code_builder.i32_eqz(); + } }, And => code_builder.i32_and(), Or => code_builder.i32_or(), diff --git a/compiler/test_gen/src/gen_num.rs b/compiler/test_gen/src/gen_num.rs index 5d997a3d43..c9ec3b7560 100644 --- a/compiler/test_gen/src/gen_num.rs +++ b/compiler/test_gen/src/gen_num.rs @@ -31,7 +31,7 @@ fn nat_alias() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn i128_signed_int_alias() { assert_evals_to!( indoc!( @@ -115,7 +115,7 @@ fn i8_signed_int_alias() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn i128_hex_int_alias() { assert_evals_to!( indoc!( @@ -741,7 +741,7 @@ fn gen_int_less_than() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn gen_dec_eq() { assert_evals_to!( indoc!( @@ -761,7 +761,7 @@ fn gen_dec_eq() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn gen_dec_neq() { assert_evals_to!( indoc!( @@ -864,7 +864,7 @@ fn gen_sub_i64() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn gen_mul_dec() { assert_evals_to!( indoc!( @@ -1830,7 +1830,7 @@ fn shift_right_zf_by() { } #[test] -#[cfg(any(feature = "gen-llvm"))] +#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))] fn max_i128() { assert_evals_to!( indoc!( From eeb8d7e9f1a687c8f9f6e4907b589711cff9870b Mon Sep 17 00:00:00 2001 From: Anton-4 <17049058+Anton-4@users.noreply.github.com> Date: Mon, 13 Dec 2021 20:27:32 +0100 Subject: [PATCH 48/57] Added builtins to docs --- cli_utils/Cargo.lock | 10 +++++----- compiler/builtins/docs/List.roc | 8 ++++++++ compiler/builtins/docs/Result.roc | 12 ++++++++++++ compiler/can/src/builtins.rs | 2 +- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/cli_utils/Cargo.lock b/cli_utils/Cargo.lock index 5fa0d0ee9b..852c98d3fb 100644 --- a/cli_utils/Cargo.lock +++ b/cli_utils/Cargo.lock @@ -1310,13 +1310,13 @@ dependencies = [ name = "inkwell" version = "0.1.0" dependencies = [ - "inkwell 0.1.0 (git+https://github.com/rtfeldman/inkwell?tag=llvm12-0.release8)", + "inkwell 0.1.0 (git+https://github.com/rtfeldman/inkwell?tag=llvm13-0.release1)", ] [[package]] name = "inkwell" version = "0.1.0" -source = "git+https://github.com/rtfeldman/inkwell?tag=llvm12-0.release8#14b78d96d2dbc95694e181be66e4cd53df3fc02f" +source = "git+https://github.com/rtfeldman/inkwell?tag=llvm13-0.release1#e15d665227b2acad4ca949820d80048e09f3f4e5" dependencies = [ "either", "inkwell_internals", @@ -1324,13 +1324,12 @@ dependencies = [ "llvm-sys", "once_cell", "parking_lot", - "regex", ] [[package]] name = "inkwell_internals" -version = "0.3.0" -source = "git+https://github.com/rtfeldman/inkwell?tag=llvm12-0.release8#14b78d96d2dbc95694e181be66e4cd53df3fc02f" +version = "0.5.0" +source = "git+https://github.com/rtfeldman/inkwell?tag=llvm13-0.release1#e15d665227b2acad4ca949820d80048e09f3f4e5" dependencies = [ "proc-macro2", "quote", @@ -2666,6 +2665,7 @@ dependencies = [ "roc_collections", "roc_module", "roc_mono", + "roc_reporting", "roc_std", "target-lexicon", ] diff --git a/compiler/builtins/docs/List.roc b/compiler/builtins/docs/List.roc index e30c0bfe45..fdbc498128 100644 --- a/compiler/builtins/docs/List.roc +++ b/compiler/builtins/docs/List.roc @@ -698,3 +698,11 @@ all : List elem, (elem -> Bool) -> Bool ## Returns the first element of the list satisfying a predicate function. ## If no satisfying element is found, an `Err NotFound` is returned. find : List elem, (elem -> Bool) -> Result elem [ NotFound ]* + +## Apply a function that returns a Result on a list, only successful +## Results are kept and returned unwrapped. +keepOks : List before, (before -> Result after *) -> List after + +## Apply a function that returns a Result on a list, only unsuccessful +## Results are kept and returned unwrapped. +keepErrs : List before, (before -> Result * after) -> List after diff --git a/compiler/builtins/docs/Result.roc b/compiler/builtins/docs/Result.roc index df56b27e66..0fe0426eb6 100644 --- a/compiler/builtins/docs/Result.roc +++ b/compiler/builtins/docs/Result.roc @@ -2,6 +2,8 @@ interface Result exposes [ Result, + isOk, + isErr, map, mapErr, withDefault, @@ -13,6 +15,16 @@ interface Result ## okay, or else there was an error of some sort. Result ok err : [ @Result ok err ] +## Return True if the result indicates a success, else return False +## +## >>> Result.isOk (Ok 5) +isOk : Result * * -> bool + +## Return True if the result indicates a failure, else return False +## +## >>> Result.isErr (Err "uh oh") +isErr : Result * * -> bool + ## If the result is `Ok`, return the value it holds. Otherwise, return ## the given default value. ## diff --git a/compiler/can/src/builtins.rs b/compiler/can/src/builtins.rs index ff0eb823c4..a79b67cb56 100644 --- a/compiler/can/src/builtins.rs +++ b/compiler/can/src/builtins.rs @@ -3091,7 +3091,7 @@ fn list_keep_errs(symbol: Symbol, var_store: &mut VarStore) -> Def { lowlevel_2(symbol, LowLevel::ListKeepErrs, var_store) } -/// List.keepErrs: List before, (before -> Result * after) -> List after +/// List.range: Int a, Int a -> List (Int a) fn list_range(symbol: Symbol, var_store: &mut VarStore) -> Def { lowlevel_2(symbol, LowLevel::ListRange, var_store) } From cca4acf728dd1f6d09abe6a5f41723e3656641aa Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Mon, 13 Dec 2021 22:09:13 +0000 Subject: [PATCH 49/57] Remove f128 equality implementation --- compiler/gen_wasm/src/low_level.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/compiler/gen_wasm/src/low_level.rs b/compiler/gen_wasm/src/low_level.rs index f64e2d632d..feb2f81dda 100644 --- a/compiler/gen_wasm/src/low_level.rs +++ b/compiler/gen_wasm/src/low_level.rs @@ -538,8 +538,8 @@ pub fn decode_low_level<'a>( }; match format { - Float128 | Decimal => { - // Check both args are finite AND bytes are identical + Decimal => { + // Both args are finite let first = [args[0]]; let second = [args[1]]; decode_low_level( @@ -557,11 +557,13 @@ pub fn decode_low_level<'a>( ret_layout, ); code_builder.i32_and(); + + // AND they have the same bytes compare_bytes(code_builder); code_builder.i32_and(); } Int128 => compare_bytes(code_builder), - DataStructure => return NotImplemented, + Float128 | DataStructure => return NotImplemented, } } } From c783446567b425bc1fdf19afd7541510d2114e16 Mon Sep 17 00:00:00 2001 From: Jan Van Bruggen Date: Mon, 13 Dec 2021 18:43:24 -0700 Subject: [PATCH 50/57] Remove duplicate `dropLast` & `all` in `List` docs --- compiler/builtins/docs/List.roc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/compiler/builtins/docs/List.roc b/compiler/builtins/docs/List.roc index e30c0bfe45..6f773aaec3 100644 --- a/compiler/builtins/docs/List.roc +++ b/compiler/builtins/docs/List.roc @@ -446,9 +446,6 @@ drop : List elem, Nat -> List elem ## To replace the element at a given index, instead of dropping it, see [List.set]. dropAt : List elem, Nat -> List elem -## Drops the last element in a List. -dropLast : List elem -> List elem - ## Adds a new element to the end of the list. ## ## >>> List.append [ "a", "b" ] "c" @@ -685,8 +682,6 @@ startsWith : List elem, List elem -> Bool endsWith : List elem, List elem -> Bool -all : List elem, (elem -> Bool) -> Bool - ## Run the given predicate on each element of the list, returning `True` if ## any of the elements satisfy it. any : List elem, (elem -> Bool) -> Bool From ba328aa30f5154326b97ed92a09d97b94847b5f8 Mon Sep 17 00:00:00 2001 From: Jan Van Bruggen Date: Mon, 13 Dec 2021 18:48:25 -0700 Subject: [PATCH 51/57] Add missing section headers to `Set` docs This emulates [the section headers in `List` docs](https://github.com/rtfeldman/roc/blob/09c1222b280d986bf66946cea0feb7da4de69a5f/compiler/builtins/docs/List.roc#L216). --- compiler/builtins/docs/Set.roc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compiler/builtins/docs/Set.roc b/compiler/builtins/docs/Set.roc index eb8e9722d7..608b21a9a1 100644 --- a/compiler/builtins/docs/Set.roc +++ b/compiler/builtins/docs/Set.roc @@ -29,6 +29,8 @@ isEmpty : Set * -> Bool len : Set * -> Nat +## Modify + # TODO: removed `'` from signature because parser does not support it yet # Original signature: `add : Set 'elem, 'elem -> Set 'elem` ## Make sure never to add a *NaN* to a [Set]! Because *NaN* is defined to be @@ -41,6 +43,8 @@ add : Set elem, elem -> Set elem # Original signature: `drop : Set 'elem, 'elem -> Set 'elem` drop : Set elem, elem -> Set elem +## Transform + ## Convert each element in the set to something new, by calling a conversion ## function on each of them. Then return a new set of the converted values. ## From e4b2c91eb478b34e734daa41d1ceec8837003bf9 Mon Sep 17 00:00:00 2001 From: Anton-4 <17049058+Anton-4@users.noreply.github.com> Date: Tue, 14 Dec 2021 16:35:09 +0100 Subject: [PATCH 52/57] quilified WhenBranch --- compiler/can/src/builtins.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/compiler/can/src/builtins.rs b/compiler/can/src/builtins.rs index ff0eb823c4..4bbad8d1c5 100644 --- a/compiler/can/src/builtins.rs +++ b/compiler/can/src/builtins.rs @@ -1,6 +1,6 @@ use crate::def::Def; -use crate::expr::{ClosureData, Expr::*}; -use crate::expr::{Expr, Field, Recursive, WhenBranch}; +use crate::expr::{ClosureData, Expr::*, self}; +use crate::expr::{Expr, Field, Recursive}; use crate::pattern::Pattern; use roc_collections::all::SendMap; use roc_module::called_via::CalledVia; @@ -4107,7 +4107,7 @@ fn result_map(symbol: Symbol, var_store: &mut VarStore) -> Def { )], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(ok), guard: None, @@ -4137,7 +4137,7 @@ fn result_map(symbol: Symbol, var_store: &mut VarStore) -> Def { )], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(err), guard: None, @@ -4204,7 +4204,7 @@ fn result_map_err(symbol: Symbol, var_store: &mut VarStore) -> Def { )], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(ok), guard: None, @@ -4234,7 +4234,7 @@ fn result_map_err(symbol: Symbol, var_store: &mut VarStore) -> Def { )], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(err), guard: None, @@ -4277,7 +4277,7 @@ fn result_with_default(symbol: Symbol, var_store: &mut VarStore) -> Def { arguments: vec![(ret_var, no_region(Pattern::Identifier(Symbol::ARG_3)))], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(Var(Symbol::ARG_3)), guard: None, @@ -4297,7 +4297,7 @@ fn result_with_default(symbol: Symbol, var_store: &mut VarStore) -> Def { arguments: vec![(var_store.fresh(), no_region(Pattern::Underscore))], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(Var(Symbol::ARG_2)), guard: None, @@ -4347,7 +4347,7 @@ fn result_is_err(symbol: Symbol, var_store: &mut VarStore) -> Def { arguments: vec![], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(false_expr), guard: None, @@ -4374,7 +4374,7 @@ fn result_is_err(symbol: Symbol, var_store: &mut VarStore) -> Def { arguments: vec![], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(true_expr), guard: None, @@ -4424,7 +4424,7 @@ fn result_is_ok(symbol: Symbol, var_store: &mut VarStore) -> Def { arguments: vec![], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(true_expr), guard: None, @@ -4451,7 +4451,7 @@ fn result_is_ok(symbol: Symbol, var_store: &mut VarStore) -> Def { arguments: vec![], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(false_expr), guard: None, @@ -4513,7 +4513,7 @@ fn result_after(symbol: Symbol, var_store: &mut VarStore) -> Def { )], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(ok), guard: None, @@ -4543,7 +4543,7 @@ fn result_after(symbol: Symbol, var_store: &mut VarStore) -> Def { )], }; - let branch = WhenBranch { + let branch = expr::WhenBranch { patterns: vec![no_region(pattern)], value: no_region(err), guard: None, From 3736e18f1a4d75eac28dfc3392b8625a0a6ab13e Mon Sep 17 00:00:00 2001 From: Anton-4 <17049058+Anton-4@users.noreply.github.com> Date: Tue, 14 Dec 2021 19:45:11 +0100 Subject: [PATCH 53/57] added editor documentation --- CONTRIBUTING.md | 1 + editor/README.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1b4b0a3214..2858e4402d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,6 +22,7 @@ Earthly may temporarily use a lot of disk space, up to 90 GB. This disk space is - Before making your first pull request, definitely talk to an existing contributor on [Roc Zulip](https://roc.zulipchat.com) first about what you plan to do! This can not only avoid duplicated effort, it can also avoid making a whole PR only to discover it won't be accepted because the change doesn't fit with the goals of the language's design or implementation. - It's a good idea to open a work-in-progress pull request as you begin working on something. This way, others can see that you're working on it, which avoids duplicate effort, and others can give feedback sooner rather than later if they notice a problem in the direction things are going. Be sure to include "WIP" in the title of the PR as long as it's not ready for review! - Make sure to create a branch on the roc repository for your changes. We do not allow CI to be run on forks for security. +- You find good first issues [here](https://github.com/rtfeldman/roc/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). ## Can we do better? diff --git a/editor/README.md b/editor/README.md index c5b3116e45..24ca818e9c 100644 --- a/editor/README.md +++ b/editor/README.md @@ -1,7 +1,7 @@ The editor is a work in progress, only a limited subset of Roc expressions are currently supported. -Unlike most editors, we use projectional or structural editing to edit the [Abstract Syntax Tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree) directly. This will allow for cool features like excellent auto-complete and refactoring. +Unlike most editors, we use projectional or structural editing to edit the [Abstract Syntax Tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree) directly. This will allow for cool features like excellent auto-complete, refactoring and never needing to format your code. ## Getting started @@ -29,3 +29,46 @@ We thank the following open source projects in particular for inspiring us when - [rgx](https://github.com/cloudhead/rgx) - [elm-editor](https://github.com/jxxcarlson/elm-editor) - [iced](https://github.com/hecrj/iced) + +## How does it work? + +To take a look behind the scenes, open the editor with `./roc edit` or `cargo run edit` and press F11. +This debug view shows important data structures that can be found in `editor/src/editor/mvc/ed_model.rs`. +Add or delete some code to see how these data structures are updated. + +From roc to render: +- `./roc edit` or `cargo run edit` is first handled in `cli/src/main.rs`, from there the editor's launch function is called (`editor/src/editor/main.rs`). +- In `run_event_loop` we initialize the winit window, wgpu, the editor's model(`EdModel`) and start the rendering loop. +- The `ed_model` is filled in part with data obtained by loading and typechecking the roc file with the same function (`load_and_typecheck`) that is used by the compiler. +- `ed_model` also contains an `EdModule`, which holds the parsed abstract syntax tree (AST). +- In the `init_model` function: + + The AST is converted into a tree of `MarkupNode`. The different types of `MarkupNode` are similar to the elements/nodes in HTML. A line of roc code is represented as a nested `MarkupNode` containing mostly text `MarkupNode`s. The line `foo = "bar"` is represented as + three text `MarkupNode` representing `foo`, ` = ` and `bar`. Multiple lines of roc code are represented as nested `MarkupNode` that contain other nested `MarkupNode`. + + `CodeLines` holds a `Vec` of `String`, each line of code is a `String`. When saving the file, the content of `CodeLines` is written to disk. + + `GridNodeMap` maps every position of a char of roc code to a `MarkNodeId`, for easy interaction with the caret. +- Back in `editor/src/editor/main.rs` we convert the `EdModel` to `RenderedWgpu` by calling `model_to_wgpu`. +- The `RenderedWgpu` is passed to the `glyph_brush` to draw the characters(glyphs) on the screen. + + +### Important files + +To understand how the editor works it is useful to know the most important files: +- editor/src/editor/main.rs +- editor/src/editor/mvc/ed_update.rs +- editor/src/editor/mvc/ed_model.rs +- editor/src/editor/mvc/ed_view.rs +- editor/src/editor/render_ast.rs +- editor/src/editor/render_debug.rs + +Important folders/files outside the editor folder: +- code_markup/src/markup/convert +- code_markup/src/markup/nodes.rs +- ast/src/lang/core/def +- ast/src/lang/core/expr +- ast/src/lang/core/ast.rs +- ast/src/lang/env.rs + +## Contributing + +We welcome new contributors :heart: and are happy to help you get started. +Check [CONTRIBUTING.md](../CONTRIBUTING.md) for more info. From 86c87640124dbe3eee4fa721fd31bd9289aafaa5 Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Mon, 13 Dec 2021 17:13:29 -0800 Subject: [PATCH 54/57] Detangle lifetime annotations for Formattable --- compiler/fmt/src/annotation.rs | 60 +++++++++++++------------- compiler/fmt/src/collection.rs | 6 +-- compiler/fmt/src/def.rs | 19 ++++++--- compiler/fmt/src/expr.rs | 44 +++++++++---------- compiler/fmt/src/module.rs | 78 ++++++++++++++++++---------------- compiler/fmt/src/pattern.rs | 13 ++++-- compiler/fmt/src/spaces.rs | 18 ++++---- 7 files changed, 126 insertions(+), 112 deletions(-) diff --git a/compiler/fmt/src/annotation.rs b/compiler/fmt/src/annotation.rs index 2fb1a90a1f..314c97c222 100644 --- a/compiler/fmt/src/annotation.rs +++ b/compiler/fmt/src/annotation.rs @@ -40,12 +40,12 @@ pub enum Newlines { No, } -pub trait Formattable<'a> { +pub trait Formattable { fn is_multiline(&self) -> bool; - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, _parens: Parens, _newlines: Newlines, indent: u16, @@ -53,23 +53,23 @@ pub trait Formattable<'a> { self.format(buf, indent); } - fn format(&self, buf: &mut Buf<'a>, indent: u16) { + fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { self.format_with_options(buf, Parens::NotNeeded, Newlines::No, indent); } } /// A reference to a formattable value is also formattable -impl<'a, T> Formattable<'a> for &'a T +impl<'a, T> Formattable for &'a T where - T: Formattable<'a>, + T: Formattable, { fn is_multiline(&self) -> bool { (*self).is_multiline() } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, parens: Parens, newlines: Newlines, indent: u16, @@ -77,23 +77,23 @@ where (*self).format_with_options(buf, parens, newlines, indent) } - fn format(&self, buf: &mut Buf<'a>, indent: u16) { + fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { (*self).format(buf, indent) } } /// A Located formattable value is also formattable -impl<'a, T> Formattable<'a> for Located +impl<'a, T> Formattable for Located where - T: Formattable<'a>, + T: Formattable, { fn is_multiline(&self) -> bool { self.value.is_multiline() } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, parens: Parens, newlines: Newlines, indent: u16, @@ -102,12 +102,12 @@ where .format_with_options(buf, parens, newlines, indent) } - fn format(&self, buf: &mut Buf<'a>, indent: u16) { + fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { self.value.format(buf, indent) } } -impl<'a> Formattable<'a> for TypeAnnotation<'a> { +impl<'a> Formattable for TypeAnnotation<'a> { fn is_multiline(&self) -> bool { use roc_parse::ast::TypeAnnotation::*; @@ -148,9 +148,9 @@ impl<'a> Formattable<'a> for TypeAnnotation<'a> { } } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, parens: Parens, newlines: Newlines, indent: u16, @@ -275,14 +275,14 @@ impl<'a> Formattable<'a> for TypeAnnotation<'a> { /// > term: { x: 100, y: True } /// /// So we need two instances, each having the specific separator -impl<'a> Formattable<'a> for AssignedField<'a, TypeAnnotation<'a>> { +impl<'a> Formattable for AssignedField<'a, TypeAnnotation<'a>> { fn is_multiline(&self) -> bool { is_multiline_assigned_field_help(self) } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, parens: Parens, newlines: Newlines, indent: u16, @@ -292,14 +292,14 @@ impl<'a> Formattable<'a> for AssignedField<'a, TypeAnnotation<'a>> { } } -impl<'a> Formattable<'a> for AssignedField<'a, Expr<'a>> { +impl<'a> Formattable for AssignedField<'a, Expr<'a>> { fn is_multiline(&self) -> bool { is_multiline_assigned_field_help(self) } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, parens: Parens, newlines: Newlines, indent: u16, @@ -309,7 +309,7 @@ impl<'a> Formattable<'a> for AssignedField<'a, Expr<'a>> { } } -fn is_multiline_assigned_field_help<'a, T: Formattable<'a>>(afield: &AssignedField<'a, T>) -> bool { +fn is_multiline_assigned_field_help(afield: &AssignedField<'_, T>) -> bool { use self::AssignedField::*; match afield { @@ -322,15 +322,15 @@ fn is_multiline_assigned_field_help<'a, T: Formattable<'a>>(afield: &AssignedFie } } -fn format_assigned_field_help<'a, T>( +fn format_assigned_field_help<'a, 'buf, T>( zelf: &AssignedField<'a, T>, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, parens: Parens, indent: u16, separator_prefix: &str, is_multiline: bool, ) where - T: Formattable<'a>, + T: Formattable, { use self::AssignedField::*; @@ -403,7 +403,7 @@ fn format_assigned_field_help<'a, T>( } } -impl<'a> Formattable<'a> for Tag<'a> { +impl<'a> Formattable for Tag<'a> { fn is_multiline(&self) -> bool { use self::Tag::*; @@ -416,9 +416,9 @@ impl<'a> Formattable<'a> for Tag<'a> { } } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, _parens: Parens, _newlines: Newlines, indent: u16, diff --git a/compiler/fmt/src/collection.rs b/compiler/fmt/src/collection.rs index 39df76be54..ed416c0382 100644 --- a/compiler/fmt/src/collection.rs +++ b/compiler/fmt/src/collection.rs @@ -6,15 +6,15 @@ use crate::{ Buf, }; -pub fn fmt_collection<'a, 'b, T: ExtractSpaces<'a> + Formattable<'b>>( - buf: &mut Buf<'b>, +pub fn fmt_collection<'a, 'buf, T: ExtractSpaces<'a> + Formattable>( + buf: &mut Buf<'buf>, indent: u16, start: char, end: char, items: Collection<'a, T>, newline: Newlines, ) where - >::Item: Formattable<'b>, + >::Item: Formattable, { buf.indent(indent); let is_multiline = diff --git a/compiler/fmt/src/def.rs b/compiler/fmt/src/def.rs index 58db5b7a1f..2b9a4d5a1f 100644 --- a/compiler/fmt/src/def.rs +++ b/compiler/fmt/src/def.rs @@ -6,7 +6,7 @@ use roc_parse::ast::{Def, Expr, Pattern}; use roc_region::all::Located; /// A Located formattable value is also formattable -impl<'a> Formattable<'a> for Def<'a> { +impl<'a> Formattable for Def<'a> { fn is_multiline(&self) -> bool { use roc_parse::ast::Def::*; @@ -25,9 +25,9 @@ impl<'a> Formattable<'a> for Def<'a> { } } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, _parens: Parens, _newlines: Newlines, indent: u16, @@ -107,8 +107,8 @@ impl<'a> Formattable<'a> for Def<'a> { } } -fn fmt_expect<'a>( - buf: &mut Buf<'a>, +fn fmt_expect<'a, 'buf>( + buf: &mut Buf<'buf>, condition: &'a Located>, is_multiline: bool, indent: u16, @@ -123,11 +123,16 @@ fn fmt_expect<'a>( condition.format(buf, return_indent); } -pub fn fmt_def<'a>(buf: &mut Buf<'a>, def: &Def<'a>, indent: u16) { +pub fn fmt_def<'a, 'buf>(buf: &mut Buf<'buf>, def: &Def<'a>, indent: u16) { def.format(buf, indent); } -pub fn fmt_body<'a>(buf: &mut Buf<'a>, pattern: &'a Pattern<'a>, body: &'a Expr<'a>, indent: u16) { +pub fn fmt_body<'a, 'buf>( + buf: &mut Buf<'buf>, + pattern: &'a Pattern<'a>, + body: &'a Expr<'a>, + indent: u16, +) { pattern.format_with_options(buf, Parens::InApply, Newlines::No, indent); buf.push_str(" ="); if body.is_multiline() { diff --git a/compiler/fmt/src/expr.rs b/compiler/fmt/src/expr.rs index 89a5564b3d..41f9f47d52 100644 --- a/compiler/fmt/src/expr.rs +++ b/compiler/fmt/src/expr.rs @@ -11,7 +11,7 @@ use roc_parse::ast::{ use roc_parse::ast::{StrLiteral, StrSegment}; use roc_region::all::Located; -impl<'a> Formattable<'a> for Expr<'a> { +impl<'a> Formattable for Expr<'a> { fn is_multiline(&self) -> bool { use roc_parse::ast::Expr::*; // TODO cache these answers using a Map, so @@ -106,9 +106,9 @@ impl<'a> Formattable<'a> for Expr<'a> { } } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, parens: Parens, newlines: Newlines, indent: u16, @@ -289,7 +289,7 @@ impl<'a> Formattable<'a> for Expr<'a> { } } -fn format_str_segment<'a>(seg: &StrSegment<'a>, buf: &mut Buf<'a>, indent: u16) { +fn format_str_segment<'a, 'buf>(seg: &StrSegment<'a>, buf: &mut Buf<'buf>, indent: u16) { use StrSegment::*; match seg { @@ -344,7 +344,7 @@ fn push_op(buf: &mut Buf, op: BinOp) { } } -pub fn fmt_str_literal<'a>(buf: &mut Buf<'a>, literal: StrLiteral<'a>, indent: u16) { +pub fn fmt_str_literal<'buf>(buf: &mut Buf<'buf>, literal: StrLiteral, indent: u16) { use roc_parse::ast::StrLiteral::*; buf.indent(indent); @@ -395,8 +395,8 @@ pub fn fmt_str_literal<'a>(buf: &mut Buf<'a>, literal: StrLiteral<'a>, indent: u buf.push('"'); } -fn fmt_bin_ops<'a>( - buf: &mut Buf<'a>, +fn fmt_bin_ops<'a, 'buf>( + buf: &mut Buf<'buf>, lefts: &'a [(Located>, Located)], loc_right_side: &'a Located>, part_of_multi_line_bin_ops: bool, @@ -454,8 +454,8 @@ fn empty_line_before_expr<'a>(expr: &'a Expr<'a>) -> bool { } } -fn fmt_when<'a>( - buf: &mut Buf<'a>, +fn fmt_when<'a, 'buf>( + buf: &mut Buf<'buf>, loc_condition: &'a Located>, branches: &[&'a WhenBranch<'a>], indent: u16, @@ -569,8 +569,8 @@ fn fmt_when<'a>( } } -fn fmt_expect<'a>( - buf: &mut Buf<'a>, +fn fmt_expect<'a, 'buf>( + buf: &mut Buf<'buf>, condition: &'a Located>, continuation: &'a Located>, is_multiline: bool, @@ -588,8 +588,8 @@ fn fmt_expect<'a>( continuation.format(buf, return_indent); } -fn fmt_if<'a>( - buf: &mut Buf<'a>, +fn fmt_if<'a, 'buf>( + buf: &mut Buf<'buf>, branches: &'a [(Located>, Located>)], final_else: &'a Located>, is_multiline: bool, @@ -709,8 +709,8 @@ fn fmt_if<'a>( final_else.format(buf, return_indent); } -fn fmt_closure<'a>( - buf: &mut Buf<'a>, +fn fmt_closure<'a, 'buf>( + buf: &mut Buf<'buf>, loc_patterns: &'a [Located>], loc_ret: &'a Located>, indent: u16, @@ -782,8 +782,8 @@ fn fmt_closure<'a>( loc_ret.format_with_options(buf, Parens::NotNeeded, Newlines::Yes, body_indent); } -fn fmt_backpassing<'a>( - buf: &mut Buf<'a>, +fn fmt_backpassing<'a, 'buf>( + buf: &mut Buf<'buf>, loc_patterns: &'a [Located>], loc_body: &'a Located>, loc_ret: &'a Located>, @@ -876,8 +876,8 @@ fn pattern_needs_parens_when_backpassing(pat: &Pattern) -> bool { } } -fn fmt_record<'a>( - buf: &mut Buf<'a>, +fn fmt_record<'a, 'buf>( + buf: &mut Buf<'buf>, update: Option<&'a Located>>, fields: Collection<'a, Located>>>, indent: u16, @@ -945,13 +945,13 @@ fn fmt_record<'a>( } } -fn format_field_multiline<'a, T>( - buf: &mut Buf<'a>, +fn format_field_multiline<'a, 'buf, T>( + buf: &mut Buf<'buf>, field: &AssignedField<'a, T>, indent: u16, separator_prefix: &str, ) where - T: Formattable<'a>, + T: Formattable, { use self::AssignedField::*; match field { diff --git a/compiler/fmt/src/module.rs b/compiler/fmt/src/module.rs index bd0f964938..b99b772249 100644 --- a/compiler/fmt/src/module.rs +++ b/compiler/fmt/src/module.rs @@ -10,7 +10,7 @@ use roc_parse::header::{ }; use roc_region::all::Located; -pub fn fmt_module<'a>(buf: &mut Buf<'a>, module: &'a Module<'a>) { +pub fn fmt_module<'a, 'buf>(buf: &mut Buf<'buf>, module: &'a Module<'a>) { match module { Module::Interface { header } => { fmt_interface_header(buf, header); @@ -24,7 +24,7 @@ pub fn fmt_module<'a>(buf: &mut Buf<'a>, module: &'a Module<'a>) { } } -pub fn fmt_interface_header<'a>(buf: &mut Buf<'a>, header: &'a InterfaceHeader<'a>) { +pub fn fmt_interface_header<'a, 'buf>(buf: &mut Buf<'buf>, header: &'a InterfaceHeader<'a>) { let indent = INDENT; buf.indent(0); @@ -49,7 +49,7 @@ pub fn fmt_interface_header<'a>(buf: &mut Buf<'a>, header: &'a InterfaceHeader<' fmt_imports(buf, header.imports, indent); } -pub fn fmt_app_header<'a>(buf: &mut Buf<'a>, header: &'a AppHeader<'a>) { +pub fn fmt_app_header<'a, 'buf>(buf: &mut Buf<'buf>, header: &'a AppHeader<'a>) { let indent = INDENT; buf.indent(0); buf.push_str("app"); @@ -84,7 +84,7 @@ pub fn fmt_app_header<'a>(buf: &mut Buf<'a>, header: &'a AppHeader<'a>) { fmt_to(buf, header.to.value, indent); } -pub fn fmt_platform_header<'a>(buf: &mut Buf<'a>, header: &'a PlatformHeader<'a>) { +pub fn fmt_platform_header<'a, 'buf>(buf: &mut Buf<'buf>, header: &'a PlatformHeader<'a>) { let indent = INDENT; buf.indent(0); @@ -131,7 +131,7 @@ pub fn fmt_platform_header<'a>(buf: &mut Buf<'a>, header: &'a PlatformHeader<'a> fmt_effects(buf, &header.effects, indent); } -fn fmt_requires<'a>(buf: &mut Buf<'a>, requires: &PlatformRequires<'a>, indent: u16) { +fn fmt_requires<'a, 'buf>(buf: &mut Buf<'buf>, requires: &PlatformRequires<'a>, indent: u16) { fmt_collection(buf, indent, '{', '}', requires.rigids, Newlines::No); buf.push_str(" { "); @@ -139,7 +139,7 @@ fn fmt_requires<'a>(buf: &mut Buf<'a>, requires: &PlatformRequires<'a>, indent: buf.push_str(" }"); } -fn fmt_effects<'a>(buf: &mut Buf<'a>, effects: &Effects<'a>, indent: u16) { +fn fmt_effects<'a, 'buf>(buf: &mut Buf<'buf>, effects: &Effects<'a>, indent: u16) { fmt_default_spaces(buf, effects.spaces_before_effects_keyword, " ", indent); buf.indent(indent); buf.push_str("effects"); @@ -155,7 +155,7 @@ fn fmt_effects<'a>(buf: &mut Buf<'a>, effects: &Effects<'a>, indent: u16) { fmt_collection(buf, indent, '{', '}', effects.entries, Newlines::No) } -fn fmt_typed_ident<'a>(buf: &mut Buf<'a>, entry: &TypedIdent<'a>, indent: u16) { +fn fmt_typed_ident<'a, 'buf>(buf: &mut Buf<'buf>, entry: &TypedIdent<'a>, indent: u16) { use TypedIdent::*; match entry { Entry { @@ -180,33 +180,33 @@ fn fmt_typed_ident<'a>(buf: &mut Buf<'a>, entry: &TypedIdent<'a>, indent: u16) { } } -impl<'a> Formattable<'a> for TypedIdent<'a> { +impl<'a> Formattable for TypedIdent<'a> { fn is_multiline(&self) -> bool { false } - fn format(&self, buf: &mut Buf<'a>, indent: u16) { + fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { fmt_typed_ident(buf, self, indent); } } -impl<'a> Formattable<'a> for PlatformRigid<'a> { +impl<'a> Formattable for PlatformRigid<'a> { fn is_multiline(&self) -> bool { false } - fn format(&self, buf: &mut Buf<'a>, indent: u16) { + fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { fmt_platform_rigid(buf, self, indent); } } -fn fmt_package_name<'a>(buf: &mut Buf<'a>, name: PackageName) { +fn fmt_package_name<'buf>(buf: &mut Buf<'buf>, name: PackageName) { buf.push_str(name.account); buf.push('/'); buf.push_str(name.pkg); } -fn fmt_platform_rigid<'a>(buf: &mut Buf<'a>, entry: &PlatformRigid<'a>, indent: u16) { +fn fmt_platform_rigid<'a, 'buf>(buf: &mut Buf<'buf>, entry: &PlatformRigid<'a>, indent: u16) { use roc_parse::header::PlatformRigid::*; match entry { @@ -227,23 +227,23 @@ fn fmt_platform_rigid<'a>(buf: &mut Buf<'a>, entry: &PlatformRigid<'a>, indent: } } -fn fmt_imports<'a>( - buf: &mut Buf<'a>, +fn fmt_imports<'a, 'buf>( + buf: &mut Buf<'buf>, loc_entries: Collection<'a, Located>>, indent: u16, ) { fmt_collection(buf, indent, '[', ']', loc_entries, Newlines::No) } -fn fmt_provides<'a>( - buf: &mut Buf<'a>, +fn fmt_provides<'a, 'buf>( + buf: &mut Buf<'buf>, loc_entries: Collection<'a, Located>>, indent: u16, ) { fmt_collection(buf, indent, '[', ']', loc_entries, Newlines::No) } -fn fmt_to<'a>(buf: &mut Buf<'a>, to: To<'a>, indent: u16) { +fn fmt_to<'buf>(buf: &mut Buf<'buf>, to: To, indent: u16) { match to { To::ExistingPackage(name) => { buf.push_str(name); @@ -252,43 +252,43 @@ fn fmt_to<'a>(buf: &mut Buf<'a>, to: To<'a>, indent: u16) { } } -fn fmt_exposes<'a, N: FormatName + Copy + 'a>( - buf: &mut Buf<'a>, +fn fmt_exposes<'a, 'buf, N: FormatName + Copy + 'a>( + buf: &mut Buf<'buf>, loc_entries: Collection<'_, Located>>, indent: u16, ) { fmt_collection(buf, indent, '[', ']', loc_entries, Newlines::No) } -impl<'a, 'b, N: FormatName> Formattable<'a> for ExposesEntry<'b, N> { +impl<'a, N: FormatName> Formattable for ExposesEntry<'a, N> { fn is_multiline(&self) -> bool { false } - fn format(&self, buf: &mut Buf<'a>, indent: u16) { + fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { fmt_exposes_entry(buf, self, indent); } } pub trait FormatName { - fn format<'a>(&self, buf: &mut Buf<'a>); + fn format<'buf>(&self, buf: &mut Buf<'buf>); } impl<'a> FormatName for &'a str { - fn format<'b>(&self, buf: &mut Buf<'b>) { + fn format<'buf>(&self, buf: &mut Buf<'buf>) { buf.push_str(self) } } impl<'a> FormatName for ModuleName<'a> { - fn format<'b>(&self, buf: &mut Buf<'b>) { + fn format<'buf>(&self, buf: &mut Buf<'buf>) { buf.push_str(self.as_str()); } } -fn fmt_exposes_entry<'a, 'b, N: FormatName>( - buf: &mut Buf<'a>, - entry: &ExposesEntry<'b, N>, +fn fmt_exposes_entry<'a, 'buf, N: FormatName>( + buf: &mut Buf<'buf>, + entry: &ExposesEntry<'a, N>, indent: u16, ) { use roc_parse::header::ExposesEntry::*; @@ -307,34 +307,34 @@ fn fmt_exposes_entry<'a, 'b, N: FormatName>( } } -fn fmt_packages<'a>( - buf: &mut Buf<'a>, +fn fmt_packages<'a, 'buf>( + buf: &mut Buf<'buf>, loc_entries: Collection<'a, Located>>, indent: u16, ) { fmt_collection(buf, indent, '{', '}', loc_entries, Newlines::No) } -impl<'a> Formattable<'a> for PackageEntry<'a> { +impl<'a> Formattable for PackageEntry<'a> { fn is_multiline(&self) -> bool { false } - fn format(&self, buf: &mut Buf<'a>, indent: u16) { + fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { fmt_packages_entry(buf, self, indent); } } -impl<'a> Formattable<'a> for ImportsEntry<'a> { +impl<'a> Formattable for ImportsEntry<'a> { fn is_multiline(&self) -> bool { false } - fn format(&self, buf: &mut Buf<'a>, indent: u16) { + fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { fmt_imports_entry(buf, self, indent); } } -fn fmt_packages_entry<'a>(buf: &mut Buf<'a>, entry: &PackageEntry<'a>, indent: u16) { +fn fmt_packages_entry<'a, 'buf>(buf: &mut Buf<'buf>, entry: &PackageEntry<'a>, indent: u16) { use PackageEntry::*; match entry { Entry { @@ -358,7 +358,11 @@ fn fmt_packages_entry<'a>(buf: &mut Buf<'a>, entry: &PackageEntry<'a>, indent: u } } -fn fmt_package_or_path<'a>(buf: &mut Buf<'a>, package_or_path: &PackageOrPath<'a>, indent: u16) { +fn fmt_package_or_path<'a, 'buf>( + buf: &mut Buf<'buf>, + package_or_path: &PackageOrPath<'a>, + indent: u16, +) { match package_or_path { PackageOrPath::Package(_name, _version) => { todo!("format package"); @@ -367,7 +371,7 @@ fn fmt_package_or_path<'a>(buf: &mut Buf<'a>, package_or_path: &PackageOrPath<'a } } -fn fmt_imports_entry<'a>(buf: &mut Buf<'a>, entry: &ImportsEntry<'a>, indent: u16) { +fn fmt_imports_entry<'a, 'buf>(buf: &mut Buf<'buf>, entry: &ImportsEntry<'a>, indent: u16) { use roc_parse::header::ImportsEntry::*; match entry { diff --git a/compiler/fmt/src/pattern.rs b/compiler/fmt/src/pattern.rs index 5199ec503f..7ca5cd0712 100644 --- a/compiler/fmt/src/pattern.rs +++ b/compiler/fmt/src/pattern.rs @@ -3,11 +3,16 @@ use crate::spaces::{fmt_comments_only, fmt_spaces, NewlineAt}; use crate::Buf; use roc_parse::ast::{Base, Pattern}; -pub fn fmt_pattern<'a>(buf: &mut Buf<'a>, pattern: &'a Pattern<'a>, indent: u16, parens: Parens) { +pub fn fmt_pattern<'a, 'buf>( + buf: &mut Buf<'buf>, + pattern: &'a Pattern<'a>, + indent: u16, + parens: Parens, +) { pattern.format_with_options(buf, parens, Newlines::No, indent); } -impl<'a> Formattable<'a> for Pattern<'a> { +impl<'a> Formattable for Pattern<'a> { fn is_multiline(&self) -> bool { // Theory: a pattern should only be multiline when it contains a comment match self { @@ -37,9 +42,9 @@ impl<'a> Formattable<'a> for Pattern<'a> { } } - fn format_with_options( + fn format_with_options<'buf>( &self, - buf: &mut Buf<'a>, + buf: &mut Buf<'buf>, parens: Parens, newlines: Newlines, indent: u16, diff --git a/compiler/fmt/src/spaces.rs b/compiler/fmt/src/spaces.rs index 1b467e57ef..590de14b86 100644 --- a/compiler/fmt/src/spaces.rs +++ b/compiler/fmt/src/spaces.rs @@ -18,8 +18,8 @@ pub fn add_spaces(buf: &mut String<'_>, spaces: u16) { } } -pub fn fmt_default_spaces<'a>( - buf: &mut Buf<'a>, +pub fn fmt_default_spaces<'a, 'buf>( + buf: &mut Buf<'buf>, spaces: &[CommentOrNewline<'a>], default: &str, indent: u16, @@ -31,9 +31,9 @@ pub fn fmt_default_spaces<'a>( } } -pub fn fmt_spaces<'a, 'b, I>(buf: &mut Buf<'a>, spaces: I, indent: u16) +pub fn fmt_spaces<'a, 'buf, I>(buf: &mut Buf<'buf>, spaces: I, indent: u16) where - I: Iterator>, + I: Iterator>, { use self::CommentOrNewline::*; @@ -84,13 +84,13 @@ pub enum NewlineAt { /// The `new_line_at` argument describes how new lines should be inserted /// at the beginning or at the end of the block /// in the case of there is some comment in the `spaces` argument. -pub fn fmt_comments_only<'a, 'b, I>( - buf: &mut Buf<'a>, +pub fn fmt_comments_only<'a, 'buf, I>( + buf: &mut Buf<'buf>, spaces: I, new_line_at: NewlineAt, indent: u16, ) where - I: Iterator>, + I: Iterator>, { use self::CommentOrNewline::*; use NewlineAt::*; @@ -123,7 +123,7 @@ pub fn fmt_comments_only<'a, 'b, I>( } } -fn fmt_comment<'a>(buf: &mut Buf<'a>, comment: &str) { +fn fmt_comment<'buf>(buf: &mut Buf<'buf>, comment: &str) { buf.push('#'); if !comment.starts_with(' ') { buf.push(' '); @@ -131,7 +131,7 @@ fn fmt_comment<'a>(buf: &mut Buf<'a>, comment: &str) { buf.push_str(comment); } -fn fmt_docs<'a>(buf: &mut Buf<'a>, docs: &str) { +fn fmt_docs<'buf>(buf: &mut Buf<'buf>, docs: &str) { buf.push_str("##"); if !docs.starts_with(' ') { buf.push(' '); From 0786e554c622ed0a2a99b71b77ca1b9675adaa0e Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Mon, 13 Dec 2021 17:13:46 -0800 Subject: [PATCH 55/57] Extract spacing from parse::header::* items into explicit Spaced enum --- cli/src/format.rs | 60 ++--- compiler/fmt/src/annotation.rs | 2 +- compiler/fmt/src/module.rs | 188 ++++++-------- compiler/load/src/file.rs | 237 +++++++----------- compiler/parse/src/ast.rs | 116 +++++++-- compiler/parse/src/header.rs | 156 ++++-------- compiler/parse/src/module.rs | 67 ++--- .../empty_platform_header.header.result-ast | 2 +- .../pass/full_app_header.header.result-ast | 4 +- ...p_header_trailing_commas.header.result-ast | 8 +- ...nonempty_platform_header.header.result-ast | 8 +- 11 files changed, 378 insertions(+), 470 deletions(-) diff --git a/cli/src/format.rs b/cli/src/format.rs index 5f4424b066..c6440a241e 100644 --- a/cli/src/format.rs +++ b/cli/src/format.rs @@ -7,11 +7,11 @@ use roc_fmt::module::fmt_module; use roc_fmt::Buf; use roc_module::called_via::{BinOp, UnaryOp}; use roc_parse::ast::{ - AssignedField, Collection, Expr, Pattern, StrLiteral, StrSegment, Tag, TypeAnnotation, + AssignedField, Collection, Expr, Pattern, Spaced, StrLiteral, StrSegment, Tag, TypeAnnotation, WhenBranch, }; use roc_parse::header::{ - AppHeader, Effects, ExposesEntry, ImportsEntry, InterfaceHeader, ModuleName, PackageEntry, + AppHeader, Effects, ExposedName, ImportsEntry, InterfaceHeader, ModuleName, PackageEntry, PackageName, PackageOrPath, PlatformHeader, PlatformRequires, PlatformRigid, To, TypedIdent, }; use roc_parse::{ @@ -228,16 +228,22 @@ impl<'a> RemoveSpaces<'a> for &'a str { } } -impl<'a, T: RemoveSpaces<'a> + Copy> RemoveSpaces<'a> for ExposesEntry<'a, T> { +impl<'a, T: RemoveSpaces<'a> + Copy> RemoveSpaces<'a> for Spaced<'a, T> { fn remove_spaces(&self, arena: &'a Bump) -> Self { match *self { - ExposesEntry::Exposed(a) => ExposesEntry::Exposed(a.remove_spaces(arena)), - ExposesEntry::SpaceBefore(a, _) => a.remove_spaces(arena), - ExposesEntry::SpaceAfter(a, _) => a.remove_spaces(arena), + Spaced::Item(a) => Spaced::Item(a.remove_spaces(arena)), + Spaced::SpaceBefore(a, _) => a.remove_spaces(arena), + Spaced::SpaceAfter(a, _) => a.remove_spaces(arena), } } } +impl<'a> RemoveSpaces<'a> for ExposedName<'a> { + fn remove_spaces(&self, _arena: &'a Bump) -> Self { + *self + } +} + impl<'a> RemoveSpaces<'a> for ModuleName<'a> { fn remove_spaces(&self, _arena: &'a Bump) -> Self { *self @@ -261,18 +267,10 @@ impl<'a> RemoveSpaces<'a> for To<'a> { impl<'a> RemoveSpaces<'a> for TypedIdent<'a> { fn remove_spaces(&self, arena: &'a Bump) -> Self { - match *self { - TypedIdent::Entry { - ident, - spaces_before_colon: _, - ann, - } => TypedIdent::Entry { - ident: ident.remove_spaces(arena), - spaces_before_colon: &[], - ann: ann.remove_spaces(arena), - }, - TypedIdent::SpaceBefore(a, _) => a.remove_spaces(arena), - TypedIdent::SpaceAfter(a, _) => a.remove_spaces(arena), + TypedIdent { + ident: self.ident.remove_spaces(arena), + spaces_before_colon: &[], + ann: self.ann.remove_spaces(arena), } } } @@ -287,29 +285,17 @@ impl<'a> RemoveSpaces<'a> for PlatformRequires<'a> { } impl<'a> RemoveSpaces<'a> for PlatformRigid<'a> { - fn remove_spaces(&self, arena: &'a Bump) -> Self { - match *self { - PlatformRigid::Entry { rigid, alias } => PlatformRigid::Entry { rigid, alias }, - PlatformRigid::SpaceBefore(a, _) => a.remove_spaces(arena), - PlatformRigid::SpaceAfter(a, _) => a.remove_spaces(arena), - } + fn remove_spaces(&self, _arena: &'a Bump) -> Self { + *self } } impl<'a> RemoveSpaces<'a> for PackageEntry<'a> { fn remove_spaces(&self, arena: &'a Bump) -> Self { - match *self { - PackageEntry::Entry { - shorthand, - spaces_after_shorthand: _, - package_or_path, - } => PackageEntry::Entry { - shorthand, - spaces_after_shorthand: &[], - package_or_path: package_or_path.remove_spaces(arena), - }, - PackageEntry::SpaceBefore(a, _) => a.remove_spaces(arena), - PackageEntry::SpaceAfter(a, _) => a.remove_spaces(arena), + PackageEntry { + shorthand: self.shorthand, + spaces_after_shorthand: &[], + package_or_path: self.package_or_path.remove_spaces(arena), } } } @@ -328,8 +314,6 @@ impl<'a> RemoveSpaces<'a> for ImportsEntry<'a> { match *self { ImportsEntry::Module(a, b) => ImportsEntry::Module(a, b.remove_spaces(arena)), ImportsEntry::Package(a, b, c) => ImportsEntry::Package(a, b, c.remove_spaces(arena)), - ImportsEntry::SpaceBefore(a, _) => a.remove_spaces(arena), - ImportsEntry::SpaceAfter(a, _) => a.remove_spaces(arena), } } } diff --git a/compiler/fmt/src/annotation.rs b/compiler/fmt/src/annotation.rs index 314c97c222..6afe608110 100644 --- a/compiler/fmt/src/annotation.rs +++ b/compiler/fmt/src/annotation.rs @@ -83,7 +83,7 @@ where } /// A Located formattable value is also formattable -impl<'a, T> Formattable for Located +impl Formattable for Located where T: Formattable, { diff --git a/compiler/fmt/src/module.rs b/compiler/fmt/src/module.rs index b99b772249..a8595032a4 100644 --- a/compiler/fmt/src/module.rs +++ b/compiler/fmt/src/module.rs @@ -3,9 +3,9 @@ use crate::collection::fmt_collection; use crate::expr::fmt_str_literal; use crate::spaces::{fmt_default_spaces, fmt_spaces, INDENT}; use crate::Buf; -use roc_parse::ast::{Collection, Module}; +use roc_parse::ast::{Collection, Module, Spaced}; use roc_parse::header::{ - AppHeader, Effects, ExposesEntry, ImportsEntry, InterfaceHeader, ModuleName, PackageEntry, + AppHeader, Effects, ExposedName, ImportsEntry, InterfaceHeader, ModuleName, PackageEntry, PackageName, PackageOrPath, PlatformHeader, PlatformRequires, PlatformRigid, To, TypedIdent, }; use roc_region::all::Located; @@ -135,7 +135,7 @@ fn fmt_requires<'a, 'buf>(buf: &mut Buf<'buf>, requires: &PlatformRequires<'a>, fmt_collection(buf, indent, '{', '}', requires.rigids, Newlines::No); buf.push_str(" { "); - fmt_typed_ident(buf, &requires.signature.value, indent); + requires.signature.value.format(buf, indent); buf.push_str(" }"); } @@ -155,48 +155,17 @@ fn fmt_effects<'a, 'buf>(buf: &mut Buf<'buf>, effects: &Effects<'a>, indent: u16 fmt_collection(buf, indent, '{', '}', effects.entries, Newlines::No) } -fn fmt_typed_ident<'a, 'buf>(buf: &mut Buf<'buf>, entry: &TypedIdent<'a>, indent: u16) { - use TypedIdent::*; - match entry { - Entry { - ident, - spaces_before_colon, - ann, - } => { - buf.indent(indent); - buf.push_str(ident.value); - fmt_default_spaces(buf, spaces_before_colon, " ", indent); - buf.push_str(": "); - ann.value.format(buf, indent); - } - SpaceBefore(sub_entry, spaces) => { - fmt_spaces(buf, spaces.iter(), indent); - fmt_typed_ident(buf, sub_entry, indent); - } - SpaceAfter(sub_entry, spaces) => { - fmt_typed_ident(buf, sub_entry, indent); - fmt_spaces(buf, spaces.iter(), indent); - } - } -} - impl<'a> Formattable for TypedIdent<'a> { fn is_multiline(&self) -> bool { false } fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { - fmt_typed_ident(buf, self, indent); - } -} - -impl<'a> Formattable for PlatformRigid<'a> { - fn is_multiline(&self) -> bool { - false - } - - fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { - fmt_platform_rigid(buf, self, indent); + buf.indent(indent); + buf.push_str(self.ident.value); + fmt_default_spaces(buf, self.spaces_before_colon, " ", indent); + buf.push_str(": "); + self.ann.value.format(buf, indent); } } @@ -206,30 +175,50 @@ fn fmt_package_name<'buf>(buf: &mut Buf<'buf>, name: PackageName) { buf.push_str(name.pkg); } -fn fmt_platform_rigid<'a, 'buf>(buf: &mut Buf<'buf>, entry: &PlatformRigid<'a>, indent: u16) { - use roc_parse::header::PlatformRigid::*; +impl<'a, T: Formattable> Formattable for Spaced<'a, T> { + fn is_multiline(&self) -> bool { + // TODO + false + } - match entry { - Entry { rigid, alias } => { - buf.push_str(rigid); - buf.push_str("=>"); - buf.push_str(alias); + fn format_with_options<'buf>( + &self, + buf: &mut Buf<'buf>, + parens: crate::annotation::Parens, + newlines: Newlines, + indent: u16, + ) { + match self { + Spaced::Item(item) => { + item.format_with_options(buf, parens, newlines, indent); + } + Spaced::SpaceBefore(item, spaces) => { + fmt_spaces(buf, spaces.iter(), indent); + item.format_with_options(buf, parens, newlines, indent); + } + Spaced::SpaceAfter(item, spaces) => { + item.format_with_options(buf, parens, newlines, indent); + fmt_spaces(buf, spaces.iter(), indent); + } } + } +} - SpaceBefore(sub_entry, spaces) => { - fmt_spaces(buf, spaces.iter(), indent); - fmt_platform_rigid(buf, sub_entry, indent); - } - SpaceAfter(sub_entry, spaces) => { - fmt_platform_rigid(buf, sub_entry, indent); - fmt_spaces(buf, spaces.iter(), indent); - } +impl<'a> Formattable for PlatformRigid<'a> { + fn is_multiline(&self) -> bool { + false + } + + fn format<'buf>(&self, buf: &mut Buf<'buf>, _indent: u16) { + buf.push_str(self.rigid); + buf.push_str("=>"); + buf.push_str(self.alias); } } fn fmt_imports<'a, 'buf>( buf: &mut Buf<'buf>, - loc_entries: Collection<'a, Located>>, + loc_entries: Collection<'a, Located>>>, indent: u16, ) { fmt_collection(buf, indent, '[', ']', loc_entries, Newlines::No) @@ -237,7 +226,7 @@ fn fmt_imports<'a, 'buf>( fn fmt_provides<'a, 'buf>( buf: &mut Buf<'buf>, - loc_entries: Collection<'a, Located>>, + loc_entries: Collection<'a, Located>>>, indent: u16, ) { fmt_collection(buf, indent, '[', ']', loc_entries, Newlines::No) @@ -252,24 +241,14 @@ fn fmt_to<'buf>(buf: &mut Buf<'buf>, to: To, indent: u16) { } } -fn fmt_exposes<'a, 'buf, N: FormatName + Copy + 'a>( +fn fmt_exposes<'buf, N: Formattable + Copy>( buf: &mut Buf<'buf>, - loc_entries: Collection<'_, Located>>, + loc_entries: Collection<'_, Located>>, indent: u16, ) { fmt_collection(buf, indent, '[', ']', loc_entries, Newlines::No) } -impl<'a, N: FormatName> Formattable for ExposesEntry<'a, N> { - fn is_multiline(&self) -> bool { - false - } - - fn format<'buf>(&self, buf: &mut Buf<'buf>, indent: u16) { - fmt_exposes_entry(buf, self, indent); - } -} - pub trait FormatName { fn format<'buf>(&self, buf: &mut Buf<'buf>); } @@ -286,30 +265,35 @@ impl<'a> FormatName for ModuleName<'a> { } } -fn fmt_exposes_entry<'a, 'buf, N: FormatName>( - buf: &mut Buf<'buf>, - entry: &ExposesEntry<'a, N>, - indent: u16, -) { - use roc_parse::header::ExposesEntry::*; +impl<'a> Formattable for ModuleName<'a> { + fn is_multiline(&self) -> bool { + false + } - match entry { - Exposed(ident) => ident.format(buf), + fn format<'buf>(&self, buf: &mut Buf<'buf>, _indent: u16) { + buf.push_str(self.as_str()); + } +} - SpaceBefore(sub_entry, spaces) => { - fmt_spaces(buf, spaces.iter(), indent); - fmt_exposes_entry(buf, sub_entry, indent); - } - SpaceAfter(sub_entry, spaces) => { - fmt_exposes_entry(buf, sub_entry, indent); - fmt_spaces(buf, spaces.iter(), indent); - } +impl<'a> Formattable for ExposedName<'a> { + fn is_multiline(&self) -> bool { + false + } + + fn format<'buf>(&self, buf: &mut Buf<'buf>, _indent: u16) { + buf.push_str(self.as_str()); + } +} + +impl<'a> FormatName for ExposedName<'a> { + fn format<'buf>(&self, buf: &mut Buf<'buf>) { + buf.push_str(self.as_str()); } } fn fmt_packages<'a, 'buf>( buf: &mut Buf<'buf>, - loc_entries: Collection<'a, Located>>, + loc_entries: Collection<'a, Located>>>, indent: u16, ) { fmt_collection(buf, indent, '{', '}', loc_entries, Newlines::No) @@ -335,27 +319,10 @@ impl<'a> Formattable for ImportsEntry<'a> { } } fn fmt_packages_entry<'a, 'buf>(buf: &mut Buf<'buf>, entry: &PackageEntry<'a>, indent: u16) { - use PackageEntry::*; - match entry { - Entry { - shorthand, - spaces_after_shorthand, - package_or_path, - } => { - buf.push_str(shorthand); - buf.push(':'); - fmt_default_spaces(buf, spaces_after_shorthand, " ", indent); - fmt_package_or_path(buf, &package_or_path.value, indent); - } - SpaceBefore(sub_entry, spaces) => { - fmt_spaces(buf, spaces.iter(), indent); - fmt_packages_entry(buf, sub_entry, indent); - } - SpaceAfter(sub_entry, spaces) => { - fmt_packages_entry(buf, sub_entry, indent); - fmt_spaces(buf, spaces.iter(), indent); - } - } + buf.push_str(entry.shorthand); + buf.push(':'); + fmt_default_spaces(buf, entry.spaces_after_shorthand, " ", indent); + fmt_package_or_path(buf, &entry.package_or_path.value, indent); } fn fmt_package_or_path<'a, 'buf>( @@ -396,14 +363,5 @@ fn fmt_imports_entry<'a, 'buf>(buf: &mut Buf<'buf>, entry: &ImportsEntry<'a>, in fmt_collection(buf, indent, '{', '}', *entries, Newlines::No) } } - - SpaceBefore(sub_entry, spaces) => { - fmt_spaces(buf, spaces.iter(), indent); - fmt_imports_entry(buf, sub_entry, indent); - } - SpaceAfter(sub_entry, spaces) => { - fmt_imports_entry(buf, sub_entry, indent); - fmt_spaces(buf, spaces.iter(), indent); - } } } diff --git a/compiler/load/src/file.rs b/compiler/load/src/file.rs index a1279fdfab..e056790377 100644 --- a/compiler/load/src/file.rs +++ b/compiler/load/src/file.rs @@ -23,14 +23,13 @@ use roc_mono::ir::{ UpdateModeIds, }; use roc_mono::layout::{Layout, LayoutCache, LayoutProblem}; -use roc_parse::ast::{self, ExtractSpaces, StrLiteral, TypeAnnotation}; +use roc_parse::ast::{self, ExtractSpaces, Spaced, StrLiteral, TypeAnnotation}; use roc_parse::header::{ - ExposesEntry, ImportsEntry, PackageEntry, PackageOrPath, PlatformHeader, To, TypedIdent, + ExposedName, ImportsEntry, PackageEntry, PackageOrPath, PlatformHeader, To, TypedIdent, }; use roc_parse::module::module_defs; use roc_parse::parser::{self, ParseProblem, Parser, SyntaxError}; use roc_region::all::{Located, Region}; -use roc_reporting::internal_error; use roc_solve::module::SolvedModule; use roc_solve::solve; use roc_types::solved_types::Solved; @@ -2603,62 +2602,57 @@ fn parse_header<'a>( match header.to.value { To::ExistingPackage(existing_package) => { - let opt_base_package = packages.iter().find(|loc_package_entry| { + let opt_base_package = packages.iter().find_map(|loc_package_entry| { let Located { value, .. } = loc_package_entry; - match value.extract_spaces().item { - PackageEntry::Entry { shorthand, .. } => shorthand == existing_package, - _ => internal_error!(), + let item = value.extract_spaces().item; + if item.shorthand == existing_package { + Some(item) + } else { + None } }); - match opt_base_package { - Some(Located { - value: - PackageEntry::Entry { - shorthand, - package_or_path: - Located { - value: package_or_path, - .. - }, - .. - }, - .. - }) => { - match package_or_path { - PackageOrPath::Path(StrLiteral::PlainLine(package)) => { - // check whether we can find a Package-Config.roc file - let mut pkg_config_roc = pkg_config_dir; - pkg_config_roc.push(package); - pkg_config_roc.push(PKG_CONFIG_FILE_NAME); - pkg_config_roc.set_extension(ROC_FILE_EXTENSION); + if let Some(PackageEntry { + shorthand, + package_or_path: + Located { + value: package_or_path, + .. + }, + .. + }) = opt_base_package + { + match package_or_path { + PackageOrPath::Path(StrLiteral::PlainLine(package)) => { + // check whether we can find a Package-Config.roc file + let mut pkg_config_roc = pkg_config_dir; + pkg_config_roc.push(package); + pkg_config_roc.push(PKG_CONFIG_FILE_NAME); + pkg_config_roc.set_extension(ROC_FILE_EXTENSION); - if pkg_config_roc.as_path().exists() { - let load_pkg_config_msg = load_pkg_config( - arena, - &pkg_config_roc, - shorthand, - module_id, - module_ids, - ident_ids_by_module, - )?; + if pkg_config_roc.as_path().exists() { + let load_pkg_config_msg = load_pkg_config( + arena, + &pkg_config_roc, + shorthand, + module_id, + module_ids, + ident_ids_by_module, + )?; - Ok(( - module_id, - Msg::Many(vec![ - app_module_header_msg, - load_pkg_config_msg, - ]), - )) - } else { - Ok((module_id, app_module_header_msg)) - } + Ok(( + module_id, + Msg::Many(vec![app_module_header_msg, load_pkg_config_msg]), + )) + } else { + Ok((module_id, app_module_header_msg)) } - _ => unreachable!(), } + _ => unreachable!(), } - _ => panic!("could not find base"), + } else { + panic!("could not find base") } } To::NewPackage(package_or_path) => match package_or_path { @@ -2765,9 +2759,9 @@ struct HeaderInfo<'a> { is_root_module: bool, opt_shorthand: Option<&'a str>, header_src: &'a str, - packages: &'a [Located>], - exposes: &'a [Located>], - imports: &'a [Located>], + packages: &'a [Located>>], + exposes: &'a [Located>>], + imports: &'a [Located>>], to_platform: Option>, } @@ -2900,7 +2894,8 @@ fn send_header<'a>( // For example, if module A has [ B.{ foo } ], then // when we get here for B, `foo` will already have // an IdentId. We must reuse that! - let ident_id = ident_ids.get_or_insert(&loc_exposed.value.as_str().into()); + let ident_id = + ident_ids.get_or_insert(&loc_exposed.value.extract_spaces().item.as_str().into()); let symbol = Symbol::new(home, ident_id); exposed.push(symbol); @@ -2913,24 +2908,13 @@ fn send_header<'a>( ident_ids.clone() }; - let mut parse_entries: Vec<_> = packages.iter().map(|x| &x.value).collect(); - let mut package_entries = MutMap::default(); - - while let Some(parse_entry) = parse_entries.pop() { - use PackageEntry::*; - match parse_entry { - Entry { - shorthand, - package_or_path, - .. - } => { - package_entries.insert(*shorthand, package_or_path.value); - } - SpaceBefore(inner, _) | SpaceAfter(inner, _) => { - parse_entries.push(inner); - } - } - } + let package_entries = packages + .iter() + .map(|pkg| { + let pkg = pkg.value.extract_spaces().item; + (pkg.shorthand, pkg.package_or_path.value) + }) + .collect::>(); // Send the deps to the coordinator thread for processing, // then continue on to parsing and canonicalizing defs. @@ -2989,15 +2973,14 @@ struct PlatformHeaderInfo<'a> { header_src: &'a str, app_module_id: ModuleId, packages: &'a [Located>], - provides: &'a [Located>], + provides: &'a [Located>>], requires: &'a [Located>], - imports: &'a [Located>], + imports: &'a [Located>>], } // TODO refactor so more logic is shared with `send_header` #[allow(clippy::too_many_arguments)] fn send_header_two<'a>( - arena: &'a Bump, info: PlatformHeaderInfo<'a>, parse_state: parser::State<'a>, module_ids: Arc>>, @@ -3105,15 +3088,17 @@ fn send_header_two<'a>( .entry(app_module_id) .or_insert_with(IdentIds::default); - for (loc_ident, _) in unpack_exposes_entries(arena, requires) { - let ident: Ident = loc_ident.value.into(); + for entry in requires { + let entry = entry.value; + + let ident: Ident = entry.ident.value.into(); let ident_id = ident_ids.get_or_insert(&ident); let symbol = Symbol::new(app_module_id, ident_id); // Since this value is exposed, add it to our module's default scope. debug_assert!(!scope.contains_key(&ident.clone())); - scope.insert(ident, (symbol, loc_ident.region)); + scope.insert(ident, (symbol, entry.ident.region)); } } @@ -3133,7 +3118,8 @@ fn send_header_two<'a>( // For example, if module A has [ B.{ foo } ], then // when we get here for B, `foo` will already have // an IdentId. We must reuse that! - let ident_id = ident_ids.get_or_insert(&loc_exposed.value.as_str().into()); + let ident_id = + ident_ids.get_or_insert(&loc_exposed.value.extract_spaces().item.as_str().into()); let symbol = Symbol::new(home, ident_id); exposed.push(symbol); @@ -3146,24 +3132,10 @@ fn send_header_two<'a>( ident_ids.clone() }; - let mut parse_entries: Vec<_> = packages.iter().map(|x| &x.value).collect(); - let mut package_entries = MutMap::default(); - - while let Some(parse_entry) = parse_entries.pop() { - use PackageEntry::*; - match parse_entry { - Entry { - shorthand, - package_or_path, - .. - } => { - package_entries.insert(*shorthand, package_or_path.value); - } - SpaceBefore(inner, _) | SpaceAfter(inner, _) => { - parse_entries.push(inner); - } - } - } + let package_entries = packages + .iter() + .map(|pkg| (pkg.value.shorthand, pkg.value.package_or_path.value)) + .collect::>(); // Send the deps to the coordinator thread for processing, // then continue on to parsing and canonicalizing defs. @@ -3174,7 +3146,7 @@ fn send_header_two<'a>( let module_name = ModuleNameEnum::PkgConfig; let main_for_host = { - let ident_str: Ident = provides[0].value.as_str().into(); + let ident_str: Ident = provides[0].value.extract_spaces().item.as_str().into(); let ident_id = ident_ids.get_or_insert(&ident_str); Symbol::new(home, ident_id) @@ -3355,7 +3327,7 @@ fn fabricate_pkg_config_module<'a>( header_src: &'a str, module_timing: ModuleTiming, ) -> (ModuleId, Msg<'a>) { - let provides: &'a [Located>] = header.provides.items; + let provides: &'a [Located>>] = header.provides.items; let info = PlatformHeaderInfo { filename, @@ -3365,12 +3337,14 @@ fn fabricate_pkg_config_module<'a>( app_module_id, packages: &[], provides, - requires: arena.alloc([header.requires.signature]), + requires: &*arena.alloc([Located::at( + header.requires.signature.region, + header.requires.signature.extract_spaces().item, + )]), imports: header.imports.items, }; send_header_two( - arena, info, parse_state, module_ids, @@ -3413,12 +3387,12 @@ fn fabricate_effects_module<'a>( let mut module_ids = (*module_ids).lock(); for exposed in header.exposes.iter() { - if let ExposesEntry::Exposed(module_name) = exposed.value { - module_ids.get_or_insert(&PQModuleName::Qualified( - shorthand, - module_name.as_str().into(), - )); - } + let module_name = exposed.value.extract_spaces().item; + + module_ids.get_or_insert(&PQModuleName::Qualified( + shorthand, + module_name.as_str().into(), + )); } } @@ -3633,33 +3607,16 @@ fn fabricate_effects_module<'a>( fn unpack_exposes_entries<'a>( arena: &'a Bump, - entries: &'a [Located>], -) -> bumpalo::collections::Vec<'a, (&'a Located<&'a str>, &'a Located>)> { + entries: &'a [Located>>], +) -> bumpalo::collections::Vec<'a, (Located<&'a str>, Located>)> { use bumpalo::collections::Vec; - let mut stack: Vec<&TypedIdent> = Vec::with_capacity_in(entries.len(), arena); - let mut output = Vec::with_capacity_in(entries.len(), arena); + let iter = entries.iter().map(|entry| { + let entry: TypedIdent<'a> = entry.value.extract_spaces().item; + (entry.ident, entry.ann) + }); - for entry in entries.iter() { - stack.push(&entry.value); - } - - while let Some(effects_entry) = stack.pop() { - match effects_entry { - TypedIdent::Entry { - ident, - spaces_before_colon: _, - ann, - } => { - output.push((ident, ann)); - } - TypedIdent::SpaceAfter(nested, _) | TypedIdent::SpaceBefore(nested, _) => { - stack.push(nested); - } - } - } - - output + Vec::from_iter_in(iter, arena) } #[allow(clippy::too_many_arguments)] @@ -3816,10 +3773,12 @@ fn parse<'a>(arena: &'a Bump, header: ModuleHeader<'a>) -> Result, Loadi Ok(Msg::Parsed(parsed)) } -fn exposed_from_import<'a>(entry: &ImportsEntry<'a>) -> (QualifiedModuleName<'a>, Vec) { +fn exposed_from_import<'a>( + entry: &Spaced<'a, ImportsEntry<'a>>, +) -> (QualifiedModuleName<'a>, Vec) { use roc_parse::header::ImportsEntry::*; - match entry { + match entry.extract_spaces().item { Module(module_name, exposes) => { let mut exposed = Vec::with_capacity(exposes.len()); @@ -3849,21 +3808,11 @@ fn exposed_from_import<'a>(entry: &ImportsEntry<'a>) -> (QualifiedModuleName<'a> (qualified_module_name, exposed) } - - SpaceBefore(sub_entry, _) | SpaceAfter(sub_entry, _) => { - // Ignore spaces. - exposed_from_import(*sub_entry) - } } } -fn ident_from_exposed(entry: &ExposesEntry<'_, &str>) -> Ident { - use roc_parse::header::ExposesEntry::*; - - match entry { - Exposed(ident) => (*ident).into(), - SpaceBefore(sub_entry, _) | SpaceAfter(sub_entry, _) => ident_from_exposed(sub_entry), - } +fn ident_from_exposed(entry: &Spaced<'_, ExposedName<'_>>) -> Ident { + entry.extract_spaces().item.as_str().into() } #[allow(clippy::too_many_arguments)] diff --git a/compiler/parse/src/ast.rs b/compiler/parse/src/ast.rs index 2cbba78d92..bf2ec390a8 100644 --- a/compiler/parse/src/ast.rs +++ b/compiler/parse/src/ast.rs @@ -1,9 +1,6 @@ use std::fmt::Debug; -use crate::header::{ - AppHeader, ExposesEntry, ImportsEntry, InterfaceHeader, PackageEntry, PlatformHeader, - PlatformRigid, TypedIdent, -}; +use crate::header::{AppHeader, InterfaceHeader, PlatformHeader}; use crate::ident::Ident; use bumpalo::collections::{String, Vec}; use bumpalo::Bump; @@ -17,6 +14,33 @@ pub struct Spaces<'a, T> { pub after: &'a [CommentOrNewline<'a>], } +#[derive(Copy, Clone, PartialEq)] +pub enum Spaced<'a, T> { + Item(T), + + // Spaces + SpaceBefore(&'a Spaced<'a, T>, &'a [CommentOrNewline<'a>]), + SpaceAfter(&'a Spaced<'a, T>, &'a [CommentOrNewline<'a>]), +} + +impl<'a, T: Debug> Debug for Spaced<'a, T> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Item(item) => item.fmt(f), + Self::SpaceBefore(item, space) => f + .debug_tuple("SpaceBefore") + .field(item) + .field(space) + .finish(), + Self::SpaceAfter(item, space) => f + .debug_tuple("SpaceAfter") + .field(item) + .field(space) + .finish(), + } + } +} + pub trait ExtractSpaces<'a>: Sized + Copy { type Item; fn extract_spaces(&self) -> Spaces<'a, Self::Item>; @@ -674,6 +698,15 @@ pub trait Spaceable<'a> { } } +impl<'a, T> Spaceable<'a> for Spaced<'a, T> { + fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { + Spaced::SpaceBefore(self, spaces) + } + fn after(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { + Spaced::SpaceAfter(self, spaces) + } +} + impl<'a> Spaceable<'a> for Expr<'a> { fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { Expr::SpaceBefore(self, spaces) @@ -701,24 +734,6 @@ impl<'a> Spaceable<'a> for TypeAnnotation<'a> { } } -impl<'a> Spaceable<'a> for ImportsEntry<'a> { - fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - ImportsEntry::SpaceBefore(self, spaces) - } - fn after(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - ImportsEntry::SpaceAfter(self, spaces) - } -} - -impl<'a> Spaceable<'a> for TypedIdent<'a> { - fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - TypedIdent::SpaceBefore(self, spaces) - } - fn after(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - TypedIdent::SpaceAfter(self, spaces) - } -} - impl<'a, Val> Spaceable<'a> for AssignedField<'a, Val> { fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { AssignedField::SpaceBefore(self, spaces) @@ -823,8 +838,55 @@ macro_rules! impl_extract_spaces { impl_extract_spaces!(Expr); impl_extract_spaces!(Tag); impl_extract_spaces!(AssignedField); -impl_extract_spaces!(PlatformRigid); -impl_extract_spaces!(TypedIdent); -impl_extract_spaces!(ImportsEntry); -impl_extract_spaces!(ExposesEntry); -impl_extract_spaces!(PackageEntry); + +impl<'a, T: Copy> ExtractSpaces<'a> for Spaced<'a, T> { + type Item = T; + + fn extract_spaces(&self) -> Spaces<'a, T> { + match self { + Spaced::SpaceBefore(item, before) => match item { + Spaced::SpaceBefore(_, _) => todo!(), + Spaced::SpaceAfter(item, after) => { + if let Spaced::Item(item) = item { + Spaces { + before, + item: *item, + after, + } + } else { + todo!(); + } + } + Spaced::Item(item) => Spaces { + before, + item: *item, + after: &[], + }, + }, + Spaced::SpaceAfter(item, after) => match item { + Spaced::SpaceBefore(item, before) => { + if let Spaced::Item(item) = item { + Spaces { + before, + item: *item, + after, + } + } else { + todo!(); + } + } + Spaced::SpaceAfter(_, _) => todo!(), + Spaced::Item(item) => Spaces { + before: &[], + item: *item, + after, + }, + }, + Spaced::Item(item) => Spaces { + before: &[], + item: *item, + after: &[], + }, + } + } +} diff --git a/compiler/parse/src/header.rs b/compiler/parse/src/header.rs index 0c01805f9f..06e1c8b1e6 100644 --- a/compiler/parse/src/header.rs +++ b/compiler/parse/src/header.rs @@ -1,4 +1,4 @@ -use crate::ast::{Collection, CommentOrNewline, Spaceable, StrLiteral, TypeAnnotation}; +use crate::ast::{Collection, CommentOrNewline, Spaced, StrLiteral, TypeAnnotation}; use crate::blankspace::space0_e; use crate::ident::lowercase_ident; use crate::parser::Progress::{self, *}; @@ -57,11 +57,30 @@ impl<'a> ModuleName<'a> { } } +#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)] +pub struct ExposedName<'a>(&'a str); + +impl<'a> From> for &'a str { + fn from(name: ExposedName<'a>) -> Self { + name.0 + } +} + +impl<'a> ExposedName<'a> { + pub fn new(name: &'a str) -> Self { + ExposedName(name) + } + + pub fn as_str(&'a self) -> &'a str { + self.0 + } +} + #[derive(Clone, Debug, PartialEq)] pub struct InterfaceHeader<'a> { pub name: Loc>, - pub exposes: Collection<'a, Loc>>, - pub imports: Collection<'a, Loc>>, + pub exposes: Collection<'a, Loc>>>, + pub imports: Collection<'a, Loc>>>, // Potential comments and newlines - these will typically all be empty. pub before_header: &'a [CommentOrNewline<'a>], @@ -81,9 +100,9 @@ pub enum To<'a> { #[derive(Clone, Debug, PartialEq)] pub struct AppHeader<'a> { pub name: Loc>, - pub packages: Collection<'a, Loc>>, - pub imports: Collection<'a, Loc>>, - pub provides: Collection<'a, Loc>>, + pub packages: Collection<'a, Loc>>>, + pub imports: Collection<'a, Loc>>>, + pub provides: Collection<'a, Loc>>>, pub to: Loc>, // Potential comments and newlines - these will typically all be empty. @@ -102,7 +121,7 @@ pub struct AppHeader<'a> { #[derive(Clone, Debug, PartialEq)] pub struct PackageHeader<'a> { pub name: Loc>, - pub exposes: Vec<'a, Loc>>, + pub exposes: Vec<'a, Loc>>>, pub packages: Vec<'a, (Loc<&'a str>, Loc>)>, pub imports: Vec<'a, Loc>>, @@ -118,37 +137,25 @@ pub struct PackageHeader<'a> { } #[derive(Copy, Clone, Debug, PartialEq)] -pub enum PlatformRigid<'a> { - Entry { rigid: &'a str, alias: &'a str }, - - // Spaces - SpaceBefore(&'a PlatformRigid<'a>, &'a [CommentOrNewline<'a>]), - SpaceAfter(&'a PlatformRigid<'a>, &'a [CommentOrNewline<'a>]), -} - -impl<'a> Spaceable<'a> for PlatformRigid<'a> { - fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - PlatformRigid::SpaceBefore(self, spaces) - } - fn after(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - PlatformRigid::SpaceAfter(self, spaces) - } +pub struct PlatformRigid<'a> { + pub rigid: &'a str, + pub alias: &'a str, } #[derive(Clone, Debug, PartialEq)] pub struct PlatformRequires<'a> { - pub rigids: Collection<'a, Loc>>, - pub signature: Loc>, + pub rigids: Collection<'a, Loc>>>, + pub signature: Loc>>, } #[derive(Clone, Debug, PartialEq)] pub struct PlatformHeader<'a> { pub name: Loc>, pub requires: PlatformRequires<'a>, - pub exposes: Collection<'a, Loc>>>, - pub packages: Collection<'a, Loc>>, - pub imports: Collection<'a, Loc>>, - pub provides: Collection<'a, Loc>>, + pub exposes: Collection<'a, Loc>>>, + pub packages: Collection<'a, Loc>>>, + pub imports: Collection<'a, Loc>>>, + pub provides: Collection<'a, Loc>>>, pub effects: Effects<'a>, // Potential comments and newlines - these will typically all be empty. @@ -174,26 +181,7 @@ pub struct Effects<'a> { pub spaces_after_type_name: &'a [CommentOrNewline<'a>], pub effect_shortname: &'a str, pub effect_type_name: &'a str, - pub entries: Collection<'a, Loc>>, -} - -#[derive(Copy, Clone, Debug, PartialEq)] -pub enum ExposesEntry<'a, T> { - /// e.g. `Task` - Exposed(T), - - // Spaces - SpaceBefore(&'a ExposesEntry<'a, T>, &'a [CommentOrNewline<'a>]), - SpaceAfter(&'a ExposesEntry<'a, T>, &'a [CommentOrNewline<'a>]), -} - -impl<'a, T> Spaceable<'a> for ExposesEntry<'a, T> { - fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - ExposesEntry::SpaceBefore(self, spaces) - } - fn after(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - ExposesEntry::SpaceAfter(self, spaces) - } + pub entries: Collection<'a, Loc>>>, } #[derive(Copy, Clone, Debug, PartialEq)] @@ -201,71 +189,35 @@ pub enum ImportsEntry<'a> { /// e.g. `Task` or `Task.{ Task, after }` Module( ModuleName<'a>, - Collection<'a, Loc>>, + Collection<'a, Loc>>>, ), /// e.g. `pf.Task` or `pf.Task.{ after }` or `pf.{ Task.{ Task, after } }` Package( &'a str, ModuleName<'a>, - Collection<'a, Loc>>, + Collection<'a, Loc>>>, ), - - // Spaces - SpaceBefore(&'a ImportsEntry<'a>, &'a [CommentOrNewline<'a>]), - SpaceAfter(&'a ImportsEntry<'a>, &'a [CommentOrNewline<'a>]), } -impl<'a> ExposesEntry<'a, &'a str> { - pub fn as_str(&'a self) -> &'a str { - use ExposesEntry::*; - - match self { - Exposed(string) => string, - SpaceBefore(sub_entry, _) | SpaceAfter(sub_entry, _) => sub_entry.as_str(), - } - } +/// e.g. +/// +/// printLine : Str -> Effect {} +#[derive(Copy, Clone, Debug, PartialEq)] +pub struct TypedIdent<'a> { + pub ident: Loc<&'a str>, + pub spaces_before_colon: &'a [CommentOrNewline<'a>], + pub ann: Loc>, } #[derive(Copy, Clone, Debug, PartialEq)] -pub enum TypedIdent<'a> { - /// e.g. - /// - /// printLine : Str -> Effect {} - Entry { - ident: Loc<&'a str>, - spaces_before_colon: &'a [CommentOrNewline<'a>], - ann: Loc>, - }, - - // Spaces - SpaceBefore(&'a TypedIdent<'a>, &'a [CommentOrNewline<'a>]), - SpaceAfter(&'a TypedIdent<'a>, &'a [CommentOrNewline<'a>]), +pub struct PackageEntry<'a> { + pub shorthand: &'a str, + pub spaces_after_shorthand: &'a [CommentOrNewline<'a>], + pub package_or_path: Loc>, } -#[derive(Copy, Clone, Debug, PartialEq)] -pub enum PackageEntry<'a> { - Entry { - shorthand: &'a str, - spaces_after_shorthand: &'a [CommentOrNewline<'a>], - package_or_path: Loc>, - }, - - // Spaces - SpaceBefore(&'a PackageEntry<'a>, &'a [CommentOrNewline<'a>]), - SpaceAfter(&'a PackageEntry<'a>, &'a [CommentOrNewline<'a>]), -} - -impl<'a> Spaceable<'a> for PackageEntry<'a> { - fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - PackageEntry::SpaceBefore(self, spaces) - } - fn after(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self { - PackageEntry::SpaceAfter(self, spaces) - } -} - -pub fn package_entry<'a>() -> impl Parser<'a, PackageEntry<'a>, EPackageEntry<'a>> { +pub fn package_entry<'a>() -> impl Parser<'a, Spaced<'a, PackageEntry<'a>>, EPackageEntry<'a>> { move |arena, state| { // You may optionally have a package shorthand, // e.g. "uc" in `uc: roc/unicode 1.0.0` @@ -293,19 +245,19 @@ pub fn package_entry<'a>() -> impl Parser<'a, PackageEntry<'a>, EPackageEntry<'a .parse(arena, state)?; let entry = match opt_shorthand { - Some((shorthand, spaces_after_shorthand)) => PackageEntry::Entry { + Some((shorthand, spaces_after_shorthand)) => PackageEntry { shorthand, spaces_after_shorthand, package_or_path, }, - None => PackageEntry::Entry { + None => PackageEntry { shorthand: "", spaces_after_shorthand: &[], package_or_path, }, }; - Ok((MadeProgress, entry, state)) + Ok((MadeProgress, Spaced::Item(entry), state)) } } diff --git a/compiler/parse/src/module.rs b/compiler/parse/src/module.rs index ed5f2528f3..a429871b34 100644 --- a/compiler/parse/src/module.rs +++ b/compiler/parse/src/module.rs @@ -1,7 +1,7 @@ -use crate::ast::{Collection, CommentOrNewline, Def, Module}; +use crate::ast::{Collection, CommentOrNewline, Def, Module, Spaced}; use crate::blankspace::{space0_around_ee, space0_before_e, space0_e}; use crate::header::{ - package_entry, package_name, package_or_path, AppHeader, Effects, ExposesEntry, ImportsEntry, + package_entry, package_name, package_or_path, AppHeader, Effects, ExposedName, ImportsEntry, InterfaceHeader, ModuleName, PackageEntry, PlatformHeader, PlatformRequires, PlatformRigid, To, TypedIdent, }; @@ -220,7 +220,7 @@ fn app_header<'a>() -> impl Parser<'a, AppHeader<'a>, EHeader<'a>> { #[allow(clippy::type_complexity)] let opt_imports: Option<( (&'a [CommentOrNewline<'a>], &'a [CommentOrNewline<'a>]), - Collection<'a, Located>>, + Collection<'a, Located>>>, )> = opt_imports; let ((before_imports, after_imports), imports) = @@ -303,7 +303,7 @@ fn platform_header<'a>() -> impl Parser<'a, PlatformHeader<'a>, EHeader<'a>> { #[derive(Debug)] struct ProvidesTo<'a> { - entries: Collection<'a, Located>>, + entries: Collection<'a, Located>>>, to: Located>, before_provides_keyword: &'a [CommentOrNewline<'a>], @@ -362,7 +362,7 @@ fn provides_without_to<'a>() -> impl Parser< 'a, ( (&'a [CommentOrNewline<'a>], &'a [CommentOrNewline<'a>]), - Collection<'a, Located>>, + Collection<'a, Located>>>, ), EProvides<'a>, > { @@ -385,14 +385,14 @@ fn provides_without_to<'a>() -> impl Parser< EProvides::Open, EProvides::Space, EProvides::IndentListEnd, - ExposesEntry::SpaceBefore + Spaced::SpaceBefore ) ) } fn exposes_entry<'a, F, E>( to_expectation: F, -) -> impl Parser<'a, Located>, E> +) -> impl Parser<'a, Located>>, E> where F: Fn(crate::parser::Row, crate::parser::Col) -> E, F: Copy, @@ -400,7 +400,7 @@ where { loc!(map!( specialize(|_, r, c| to_expectation(r, c), unqualified_ident()), - ExposesEntry::Exposed + |n| Spaced::Item(ExposedName::new(n)) )) } @@ -444,7 +444,7 @@ fn platform_requires<'a>() -> impl Parser<'a, PlatformRequires<'a>, ERequires<'a #[inline(always)] fn requires_rigids<'a>( min_indent: u16, -) -> impl Parser<'a, Collection<'a, Located>>, ERequires<'a>> { +) -> impl Parser<'a, Collection<'a, Located>>>, ERequires<'a>> { collection_trailing_sep_e!( word1(b'{', ERequires::ListStart), specialize(|_, r, c| ERequires::Rigid(r, c), loc!(requires_rigid())), @@ -454,23 +454,24 @@ fn requires_rigids<'a>( ERequires::Open, ERequires::Space, ERequires::IndentListEnd, - PlatformRigid::SpaceBefore + Spaced::SpaceBefore ) } #[inline(always)] -fn requires_rigid<'a>() -> impl Parser<'a, PlatformRigid<'a>, ()> { +fn requires_rigid<'a>() -> impl Parser<'a, Spaced<'a, PlatformRigid<'a>>, ()> { map!( and!( lowercase_ident(), skip_first!(word2(b'=', b'>', |_, _| ()), uppercase_ident()) ), - |(rigid, alias)| PlatformRigid::Entry { rigid, alias } + |(rigid, alias)| Spaced::Item(PlatformRigid { rigid, alias }) ) } #[inline(always)] -fn requires_typed_ident<'a>() -> impl Parser<'a, Located>, ERequires<'a>> { +fn requires_typed_ident<'a>() -> impl Parser<'a, Located>>, ERequires<'a>> +{ skip_first!( word1(b'{', ERequires::ListStart), skip_second!( @@ -491,7 +492,7 @@ fn exposes_values<'a>() -> impl Parser< 'a, ( (&'a [CommentOrNewline<'a>], &'a [CommentOrNewline<'a>]), - Collection<'a, Located>>, + Collection<'a, Located>>>, ), EExposes, > { @@ -515,7 +516,7 @@ fn exposes_values<'a>() -> impl Parser< EExposes::Open, EExposes::Space, EExposes::IndentListEnd, - ExposesEntry::SpaceBefore + Spaced::SpaceBefore ) ) } @@ -545,7 +546,7 @@ fn exposes_modules<'a>() -> impl Parser< 'a, ( (&'a [CommentOrNewline<'a>], &'a [CommentOrNewline<'a>]), - Collection<'a, Located>>>, + Collection<'a, Located>>>, ), EExposes, > { @@ -569,14 +570,14 @@ fn exposes_modules<'a>() -> impl Parser< EExposes::Open, EExposes::Space, EExposes::IndentListEnd, - ExposesEntry::SpaceBefore + Spaced::SpaceBefore ) ) } fn exposes_module<'a, F, E>( to_expectation: F, -) -> impl Parser<'a, Located>>, E> +) -> impl Parser<'a, Located>>, E> where F: Fn(crate::parser::Row, crate::parser::Col) -> E, F: Copy, @@ -584,13 +585,13 @@ where { loc!(map!( specialize(|_, r, c| to_expectation(r, c), module_name()), - ExposesEntry::Exposed + Spaced::Item )) } #[derive(Debug)] struct Packages<'a> { - entries: Collection<'a, Located>>, + entries: Collection<'a, Located>>>, before_packages_keyword: &'a [CommentOrNewline<'a>], after_packages_keyword: &'a [CommentOrNewline<'a>], } @@ -618,7 +619,7 @@ fn packages<'a>() -> impl Parser<'a, Packages<'a>, EPackages<'a>> { EPackages::Open, EPackages::Space, EPackages::IndentListEnd, - PackageEntry::SpaceBefore + Spaced::SpaceBefore ) ), |((before_packages_keyword, after_packages_keyword), entries): ( @@ -639,7 +640,7 @@ fn imports<'a>() -> impl Parser< 'a, ( (&'a [CommentOrNewline<'a>], &'a [CommentOrNewline<'a>]), - Collection<'a, Located>>, + Collection<'a, Located>>>, ), EImports, > { @@ -663,7 +664,7 @@ fn imports<'a>() -> impl Parser< EImports::Open, EImports::Space, EImports::IndentListEnd, - ImportsEntry::SpaceBefore + Spaced::SpaceBefore ) ) } @@ -706,7 +707,7 @@ fn effects<'a>() -> impl Parser<'a, Effects<'a>, EEffects<'a>> { EEffects::Open, EEffects::Space, EEffects::IndentListEnd, - TypedIdent::SpaceBefore + Spaced::SpaceBefore ) .parse(arena, state)?; @@ -726,7 +727,7 @@ fn effects<'a>() -> impl Parser<'a, Effects<'a>, EEffects<'a>> { } #[inline(always)] -fn typed_ident<'a>() -> impl Parser<'a, TypedIdent<'a>, ETypedIdent<'a>> { +fn typed_ident<'a>() -> impl Parser<'a, Spaced<'a, TypedIdent<'a>>, ETypedIdent<'a>> { // e.g. // // printLine : Str -> Effect {} @@ -752,11 +753,11 @@ fn typed_ident<'a>() -> impl Parser<'a, TypedIdent<'a>, ETypedIdent<'a>> { ) ), |((ident, spaces_before_colon), ann)| { - TypedIdent::Entry { + Spaced::Item(TypedIdent { ident, spaces_before_colon, ann, - } + }) } ) } @@ -775,12 +776,12 @@ where } #[inline(always)] -fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>, EImports> { +fn imports_entry<'a>() -> impl Parser<'a, Spaced<'a, ImportsEntry<'a>>, EImports> { let min_indent = 1; type Temp<'a> = ( (Option<&'a str>, ModuleName<'a>), - Option>>>, + Option>>>>, ); map_with_arena!( @@ -806,18 +807,20 @@ fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>, EImports> { EImports::Open, EImports::Space, EImports::IndentSetEnd, - ExposesEntry::SpaceBefore + Spaced::SpaceBefore ) )) ), |_arena, ((opt_shortname, module_name), opt_values): Temp<'a>| { let exposed_values = opt_values.unwrap_or_else(Collection::empty); - match opt_shortname { + let entry = match opt_shortname { Some(shortname) => ImportsEntry::Package(shortname, module_name, exposed_values), None => ImportsEntry::Module(module_name, exposed_values), - } + }; + + Spaced::Item(entry) } ) } diff --git a/compiler/parse/tests/snapshots/pass/empty_platform_header.header.result-ast b/compiler/parse/tests/snapshots/pass/empty_platform_header.header.result-ast index fa3993d530..47d116d78d 100644 --- a/compiler/parse/tests/snapshots/pass/empty_platform_header.header.result-ast +++ b/compiler/parse/tests/snapshots/pass/empty_platform_header.header.result-ast @@ -6,7 +6,7 @@ Platform { }, requires: PlatformRequires { rigids: [], - signature: |L 0-0, C 38-47| Entry { + signature: |L 0-0, C 38-47| TypedIdent { ident: |L 0-0, C 38-42| "main", spaces_before_colon: [], ann: |L 0-0, C 45-47| Record { diff --git a/compiler/parse/tests/snapshots/pass/full_app_header.header.result-ast b/compiler/parse/tests/snapshots/pass/full_app_header.header.result-ast index e33441e9ea..f04eff75bf 100644 --- a/compiler/parse/tests/snapshots/pass/full_app_header.header.result-ast +++ b/compiler/parse/tests/snapshots/pass/full_app_header.header.result-ast @@ -4,7 +4,7 @@ App { "quicksort", ), packages: [ - |L 1-1, C 15-31| Entry { + |L 1-1, C 15-31| PackageEntry { shorthand: "pf", spaces_after_shorthand: [], package_or_path: |L 1-1, C 19-31| Path( @@ -24,7 +24,7 @@ App { ), ], provides: [ - |L 3-3, C 15-24| Exposed( + |L 3-3, C 15-24| ExposedName( "quicksort", ), ], diff --git a/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.result-ast b/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.result-ast index 8864727f1b..988ff5ae7a 100644 --- a/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.result-ast +++ b/compiler/parse/tests/snapshots/pass/full_app_header_trailing_commas.header.result-ast @@ -4,7 +4,7 @@ App { "quicksort", ), packages: [ - |L 1-1, C 15-31| Entry { + |L 1-1, C 15-31| PackageEntry { shorthand: "pf", spaces_after_shorthand: [], package_or_path: |L 1-1, C 19-31| Path( @@ -23,7 +23,7 @@ App { Collection { items: [ |L 3-3, C 8-11| SpaceBefore( - Exposed( + ExposedName( "Baz", ), [ @@ -31,7 +31,7 @@ App { ], ), |L 4-4, C 8-16| SpaceBefore( - Exposed( + ExposedName( "FortyTwo", ), [ @@ -49,7 +49,7 @@ App { ), ], provides: [ - |L 7-7, C 15-24| Exposed( + |L 7-7, C 15-24| ExposedName( "quicksort", ), ], diff --git a/compiler/parse/tests/snapshots/pass/nonempty_platform_header.header.result-ast b/compiler/parse/tests/snapshots/pass/nonempty_platform_header.header.result-ast index 8497dc8470..60259c1cd8 100644 --- a/compiler/parse/tests/snapshots/pass/nonempty_platform_header.header.result-ast +++ b/compiler/parse/tests/snapshots/pass/nonempty_platform_header.header.result-ast @@ -6,12 +6,12 @@ Platform { }, requires: PlatformRequires { rigids: [ - |L 1-1, C 14-26| Entry { + |L 1-1, C 14-26| PlatformRigid { rigid: "model", alias: "Model", }, ], - signature: |L 1-1, C 30-39| Entry { + signature: |L 1-1, C 30-39| TypedIdent { ident: |L 1-1, C 30-34| "main", spaces_before_colon: [], ann: |L 1-1, C 37-39| Record { @@ -22,7 +22,7 @@ Platform { }, exposes: [], packages: [ - |L 3-3, C 15-27| Entry { + |L 3-3, C 15-27| PackageEntry { shorthand: "foo", spaces_after_shorthand: [], package_or_path: |L 3-3, C 20-27| Path( @@ -34,7 +34,7 @@ Platform { ], imports: [], provides: [ - |L 5-5, C 15-26| Exposed( + |L 5-5, C 15-26| ExposedName( "mainForHost", ), ], From 63056eeeacd4acf224e40bd58e5b057574ecb0d0 Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Mon, 13 Dec 2021 17:34:29 -0800 Subject: [PATCH 56/57] Remove spaces from header 'Info' structs --- compiler/load/src/file.rs | 57 ++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/compiler/load/src/file.rs b/compiler/load/src/file.rs index e056790377..044f34d065 100644 --- a/compiler/load/src/file.rs +++ b/compiler/load/src/file.rs @@ -2553,8 +2553,8 @@ fn parse_header<'a>( opt_shorthand, header_src, packages: &[], - exposes: header.exposes.items, - imports: header.imports.items, + exposes: unspace(arena, header.exposes.items), + imports: unspace(arena, header.imports.items), to_platform: None, }; @@ -2575,7 +2575,7 @@ fn parse_header<'a>( std::str::from_utf8_unchecked(&src_bytes[..chomped]) }; - let packages = header.packages.items; + let packages = unspace(arena, header.packages.items); let info = HeaderInfo { loc_name: Located { @@ -2587,8 +2587,8 @@ fn parse_header<'a>( opt_shorthand, header_src, packages, - exposes: header.provides.items, - imports: header.imports.items, + exposes: unspace(arena, header.provides.items), + imports: unspace(arena, header.imports.items), to_platform: Some(header.to.value), }; @@ -2605,9 +2605,8 @@ fn parse_header<'a>( let opt_base_package = packages.iter().find_map(|loc_package_entry| { let Located { value, .. } = loc_package_entry; - let item = value.extract_spaces().item; - if item.shorthand == existing_package { - Some(item) + if value.shorthand == existing_package { + Some(value) } else { None } @@ -2759,9 +2758,9 @@ struct HeaderInfo<'a> { is_root_module: bool, opt_shorthand: Option<&'a str>, header_src: &'a str, - packages: &'a [Located>>], - exposes: &'a [Located>>], - imports: &'a [Located>>], + packages: &'a [Located>], + exposes: &'a [Located>], + imports: &'a [Located>], to_platform: Option>, } @@ -2894,8 +2893,7 @@ fn send_header<'a>( // For example, if module A has [ B.{ foo } ], then // when we get here for B, `foo` will already have // an IdentId. We must reuse that! - let ident_id = - ident_ids.get_or_insert(&loc_exposed.value.extract_spaces().item.as_str().into()); + let ident_id = ident_ids.get_or_insert(&loc_exposed.value.as_str().into()); let symbol = Symbol::new(home, ident_id); exposed.push(symbol); @@ -2911,7 +2909,7 @@ fn send_header<'a>( let package_entries = packages .iter() .map(|pkg| { - let pkg = pkg.value.extract_spaces().item; + let pkg = pkg.value; (pkg.shorthand, pkg.package_or_path.value) }) .collect::>(); @@ -2973,9 +2971,9 @@ struct PlatformHeaderInfo<'a> { header_src: &'a str, app_module_id: ModuleId, packages: &'a [Located>], - provides: &'a [Located>>], + provides: &'a [Located>], requires: &'a [Located>], - imports: &'a [Located>>], + imports: &'a [Located>], } // TODO refactor so more logic is shared with `send_header` @@ -3118,8 +3116,7 @@ fn send_header_two<'a>( // For example, if module A has [ B.{ foo } ], then // when we get here for B, `foo` will already have // an IdentId. We must reuse that! - let ident_id = - ident_ids.get_or_insert(&loc_exposed.value.extract_spaces().item.as_str().into()); + let ident_id = ident_ids.get_or_insert(&loc_exposed.value.as_str().into()); let symbol = Symbol::new(home, ident_id); exposed.push(symbol); @@ -3146,7 +3143,7 @@ fn send_header_two<'a>( let module_name = ModuleNameEnum::PkgConfig; let main_for_host = { - let ident_str: Ident = provides[0].value.extract_spaces().item.as_str().into(); + let ident_str: Ident = provides[0].value.as_str().into(); let ident_id = ident_ids.get_or_insert(&ident_str); Symbol::new(home, ident_id) @@ -3314,6 +3311,16 @@ fn run_solve<'a>( } } +fn unspace<'a, T: Copy>(arena: &'a Bump, items: &[Located>]) -> &'a [Located] { + bumpalo::collections::Vec::from_iter_in( + items + .iter() + .map(|item| Located::at(item.region, item.value.extract_spaces().item)), + arena, + ) + .into_bump_slice() +} + #[allow(clippy::too_many_arguments)] fn fabricate_pkg_config_module<'a>( arena: &'a Bump, @@ -3327,8 +3334,6 @@ fn fabricate_pkg_config_module<'a>( header_src: &'a str, module_timing: ModuleTiming, ) -> (ModuleId, Msg<'a>) { - let provides: &'a [Located>>] = header.provides.items; - let info = PlatformHeaderInfo { filename, is_root_module: false, @@ -3336,12 +3341,12 @@ fn fabricate_pkg_config_module<'a>( header_src, app_module_id, packages: &[], - provides, + provides: unspace(arena, header.provides.items), requires: &*arena.alloc([Located::at( header.requires.signature.region, header.requires.signature.extract_spaces().item, )]), - imports: header.imports.items, + imports: unspace(arena, header.imports.items), }; send_header_two( @@ -3773,12 +3778,10 @@ fn parse<'a>(arena: &'a Bump, header: ModuleHeader<'a>) -> Result, Loadi Ok(Msg::Parsed(parsed)) } -fn exposed_from_import<'a>( - entry: &Spaced<'a, ImportsEntry<'a>>, -) -> (QualifiedModuleName<'a>, Vec) { +fn exposed_from_import<'a>(entry: &ImportsEntry<'a>) -> (QualifiedModuleName<'a>, Vec) { use roc_parse::header::ImportsEntry::*; - match entry.extract_spaces().item { + match entry { Module(module_name, exposes) => { let mut exposed = Vec::with_capacity(exposes.len()); From 45c1b6a81206b71e17dbf3304b88f024e342e8e8 Mon Sep 17 00:00:00 2001 From: Anton-4 <17049058+Anton-4@users.noreply.github.com> Date: Wed, 15 Dec 2021 14:12:32 +0100 Subject: [PATCH 57/57] fmt --- cli_utils/Cargo.lock | 10 +++++----- compiler/can/src/builtins.rs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cli_utils/Cargo.lock b/cli_utils/Cargo.lock index 5fa0d0ee9b..852c98d3fb 100644 --- a/cli_utils/Cargo.lock +++ b/cli_utils/Cargo.lock @@ -1310,13 +1310,13 @@ dependencies = [ name = "inkwell" version = "0.1.0" dependencies = [ - "inkwell 0.1.0 (git+https://github.com/rtfeldman/inkwell?tag=llvm12-0.release8)", + "inkwell 0.1.0 (git+https://github.com/rtfeldman/inkwell?tag=llvm13-0.release1)", ] [[package]] name = "inkwell" version = "0.1.0" -source = "git+https://github.com/rtfeldman/inkwell?tag=llvm12-0.release8#14b78d96d2dbc95694e181be66e4cd53df3fc02f" +source = "git+https://github.com/rtfeldman/inkwell?tag=llvm13-0.release1#e15d665227b2acad4ca949820d80048e09f3f4e5" dependencies = [ "either", "inkwell_internals", @@ -1324,13 +1324,12 @@ dependencies = [ "llvm-sys", "once_cell", "parking_lot", - "regex", ] [[package]] name = "inkwell_internals" -version = "0.3.0" -source = "git+https://github.com/rtfeldman/inkwell?tag=llvm12-0.release8#14b78d96d2dbc95694e181be66e4cd53df3fc02f" +version = "0.5.0" +source = "git+https://github.com/rtfeldman/inkwell?tag=llvm13-0.release1#e15d665227b2acad4ca949820d80048e09f3f4e5" dependencies = [ "proc-macro2", "quote", @@ -2666,6 +2665,7 @@ dependencies = [ "roc_collections", "roc_module", "roc_mono", + "roc_reporting", "roc_std", "target-lexicon", ] diff --git a/compiler/can/src/builtins.rs b/compiler/can/src/builtins.rs index 4bbad8d1c5..0e04e6c0f8 100644 --- a/compiler/can/src/builtins.rs +++ b/compiler/can/src/builtins.rs @@ -1,5 +1,5 @@ use crate::def::Def; -use crate::expr::{ClosureData, Expr::*, self}; +use crate::expr::{self, ClosureData, Expr::*}; use crate::expr::{Expr, Field, Recursive}; use crate::pattern::Pattern; use roc_collections::all::SendMap;