From a9a5ba23171875c838c4d89c582aa37bde86eeb7 Mon Sep 17 00:00:00 2001 From: Sean Billig Date: Sun, 9 May 2021 11:04:00 -0700 Subject: [PATCH] Add some codespan errors to analyzer --- analyzer/src/context.rs | 71 +- analyzer/src/errors.rs | 22 + analyzer/src/lib.rs | 37 +- analyzer/src/namespace/events.rs | 19 +- analyzer/src/namespace/types.rs | 146 +- analyzer/src/traversal/assignments.rs | 30 +- analyzer/src/traversal/expressions.rs | 59 +- analyzer/src/traversal/functions.rs | 321 ++- analyzer/src/traversal/utils.rs | 6 +- analyzer/tests/analysis.rs | 31 +- analyzer/tests/errors.rs | 110 + analyzer/tests/fixtures/demos/erc20_token.fe | 54 +- analyzer/tests/fixtures/demos/uniswap.fe | 14 +- .../errors}/assert_reason_not_string.fe | 0 analyzer/tests/fixtures/errors/assign_call.fe | 8 + analyzer/tests/fixtures/errors/assign_int.fe | 3 + .../errors}/aug_assign_non_numeric.fe | 0 .../tests/fixtures/errors}/bad_map.fe | 0 .../tests/fixtures/errors}/bad_map2.fe | 0 .../tests/fixtures/errors}/bad_map3.fe | 0 .../tests/fixtures/errors}/bad_map4.fe | 0 .../tests/fixtures/errors}/bad_map5.fe | 0 .../errors}/binary_operations/add_uints.fe | 0 .../errors}/binary_operations/lshift_bool.fe | 0 .../binary_operations/lshift_with_int.fe | 0 .../errors}/binary_operations/pow_int.fe | 0 .../fixtures/errors}/break_without_loop.fe | 0 .../fixtures/errors}/break_without_loop_2.fe | 0 .../errors}/call_event_with_wrong_types.fe | 0 .../call_undefined_function_on_contract.fe | 0 ...undefined_function_on_external_contract.fe | 0 ...all_undefined_function_on_memory_struct.fe | 0 ...ll_undefined_function_on_storage_struct.fe | 0 .../errors}/circular_dependency_create.fe | 0 .../errors}/circular_dependency_create2.fe | 0 .../fixtures/errors}/continue_without_loop.fe | 0 .../errors}/continue_without_loop_2.fe | 0 .../errors}/duplicate_contract_in_module.fe | 0 .../errors}/duplicate_event_in_contract.fe | 0 .../errors}/duplicate_field_in_contract.fe | 0 .../errors}/duplicate_field_in_struct.fe | 0 .../errors}/duplicate_method_in_contract.fe | 0 .../errors}/duplicate_struct_in_module.fe | 0 .../errors}/duplicate_typedef_in_module.fe | 0 .../errors}/duplicate_var_in_child_scope.fe | 0 .../duplicate_var_in_contract_method.fe | 0 .../tests/fixtures/errors/emit_bad_args.fe | 8 + .../fixtures/errors}/emit_undefined_event.fe | 0 .../errors}/external_call_type_error.fe | 0 .../external_call_wrong_number_of_params.fe | 0 .../tests/fixtures/errors}/indexed_event.fe | 0 .../errors}/keccak_called_with_wrong_type.fe | 0 .../fixtures/errors}/mismatch_return_type.fe | 0 .../tests/fixtures/errors}/missing_return.fe | 0 .../errors}/missing_return_in_else.fe | 0 .../tests/fixtures/errors}/needs_mem_copy.fe | 0 .../tests/fixtures/errors}/non_bool_and.fe | 0 .../tests/fixtures/errors}/non_bool_or.fe | 0 .../tests/fixtures/errors}/not_in_scope.fe | 0 .../tests/fixtures/errors}/not_in_scope_2.fe | 0 .../numeric_capacity_mismatch/i128_neg.fe | 0 .../numeric_capacity_mismatch/i128_pos.fe | 0 .../numeric_capacity_mismatch/i16_neg.fe | 0 .../numeric_capacity_mismatch/i16_pos.fe | 0 .../numeric_capacity_mismatch/i256_neg.fe | 0 .../numeric_capacity_mismatch/i256_pos.fe | 0 .../numeric_capacity_mismatch/i32_neg.fe | 0 .../numeric_capacity_mismatch/i32_pos.fe | 0 .../numeric_capacity_mismatch/i64_neg.fe | 0 .../numeric_capacity_mismatch/i64_pos.fe | 0 .../numeric_capacity_mismatch/i8_neg.fe | 0 .../numeric_capacity_mismatch/i8_pos.fe | 0 .../literal_too_big.fe | 0 .../literal_too_small.fe | 0 .../numeric_capacity_mismatch/octal_number.fe | 0 .../numeric_capacity_mismatch/u128_neg.fe | 0 .../numeric_capacity_mismatch/u128_pos.fe | 0 .../numeric_capacity_mismatch/u16_neg.fe | 0 .../numeric_capacity_mismatch/u16_pos.fe | 0 .../numeric_capacity_mismatch/u256_neg.fe | 0 .../numeric_capacity_mismatch/u256_pos.fe | 0 .../numeric_capacity_mismatch/u32_neg.fe | 0 .../numeric_capacity_mismatch/u32_pos.fe | 0 .../numeric_capacity_mismatch/u64_neg.fe | 0 .../numeric_capacity_mismatch/u64_pos.fe | 0 .../numeric_capacity_mismatch/u8_neg.fe | 0 .../numeric_capacity_mismatch/u8_pos.fe | 0 .../errors}/pow_with_signed_exponent.fe | 0 .../errors}/pow_with_wrong_capacity.fe | 0 .../return_addition_with_mixed_types.fe | 0 ...urn_call_to_fn_with_param_type_mismatch.fe | 0 .../return_call_to_fn_without_return.fe | 0 .../fixtures/errors}/return_from_init.fe | 0 .../fixtures/errors}/return_lt_mixed_types.fe | 0 .../errors}/strict_boolean_if_else.fe | 0 .../errors}/string_capacity_mismatch.fe | 0 .../errors}/struct_call_without_kw_args.fe | 0 .../errors}/type_constructor_from_variable.fe | 0 .../fixtures/errors}/unary_minus_on_bool.fe | 0 .../fixtures/errors}/unexpected_return.fe | 0 analyzer/tests/fixtures/features/events.fe | 6 +- analyzer/tests/fixtures/features/ownable.fe | 14 +- .../fixtures/features/sized_vals_in_sto.fe | 6 +- analyzer/tests/fixtures/features/strings.fe | 2 +- .../fixtures/stress/abi_encoding_stress.fe | 12 +- .../fixtures/stress/data_copying_stress.fe | 2 +- .../analysis__case_001_erc20_token.snap | 754 +++--- .../snapshots/analysis__case_003_uniswap.snap | 2126 ++++++++--------- .../snapshots/analysis__case_017_events.snap | 122 +- .../analysis__case_022_if_statement.snap | 52 +- .../analysis__case_023_if_statement_2.snap | 52 +- ...4_if_statement_with_block_declaration.snap | 30 +- .../snapshots/analysis__case_026_math.snap | 358 +-- .../snapshots/analysis__case_030_ownable.snap | 90 +- .../analysis__case_085_sized_vals_in_sto.snap | 76 +- .../snapshots/analysis__case_086_strings.snap | 72 +- .../analysis__case_096_while_loop.snap | 118 +- ...lysis__case_097_while_loop_with_break.snap | 74 +- ...sis__case_098_while_loop_with_break_2.snap | 104 +- ...is__case_099_while_loop_with_continue.snap | 158 +- ...nalysis__case_100_abi_encoding_stress.snap | 138 +- ...nalysis__case_101_data_copying_stress.snap | 34 +- analyzer/tests/snapshots/errors__case_01.snap | 10 + analyzer/tests/snapshots/errors__case_02.snap | 9 + analyzer/tests/snapshots/errors__case_03.snap | 9 + analyzer/tests/snapshots/errors__case_04.snap | 9 + analyzer/tests/snapshots/errors__case_05.snap | 9 + analyzer/tests/snapshots/errors__case_06.snap | 9 + analyzer/tests/snapshots/errors__case_07.snap | 12 + analyzer/tests/snapshots/errors__case_08.snap | 12 + analyzer/tests/snapshots/errors__case_09.snap | 36 + analyzer/tests/snapshots/errors__case_10.snap | 9 + analyzer/tests/snapshots/errors__case_11.snap | 9 + analyzer/tests/snapshots/errors__case_12.snap | 9 + analyzer/tests/snapshots/errors__case_13.snap | 9 + analyzer/tests/snapshots/errors__case_14.snap | 9 + analyzer/tests/snapshots/errors__case_15.snap | 9 + analyzer/tests/snapshots/errors__case_16.snap | 12 + analyzer/tests/snapshots/errors__case_17.snap | 12 + analyzer/tests/snapshots/errors__case_18.snap | 9 + analyzer/tests/snapshots/errors__case_19.snap | 10 + analyzer/tests/snapshots/errors__case_20.snap | 9 + analyzer/tests/snapshots/errors__case_21.snap | 9 + analyzer/tests/snapshots/errors__case_22.snap | 10 + analyzer/tests/snapshots/errors__case_23.snap | 9 + analyzer/tests/snapshots/errors__case_24.snap | 9 + analyzer/tests/snapshots/errors__case_25.snap | 10 + analyzer/tests/snapshots/errors__case_26.snap | 11 + analyzer/tests/snapshots/errors__case_27.snap | 12 + analyzer/tests/snapshots/errors__case_28.snap | 47 + analyzer/tests/snapshots/errors__case_29.snap | 9 + analyzer/tests/snapshots/errors__case_30.snap | 9 + analyzer/tests/snapshots/errors__case_31.snap | 13 + analyzer/tests/snapshots/errors__case_32.snap | 9 + analyzer/tests/snapshots/errors__case_33.snap | 10 + analyzer/tests/snapshots/errors__case_34.snap | 17 + analyzer/tests/snapshots/errors__case_35.snap | 14 + analyzer/tests/snapshots/errors__case_36.snap | 10 + analyzer/tests/snapshots/errors__case_37.snap | 9 + analyzer/tests/snapshots/errors__case_38.snap | 9 + analyzer/tests/snapshots/errors__case_39.snap | 9 + analyzer/tests/snapshots/errors__case_40.snap | 9 + analyzer/tests/snapshots/errors__case_41.snap | 12 + analyzer/tests/snapshots/errors__case_42.snap | 12 + analyzer/tests/snapshots/errors__case_43.snap | 12 + analyzer/tests/snapshots/errors__case_44.snap | 12 + analyzer/tests/snapshots/errors__case_45.snap | 12 + analyzer/tests/snapshots/errors__case_46.snap | 12 + analyzer/tests/snapshots/errors__case_47.snap | 12 + analyzer/tests/snapshots/errors__case_48.snap | 12 + analyzer/tests/snapshots/errors__case_49.snap | 12 + analyzer/tests/snapshots/errors__case_50.snap | 12 + analyzer/tests/snapshots/errors__case_51.snap | 12 + analyzer/tests/snapshots/errors__case_52.snap | 12 + analyzer/tests/snapshots/errors__case_53.snap | 12 + analyzer/tests/snapshots/errors__case_54.snap | 12 + analyzer/tests/snapshots/errors__case_55.snap | 18 + analyzer/tests/snapshots/errors__case_56.snap | 12 + analyzer/tests/snapshots/errors__case_57.snap | 12 + analyzer/tests/snapshots/errors__case_58.snap | 12 + analyzer/tests/snapshots/errors__case_59.snap | 12 + analyzer/tests/snapshots/errors__case_60.snap | 12 + analyzer/tests/snapshots/errors__case_61.snap | 18 + analyzer/tests/snapshots/errors__case_62.snap | 12 + analyzer/tests/snapshots/errors__case_63.snap | 12 + analyzer/tests/snapshots/errors__case_64.snap | 12 + analyzer/tests/snapshots/errors__case_65.snap | 12 + analyzer/tests/snapshots/errors__case_66.snap | 12 + analyzer/tests/snapshots/errors__case_67.snap | 12 + analyzer/tests/snapshots/errors__case_68.snap | 9 + analyzer/tests/snapshots/errors__case_69.snap | 9 + analyzer/tests/snapshots/errors__case_70.snap | 9 + analyzer/tests/snapshots/errors__case_71.snap | 9 + analyzer/tests/snapshots/errors__case_72.snap | 10 + analyzer/tests/snapshots/errors__case_73.snap | 19 + analyzer/tests/snapshots/errors__case_74.snap | 9 + analyzer/tests/snapshots/errors__case_75.snap | 12 + analyzer/tests/snapshots/errors__case_76.snap | 9 + analyzer/tests/snapshots/errors__case_77.snap | 9 + analyzer/tests/snapshots/errors__case_78.snap | 9 + analyzer/tests/snapshots/errors__case_79.snap | 9 + analyzer/tests/snapshots/errors__case_80.snap | 10 + analyzer/tests/snapshots/errors__case_81.snap | 10 + analyzer/tests/snapshots/errors__case_82.snap | 9 + analyzer/tests/snapshots/errors__case_83.snap | 9 + analyzer/tests/snapshots/errors__case_84.snap | 9 + analyzer/tests/snapshots/errors__case_85.snap | 9 + common/src/diagnostics.rs | 42 +- compiler/src/abi/builder.rs | 4 +- compiler/src/errors.rs | 16 +- compiler/src/lib.rs | 5 +- compiler/tests/cases/compile_errors.rs | 142 -- .../cases/lowering/fixtures/base_tuple.fe | 4 +- .../lowering/fixtures/base_tuple_lowered.fe | 4 +- compiler/tests/cases/lowering/mod.rs | 8 +- compiler/tests/cases/main.rs | 1 - compiler/tests/cases/utils.rs | 12 +- compiler/tests/fixtures/demos/erc20_token.fe | 54 +- compiler/tests/fixtures/demos/uniswap.fe | 14 +- compiler/tests/fixtures/features/events.fe | 6 +- compiler/tests/fixtures/features/ownable.fe | 14 +- .../fixtures/features/sized_vals_in_sto.fe | 6 +- compiler/tests/fixtures/features/strings.fe | 2 +- .../fixtures/stress/abi_encoding_stress.fe | 12 +- .../fixtures/stress/data_copying_stress.fe | 2 +- parser/src/ast.rs | 3 +- parser/src/grammar/functions.rs | 4 +- parser/src/parser.rs | 48 +- src/main.rs | 12 +- 229 files changed, 4045 insertions(+), 2688 deletions(-) create mode 100644 analyzer/tests/errors.rs rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/assert_reason_not_string.fe (100%) create mode 100644 analyzer/tests/fixtures/errors/assign_call.fe create mode 100644 analyzer/tests/fixtures/errors/assign_int.fe rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/aug_assign_non_numeric.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/bad_map.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/bad_map2.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/bad_map3.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/bad_map4.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/bad_map5.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/binary_operations/add_uints.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/binary_operations/lshift_bool.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/binary_operations/lshift_with_int.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/binary_operations/pow_int.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/break_without_loop.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/break_without_loop_2.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/call_event_with_wrong_types.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/call_undefined_function_on_contract.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/call_undefined_function_on_external_contract.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/call_undefined_function_on_memory_struct.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/call_undefined_function_on_storage_struct.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/circular_dependency_create.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/circular_dependency_create2.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/continue_without_loop.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/continue_without_loop_2.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_contract_in_module.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_event_in_contract.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_field_in_contract.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_field_in_struct.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_method_in_contract.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_struct_in_module.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_typedef_in_module.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_var_in_child_scope.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/duplicate_var_in_contract_method.fe (100%) create mode 100644 analyzer/tests/fixtures/errors/emit_bad_args.fe rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/emit_undefined_event.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/external_call_type_error.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/external_call_wrong_number_of_params.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/indexed_event.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/keccak_called_with_wrong_type.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/mismatch_return_type.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/missing_return.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/missing_return_in_else.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/needs_mem_copy.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/non_bool_and.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/non_bool_or.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/not_in_scope.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/not_in_scope_2.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i128_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i128_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i16_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i16_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i256_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i256_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i32_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i32_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i64_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i64_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i8_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/i8_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/literal_too_big.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/literal_too_small.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/octal_number.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u128_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u128_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u16_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u16_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u256_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u256_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u32_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u32_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u64_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u64_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u8_neg.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/numeric_capacity_mismatch/u8_pos.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/pow_with_signed_exponent.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/pow_with_wrong_capacity.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/return_addition_with_mixed_types.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/return_call_to_fn_with_param_type_mismatch.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/return_call_to_fn_without_return.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/return_from_init.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/return_lt_mixed_types.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/strict_boolean_if_else.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/string_capacity_mismatch.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/struct_call_without_kw_args.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/type_constructor_from_variable.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/unary_minus_on_bool.fe (100%) rename {compiler/tests/fixtures/compile_errors => analyzer/tests/fixtures/errors}/unexpected_return.fe (100%) create mode 100644 analyzer/tests/snapshots/errors__case_01.snap create mode 100644 analyzer/tests/snapshots/errors__case_02.snap create mode 100644 analyzer/tests/snapshots/errors__case_03.snap create mode 100644 analyzer/tests/snapshots/errors__case_04.snap create mode 100644 analyzer/tests/snapshots/errors__case_05.snap create mode 100644 analyzer/tests/snapshots/errors__case_06.snap create mode 100644 analyzer/tests/snapshots/errors__case_07.snap create mode 100644 analyzer/tests/snapshots/errors__case_08.snap create mode 100644 analyzer/tests/snapshots/errors__case_09.snap create mode 100644 analyzer/tests/snapshots/errors__case_10.snap create mode 100644 analyzer/tests/snapshots/errors__case_11.snap create mode 100644 analyzer/tests/snapshots/errors__case_12.snap create mode 100644 analyzer/tests/snapshots/errors__case_13.snap create mode 100644 analyzer/tests/snapshots/errors__case_14.snap create mode 100644 analyzer/tests/snapshots/errors__case_15.snap create mode 100644 analyzer/tests/snapshots/errors__case_16.snap create mode 100644 analyzer/tests/snapshots/errors__case_17.snap create mode 100644 analyzer/tests/snapshots/errors__case_18.snap create mode 100644 analyzer/tests/snapshots/errors__case_19.snap create mode 100644 analyzer/tests/snapshots/errors__case_20.snap create mode 100644 analyzer/tests/snapshots/errors__case_21.snap create mode 100644 analyzer/tests/snapshots/errors__case_22.snap create mode 100644 analyzer/tests/snapshots/errors__case_23.snap create mode 100644 analyzer/tests/snapshots/errors__case_24.snap create mode 100644 analyzer/tests/snapshots/errors__case_25.snap create mode 100644 analyzer/tests/snapshots/errors__case_26.snap create mode 100644 analyzer/tests/snapshots/errors__case_27.snap create mode 100644 analyzer/tests/snapshots/errors__case_28.snap create mode 100644 analyzer/tests/snapshots/errors__case_29.snap create mode 100644 analyzer/tests/snapshots/errors__case_30.snap create mode 100644 analyzer/tests/snapshots/errors__case_31.snap create mode 100644 analyzer/tests/snapshots/errors__case_32.snap create mode 100644 analyzer/tests/snapshots/errors__case_33.snap create mode 100644 analyzer/tests/snapshots/errors__case_34.snap create mode 100644 analyzer/tests/snapshots/errors__case_35.snap create mode 100644 analyzer/tests/snapshots/errors__case_36.snap create mode 100644 analyzer/tests/snapshots/errors__case_37.snap create mode 100644 analyzer/tests/snapshots/errors__case_38.snap create mode 100644 analyzer/tests/snapshots/errors__case_39.snap create mode 100644 analyzer/tests/snapshots/errors__case_40.snap create mode 100644 analyzer/tests/snapshots/errors__case_41.snap create mode 100644 analyzer/tests/snapshots/errors__case_42.snap create mode 100644 analyzer/tests/snapshots/errors__case_43.snap create mode 100644 analyzer/tests/snapshots/errors__case_44.snap create mode 100644 analyzer/tests/snapshots/errors__case_45.snap create mode 100644 analyzer/tests/snapshots/errors__case_46.snap create mode 100644 analyzer/tests/snapshots/errors__case_47.snap create mode 100644 analyzer/tests/snapshots/errors__case_48.snap create mode 100644 analyzer/tests/snapshots/errors__case_49.snap create mode 100644 analyzer/tests/snapshots/errors__case_50.snap create mode 100644 analyzer/tests/snapshots/errors__case_51.snap create mode 100644 analyzer/tests/snapshots/errors__case_52.snap create mode 100644 analyzer/tests/snapshots/errors__case_53.snap create mode 100644 analyzer/tests/snapshots/errors__case_54.snap create mode 100644 analyzer/tests/snapshots/errors__case_55.snap create mode 100644 analyzer/tests/snapshots/errors__case_56.snap create mode 100644 analyzer/tests/snapshots/errors__case_57.snap create mode 100644 analyzer/tests/snapshots/errors__case_58.snap create mode 100644 analyzer/tests/snapshots/errors__case_59.snap create mode 100644 analyzer/tests/snapshots/errors__case_60.snap create mode 100644 analyzer/tests/snapshots/errors__case_61.snap create mode 100644 analyzer/tests/snapshots/errors__case_62.snap create mode 100644 analyzer/tests/snapshots/errors__case_63.snap create mode 100644 analyzer/tests/snapshots/errors__case_64.snap create mode 100644 analyzer/tests/snapshots/errors__case_65.snap create mode 100644 analyzer/tests/snapshots/errors__case_66.snap create mode 100644 analyzer/tests/snapshots/errors__case_67.snap create mode 100644 analyzer/tests/snapshots/errors__case_68.snap create mode 100644 analyzer/tests/snapshots/errors__case_69.snap create mode 100644 analyzer/tests/snapshots/errors__case_70.snap create mode 100644 analyzer/tests/snapshots/errors__case_71.snap create mode 100644 analyzer/tests/snapshots/errors__case_72.snap create mode 100644 analyzer/tests/snapshots/errors__case_73.snap create mode 100644 analyzer/tests/snapshots/errors__case_74.snap create mode 100644 analyzer/tests/snapshots/errors__case_75.snap create mode 100644 analyzer/tests/snapshots/errors__case_76.snap create mode 100644 analyzer/tests/snapshots/errors__case_77.snap create mode 100644 analyzer/tests/snapshots/errors__case_78.snap create mode 100644 analyzer/tests/snapshots/errors__case_79.snap create mode 100644 analyzer/tests/snapshots/errors__case_80.snap create mode 100644 analyzer/tests/snapshots/errors__case_81.snap create mode 100644 analyzer/tests/snapshots/errors__case_82.snap create mode 100644 analyzer/tests/snapshots/errors__case_83.snap create mode 100644 analyzer/tests/snapshots/errors__case_84.snap create mode 100644 analyzer/tests/snapshots/errors__case_85.snap delete mode 100644 compiler/tests/cases/compile_errors.rs diff --git a/analyzer/src/context.rs b/analyzer/src/context.rs index 5ad7bb1e31..42a3cb537c 100644 --- a/analyzer/src/context.rs +++ b/analyzer/src/context.rs @@ -3,12 +3,16 @@ use crate::errors::SemanticError; use crate::namespace::events::EventDef; use crate::namespace::scopes::{ContractFunctionDef, ContractScope, ModuleScope, Shared}; use crate::namespace::types::{Array, Contract, FixedSize, Struct, Tuple, Type}; +pub use fe_common::diagnostics::Label; +use fe_common::diagnostics::{Diagnostic, Severity}; +use fe_common::files::SourceFileId; use fe_common::Span; use fe_parser::ast as fe; use fe_parser::node::{Node, NodeId}; + use std::cell::RefCell; use std::collections::{BTreeMap, BTreeSet}; -use std::fmt::Debug; +use std::fmt::{Debug, Display}; use std::hash::Hash; use std::rc::Rc; @@ -285,7 +289,7 @@ impl From> for ModuleAttributes { /// Contains contextual information about a Fe module and can be queried using /// `Spanned` AST nodes. -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug)] pub struct Context { /// Node ids in the order they were visited. pub node_ids: Vec, @@ -300,16 +304,30 @@ pub struct Context { pub events: BTreeMap, pub type_descs: BTreeMap, pub module: Option, + pub file_id: SourceFileId, + pub diagnostics: Vec, } impl Context { - pub fn new_shared() -> Shared { - Rc::new(RefCell::new(Self::new())) + pub fn new_shared(file_id: SourceFileId) -> Shared { + Rc::new(RefCell::new(Self::new(file_id))) } - pub fn new() -> Self { + pub fn new(file_id: SourceFileId) -> Self { Context { - ..Default::default() + node_ids: Vec::new(), + spans: BTreeMap::new(), + expressions: BTreeMap::new(), + emits: BTreeMap::new(), + functions: BTreeMap::new(), + declarations: BTreeMap::new(), + contracts: BTreeMap::new(), + calls: BTreeMap::new(), + events: BTreeMap::new(), + type_descs: BTreeMap::new(), + module: None, + file_id, + diagnostics: Vec::new(), } } @@ -503,4 +521,45 @@ impl Context { }) .collect::>() } + + pub fn error( + &mut self, + message: impl Into, + label_span: Span, + label: impl Into, + ) { + self.fancy_error(message, vec![Label::primary(label_span, label)], vec![]); + } + + pub fn type_error( + &mut self, + message: impl Into, + span: Span, + expected: impl Display, + actual: impl Display, + ) { + self.error( + message, + span, + format!("this has type `{}`; expected type `{}`", actual, expected), + ) + } + + pub fn fancy_error( + &mut self, + message: impl Into, + labels: Vec