diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index 565c34d..fcca92f 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -1440,18 +1440,13 @@ infer_prefix({IntOp,As}) when IntOp =:= '-' -> abort_expr(Ann, Str) -> {app, Ann, {id, Ann, "abort"}, [{string, Ann, Str}]}. -free_vars({int, _, _}) -> - []; -free_vars({char, _, _}) -> - []; -free_vars({string, _, _}) -> - []; -free_vars({bool, _, _}) -> - []; -free_vars(Id={id, _, _}) -> - [Id]; -free_vars({con, _, _}) -> - []; +free_vars({int, _, _}) -> []; +free_vars({char, _, _}) -> []; +free_vars({string, _, _}) -> []; +free_vars({bool, _, _}) -> []; +free_vars(Id={id, _, _}) -> [Id]; +free_vars({con, _, _}) -> []; +free_vars({qcon, _, _}) -> []; free_vars({tuple, _, Cpts}) -> free_vars(Cpts); free_vars({list, _, Elems}) -> @@ -1460,6 +1455,8 @@ free_vars({app, _, {'::', _}, Args}) -> free_vars(Args); free_vars({app, _, {con, _, _}, Args}) -> free_vars(Args); +free_vars({app, _, {qcon, _, _}, Args}) -> + free_vars(Args); free_vars({record, _, Fields}) -> free_vars([E || {field, _, _, E} <- Fields]); free_vars({typed, _, A, _}) -> diff --git a/src/aeso_parser.erl b/src/aeso_parser.erl index e03224c..de9dcc6 100644 --- a/src/aeso_parser.erl +++ b/src/aeso_parser.erl @@ -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()). parse_pattern({app, Ann, Con = {'::', _}, 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)}; parse_pattern({tuple, Ann, Es}) -> {tuple, Ann, lists:map(fun parse_pattern/1, Es)}; @@ -554,6 +554,7 @@ parse_pattern({list, Ann, Es}) -> parse_pattern({record, Ann, Fs}) -> {record, Ann, lists:map(fun parse_field_pattern/1, Fs)}; parse_pattern(E = {con, _, _}) -> E; +parse_pattern(E = {qcon, _, _}) -> E; parse_pattern(E = {id, _, _}) -> E; parse_pattern(E = {int, _, _}) -> E; parse_pattern(E = {bool, _, _}) -> E; diff --git a/test/aeso_compiler_tests.erl b/test/aeso_compiler_tests.erl index c5912cd..b4d400e 100644 --- a/test/aeso_compiler_tests.erl +++ b/test/aeso_compiler_tests.erl @@ -161,7 +161,8 @@ compilable_contracts() -> "list_comp", "payable", "unapplied_builtins", - "underscore_number_literals" + "underscore_number_literals", + "qualified_constructor" ]. not_yet_compilable(fate) -> []; diff --git a/test/contracts/qualified_constructor.aes b/test/contracts/qualified_constructor.aes new file mode 100644 index 0000000..31a77a5 --- /dev/null +++ b/test/contracts/qualified_constructor.aes @@ -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