diff --git a/lib/elixir/lib/io.ex b/lib/elixir/lib/io.ex index b9080a05ad..aba500d73a 100644 --- a/lib/elixir/lib/io.ex +++ b/lib/elixir/lib/io.ex @@ -317,7 +317,7 @@ defmodule IO do @spec warn(chardata | String.Chars.t(), Exception.stacktrace()) :: :ok def warn(message, []) do message = [to_chardata(message), ?\n] - :elixir_errors.io_warn(nil, nil, message, message) + :elixir_errors.io_warn(0, nil, message, message) end def warn(message, [{_, _, _, opts} | _] = stacktrace) do @@ -327,7 +327,7 @@ defmodule IO do file = opts[:file] :elixir_errors.io_warn( - line, + line || 0, file && List.to_string(file), message, [message, ?\n, " ", formatted_trace, ?\n] diff --git a/lib/elixir/lib/module/checker.ex b/lib/elixir/lib/module/checker.ex index 2ae8ff0a2d..3cff67b6e8 100644 --- a/lib/elixir/lib/module/checker.ex +++ b/lib/elixir/lib/module/checker.ex @@ -221,7 +221,7 @@ defmodule Module.Checker do defp warn(meta, state, warning) do {fun, arity} = state.function - location = {state.file, meta[:line], {state.module, fun, arity}} + location = {state.file, meta[:line] || 0, {state.module, fun, arity}} %{state | warnings: [{__MODULE__, warning, location} | state.warnings]} end @@ -308,7 +308,7 @@ defmodule Module.Checker do defp format_file_line(file, line) do file = Path.relative_to_cwd(file) - line = if line, do: [?: | Integer.to_string(line)], else: [] + line = if line > 0, do: [?: | Integer.to_string(line)], else: [] [" ", file, line] end diff --git a/lib/elixir/src/elixir_dispatch.erl b/lib/elixir/src/elixir_dispatch.erl index 7196af0df7..577023f22f 100644 --- a/lib/elixir/src/elixir_dispatch.erl +++ b/lib/elixir/src/elixir_dispatch.erl @@ -92,7 +92,7 @@ dispatch_import(Meta, Name, Args, E, Callback) -> {ok, Receiver, Quoted} -> expand_quoted(Meta, Receiver, Name, Arity, Quoted, E); {ok, Receiver, NewName, NewArgs} -> - elixir_expand:expand({{'.', [], [Receiver, NewName]}, Meta, NewArgs}, E); + elixir_expand:expand({{'.', Meta, [Receiver, NewName]}, Meta, NewArgs}, E); error -> Callback() end. diff --git a/lib/elixir/src/elixir_errors.erl b/lib/elixir/src/elixir_errors.erl index c74902a6e1..29b0efd589 100644 --- a/lib/elixir/src/elixir_errors.erl +++ b/lib/elixir/src/elixir_errors.erl @@ -16,8 +16,8 @@ erl_warn(Line, File, Warning) when is_integer(Line), is_binary(File) -> io_warn(Line, File, Warning, [Warning, "\n ", file_format(Line, File), $\n]). %% Low-level warning, all other warnings are built on top of it. --spec io_warn(non_neg_integer() | nil, unicode:chardata() | nil, unicode:chardata(), unicode:chardata()) -> ok. -io_warn(Line, File, LogMessage, PrintMessage) when is_integer(Line) or (Line == nil), is_binary(File) or (File == nil) -> +-spec io_warn(non_neg_integer(), unicode:chardata() | nil, unicode:chardata(), unicode:chardata()) -> ok. +io_warn(Line, File, LogMessage, PrintMessage) when is_integer(Line), is_binary(File) or (File == nil) -> send_warning(Line, File, LogMessage), print_warning(PrintMessage). diff --git a/lib/elixir/test/elixir/kernel/expansion_test.exs b/lib/elixir/test/elixir/kernel/expansion_test.exs index de61d336ba..125274dd29 100644 --- a/lib/elixir/test/elixir/kernel/expansion_test.exs +++ b/lib/elixir/test/elixir/kernel/expansion_test.exs @@ -654,8 +654,8 @@ defmodule Kernel.ExpansionTest do expand(quote(do: [1] ++ 2 ++ [3] = [1, 2, 3])) end - assert {:=, _, [-1, {{:., [], [:erlang, :-]}, _, [1]}]} = expand(quote(do: -1 = -1)) - assert {:=, _, [1, {{:., [], [:erlang, :+]}, _, [1]}]} = expand(quote(do: +1 = +1)) + assert {:=, _, [-1, {{:., _, [:erlang, :-]}, _, [1]}]} = expand(quote(do: -1 = -1)) + assert {:=, _, [1, {{:., _, [:erlang, :+]}, _, [1]}]} = expand(quote(do: +1 = +1)) assert {:=, _, [[{:|, _, [1, [{:|, _, [2, 3]}]]}], [1, 2, 3]]} = expand(quote(do: [1] ++ [2] ++ 3 = [1, 2, 3])) diff --git a/lib/elixir/test/elixir/module/checker_test.exs b/lib/elixir/test/elixir/module/checker_test.exs index 7805047cd2..dacbf5576f 100644 --- a/lib/elixir/test/elixir/module/checker_test.exs +++ b/lib/elixir/test/elixir/module/checker_test.exs @@ -639,6 +639,31 @@ defmodule Module.CheckerTest do assert_warnings(files, warning) end + test "reports imported functions" do + files = %{ + "a.ex" => """ + defmodule A do + @deprecated "oops" + def a, do: :ok + end + """, + "b.ex" => """ + defmodule B do + import A + def b, do: a() + end + """ + } + + warning = """ + warning: A.a/0 is deprecated. oops + b.ex:3: B.b/0 + + """ + + assert_warnings(files, warning) + end + test "reports structs" do files = %{ "a.ex" => """