Fix coerce/3 when applied to namespace types, and type parameters inside record types. #1
29
src/hz.erl
29
src/hz.erl
@ -1662,12 +1662,39 @@ substitute_opaque_type(Bindings, {var, VarName}) ->
|
|||||||
false -> {error, invalid_aci};
|
false -> {error, invalid_aci};
|
||||||
{_, TypeArg} -> {ok, TypeArg}
|
{_, TypeArg} -> {ok, TypeArg}
|
||||||
end;
|
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}) ->
|
substitute_opaque_type(Bindings, {Connective, Args}) ->
|
||||||
case substitute_opaque_types(Bindings, Args, []) of
|
case substitute_opaque_types(Bindings, Args, []) of
|
||||||
{ok, Result} -> {ok, {Connective, Result}};
|
{ok, Result} -> {ok, {Connective, Result}};
|
||||||
Error -> Error
|
Error -> Error
|
||||||
end;
|
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) ->
|
substitute_opaque_types(Bindings, [Next | Rest], Acc) ->
|
||||||
case substitute_opaque_type(Bindings, Next) of
|
case substitute_opaque_type(Bindings, Next) of
|
||||||
|
Loading…
x
Reference in New Issue
Block a user