Skip to content

Commit

Permalink
More type overrides
Browse files Browse the repository at this point in the history
  • Loading branch information
Qqwy committed May 29, 2022
1 parent 8ab6940 commit b06eb68
Show file tree
Hide file tree
Showing 15 changed files with 175 additions and 28 deletions.
2 changes: 2 additions & 0 deletions config/dev.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import Config

12 changes: 9 additions & 3 deletions lib/type_check/default_overrides.ex
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ defmodule TypeCheck.DefaultOverrides do
Access
Calendar
Calendar.ISO
Calendar.TimeZoneDatabase
Collectable
Date
Date.Range
Expand All @@ -34,11 +35,16 @@ defmodule TypeCheck.DefaultOverrides do
Function
Inspect
IO
IO.ANSI
IO.Stream
Keyword
Map
MapSet
Module
NaiveDateTime
OptionParser
Path
Port
Range
Regex
Stream
Expand All @@ -53,17 +59,17 @@ defmodule TypeCheck.DefaultOverrides do
@erlang_modules ~w[
Erlang.Binary
Erlang.Inet
Erlang.Calendar
]a

for module <- @elixir_modules do
for module <- @erlang_modules do
Code.ensure_compiled(Elixir.Module.concat(__MODULE__, module))
end

for module <- @erlang_modules do
for module <- @elixir_modules do
Code.ensure_compiled(Elixir.Module.concat(__MODULE__, module))
end


@doc """
Lists all overridden types in {module, function, arity} format.
"""
Expand Down
5 changes: 1 addition & 4 deletions lib/type_check/default_overrides/access.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ defmodule TypeCheck.DefaultOverrides.Access do

@type! any_container() :: any()

# TODO
@type container() :: keyword() | struct() | map()
@autogen_typespec false
@type! container() :: keyword() | map()
@type! container() :: keyword() | struct() | map()

@type! get_and_update_fun(data, current_value) ::
(:get_and_update, data, (term() -> term()) ->
Expand Down
7 changes: 7 additions & 0 deletions lib/type_check/default_overrides/base.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
defmodule TypeCheck.DefaultOverrides.Base do
use TypeCheck

@type! decode_case() :: :upper | :lower | :mixed

@type! encode_case() :: :upper | :lower
end
14 changes: 14 additions & 0 deletions lib/type_check/default_overrides/calendar/time_zone_database.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
defmodule TypeCheck.DefaultOverrides.Calendar.TimeZoneDatabase do
use TypeCheck

alias TypeCheck.DefaultOverrides.Calendar

@type! time_zone_period() :: %{
optional(any()) => any(),
utc_offset: Calendar.utc_offset(),
std_offset: Calendar.std_offset(),
zone_abbr: Calendar.zone_abbr()
}

@type! time_zone_period_limit() :: Calendar.naive_datetime()
end
5 changes: 5 additions & 0 deletions lib/type_check/default_overrides/enum.ex
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
defmodule TypeCheck.DefaultOverrides.Enum do
alias TypeCheck.DefaultOverrides.Enumerable
use TypeCheck

@type! acc() :: any()

@type! default() :: any()

@type! element() :: any()

@type! index() :: integer()

@type! t() :: Enumerable.t()
end
45 changes: 45 additions & 0 deletions lib/type_check/default_overrides/erlang/calendar.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Overrides Erlang's `:binary` module:
defmodule Elixir.TypeCheck.DefaultOverrides.Erlang.Calendar do
use TypeCheck

@type! date() :: {year(), month(), day()}

@type! datetime() :: {date(), time()}

@type! datetime1970() :: {{year1970(), month(), day()}, time()}

@typep! day() :: 1..31

# @typep! day_of_year() :: 0..365

# @typep! daynum() :: 1..7

@typep! hour() :: 0..23

# @typep! ldom() :: 28 | 29 | 30 | 31

@typep! minute() :: 0..59

@typep! month() :: 1..12

# @typep! offset() :: [byte()] | (time :: integer())

# @typep! rfc3339_string() :: [byte(), ...]

# @typep! rfc3339_time_unit() ::
# :microsecond | :millisecond | :nanosecond | :second | :native

@typep! second() :: 0..59

# @typep! secs_per_day() :: 0..86400

@type! time() :: {hour(), minute(), second()}

# @typep! weeknum() :: 1..53

@typep! year() :: non_neg_integer()

@typep! year1970() :: 1970..10000

# @typep! yearweeknum() :: {year(), weeknum()}
end
1 change: 0 additions & 1 deletion lib/type_check/default_overrides/exception.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ defmodule TypeCheck.DefaultOverrides.Exception do
{module(), atom(), arity_or_args(), location()}
| {(... -> any()), arity_or_args(), location()}

# TODO
@type! t() :: %{
:__struct__ => module(),
:__exception__ => true,
Expand Down
32 changes: 28 additions & 4 deletions lib/type_check/default_overrides/file.ex
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,15 @@ defmodule TypeCheck.DefaultOverrides.File do
{{year :: non_neg_integer(), month :: 1..12, day :: 1..31},
{hour :: 0..23, minute :: 0..59, second :: 0..59}}

# TODO
# @type! io_device() :: :file.io_device()

# TODO: c.f. https://github.com/Qqwy/elixir-type_check/issues/116
# https://github.com/erlang/otp/blob/master/bootstrap/lib/kernel/include/file.hrl#L62
# -record(file_descriptor,
# {module :: module(), % Module that handles this kind of file
# data :: term()}). % Module dependent data

@type! fd :: {:file_descriptor, module :: module(), data :: term()}
@type! io_device() :: pid() | fd()

@type! mode() ::
:append
Expand All @@ -34,8 +41,25 @@ defmodule TypeCheck.DefaultOverrides.File do
| {:delayed_write, non_neg_integer(), non_neg_integer()}
| encoding_mode()

# TODO
# @type! posix() :: :file.posix()
@type! posix ::
:eacces | :eagain |
:ebadf | :ebadmsg | :ebusy |
:edeadlk | :edeadlock | :edquot |
:eexist |
:efault | :efbig | :eftype |
:eintr | :einval | :eio | :eisdir |
:eloop |
:emfile | :emlink | :emultihop |
:enametoolong | :enfile |
:enobufs | :enodev | :enolck | :enolink | :enoent |
:enomem | :enospc | :enosr | :enostr | :enosys |
:enotblk | :enotdir | :enotsup | :enxio |
:eopnotsupp | :eoverflow |
:eperm | :epipe |
:erange | :erofs |
:espipe | :esrch | :estale |
:etxtbsy |
:exdev

@type! posix_time() :: integer()

Expand Down
34 changes: 18 additions & 16 deletions lib/type_check/default_overrides/file/stat.ex
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
defmodule TypeCheck.DefaultOverrides.File.Stat do
use TypeCheck
# TODO
# @type! t() :: %Elixir.File.Stat{
# access: :read | :write | :read_write | :none,
# atime: :calendar.datetime() | integer(),
# ctime: :calendar.datetime() | integer(),
# gid: non_neg_integer(),
# inode: non_neg_integer(),
# links: non_neg_integer(),
# major_device: non_neg_integer(),
# minor_device: non_neg_integer(),
# mode: non_neg_integer(),
# mtime: :calendar.datetime() | integer(),
# size: non_neg_integer(),
# type: :device | :directory | :regular | :other | :symlink,
# uid: non_neg_integer()
# }

alias Elixir.TypeCheck.DefaultOverrides.Erlang

@type! t() :: %Elixir.File.Stat{
access: :read | :write | :read_write | :none,
atime: Erlang.Calendar.datetime() | integer(),
ctime: Erlang.Calendar.datetime() | integer(),
gid: non_neg_integer(),
inode: non_neg_integer(),
links: non_neg_integer(),
major_device: non_neg_integer(),
minor_device: non_neg_integer(),
mode: non_neg_integer(),
mtime: Erlang.Calendar.datetime() | integer(),
size: non_neg_integer(),
type: :device | :directory | :regular | :other | :symlink,
uid: non_neg_integer()
}
end
14 changes: 14 additions & 0 deletions lib/type_check/default_overrides/io/ansi.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
defmodule TypeCheck.DefaultOverrides.IO.ANSI do
use TypeCheck
@type! ansicode() :: atom()

# TODO
# @type! ansidata() :: ansilist() | ansicode() | binary()

# TODO
# @type! ansilist() ::
# maybe_improper_list(
# char() | ansicode() | binary() | ansilist(),
# binary() | ansicode() | []
# )
end
5 changes: 5 additions & 0 deletions lib/type_check/default_overrides/io/stream.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
defmodule TypeCheck.DefaultOverrides.IO.Stream do
use TypeCheck

@type! t() :: %IO.Stream{device: term(), line_or_bytes: term(), raw: term()}
end
13 changes: 13 additions & 0 deletions lib/type_check/default_overrides/option_parser.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
defmodule TypeCheck.DefaultOverrides.OptionParser do
use TypeCheck

alias TypeCheck.DefaultOverrides.String

@type! argv() :: list(String.t())

@type! errors() :: list({String.t(), String.t() | nil})

@type! options() :: list({:switches, keyword()} | {:strict, keyword()} | {:aliases, keyword()})

@type! parsed() :: keyword()
end
6 changes: 6 additions & 0 deletions lib/type_check/default_overrides/path.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
defmodule TypeCheck.DefaultOverrides.Path do
use TypeCheck

# TODO
# @type! t() :: IO.chardata()
end
8 changes: 8 additions & 0 deletions lib/type_check/default_overrides/port.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
defmodule TypeCheck.DefaultOverrides.Port do
use TypeCheck
@type! name() ::
{:spawn, charlist() | binary()}
| {:spawn_driver, charlist() | binary()}
| {:spawn_executable, charlist() | atom()}
| {:fd, non_neg_integer(), non_neg_integer()}
end

0 comments on commit b06eb68

Please sign in to comment.