diff --git a/lib/elixir/lib/inspect.ex b/lib/elixir/lib/inspect.ex index 29923748c5a..7a1b53a0b78 100644 --- a/lib/elixir/lib/inspect.ex +++ b/lib/elixir/lib/inspect.ex @@ -381,6 +381,16 @@ defimpl Inspect, for: Float do end defimpl Inspect, for: Regex do + def inspect(regex = %{opts: regex_opts}, opts) when is_list(regex_opts) do + concat([ + "Regex.compile!(", + Inspect.BitString.inspect(regex.source, opts), + ", ", + Inspect.List.inspect(regex_opts, opts), + ")" + ]) + end + def inspect(regex, opts) do {escaped, _} = regex.source diff --git a/lib/elixir/lib/regex.ex b/lib/elixir/lib/regex.ex index 9a420cac2b8..aaa6c59965b 100644 --- a/lib/elixir/lib/regex.ex +++ b/lib/elixir/lib/regex.ex @@ -155,7 +155,7 @@ defmodule Regex do defstruct re_pattern: nil, source: "", opts: "", re_version: "" - @type t :: %__MODULE__{re_pattern: term, source: binary, opts: binary} + @type t :: %__MODULE__{re_pattern: term, source: binary, opts: binary | list(atom)} defmodule CompileError do defexception message: "regex could not be compiled" @@ -203,6 +203,7 @@ defmodule Regex do defp compile(source, opts, doc_opts, version) do case :re.compile(source, opts) do {:ok, re_pattern} -> + doc_opts = format_doc_opts(doc_opts, opts) {:ok, %Regex{re_pattern: re_pattern, re_version: version, source: source, opts: doc_opts}} error -> @@ -210,6 +211,10 @@ defmodule Regex do end end + defp format_doc_opts(_doc_opts = "", _opts = []), do: "" + defp format_doc_opts(_doc_opts = "", opts), do: opts + defp format_doc_opts(doc_opts, _opts), do: doc_opts + @doc """ Compiles the regular expression and raises `Regex.CompileError` in case of errors. """ diff --git a/lib/elixir/test/elixir/inspect_test.exs b/lib/elixir/test/elixir/inspect_test.exs index 27f76ced173..a6bbe378426 100644 --- a/lib/elixir/test/elixir/inspect_test.exs +++ b/lib/elixir/test/elixir/inspect_test.exs @@ -863,6 +863,8 @@ defmodule Inspect.OthersTest do assert inspect(~r<\a\b\d\e\f\n\r\s\t\v/>) == "~r/\\a\\b\\d\\e\\f\\n\\r\\s\\t\\v\\//" assert inspect(~r" \\/ ") == "~r/ \\\\\\/ /" assert inspect(~r/hi/, syntax_colors: [regex: :red]) == "\e[31m~r/hi/\e[0m" + + assert inspect(Regex.compile!("foo", [:caseless])) == ~S'Regex.compile!("foo", [:caseless])' end test "inspect_fun" do