Skip to content

Annotated types #9

@ktec

Description

@ktec

Hi, firstly thanks for an excellent library!

I have discovered that annotated types are not validated by the checker correctly.

I have reduced it down to the following test:

type = {:ann_type, 0, [{:var, 0, :annotation}, {:atom, 0, :atom}]}
term = :atom

typespec = Code.Typespec.type_to_quoted(type) |> Macro.to_string()

assert typespec == "ann_type(annotation, :atom) :: 0"
assert RTypes.Checker.check(term, type) == :ok

=> {:error, [term: :atom, message: "term does not conform to type", types: [{:ann_type, 0, [{:var, 0, :annotation}, {:atom, 0, :atom}]}], ctx: []]}

I'm happy to attempt a fix, but I wanted to check [sic] whether adding another function head to checker.ex is the right approach. Something like this:

  ## annotations
  defp check(term, {:ann_type, _, [{:var, _, annotation}, typ]}, ctx) do
    case check(term, typ, ctx) do
      :ok ->
        :ok

      {:error, _} ->
        {:error,
         term: term,
         message: "term does not match annotated #{annotation} type",
         types: [typ],
         ctx: ctx}
    end
  end

I've got this in a branch, if you're happy with it, or have suggestions to improve?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions