Handle qualified constructors in patterns

This commit is contained in:
Ulf Norell 2019-12-11 09:02:32 +01:00
parent b9f585ebaf
commit d4f291f252
4 changed files with 21 additions and 14 deletions

View File

@ -1440,18 +1440,13 @@ infer_prefix({IntOp,As}) when IntOp =:= '-' ->
abort_expr(Ann, Str) -> abort_expr(Ann, Str) ->
{app, Ann, {id, Ann, "abort"}, [{string, Ann, Str}]}. {app, Ann, {id, Ann, "abort"}, [{string, Ann, Str}]}.
free_vars({int, _, _}) -> free_vars({int, _, _}) -> [];
[]; free_vars({char, _, _}) -> [];
free_vars({char, _, _}) -> free_vars({string, _, _}) -> [];
[]; free_vars({bool, _, _}) -> [];
free_vars({string, _, _}) -> free_vars(Id={id, _, _}) -> [Id];
[]; free_vars({con, _, _}) -> [];
free_vars({bool, _, _}) -> free_vars({qcon, _, _}) -> [];
[];
free_vars(Id={id, _, _}) ->
[Id];
free_vars({con, _, _}) ->
[];
free_vars({tuple, _, Cpts}) -> free_vars({tuple, _, Cpts}) ->
free_vars(Cpts); free_vars(Cpts);
free_vars({list, _, Elems}) -> free_vars({list, _, Elems}) ->
@ -1460,6 +1455,8 @@ free_vars({app, _, {'::', _}, Args}) ->
free_vars(Args); free_vars(Args);
free_vars({app, _, {con, _, _}, Args}) -> free_vars({app, _, {con, _, _}, Args}) ->
free_vars(Args); free_vars(Args);
free_vars({app, _, {qcon, _, _}, Args}) ->
free_vars(Args);
free_vars({record, _, Fields}) -> free_vars({record, _, Fields}) ->
free_vars([E || {field, _, _, E} <- Fields]); free_vars([E || {field, _, _, E} <- Fields]);
free_vars({typed, _, A, _}) -> free_vars({typed, _, A, _}) ->

View File

@ -545,7 +545,7 @@ list_comp_e(Ann, Expr, Binds) -> {list_comp, Ann, Expr, Binds}.
-spec parse_pattern(aeso_syntax:expr()) -> aeso_parse_lib:parser(aeso_syntax:pat()). -spec parse_pattern(aeso_syntax:expr()) -> aeso_parse_lib:parser(aeso_syntax:pat()).
parse_pattern({app, Ann, Con = {'::', _}, Es}) -> parse_pattern({app, Ann, Con = {'::', _}, Es}) ->
{app, Ann, Con, lists:map(fun parse_pattern/1, Es)}; {app, Ann, Con, lists:map(fun parse_pattern/1, Es)};
parse_pattern({app, Ann, Con = {con, _, _}, Es}) -> parse_pattern({app, Ann, Con = {Tag, _, _}, Es}) when Tag == con; Tag == qcon ->
{app, Ann, Con, lists:map(fun parse_pattern/1, Es)}; {app, Ann, Con, lists:map(fun parse_pattern/1, Es)};
parse_pattern({tuple, Ann, Es}) -> parse_pattern({tuple, Ann, Es}) ->
{tuple, Ann, lists:map(fun parse_pattern/1, Es)}; {tuple, Ann, lists:map(fun parse_pattern/1, Es)};
@ -554,6 +554,7 @@ parse_pattern({list, Ann, Es}) ->
parse_pattern({record, Ann, Fs}) -> parse_pattern({record, Ann, Fs}) ->
{record, Ann, lists:map(fun parse_field_pattern/1, Fs)}; {record, Ann, lists:map(fun parse_field_pattern/1, Fs)};
parse_pattern(E = {con, _, _}) -> E; parse_pattern(E = {con, _, _}) -> E;
parse_pattern(E = {qcon, _, _}) -> E;
parse_pattern(E = {id, _, _}) -> E; parse_pattern(E = {id, _, _}) -> E;
parse_pattern(E = {int, _, _}) -> E; parse_pattern(E = {int, _, _}) -> E;
parse_pattern(E = {bool, _, _}) -> E; parse_pattern(E = {bool, _, _}) -> E;

View File

@ -161,7 +161,8 @@ compilable_contracts() ->
"list_comp", "list_comp",
"payable", "payable",
"unapplied_builtins", "unapplied_builtins",
"underscore_number_literals" "underscore_number_literals",
"qualified_constructor"
]. ].
not_yet_compilable(fate) -> []; not_yet_compilable(fate) -> [];

View File

@ -0,0 +1,8 @@
namespace Foo =
datatype x = A | B(int)
contract Bar =
entrypoint f(a : Foo.x) =
switch(a)
Foo.A => 0
Foo.B(n) => n