Simplify error messages reported by the compiler #853

Merged
ghallak merged 10 commits from ghallak/354 into master 2022-01-05 19:22:22 +09:00
2 changed files with 127 additions and 129 deletions
Showing only changes of commit c209d51c5a - Show all commits

View File

@ -2941,7 +2941,7 @@ mk_error({mismatched_decl_in_funblock, Name, Decl}) ->
Msg = io_lib:format("Mismatch in the function block. Expected implementation/type declaration of ~s function", [Name]), Msg = io_lib:format("Mismatch in the function block. Expected implementation/type declaration of ~s function", [Name]),
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({higher_kinded_typevar, T}) -> mk_error({higher_kinded_typevar, T}) ->
Msg = io_lib:format("Type ~s is a higher kinded type variable " Msg = io_lib:format("Type `~s` is a higher kinded type variable "
"(takes another type as an argument)", [pp(instantiate(T))] "(takes another type as an argument)", [pp(instantiate(T))]
), ),
mk_t_err(pos(T), Msg); mk_t_err(pos(T), Msg);
@ -2954,7 +2954,7 @@ mk_error({unnamed_map_update_with_default, Upd}) ->
Msg = "Invalid map update with default", Msg = "Invalid map update with default",
mk_t_err(pos(Upd), Msg); mk_t_err(pos(Upd), Msg);
mk_error({fundecl_must_have_funtype, _Ann, Id, Type}) -> mk_error({fundecl_must_have_funtype, _Ann, Id, Type}) ->
Msg = io_lib:format("~s was declared with an invalid type ~s. " Msg = io_lib:format("`~s` was declared with an invalid type `~s`. "
"Entrypoints and functions must have functional types" "Entrypoints and functions must have functional types"
, [pp(Id), pp(instantiate(Type))]), , [pp(Id), pp(instantiate(Type))]),
mk_t_err(pos(Id), Msg); mk_t_err(pos(Id), Msg);
@ -2965,7 +2965,7 @@ mk_error({cannot_unify, A, B, When}) ->
{Pos, Ctxt} = pp_when(When), {Pos, Ctxt} = pp_when(When),
mk_t_err(Pos, Msg, Ctxt); mk_t_err(Pos, Msg, Ctxt);
mk_error({unbound_variable, Id}) -> mk_error({unbound_variable, Id}) ->
Msg = io_lib:format("Unbound variable ~s", [pp(Id)]), Msg = io_lib:format("Unbound variable `~s`", [pp(Id)]),
case Id of case Id of
{qid, _, ["Chain", "event"]} -> {qid, _, ["Chain", "event"]} ->
Cxt = "Did you forget to define the event type?", Cxt = "Did you forget to define the event type?",
@ -2976,7 +2976,7 @@ mk_error({undefined_field, Id}) ->
Msg = io_lib:format("Unbound field ~s", [pp(Id)]), Msg = io_lib:format("Unbound field ~s", [pp(Id)]),
mk_t_err(pos(Id), Msg); mk_t_err(pos(Id), Msg);
mk_error({not_a_record_type, Type, Why}) -> mk_error({not_a_record_type, Type, Why}) ->
Msg = io_lib:format("~s", [pp_type("Not a record type: ", Type)]), Msg = io_lib:format("Not a record type: `~s`", [pp_type(Type)]),
{Pos, Ctxt} = pp_why_record(Why), {Pos, Ctxt} = pp_why_record(Why),
mk_t_err(Pos, Msg, Ctxt); mk_t_err(Pos, Msg, Ctxt);
mk_error({not_a_contract_type, Type, Cxt}) -> mk_error({not_a_contract_type, Type, Cxt}) ->
@ -2986,7 +2986,7 @@ mk_error({not_a_contract_type, Type, Cxt}) ->
{tvar, _, _} -> {tvar, _, _} ->
"Unresolved contract type\n"; "Unresolved contract type\n";
_ -> _ ->
io_lib:format("The type ~s is not a contract type\n", [pp_type("", Type)]) io_lib:format("The type ~s is not a contract type\n", [pp_type(Type)])
end, end,
{Pos, Cxt1} = {Pos, Cxt1} =
case Cxt of case Cxt of
@ -3006,9 +3006,10 @@ mk_error({not_a_contract_type, Type, Cxt}) ->
end, end,
mk_t_err(Pos, Msg, Cxt1); mk_t_err(Pos, Msg, Cxt1);
mk_error({non_linear_pattern, Pattern, Nonlinear}) -> mk_error({non_linear_pattern, Pattern, Nonlinear}) ->
Msg = io_lib:format("Repeated name~s ~s in pattern: ~s", Msg = io_lib:format("Repeated name~s ~s in the pattern `~s`",
[plural("", "s", Nonlinear), string:join(Nonlinear, ", "), [plural("", "s", Nonlinear),
pp_expr(" ", Pattern)]), string:join(lists:map(fun(F) -> "`" ++ F ++ "`" end, Nonlinear), ", "),
pp_expr(Pattern)]),
mk_t_err(pos(Pattern), Msg); mk_t_err(pos(Pattern), Msg);
mk_error({ambiguous_record, Fields = [{_, First} | _], Candidates}) -> mk_error({ambiguous_record, Fields = [{_, First} | _], Candidates}) ->
% TODO(mk_error) % TODO(mk_error)
@ -3017,17 +3018,19 @@ mk_error({ambiguous_record, Fields = [{_, First} | _], Candidates}) ->
pp_loc(First), [ [" - ", pp(C), " (at ", pp_loc(C), ")\n"] || C <- Candidates ]]), pp_loc(First), [ [" - ", pp(C), " (at ", pp_loc(C), ")\n"] || C <- Candidates ]]),
mk_t_err(pos(First), Msg); mk_t_err(pos(First), Msg);
mk_error({missing_field, Field, Rec}) -> mk_error({missing_field, Field, Rec}) ->
Msg = io_lib:format("Record type ~s does not have field ~s", Msg = io_lib:format("Record type `~s` does not have field `~s`",
[pp(Rec), pp(Field)]), [pp(Rec), pp(Field)]),
mk_t_err(pos(Field), Msg); mk_t_err(pos(Field), Msg);
mk_error({missing_fields, Ann, RecType, Fields}) -> mk_error({missing_fields, Ann, RecType, Fields}) ->
Msg = io_lib:format("The field~s ~s ~s missing when constructing an element of type ~s", Msg = io_lib:format("The field~s ~s ~s missing when constructing an element of type `~s`",
[plural("", "s", Fields), string:join(Fields, ", "), [plural("", "s", Fields),
string:join(lists:map(fun(F) -> "`" ++ F ++ "`" end, Fields), ", "),
plural("is", "are", Fields), pp(RecType)]), plural("is", "are", Fields), pp(RecType)]),
mk_t_err(pos(Ann), Msg); mk_t_err(pos(Ann), Msg);
mk_error({no_records_with_all_fields, Fields = [{_, First} | _]}) -> mk_error({no_records_with_all_fields, Fields = [{_, First} | _]}) ->
Msg = io_lib:format("No record type with field~s ~s", Msg = io_lib:format("No record type with field~s ~s",
[plural("", "s", Fields), string:join([ pp(F) || {_, F} <- Fields ], ", ")]), [plural("", "s", Fields),
string:join(lists:map(fun(F) -> "`" ++ F ++ "`" end, [ pp(F) || {_, F} <- Fields ]), ", ")]),
mk_t_err(pos(First), Msg); mk_t_err(pos(First), Msg);
mk_error({recursive_types_not_implemented, Types}) -> mk_error({recursive_types_not_implemented, Types}) ->
% TODO(mk_error) % TODO(mk_error)
@ -3039,19 +3042,19 @@ mk_error({event_must_be_variant_type, Where}) ->
Msg = io_lib:format("The event type must be a variant type", []), Msg = io_lib:format("The event type must be a variant type", []),
mk_t_err(pos(Where), Msg); mk_t_err(pos(Where), Msg);
mk_error({indexed_type_must_be_word, Type, Type}) -> mk_error({indexed_type_must_be_word, Type, Type}) ->
Msg = io_lib:format("The indexed type ~s is not a word type", Msg = io_lib:format("The indexed type `~s` is not a word type",
[pp_type("", Type)]), [pp_type(Type)]),
mk_t_err(pos(Type), Msg); mk_t_err(pos(Type), Msg);
mk_error({indexed_type_must_be_word, Type, Type1}) -> mk_error({indexed_type_must_be_word, Type, Type1}) ->
Msg = io_lib:format("The indexed type ~s equals ~s which is not a word type", Msg = io_lib:format("The indexed type `~s` equals `~s` which is not a word type",
[pp_type("", Type), pp_type("", Type1)]), [pp_type(Type), pp_type(Type1)]),
mk_t_err(pos(Type), Msg); mk_t_err(pos(Type), Msg);
mk_error({event_0_to_3_indexed_values, Constr}) -> mk_error({event_0_to_3_indexed_values, Constr}) ->
Msg = io_lib:format("The event constructor ~s has too many indexed values (max 3)", Msg = io_lib:format("The event constructor `~s` has too many indexed values (max 3)",
[name(Constr)]), [name(Constr)]),
mk_t_err(pos(Constr), Msg); mk_t_err(pos(Constr), Msg);
mk_error({event_0_to_1_string_values, Constr}) -> mk_error({event_0_to_1_string_values, Constr}) ->
Msg = io_lib:format("The event constructor ~s has too many non-indexed values (max 1)", Msg = io_lib:format("The event constructor `~s` has too many non-indexed values (max 1)",
[name(Constr)]), [name(Constr)]),
mk_t_err(pos(Constr), Msg); mk_t_err(pos(Constr), Msg);
mk_error({repeated_constructor, Cs}) -> mk_error({repeated_constructor, Cs}) ->
@ -3084,40 +3087,40 @@ mk_error({duplicate_definition, Name, Locs}) ->
[Name, [ [" - ", pp_loc(L), "\n"] || L <- Locs ]]), [Name, [ [" - ", pp_loc(L), "\n"] || L <- Locs ]]),
mk_t_err(pos(lists:last(Locs)), Msg); mk_t_err(pos(lists:last(Locs)), Msg);
mk_error({duplicate_scope, Kind, Name, OtherKind, L}) -> mk_error({duplicate_scope, Kind, Name, OtherKind, L}) ->
Msg = io_lib:format("The ~p ~s has the same name as a ~p at ~s", Msg = io_lib:format("The ~p `~s` has the same name as a ~p at ~s",
[Kind, pp(Name), OtherKind, pp_loc(L)]), [Kind, pp(Name), OtherKind, pp_loc(L)]),
mk_t_err(pos(Name), Msg); mk_t_err(pos(Name), Msg);
mk_error({include, _, {string, Pos, Name}}) -> mk_error({include, _, {string, Pos, Name}}) ->
Msg = io_lib:format("Include of '~s' is not allowed, include only allowed at top level.", Msg = io_lib:format("Include of `~s` is not allowed, include only allowed at top level.",
[binary_to_list(Name)]), [binary_to_list(Name)]),
mk_t_err(pos(Pos), Msg); mk_t_err(pos(Pos), Msg);
mk_error({namespace, _Pos, {con, Pos, Name}, _Def}) -> mk_error({namespace, _Pos, {con, Pos, Name}, _Def}) ->
Msg = io_lib:format("Nested namespaces are not allowed. Namespace '~s' not defined at top level.", Msg = io_lib:format("Nested namespaces are not allowed. Namespace `~s` is not defined at top level.",
[Name]), [Name]),
mk_t_err(pos(Pos), Msg); mk_t_err(pos(Pos), Msg);
mk_error({Contract, _Pos, {con, Pos, Name}, _Def}) when ?IS_CONTRACT_HEAD(Contract) -> mk_error({Contract, _Pos, {con, Pos, Name}, _Def}) when ?IS_CONTRACT_HEAD(Contract) ->
Msg = io_lib:format("Nested contracts are not allowed. Contract '~s' not defined at top level.", Msg = io_lib:format("Nested contracts are not allowed. Contract `~s` is not defined at top level.",
[Name]), [Name]),
mk_t_err(pos(Pos), Msg); mk_t_err(pos(Pos), Msg);
mk_error({type_decl, _, {id, Pos, Name}, _}) -> mk_error({type_decl, _, {id, Pos, Name}, _}) ->
Msg = io_lib:format("Empty type declarations are not supported. Type ~s lacks a definition", Msg = io_lib:format("Empty type declarations are not supported. Type `~s` lacks a definition",
[Name]), [Name]),
mk_t_err(pos(Pos), Msg); mk_t_err(pos(Pos), Msg);
mk_error({letval, _Pos, {id, Pos, Name}, _Def}) -> mk_error({letval, _Pos, {id, Pos, Name}, _Def}) ->
Msg = io_lib:format("Toplevel \"let\" definitions are not supported. Value ~s could be replaced by 0-argument function.", Msg = io_lib:format("Toplevel \"let\" definitions are not supported. Value `~s` could be replaced by 0-argument function.",
[Name]), [Name]),
mk_t_err(pos(Pos), Msg); mk_t_err(pos(Pos), Msg);
mk_error({stateful_not_allowed, Id, Fun}) -> mk_error({stateful_not_allowed, Id, Fun}) ->
Msg = io_lib:format("Cannot reference stateful function ~s in the definition of non-stateful function ~s.", Msg = io_lib:format("Cannot reference stateful function `~s` in the definition of non-stateful function `~s`.",
[pp(Id), pp(Fun)]), [pp(Id), pp(Fun)]),
mk_t_err(pos(Id), Msg); mk_t_err(pos(Id), Msg);
mk_error({stateful_not_allowed_in_guards, Id}) -> mk_error({stateful_not_allowed_in_guards, Id}) ->
Msg = io_lib:format("Cannot reference stateful function ~s in a pattern guard.", Msg = io_lib:format("Cannot reference stateful function `~s` in a pattern guard.",
[pp(Id)]), [pp(Id)]),
mk_t_err(pos(Id), Msg); mk_t_err(pos(Id), Msg);
mk_error({value_arg_not_allowed, Value, Fun}) -> mk_error({value_arg_not_allowed, Value, Fun}) ->
Msg = io_lib:format("Cannot pass non-zero value argument ~s in the definition of non-stateful function ~s.", Msg = io_lib:format("Cannot pass non-zero value argument `~s` in the definition of non-stateful function `~s`.",
[pp_expr("", Value), pp(Fun)]), [pp_expr(Value), pp(Fun)]),
mk_t_err(pos(Value), Msg); mk_t_err(pos(Value), Msg);
mk_error({init_depends_on_state, Which, [_Init | Chain]}) -> mk_error({init_depends_on_state, Which, [_Init | Chain]}) ->
% TODO(mk_error) % TODO(mk_error)
@ -3132,9 +3135,9 @@ mk_error({missing_body_for_let, Ann}) ->
mk_t_err(pos(Ann), Msg); mk_t_err(pos(Ann), Msg);
mk_error({public_modifier_in_contract, Decl}) -> mk_error({public_modifier_in_contract, Decl}) ->
Decl1 = mk_entrypoint(Decl), Decl1 = mk_entrypoint(Decl),
Msg = io_lib:format("Use 'entrypoint' instead of 'function' for public function `~s`: `~s`", Msg = io_lib:format("Use `entrypoint` instead of `function` for public function `~s`: `~s`",
[pp_expr(element(3, Decl)), [pp_expr(element(3, Decl)),
prettypr:format(prettypr:nest(2, aeso_pretty:decl(Decl1)))]), prettypr:format(aeso_pretty:decl(Decl1))]),
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({init_must_be_an_entrypoint, Decl}) -> mk_error({init_must_be_an_entrypoint, Decl}) ->
Decl1 = mk_entrypoint(Decl), Decl1 = mk_entrypoint(Decl),
@ -3149,35 +3152,35 @@ mk_error({init_must_not_be_payable, Decl}) ->
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({proto_must_be_entrypoint, Decl}) -> mk_error({proto_must_be_entrypoint, Decl}) ->
Decl1 = mk_entrypoint(Decl), Decl1 = mk_entrypoint(Decl),
Msg = io_lib:format("Use 'entrypoint' for declaration of `~s`: `~s`", Msg = io_lib:format("Use `entrypoint` for declaration of `~s`: `~s`",
[pp_expr(element(3, Decl)), [pp_expr(element(3, Decl)),
prettypr:format(prettypr:nest(2, aeso_pretty:decl(Decl1)))]), prettypr:format(aeso_pretty:decl(Decl1))]),
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({proto_in_namespace, Decl}) -> mk_error({proto_in_namespace, Decl}) ->
Msg = io_lib:format("Namespaces cannot contain function prototypes.", []), Msg = io_lib:format("Namespaces cannot contain function prototypes.", []),
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({entrypoint_in_namespace, Decl}) -> mk_error({entrypoint_in_namespace, Decl}) ->
Msg = io_lib:format("Namespaces cannot contain entrypoints. Use 'function' instead.", []), Msg = io_lib:format("Namespaces cannot contain entrypoints. Use `function` instead.", []),
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({private_entrypoint, Decl}) -> mk_error({private_entrypoint, Decl}) ->
Msg = io_lib:format("The entrypoint ~s cannot be private. Use 'function' instead.", Msg = io_lib:format("The entrypoint `~s` cannot be private. Use `function` instead.",
[pp_expr("", element(3, Decl))]), [pp_expr(element(3, Decl))]),
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({private_and_public, Decl}) -> mk_error({private_and_public, Decl}) ->
Msg = io_lib:format("The function ~s cannot be both public and private.", Msg = io_lib:format("The function `~s` cannot be both public and private.",
[pp_expr("", element(3, Decl))]), [pp_expr(element(3, Decl))]),
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({contract_has_no_entrypoints, Con}) -> mk_error({contract_has_no_entrypoints, Con}) ->
Msg = io_lib:format("The contract ~s has no entrypoints. Since Sophia version 3.2, public " Msg = io_lib:format("The contract `~s` has no entrypoints. Since Sophia version 3.2, public "
"contract functions must be declared with the 'entrypoint' keyword instead of " "contract functions must be declared with the `entrypoint` keyword instead of "
"'function'.", [pp_expr("", Con)]), "`function`.", [pp_expr(Con)]),
mk_t_err(pos(Con), Msg); mk_t_err(pos(Con), Msg);
mk_error({definition_in_contract_interface, Ann, {id, _, Id}}) -> mk_error({definition_in_contract_interface, Ann, {id, _, Id}}) ->
Msg = "Contract interfaces cannot contain defined functions or entrypoints.", Msg = "Contract interfaces cannot contain defined functions or entrypoints.",
Cxt = io_lib:format("Fix: replace the definition of '~s' by a type signature.", [Id]), Cxt = io_lib:format("Fix: replace the definition of `~s` by a type signature.", [Id]),
mk_t_err(pos(Ann), Msg, Cxt); mk_t_err(pos(Ann), Msg, Cxt);
mk_error({unbound_type, Type}) -> mk_error({unbound_type, Type}) ->
Msg = io_lib:format("Unbound type ~s.", [pp_type("", Type)]), Msg = io_lib:format("Unbound type ~s.", [pp_type(Type)]),
mk_t_err(pos(Type), Msg); mk_t_err(pos(Type), Msg);
mk_error({new_tuple_syntax, Ann, Ts}) -> mk_error({new_tuple_syntax, Ann, Ts}) ->
Msg = io_lib:format("Invalid type `~s`. The syntax of tuple types changed in Sophia version 4.0. Did you mean `~s`", Msg = io_lib:format("Invalid type `~s`. The syntax of tuple types changed in Sophia version 4.0. Did you mean `~s`",
@ -3192,8 +3195,8 @@ mk_error({cannot_call_init_function, Ann}) ->
"and cannot be called from the contract code.", "and cannot be called from the contract code.",
mk_t_err(pos(Ann), Msg); mk_t_err(pos(Ann), Msg);
mk_error({contract_treated_as_namespace, Ann, [Con, Fun] = QName}) -> mk_error({contract_treated_as_namespace, Ann, [Con, Fun] = QName}) ->
Msg = io_lib:format("Invalid call to contract entrypoint '~s'.", [string:join(QName, ".")]), Msg = io_lib:format("Invalid call to contract entrypoint `~s`.", [string:join(QName, ".")]),
Cxt = io_lib:format("It must be called as 'c.~s' for some c : ~s.", [Fun, Con]), Cxt = io_lib:format("It must be called as `c.~s` for some `c : ~s`.", [Fun, Con]),
mk_t_err(pos(Ann), Msg, Cxt); mk_t_err(pos(Ann), Msg, Cxt);
mk_error({bad_top_level_decl, Decl}) -> mk_error({bad_top_level_decl, Decl}) ->
What = case element(1, Decl) of What = case element(1, Decl) of
@ -3202,7 +3205,7 @@ mk_error({bad_top_level_decl, Decl}) ->
end, end,
Id = element(3, Decl), Id = element(3, Decl),
Msg = io_lib:format("The definition of '~s' must appear inside a ~s.", Msg = io_lib:format("The definition of '~s' must appear inside a ~s.",
[pp_expr("", Id), What]), [pp_expr(Id), What]),
mk_t_err(pos(Decl), Msg); mk_t_err(pos(Decl), Msg);
mk_error({unknown_byte_length, Type}) -> mk_error({unknown_byte_length, Type}) ->
Msg = io_lib:format("Cannot resolve length of byte array.", []), Msg = io_lib:format("Cannot resolve length of byte array.", []),
@ -3237,7 +3240,9 @@ mk_error({mixed_record_and_map, Expr}) ->
Msg = io_lib:format("Mixed record fields and map keys in `~s`", [pp_expr(Expr)]), Msg = io_lib:format("Mixed record fields and map keys in `~s`", [pp_expr(Expr)]),
mk_t_err(pos(Expr), Msg); mk_t_err(pos(Expr), Msg);
mk_error({named_argument_must_be_literal_bool, Name, Arg}) -> mk_error({named_argument_must_be_literal_bool, Name, Arg}) ->
Msg = io_lib:format("Invalid '~s' argument `~s` It must be either 'true' or 'false'.", [Name, pp_expr(instantiate(Arg))]), Msg = io_lib:format("Invalid `~s` argument `~s`. "
"It must be either `true` or `false`.",
[Name, pp_expr(instantiate(Arg))]),
mk_t_err(pos(Arg), Msg); mk_t_err(pos(Arg), Msg);
mk_error({conflicting_updates_for_field, Upd, Key}) -> mk_error({conflicting_updates_for_field, Upd, Key}) ->
Msg = io_lib:format("Conflicting updates for field '~s'", [Key]), Msg = io_lib:format("Conflicting updates for field '~s'", [Key]),
@ -3462,19 +3467,19 @@ pp_when(unknown) -> {pos(0,0), ""}.
-spec pp_why_record(why_record()) -> {pos(), iolist()}. -spec pp_why_record(why_record()) -> {pos(), iolist()}.
pp_why_record({var_args, Ann, Fun}) -> pp_why_record({var_args, Ann, Fun}) ->
{pos(Ann), {pos(Ann),
io_lib:format("arising from resolution of variadic function ~s", io_lib:format("arising from resolution of variadic function `~s`",
[pp_expr(Fun)])}; [pp_expr(Fun)])};
pp_why_record(Fld = {field, _Ann, LV, _E}) -> pp_why_record(Fld = {field, _Ann, LV, _E}) ->
{pos(Fld), {pos(Fld),
io_lib:format("arising from an assignment of the field ~s", io_lib:format("arising from an assignment of the field `~s`",
[pp_expr({lvalue, [], LV})])}; [pp_expr({lvalue, [], LV})])};
pp_why_record(Fld = {field, _Ann, LV, _Alias, _E}) -> pp_why_record(Fld = {field, _Ann, LV, _Alias, _E}) ->
{pos(Fld), {pos(Fld),
io_lib:format("arising from an assignment of the field ~s", io_lib:format("arising from an assignment of the field `~s`",
[pp_expr({lvalue, [], LV})])}; [pp_expr({lvalue, [], LV})])};
pp_why_record({proj, _Ann, Rec, FldName}) -> pp_why_record({proj, _Ann, Rec, FldName}) ->
{pos(Rec), {pos(Rec),
io_lib:format("arising from the projection of the field ~s", io_lib:format("arising from the projection of the field `~s`",
[pp(FldName)])}. [pp(FldName)])}.

View File

@ -330,7 +330,7 @@ failing_contracts() ->
" - line 17, column 3">>]) " - line 17, column 3">>])
, ?TYPE_ERROR(type_errors, , ?TYPE_ERROR(type_errors,
[<<?Pos(17, 23) [<<?Pos(17, 23)
"Unbound variable zz at line 17, column 23">>, "Unbound variable `zz`">>,
<<?Pos(26, 9) <<?Pos(26, 9)
"Cannot unify int\n" "Cannot unify int\n"
" and list(int)\n" " and list(int)\n"
@ -381,27 +381,25 @@ failing_contracts() ->
" - w : int (at line 38, column 13)\n" " - w : int (at line 38, column 13)\n"
" - z : string (at line 39, column 10)">>, " - z : string (at line 39, column 10)">>,
<<?Pos(22, 40) <<?Pos(22, 40)
"Not a record type: string\n" "Not a record type: `string`\n"
"arising from the projection of the field y (at line 22, column 40)">>, "arising from the projection of the field `y`">>,
<<?Pos(21, 44) <<?Pos(21, 44)
"Not a record type: string\n" "Not a record type: `string`\n"
"arising from an assignment of the field y (at line 21, column 44)">>, "arising from an assignment of the field `y`">>,
<<?Pos(20, 40) <<?Pos(20, 40)
"Not a record type: string\n" "Not a record type: `string`\n"
"arising from an assignment of the field y (at line 20, column 40)">>, "arising from an assignment of the field `y`">>,
<<?Pos(19, 37) <<?Pos(19, 37)
"Not a record type: string\n" "Not a record type: `string`\n"
"arising from an assignment of the field y (at line 19, column 37)">>, "arising from an assignment of the field `y`">>,
<<?Pos(13, 27) <<?Pos(13, 27)
"Ambiguous record type with field y (at line 13, column 27) could be one of\n" "Ambiguous record type with field y (at line 13, column 27) could be one of\n"
" - r (at line 4, column 10)\n" " - r (at line 4, column 10)\n"
" - r' (at line 5, column 10)">>, " - r' (at line 5, column 10)">>,
<<?Pos(26, 7) <<?Pos(26, 7)
"Repeated name x in pattern\n" "Repeated name `x` in the pattern `x :: x`">>,
" x :: x (at line 26, column 7)">>,
<<?Pos(44, 14) <<?Pos(44, 14)
"Repeated names x, y in pattern\n" "Repeated names `x`, `y` in the pattern `(x : int, y, x : string, y : bool)`">>,
" (x : int, y, x : string, y : bool) (at line 44, column 14)">>,
<<?Pos(44, 39) <<?Pos(44, 39)
"Cannot unify int\n" "Cannot unify int\n"
" and string\n" " and string\n"
@ -417,19 +415,19 @@ failing_contracts() ->
"against the expected type\n" "against the expected type\n"
" string">>, " string">>,
<<?Pos(14, 24) <<?Pos(14, 24)
"No record type with fields y, z (at line 14, column 24)">>, "No record type with fields `y`, `z`">>,
<<?Pos(15, 26) <<?Pos(15, 26)
"The field z is missing when constructing an element of type r2 (at line 15, column 26)">>, "The field `z` is missing when constructing an element of type `r2`">>,
<<?Pos(15, 24) <<?Pos(15, 24)
"Record type r2 does not have field y (at line 15, column 24)">>, "Record type `r2` does not have field `y`">>,
<<?Pos(47, 5) <<?Pos(47, 5)
"Let binding at line 47, column 5 must be followed by an expression">>, "Let binding must be followed by an expression.">>,
<<?Pos(50, 5) <<?Pos(50, 5)
"Let binding at line 50, column 5 must be followed by an expression">>, "Let binding must be followed by an expression.">>,
<<?Pos(54, 5) <<?Pos(54, 5)
"Let binding at line 54, column 5 must be followed by an expression">>, "Let binding must be followed by an expression.">>,
<<?Pos(58, 5) <<?Pos(58, 5)
"Let binding at line 58, column 5 must be followed by an expression">>, "Let binding must be followed by an expression.">>,
<<?Pos(63, 5) <<?Pos(63, 5)
"Cannot unify int\n" "Cannot unify int\n"
" and bool\n" " and bool\n"
@ -449,24 +447,24 @@ failing_contracts() ->
"when checking that 'init' returns a value of type 'state' at line 5, column 3">>]) "when checking that 'init' returns a value of type 'state' at line 5, column 3">>])
, ?TYPE_ERROR(missing_fields_in_record_expression, , ?TYPE_ERROR(missing_fields_in_record_expression,
[<<?Pos(7, 42) [<<?Pos(7, 42)
"The field x is missing when constructing an element of type r('a) (at line 7, column 42)">>, "The field `x` is missing when constructing an element of type `r('a)`">>,
<<?Pos(8, 42) <<?Pos(8, 42)
"The field y is missing when constructing an element of type r(int) (at line 8, column 42)">>, "The field `y` is missing when constructing an element of type `r(int)`">>,
<<?Pos(6, 42) <<?Pos(6, 42)
"The fields y, z are missing when constructing an element of type r('a) (at line 6, column 42)">>]) "The fields `y`, `z` are missing when constructing an element of type `r('a)`">>])
, ?TYPE_ERROR(namespace_clash, , ?TYPE_ERROR(namespace_clash,
[<<?Pos(4, 10) [<<?Pos(4, 10)
"The contract Call (at line 4, column 10) has the same name as a namespace at (builtin location)">>]) "The contract `Call` has the same name as a namespace at (builtin location)">>])
, ?TYPE_ERROR(bad_events, , ?TYPE_ERROR(bad_events,
[<<?Pos(9, 25) [<<?Pos(9, 25)
"The indexed type string (at line 9, column 25) is not a word type">>, "The indexed type `string` is not a word type">>,
<<?Pos(10, 25) <<?Pos(10, 25)
"The indexed type alias_string (at line 10, column 25) equals string which is not a word type">>]) "The indexed type `alias_string` equals `string` which is not a word type">>])
, ?TYPE_ERROR(bad_events2, , ?TYPE_ERROR(bad_events2,
[<<?Pos(9, 7) [<<?Pos(9, 7)
"The event constructor BadEvent1 (at line 9, column 7) has too many non-indexed values (max 1)">>, "The event constructor `BadEvent1` has too many non-indexed values (max 1)">>,
<<?Pos(10, 7) <<?Pos(10, 7)
"The event constructor BadEvent2 (at line 10, column 7) has too many indexed values (max 3)">>]) "The event constructor `BadEvent2` has too many indexed values (max 3)">>])
, ?TYPE_ERROR(type_clash, , ?TYPE_ERROR(type_clash,
[<<?Pos(12, 42) [<<?Pos(12, 42)
"Cannot unify int\n" "Cannot unify int\n"
@ -477,13 +475,13 @@ failing_contracts() ->
" map(string, int)">>]) " map(string, int)">>])
, ?TYPE_ERROR(not_toplevel_include, , ?TYPE_ERROR(not_toplevel_include,
[<<?Pos(2, 11) [<<?Pos(2, 11)
"Include of 'included.aes' at line 2, column 11\nnot allowed, include only allowed at top level.">>]) "Include of `included.aes` is not allowed, include only allowed at top level.">>])
, ?TYPE_ERROR(not_toplevel_namespace, , ?TYPE_ERROR(not_toplevel_namespace,
[<<?Pos(2, 13) [<<?Pos(2, 13)
"Nested namespaces are not allowed\nNamespace 'Foo' at line 2, column 13 not defined at top level.">>]) "Nested namespaces are not allowed. Namespace `Foo` is not defined at top level.">>])
, ?TYPE_ERROR(not_toplevel_contract, , ?TYPE_ERROR(not_toplevel_contract,
[<<?Pos(2, 12) [<<?Pos(2, 12)
"Nested contracts are not allowed\nContract 'Con' at line 2, column 12 not defined at top level.">>]) "Nested contracts are not allowed. Contract `Con` is not defined at top level.">>])
, ?TYPE_ERROR(bad_address_literals, , ?TYPE_ERROR(bad_address_literals,
[<<?Pos(11, 5) [<<?Pos(11, 5)
"Cannot unify address\n" "Cannot unify address\n"
@ -580,21 +578,21 @@ failing_contracts() ->
" address">>]) " address">>])
, ?TYPE_ERROR(stateful, , ?TYPE_ERROR(stateful,
[<<?Pos(13, 35) [<<?Pos(13, 35)
"Cannot reference stateful function Chain.spend (at line 13, column 35)\nin the definition of non-stateful function fail1.">>, "Cannot reference stateful function `Chain.spend` in the definition of non-stateful function `fail1`.">>,
<<?Pos(14, 35) <<?Pos(14, 35)
"Cannot reference stateful function local_spend (at line 14, column 35)\nin the definition of non-stateful function fail2.">>, "Cannot reference stateful function `local_spend` in the definition of non-stateful function `fail2`.">>,
<<?Pos(16, 15) <<?Pos(16, 15)
"Cannot reference stateful function Chain.spend (at line 16, column 15)\nin the definition of non-stateful function fail3.">>, "Cannot reference stateful function `Chain.spend` in the definition of non-stateful function `fail3`.">>,
<<?Pos(20, 31) <<?Pos(20, 31)
"Cannot reference stateful function Chain.spend (at line 20, column 31)\nin the definition of non-stateful function fail4.">>, "Cannot reference stateful function `Chain.spend` in the definition of non-stateful function `fail4`.">>,
<<?Pos(35, 47) <<?Pos(35, 47)
"Cannot reference stateful function Chain.spend (at line 35, column 47)\nin the definition of non-stateful function fail5.">>, "Cannot reference stateful function `Chain.spend` in the definition of non-stateful function `fail5`.">>,
<<?Pos(48, 57) <<?Pos(48, 57)
"Cannot pass non-zero value argument 1000 (at line 48, column 57)\nin the definition of non-stateful function fail6.">>, "Cannot pass non-zero value argument `1000` in the definition of non-stateful function `fail6`.">>,
<<?Pos(49, 56) <<?Pos(49, 56)
"Cannot pass non-zero value argument 1000 (at line 49, column 56)\nin the definition of non-stateful function fail7.">>, "Cannot pass non-zero value argument `1000` in the definition of non-stateful function `fail7`.">>,
<<?Pos(52, 17) <<?Pos(52, 17)
"Cannot pass non-zero value argument 1000 (at line 52, column 17)\nin the definition of non-stateful function fail8.">>]) "Cannot pass non-zero value argument `1000` in the definition of non-stateful function `fail8`.">>])
, ?TYPE_ERROR(bad_init_state_access, , ?TYPE_ERROR(bad_init_state_access,
[<<?Pos(11, 5) [<<?Pos(11, 5)
"The init function should return the initial state as its result and cannot write the state,\n" "The init function should return the initial state as its result and cannot write the state,\n"
@ -613,19 +611,21 @@ failing_contracts() ->
" - state (at line 13, column 13)">>]) " - state (at line 13, column 13)">>])
, ?TYPE_ERROR(modifier_checks, , ?TYPE_ERROR(modifier_checks,
[<<?Pos(11, 3) [<<?Pos(11, 3)
"The function all_the_things (at line 11, column 3) cannot be both public and private.">>, "The function `all_the_things` cannot be both public and private.">>,
<<?Pos(3, 3) <<?Pos(3, 3)
"Namespaces cannot contain entrypoints (at line 3, column 3). Use 'function' instead.">>, "Namespaces cannot contain entrypoints. Use `function` instead.">>,
<<?Pos(5, 10) <<?Pos(5, 10)
"The contract Remote (at line 5, column 10) has no entrypoints. Since Sophia version 3.2, public\ncontract functions must be declared with the 'entrypoint' keyword instead of\n'function'.">>, "The contract `Remote` has no entrypoints. Since Sophia version 3.2, "
"public contract functions must be declared with the `entrypoint` "
"keyword instead of `function`.">>,
<<?Pos(12, 3) <<?Pos(12, 3)
"The entrypoint wha (at line 12, column 3) cannot be private. Use 'function' instead.">>, "The entrypoint `wha` cannot be private. Use `function` instead.">>,
<<?Pos(6, 3) <<?Pos(6, 3)
"Use 'entrypoint' for declaration of foo (at line 6, column 3):\n entrypoint foo : () => unit">>, "Use `entrypoint` for declaration of `foo`: `entrypoint foo : () => unit`">>,
<<?Pos(10, 3) <<?Pos(10, 3)
"Use 'entrypoint' instead of 'function' for public function foo (at line 10, column 3):\n entrypoint foo() = ()">>, "Use `entrypoint` instead of `function` for public function `foo`: `entrypoint foo() = ()`">>,
<<?Pos(6, 3) <<?Pos(6, 3)
"Use 'entrypoint' instead of 'function' for public function foo (at line 6, column 3):\n entrypoint foo : () => unit">>]) "Use `entrypoint` instead of `function` for public function `foo`: `entrypoint foo : () => unit`">>])
, ?TYPE_ERROR(list_comp_not_a_list, , ?TYPE_ERROR(list_comp_not_a_list,
[<<?Pos(2, 36) [<<?Pos(2, 36)
"Cannot unify int\n and list('a)\nwhen checking rvalue of list comprehension binding at line 2, column 36\n 1 : int\nagainst type \n list('a)">> "Cannot unify int\n and list('a)\nwhen checking rvalue of list comprehension binding at line 2, column 36\n 1 : int\nagainst type \n list('a)">>
@ -640,26 +640,23 @@ failing_contracts() ->
]) ])
, ?TYPE_ERROR(map_as_map_key, , ?TYPE_ERROR(map_as_map_key,
[<<?Pos(5, 47) [<<?Pos(5, 47)
"Invalid key type\n" "Invalid key type `map(int, int)`\n"
" map(int, int)\n"
"Map keys cannot contain other maps.">>, "Map keys cannot contain other maps.">>,
<<?Pos(6, 31) <<?Pos(6, 31)
"Invalid key type\n" "Invalid key type `list(map(int, int))`\n"
" list(map(int, int))\n"
"Map keys cannot contain other maps.">>, "Map keys cannot contain other maps.">>,
<<?Pos(6, 31) <<?Pos(6, 31)
"Invalid key type\n" "Invalid key type `lm`\n"
" lm\n"
"Map keys cannot contain other maps.">>]) "Map keys cannot contain other maps.">>])
, ?TYPE_ERROR(calling_init_function, , ?TYPE_ERROR(calling_init_function,
[<<?Pos(7, 28) [<<?Pos(7, 28)
"The 'init' function is called exclusively by the create contract transaction\n" "The 'init' function is called exclusively by the create contract transaction "
"and cannot be called from the contract code.">>]) "and cannot be called from the contract code.">>])
, ?TYPE_ERROR(bad_top_level_decl, , ?TYPE_ERROR(bad_top_level_decl,
[<<?Pos(1, 1) "The definition of 'square' must appear inside a contract or namespace.">>]) [<<?Pos(1, 1) "The definition of 'square' must appear inside a contract or namespace.">>])
, ?TYPE_ERROR(missing_event_type, , ?TYPE_ERROR(missing_event_type,
[<<?Pos(3, 5) [<<?Pos(3, 5)
"Unbound variable Chain.event at line 3, column 5\n" "Unbound variable `Chain.event`"
"Did you forget to define the event type?">>]) "Did you forget to define the event type?">>])
, ?TYPE_ERROR(bad_bytes_concat, , ?TYPE_ERROR(bad_bytes_concat,
[<<?Pos(12, 40) [<<?Pos(12, 40)
@ -710,30 +707,30 @@ failing_contracts() ->
" - 'a (at line 18, column 37)">>]) " - 'a (at line 18, column 37)">>])
, ?TYPE_ERROR(wrong_compiler_version, , ?TYPE_ERROR(wrong_compiler_version,
[<<?Pos(1, 1) [<<?Pos(1, 1)
"Cannot compile with this version of the compiler,\n" "Cannot compile with this version of the compiler, "
"because it does not satisfy the constraint ", Version/binary, " < 1.0">>, "because it does not satisfy the constraint ", Version/binary, " < 1.0">>,
<<?Pos(2, 1) <<?Pos(2, 1)
"Cannot compile with this version of the compiler,\n" "Cannot compile with this version of the compiler, "
"because it does not satisfy the constraint ", Version/binary, " == 9.9.9">>]) "because it does not satisfy the constraint ", Version/binary, " == 9.9.9">>])
, ?TYPE_ERROR(interface_with_defs, , ?TYPE_ERROR(interface_with_defs,
[<<?Pos(2, 3) [<<?Pos(2, 3)
"Contract interfaces cannot contain defined functions or entrypoints.\n" "Contract interfaces cannot contain defined functions or entrypoints.\n"
"Fix: replace the definition of 'foo' by a type signature.">>]) "Fix: replace the definition of `foo` by a type signature.">>])
, ?TYPE_ERROR(contract_as_namespace, , ?TYPE_ERROR(contract_as_namespace,
[<<?Pos(5, 28) [<<?Pos(5, 28)
"Invalid call to contract entrypoint 'Foo.foo'.\n" "Invalid call to contract entrypoint `Foo.foo`.\n"
"It must be called as 'c.foo' for some c : Foo.">>]) "It must be called as `c.foo` for some `c : Foo`.">>])
, ?TYPE_ERROR(toplevel_let, , ?TYPE_ERROR(toplevel_let,
[<<?Pos(2, 7) [<<?Pos(2, 7)
"Toplevel \"let\" definitions are not supported\n" "Toplevel \"let\" definitions are not supported. "
"Value this_is_illegal at line 2, column 7 could be replaced by 0-argument function">>]) "Value `this_is_illegal` could be replaced by 0-argument function.">>])
, ?TYPE_ERROR(empty_typedecl, , ?TYPE_ERROR(empty_typedecl,
[<<?Pos(2, 8) [<<?Pos(2, 8)
"Empty type declarations are not supported\n" "Empty type declarations are not supported. "
"Type t at line 2, column 8 lacks a definition">>]) "Type `t` lacks a definition">>])
, ?TYPE_ERROR(higher_kinded_type, , ?TYPE_ERROR(higher_kinded_type,
[<<?Pos(2, 35) [<<?Pos(2, 35)
"Type 'm is a higher kinded type variable\n" "Type `'m` is a higher kinded type variable "
"(takes another type as an argument)">>]) "(takes another type as an argument)">>])
, ?TYPE_ERROR(bad_arity, , ?TYPE_ERROR(bad_arity,
[<<?Pos(3, 20) [<<?Pos(3, 20)
@ -759,24 +756,20 @@ failing_contracts() ->
"Invalid map update with default">>]) "Invalid map update with default">>])
, ?TYPE_ERROR(non_functional_entrypoint, , ?TYPE_ERROR(non_functional_entrypoint,
[<<?Pos(2, 14) [<<?Pos(2, 14)
"f at line 2, column 14 was declared with an invalid type int.\n" "`f` was declared with an invalid type `int`. "
"Entrypoints and functions must have functional types">>]) "Entrypoints and functions must have functional types">>])
, ?TYPE_ERROR(bad_records, , ?TYPE_ERROR(bad_records,
[<<?Pos(3, 16) [<<?Pos(3, 16)
"Mixed record fields and map keys in\n" "Mixed record fields and map keys in `{x = 0, [0] = 1}`">>,
" {x = 0, [0] = 1}">>,
<<?Pos(4, 6) <<?Pos(4, 6)
"Mixed record fields and map keys in\n" "Mixed record fields and map keys in `r {x = 0, [0] = 1}`">>,
" r {x = 0, [0] = 1}">>,
<<?Pos(5, 6) <<?Pos(5, 6)
"Empty record/map update\n" "Empty record/map update `r {}`">>
" r {}">>
]) ])
, ?TYPE_ERROR(bad_protected_call, , ?TYPE_ERROR(bad_protected_call,
[<<?Pos(6, 22) [<<?Pos(6, 22)
"Invalid 'protected' argument\n" "Invalid `protected` argument `(0 : int) == (1 : int) : bool`. "
" (0 : int) == (1 : int) : bool\n" "It must be either `true` or `false`.">>
"It must be either 'true' or 'false'.">>
]) ])
, ?TYPE_ERROR(bad_function_block, , ?TYPE_ERROR(bad_function_block,
[<<?Pos(4, 5) [<<?Pos(4, 5)
@ -850,13 +843,13 @@ failing_contracts() ->
[ <<?Pos(2,3) [ <<?Pos(2,3)
"Ambiguous name: Xa.f at line 2, column 3\nXb.f at line 5, column 3">> "Ambiguous name: Xa.f at line 2, column 3\nXb.f at line 5, column 3">>
, <<?Pos(13,23) , <<?Pos(13,23)
"Unbound variable A.f at line 13, column 23">> "Unbound variable `A.f`">>
]) ])
, ?TYPE_ERROR(using_namespace_wrong_scope, , ?TYPE_ERROR(using_namespace_wrong_scope,
[ <<?Pos(19,5) [ <<?Pos(19,5)
"Unbound variable f at line 19, column 5">> "Unbound variable `f`">>
, <<?Pos(21,23) , <<?Pos(21,23)
"Unbound variable f at line 21, column 23">> "Unbound variable `f`">>
]) ])
, ?TYPE_ERROR(using_namespace_undefined, , ?TYPE_ERROR(using_namespace_undefined,
[<<?Pos(2,3) [<<?Pos(2,3)
@ -868,11 +861,11 @@ failing_contracts() ->
]) ])
, ?TYPE_ERROR(using_namespace_hidden_parts, , ?TYPE_ERROR(using_namespace_hidden_parts,
[<<?Pos(8,23) [<<?Pos(8,23)
"Unbound variable g at line 8, column 23">> "Unbound variable `g`">>
]) ])
, ?TYPE_ERROR(stateful_pattern_guard, , ?TYPE_ERROR(stateful_pattern_guard,
[<<?Pos(8,12) [<<?Pos(8,12)
"Cannot reference stateful function g (at line 8, column 12) in a pattern guard.">> "Cannot reference stateful function `g` in a pattern guard.">>
]) ])
, ?TYPE_ERROR(non_boolean_pattern_guard, , ?TYPE_ERROR(non_boolean_pattern_guard,
[<<?Pos(4,24) [<<?Pos(4,24)