From 7eb29827a61f5228063d6347b9703ac95cb854fd Mon Sep 17 00:00:00 2001 From: SpiveeWorks Date: Fri, 24 Jan 2025 18:50:41 +1100 Subject: [PATCH] Fix type substitution into variants and records Variants were working by accident, since {variant, [{"VariantName", [Element]}]} had a similar enough form to the opaque types that would come from something like `type1(type2(int))`, but records were not working, since they have a different form. Now both are handled explicitly so that only the intended forms of each are handled. --- src/hz.erl | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/hz.erl b/src/hz.erl index 7143e30..55fb64c 100644 --- a/src/hz.erl +++ b/src/hz.erl @@ -1662,12 +1662,39 @@ substitute_opaque_type(Bindings, {var, VarName}) -> false -> {error, invalid_aci}; {_, TypeArg} -> {ok, TypeArg} end; +substitute_opaque_type(Bindings, {variant, Args}) -> + case substitute_variant_types(Bindings, Args, []) of + {ok, Result} -> {ok, {variant, Result}}; + Error -> Error + end; +substitute_opaque_type(Bindings, {record, Args}) -> + case substitute_record_types(Bindings, Args, []) of + {ok, Result} -> {ok, {record, Result}}; + Error -> Error + end; substitute_opaque_type(Bindings, {Connective, Args}) -> case substitute_opaque_types(Bindings, Args, []) of {ok, Result} -> {ok, {Connective, Result}}; Error -> Error end; -substitute_opaque_type(_Bindings, Type) -> {ok, Type}. +substitute_opaque_type(_Bindings, Type) -> + {ok, Type}. + +substitute_variant_types(Bindings, [{VariantName, Elements} | Rest], Acc) -> + case substitute_opaque_types(Bindings, Elements, []) of + {ok, Result} -> substitute_variant_types(Bindings, Rest, [{VariantName, Result} | Acc]); + Error -> Error + end; +substitute_variant_types(_Bindings, [], Acc) -> + {ok, lists:reverse(Acc)}. + +substitute_record_types(Bindings, [{ElementName, Type} | Rest], Acc) -> + case substitute_opaque_type(Bindings, Type) of + {ok, Result} -> substitute_record_types(Bindings, Rest, [{ElementName, Result} | Acc]); + Error -> Error + end; +substitute_record_types(_Bindings, [], Acc) -> + {ok, lists:reverse(Acc)}. substitute_opaque_types(Bindings, [Next | Rest], Acc) -> case substitute_opaque_type(Bindings, Next) of