Tidy up code around syntax highlighting in IEx
This commit is contained in:
@@ -541,8 +541,7 @@ defimpl Inspect, for: Any do
|
||||
_ -> Inspect.Map.inspect(map, opts)
|
||||
else
|
||||
dunder ->
|
||||
is_struct = :maps.keys(dunder) == :maps.keys(map)
|
||||
if is_struct do
|
||||
if :maps.keys(dunder) == :maps.keys(map) do
|
||||
pruned = :maps.remove(:__exception__, :maps.remove(:__struct__, map))
|
||||
colorless_opts = %{opts | syntax_colors: []}
|
||||
Inspect.Map.inspect(pruned, Inspect.Atom.inspect(struct, colorless_opts), opts)
|
||||
|
||||
@@ -61,6 +61,8 @@ defmodule Inspect.Opts do
|
||||
safe: true,
|
||||
syntax_colors: []
|
||||
|
||||
@type color_key :: atom
|
||||
|
||||
# TODO: Deprecate char_lists key and :as_char_lists value by v1.5
|
||||
@type t :: %__MODULE__{
|
||||
structs: boolean,
|
||||
@@ -72,8 +74,8 @@ defmodule Inspect.Opts do
|
||||
base: :decimal | :binary | :hex | :octal,
|
||||
pretty: boolean,
|
||||
safe: boolean,
|
||||
syntax_colors: [{atom, IO.ANSI.ansidata}]
|
||||
}
|
||||
syntax_colors: [{color_key, IO.ANSI.ansidata}]
|
||||
}
|
||||
end
|
||||
|
||||
defmodule Inspect.Error do
|
||||
@@ -163,8 +165,6 @@ defmodule Inspect.Algebra do
|
||||
|
||||
@type t :: :doc_nil | :doc_line | doc_cons | doc_nest | doc_break | doc_group | doc_color | binary
|
||||
|
||||
@type color_identifier :: atom
|
||||
|
||||
@typep doc_cons :: {:doc_cons, t, t}
|
||||
defmacrop doc_cons(left, right) do
|
||||
quote do: {:doc_cons, unquote(left), unquote(right)}
|
||||
@@ -308,22 +308,18 @@ defmodule Inspect.Algebra do
|
||||
end
|
||||
|
||||
@doc """
|
||||
Colors a document if a the identifier has a color in the options.
|
||||
Colors a document if the `color_key` has a color in the options.
|
||||
"""
|
||||
@spec color(t, color_identifier, Inspect.Opts.t) :: doc_color
|
||||
def color(doc, identifier, %Inspect.Opts{syntax_colors: syntax_colors}) when is_doc(doc) do
|
||||
precolor = Keyword.get(syntax_colors, identifier)
|
||||
if precolor do
|
||||
@spec color(t, Inspect.Opts.color_key, Inspect.Opts.t) :: doc_color
|
||||
def color(doc, color_key, %Inspect.Opts{syntax_colors: syntax_colors}) when is_doc(doc) do
|
||||
if precolor = Keyword.get(syntax_colors, color_key) do
|
||||
postcolor = Keyword.get(syntax_colors, :reset, :reset)
|
||||
concat(
|
||||
doc_color(doc, List.wrap(precolor)),
|
||||
doc_color(empty(), List.wrap(postcolor)))
|
||||
concat(doc_color(doc, precolor), doc_color(empty(), postcolor))
|
||||
else
|
||||
doc
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@doc ~S"""
|
||||
Nests the given document at the given `level`.
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ defmodule Inspect.AlgebraTest do
|
||||
# Consistent with definitions
|
||||
assert empty() == :doc_nil
|
||||
|
||||
# Consistent of corresponding sdoc
|
||||
# Consistent with corresponding sdoc
|
||||
assert sdoc(empty()) == []
|
||||
|
||||
# Consistent formatting
|
||||
@@ -102,19 +102,17 @@ defmodule Inspect.AlgebraTest do
|
||||
assert color(empty(), :atom, opts) == empty()
|
||||
|
||||
opts = %Inspect.Opts{syntax_colors: [atom: :red]}
|
||||
assert color("Hi", :atom, opts) == concat(
|
||||
{:doc_color, "Hi", [:red]},
|
||||
{:doc_color, empty(), [:reset]}
|
||||
)
|
||||
doc1 = {:doc_color, "Hi", :red}
|
||||
doc2 = {:doc_color, empty(), :reset}
|
||||
assert color("Hi", :atom, opts) == concat(doc1, doc2)
|
||||
|
||||
opts = %Inspect.Opts{syntax_colors: [reset: :red]}
|
||||
assert color(empty(), :atom, opts) == empty()
|
||||
|
||||
opts = %Inspect.Opts{syntax_colors: [number: :cyan, reset: :red]}
|
||||
assert color("123", :number, opts) == concat(
|
||||
{:doc_color, "123", [:cyan]},
|
||||
{:doc_color, empty(), [:red]}
|
||||
)
|
||||
doc1 = {:doc_color, "123", :cyan}
|
||||
doc2 = {:doc_color, empty(), :red}
|
||||
assert color("123", :number, opts) == concat(doc1, doc2)
|
||||
|
||||
# Consistent formatting
|
||||
opts = %Inspect.Opts{syntax_colors: [atom: :cyan]}
|
||||
|
||||
@@ -203,21 +203,21 @@ defmodule Inspect.TupleTest do
|
||||
|
||||
opts = [syntax_colors: [reset: :cyan]]
|
||||
assert inspect({}, opts) == "{}"
|
||||
assert inspect({:X, :Y}, opts) == "{:X, :Y}"
|
||||
assert inspect({:x, :y}, opts) == "{:x, :y}"
|
||||
|
||||
opts = [syntax_colors: [reset: :cyan, atom: :red]]
|
||||
assert inspect({}, opts) == "{}"
|
||||
assert inspect({:X, :Y}, opts) ==
|
||||
"{\e[31m:X\e[36m, \e[31m:Y\e[36m}"
|
||||
assert inspect({:x, :y}, opts) ==
|
||||
"{\e[31m:x\e[36m, \e[31m:y\e[36m}"
|
||||
|
||||
opts = [syntax_colors: [tuple: :green, reset: :cyan, atom: :red]]
|
||||
assert inspect({}, opts) == "\e[32m{\e[36m\e[32m}\e[36m"
|
||||
assert inspect({:X, :Y}, opts) ==
|
||||
"\e[32m{\e[36m" <>
|
||||
"\e[31m:X\e[36m" <>
|
||||
"\e[32m,\e[36m " <>
|
||||
"\e[31m:Y\e[36m" <>
|
||||
"\e[32m}\e[36m"
|
||||
assert inspect({:x, :y}, opts) ==
|
||||
"\e[32m{\e[36m" <>
|
||||
"\e[31m:x\e[36m" <>
|
||||
"\e[32m,\e[36m " <>
|
||||
"\e[31m:y\e[36m" <>
|
||||
"\e[32m}\e[36m"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -296,51 +296,51 @@ defmodule Inspect.ListTest do
|
||||
|
||||
opts = [syntax_colors: [reset: :cyan]]
|
||||
assert inspect([], opts) == "[]"
|
||||
assert inspect([:X, :Y], opts) ==
|
||||
"[:X, :Y]"
|
||||
assert inspect([:x, :y], opts) ==
|
||||
"[:x, :y]"
|
||||
|
||||
opts = [syntax_colors: [reset: :cyan, atom: :red]]
|
||||
assert inspect([], opts) == "[]"
|
||||
assert inspect([:X, :Y], opts) ==
|
||||
"[\e[31m:X\e[36m, \e[31m:Y\e[36m]"
|
||||
assert inspect([:x, :y], opts) ==
|
||||
"[\e[31m:x\e[36m, \e[31m:y\e[36m]"
|
||||
|
||||
opts = [syntax_colors: [reset: :cyan, atom: :red, list: :green]]
|
||||
assert inspect([], opts) == "\e[32m[]\e[36m"
|
||||
assert inspect([:X, :Y], opts) ==
|
||||
"\e[32m[\e[36m" <>
|
||||
"\e[31m:X\e[36m" <>
|
||||
"\e[32m,\e[36m " <>
|
||||
"\e[31m:Y\e[36m" <>
|
||||
"\e[32m]\e[36m"
|
||||
assert inspect([:x, :y], opts) ==
|
||||
"\e[32m[\e[36m" <>
|
||||
"\e[31m:x\e[36m" <>
|
||||
"\e[32m,\e[36m " <>
|
||||
"\e[31m:y\e[36m" <>
|
||||
"\e[32m]\e[36m"
|
||||
end
|
||||
|
||||
test "keyword with colors" do
|
||||
opts = [syntax_colors: [reset: :cyan, list: :green, number: :blue]]
|
||||
assert inspect([], opts) == "\e[32m[]\e[36m"
|
||||
assert inspect([a: 9999], opts) ==
|
||||
"\e[32m[\e[36m" <>
|
||||
"a: " <>
|
||||
"\e[34m9999\e[36m" <>
|
||||
"\e[32m]\e[36m"
|
||||
"\e[32m[\e[36m" <>
|
||||
"a: " <>
|
||||
"\e[34m9999\e[36m" <>
|
||||
"\e[32m]\e[36m"
|
||||
|
||||
opts = [syntax_colors: [reset: :cyan, atom: :red, list: :green, number: :blue]]
|
||||
assert inspect([], opts) == "\e[32m[]\e[36m"
|
||||
assert inspect([a: 9999], opts) ==
|
||||
"\e[32m[\e[36m" <>
|
||||
"\e[31ma: \e[36m" <>
|
||||
"\e[34m9999\e[36m" <>
|
||||
"\e[32m]\e[36m"
|
||||
"\e[32m[\e[36m" <>
|
||||
"\e[31ma: \e[36m" <>
|
||||
"\e[34m9999\e[36m" <>
|
||||
"\e[32m]\e[36m"
|
||||
end
|
||||
|
||||
test "limit with colors" do
|
||||
opts = [limit: 1, syntax_colors: [reset: :cyan, list: :green, atom: :red]]
|
||||
assert inspect([], opts) == "\e[32m[]\e[36m"
|
||||
assert inspect([:X, :Y], opts) ==
|
||||
"\e[32m[\e[36m" <>
|
||||
"\e[31m:X\e[36m" <>
|
||||
"\e[32m,\e[36m " <>
|
||||
"..." <>
|
||||
"\e[32m]\e[36m"
|
||||
assert inspect([:x, :y], opts) ==
|
||||
"\e[32m[\e[36m" <>
|
||||
"\e[31m:x\e[36m" <>
|
||||
"\e[32m,\e[36m " <>
|
||||
"..." <>
|
||||
"\e[32m]\e[36m"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -422,20 +422,20 @@ defmodule Inspect.MapTest do
|
||||
test "colors" do
|
||||
opts = [syntax_colors: [reset: :cyan, atom: :red, number: :magenta]]
|
||||
assert inspect(%{1 => 2}, opts) ==
|
||||
"%{\e[35m1\e[36m => \e[35m2\e[36m}"
|
||||
"%{\e[35m1\e[36m => \e[35m2\e[36m}"
|
||||
|
||||
assert inspect(%{a: 1}, opts) ==
|
||||
"%{\e[31ma: \e[36m\e[35m1\e[36m}"
|
||||
"%{\e[31ma: \e[36m\e[35m1\e[36m}"
|
||||
|
||||
assert inspect(%Public{key: 1}, opts) ==
|
||||
"%Inspect.MapTest.Public{\e[31mkey: \e[36m\e[35m1\e[36m}"
|
||||
"%Inspect.MapTest.Public{\e[31mkey: \e[36m\e[35m1\e[36m}"
|
||||
|
||||
opts = [syntax_colors: [reset: :cyan, atom: :red, map: :green, number: :blue]]
|
||||
assert inspect(%{a: 9999}, opts) ==
|
||||
"\e[32m%{\e[36m" <>
|
||||
"\e[31ma: \e[36m" <>
|
||||
"\e[34m9999\e[36m" <>
|
||||
"\e[32m}\e[36m"
|
||||
"\e[32m%{\e[36m" <>
|
||||
"\e[31ma: \e[36m" <>
|
||||
"\e[34m9999\e[36m" <>
|
||||
"\e[32m}\e[36m"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -485,8 +485,8 @@ defmodule Inspect.OthersTest do
|
||||
opts = [syntax_colors: []]
|
||||
assert "#Function<" <> _ = inspect(fun(), opts)
|
||||
opts = [syntax_colors: [reset: :red]]
|
||||
assert "#Function<" <> _ = inspect(fun(), opts)
|
||||
assert String.ends_with?(inspect(fun(), opts), ">")
|
||||
assert "#Function<" <> rest = inspect(fun(), opts)
|
||||
assert String.ends_with?(rest, ">")
|
||||
end
|
||||
|
||||
test "map set" do
|
||||
@@ -498,8 +498,8 @@ defmodule Inspect.OthersTest do
|
||||
opts = [syntax_colors: []]
|
||||
assert "#PID<" <> _ = inspect(self(), opts)
|
||||
opts = [syntax_colors: [reset: :cyan]]
|
||||
assert "#PID" <> _ = inspect(self(), opts)
|
||||
assert String.ends_with?(inspect(self(), opts), ">")
|
||||
assert "#PID<" <> rest = inspect(self(), opts)
|
||||
assert String.ends_with?(rest, ">")
|
||||
end
|
||||
|
||||
test "references" do
|
||||
@@ -509,11 +509,11 @@ defmodule Inspect.OthersTest do
|
||||
test "regex" do
|
||||
assert inspect(~r(foo)m) == "~r/foo/m"
|
||||
assert inspect(Regex.compile!("\a\b\d\e\f\n\r\s\t\v/")) ==
|
||||
"~r/\\a\\x08\\x7F\\x1B\\f\\n\\r \\t\\v\\//"
|
||||
"~r/\\a\\x08\\x7F\\x1B\\f\\n\\r \\t\\v\\//"
|
||||
assert inspect(~r<\a\b\d\e\f\n\r\s\t\v/>) ==
|
||||
"~r/\\a\\b\\d\\e\\f\\n\\r\\s\\t\\v\\//"
|
||||
"~r/\\a\\b\\d\\e\\f\\n\\r\\s\\t\\v\\//"
|
||||
opts = [syntax_colors: [regex: :red]]
|
||||
assert inspect(~r/hi/, opts) ==
|
||||
"\e[31m~r/hi/\e[0m"
|
||||
"\e[31m~r/hi/\e[0m"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -175,7 +175,7 @@ defmodule IEx.Config do
|
||||
defp merge_option(:default_prompt, _old, new) when is_binary(new), do: new
|
||||
defp merge_option(:alive_prompt, _old, new) when is_binary(new), do: new
|
||||
defp merge_option(:width, _old, new) when is_integer(new), do: new
|
||||
defp merge_option(k, _old, new) do
|
||||
raise ArgumentError, "invalid configuration or value for pair #{inspect k} - #{inspect new}"
|
||||
defp merge_option(key, _old, new) do
|
||||
raise ArgumentError, "invalid configuration or value for pair #{inspect key} - #{inspect new}"
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user