Tidy up code around syntax highlighting in IEx

This commit is contained in:
Aleksei Magusev
2016-11-20 17:20:38 +01:00
parent 5c6cbf2f90
commit f557d7b7cb
5 changed files with 66 additions and 73 deletions
+1 -2
View File
@@ -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)
+9 -13
View File
@@ -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]}
+47 -47
View File
@@ -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
+2 -2
View File
@@ -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