Handle qualified constructors in patterns
This commit is contained in:
parent
b9f585ebaf
commit
d4f291f252
@ -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, _}) ->
|
||||||
|
@ -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;
|
||||||
|
@ -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) -> [];
|
||||||
|
8
test/contracts/qualified_constructor.aes
Normal file
8
test/contracts/qualified_constructor.aes
Normal 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
|
Loading…
x
Reference in New Issue
Block a user